【问题标题】:Do I have to use a Scale-Layer after every BatchNorm Layer?我必须在每个 BatchNorm 层之后使用 Scale-Layer 吗?
【发布时间】:2017-05-12 02:34:57
【问题描述】:

我正在使用 caffe,具体来说是 pycaffe,来创建我的神经网络。我注意到我必须使用 BatchNormLayer 才能获得积极的结果。我使用 Kappa-Score 作为结果矩阵。 我现在已经在我的网络中看到了 BatchNorm-Layers 的几个不同位置。但是我也遇到了 ScaleLayer,它不在图层目录中,但在 BatchNorm 图层中经常被提及

您是否总是需要在 BatchNorm - Layer 之后放置一个 ScaleLayer,它有什么作用?

【问题讨论】:

标签: neural-network deep-learning caffe pycaffe


【解决方案1】:

通常,您不会从与批量标准化并列的缩放层中获得任何好处。每个都是线性变换。在 BatchNorm 进行转换时,新分布的均值为 0,方差为 1,Scale 将整个范围压缩到指定的区间,通常为 [0,1]。由于它们都是线性变换,如果按顺序进行,第二个将完全撤消第一个的工作。

它们对异常值的处理也有所不同。考虑一组数据:十个值,-1 和 +1 各五个。 BatchNorm 根本不会改变这一点:它已经具有均值 0 和方差 1。为了保持一致性,让我们为 Scale 指定相同的区间 [-1, 1],这也是一个流行的选择。

现在,添加一个异常值,比如 99。 Scale 会将集合转换为 [-1, 1] 范围,因此现在有五个 -1.00 值、一个 +1.00 值(前 99)和五个 -0.96 值(以前 +1)。

BatchNorm 担心的是平均标准差,而不是最大值和最小值。新平均值为+9; S.D.是 28.48(四舍五入到小数点后 2 位)。这些数字将被缩放为大约 -.35 和 -.28 中的五个值,以及一个值 3.16

一种缩放是否比另一种效果更好在很大程度上取决于您的分布的偏斜和分散。我更喜欢 BatchNorm,因为它倾向于在分布的密集区域更好地区分。

【讨论】:

    【解决方案2】:

    来自 Ioffe & Szegedy 的原始 batch normalization paper:“我们确保插入到网络中的变换可以表示身份变换。”如果在 BatchNorm 层之后没有 Scale 层,则不会出现这种情况,因为 Caffe BatchNorm 层没有可学习的参数。

    我是从Deep Residual Networks git repo 那里学到的;请参阅免责声明和已知问题下的第 6 项。

    【讨论】:

    • 所以提到 caffe 必须在 BatchNorm 层之后使用 ScaleLayer,但在通常的形式中,它不像@Prune 的答案中的建议
    • @Kev1n91 在 Python 中完成我自己的(空间)批处理规范的天真实现之后,我一直在努力在 caffe 中正确使用 BatchNorm。我刚刚偶然发现的一些可能更有帮助的信息可以在这里找到:github.com/BVLC/caffe/issues/3347
    猜你喜欢
    • 2015-12-07
    • 1970-01-01
    • 2018-01-18
    • 2010-09-18
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    相关资源
    最近更新 更多