3-6 Batch Norm 为什么奏效?
Batch Norm 为什么奏效?( Why does Batch Norm work?)
一个原因是,你已经看到如何归一化输入特征值x,使其均值为 0,方差 1,它又是怎样加速学习的,有一些从 0 到 1 而不是从 1 到 1000 的特征值,通过归一化所有的输入特征值x,以获得类似范围的值,可以加速学习。所以 Batch 归一化起的作用的原因,直观的一点就是,它在做类似的工作,但不仅仅对于这里的输入值,还有隐藏单元的值,这只是 Batch归一化作用的冰山一角,还有些深层的原理。
Batch 归一化有效的第二个原因是,它可以使权重比你的网络更滞后或更深层,比如,第 10 层的权重更能经受得住变化。
举个例子:
在猫识别的问题上,假设训练集中只包含黑猫的识别,其训练集以及正负样本分布如下图所示:
现在要将训练的结果使用在带颜色的猫识别问题中,其样本和正负分布可能如下图所示:
此时在识别黑猫中训练很好的模块可能并不会在在识别带颜色猫的问题上表现的依旧很好。这种数据分布改变的问题称为 “Covariate shift”,具体可以理解为:
已经学习到了x到y的映射,但是如果x的分布改变了,那么可能需要重新训练学习算法。
“Covariate shift”问题在神经网络中的体现,如下的神经网络:
我们从第三层开始看起,遮挡住前两层:
从第三隐藏层的角度来看,它得到一些值,称为$a_1^{[2]}$,$a_2^{[2]}$,$a_3^{[2]}$,$a_4^{[2]}$,第三层隐藏层的工作是找到一种方式,使这些值映射到${\hat y}$,所以接下来使用的参数可能是${w^{[3]}}$,${b^{[3]}}$, ${w^{[4]}}$,${b^{4]}}$从而得到不错的映射。
现在将前两层的遮挡去掉:
可以看到这个网络还有参数${w^{[1]}}$,${b^{[1]}}$, ${w^{[2]}}$,${b^{2]}}$,如果这些参数改变了,那么${a^{\left[ 2 \right]}}$的值也会改变。所以从第三层隐藏层的角度来看,这些隐藏单元的值在不断地改变, 所以它就有了“Covariate shift”的问题。
Batch 归一化做的,是它减少了这些隐藏值分布变化的数量。当神经网络在之前层中更新参数,z的值可能发生变化, Batch 归一化可以确保无论其怎样变化z的均值和方差保持不变,如果神经网络选择的话,可强制其为均值 0,方差 1,或其他任何均值和方差(由$\gamma$和$\beta$决定)。但它做的是,它限制了在前层的参数更新,会影响数值分布的程度。
Batch 归一化减少了输入值改变的问题,它的确使这些值变得更稳定,神经网络的之后层就会有更坚实的基础。即使使输入分布改变了一些,它会改变得更少。它做的是当前层保持学习,当改变时,迫使后层适应的程度减小了,你可以这样想,它减弱了前层参数的作用与后层参数的作用之间的联系,它使得网络每层都可以自己学习,稍稍独立于其它层,这有助于加速整个网络的学习。尤其从神经网络后层之一的角度而言,前层不会左右移动的那么多,因为它们被同样的均值和方差所限制,所以,这会使得后层的学习工作变得更容易些。
Batch 归一化还有一个作用,它有轻微的正则化效果, Batch 归一化中非直观的一件事是在 mini-batch 计算中,由均值和方差缩放的,因为在 mini-batch 上计算的均值和方差,而不是在整个数据集上,均值和方差有一些小的噪声,因为它只在你的 mini-batch 上计算,比如 64 或 128 或 256 或更大的训练例子。因为均值和方差有一点小噪音,因为它只是由一小部分数据估计得出的。缩放过程从${z^{[l]}}$到${{\tilde z}^{[l]}}$的过程中也有一些噪音,因为它是用有些噪音的均值和方差计算得出的。
所以和 dropout 相似,它往每个隐藏层的激活值上增加了噪音, dropout 有增加噪音的方式,它使一个隐藏的单元,以一定的概率乘以 0,以一定的概率乘以 1,所以你的 dropout含几重噪音,因为它乘以 0 或 1
对比而言, Batch 归一化含几重噪音,因为标准偏差的缩放和减去均值带来的额外噪音。
这里的均值和标准差的估计值也是有噪音的,所以类似于 dropout, Batch 归一化有轻微的正则化效果,因为给隐藏单元添加了噪音,这迫使后部单元不过分依赖任何一个隐藏单元,类似于 dropout,它给隐藏层增加了噪音,因此有轻微的正则化效果。因为添加的噪音很微小,所以并不是巨大的正则化效果,你可以将 Batch 归一化和 dropout 一起使用,如果你想得到 dropout 更强大的正则化效果。
也许另一个轻微非直观的效果是,如果你应用了较大的 mini-batch,对,比如说,你用了 512 而不是 64,通过应用较大的 min-batch,你减少了噪音,因此减少了正则化效果,这是 dropout 的一个奇怪的性质,就是应用较大的 mini-batch 可以减少正则化效果。
说到这儿,我会把 Batch 归一化当成一种正则化,这确实不是其目的,但有时它会对你的算法有额外的期望效应或非期望效应。但是不要把 Batch 归一化当作正则化,把它当作将你归一化隐藏单元激活值并加速学习的方式,我认为正则化几乎是一个意想不到的副作用。