Covariate Shift
mini-batch梯度下降法:即每次选取部分的样本进行梯度计算,然后更新参数。
不过如果选取的样本不够随机,可能会出现两次的batch样本分布差别较大,会影响网络的学习(因为每次梯度下降学习的目标分布不同),这就导致了Covariate Shift。
Internal Covariate Shift
Internal Covariate Shift是指输入的数据每经过一层网络后分布都会改变,因为网络的权重是不断更新的。
以上存在的两个问题严重的影响了网络的训练,而Batch Normalization就是用来解决这些问题。
BN
我们知道归一化输入特征可以将学习问题的轮廓从很长的东西变成了很圆的东西,使更容易算法优化(比如可以使用更大的学习率而不用担心其在某一维度产生颠簸)。
可以选择在激活函数之前或者之后进行归一化,一般是在激活函数之前进行。
什么是归一化?下面举例说明。
例如我们要将特征( x 1 , x 2 , x 3 , . . . , x n x_1, x_2, x_3, ... ,x_n x1,x2,x3,...,xn)归一化,那么我们需要先计算他们的均值 μ x \mu_x μx和方差 σ x 2 \sigma^2_x σx2
然后每一个特征减去均值,再除以方差即可。
如此即可将这一维度的特征变成0为均值、1为方差的特征。
不过实际中一般不想每一层都变成均值为0、方差为1的分布,因为这样就几乎变成了线性函数(网络再深也没有什么意义),所以我们一般会再增加两个参数使网络可以自行学习,用来调整均值和方差,
y
∗
=
γ
y
+
β
y^* = \gamma{y} + \beta
y∗=γy+β,增强非线性性。由于增加了
β
\beta
β项,因此原先的
y
=
w
x
+
b
y = wx+b
y=wx+b中的b可以设置为0(或者直接去掉)。
Batch Normalization减少了输入值改变的问题,它使每一层的输入变得稳定。因此即使输入分布改变了一些,由于BN的存在输入也会改变的更少。BN减弱了前层参数与后层参数的作用之间的联系,使得网络每层都可以自己学习,稍稍独立于其他层,有助于加速整个网络的学习。
除此之外,BN还有轻微的正则化的效果。由于我们每次从输入中减去的均值和除去的方差都是基于一个batch的(而不是整个训练集),因此这里也引入了一些噪声,和Dropout一样往每层的激活值上增加了噪声,使得后面的神经元不过分依赖任何一个前层的神经元。 加大batch-size可以减轻正则化的效果。
在测试时,没有办法计算 μ \mu μ和 σ 2 \sigma^2 σ2,一般采用指数加权平均来跟踪在在训练过程中得到的 μ \mu μ和 σ \sigma σ以得到测试时的 μ \mu μ和 σ \sigma σ。
总结:使用BN,可以训练更深的网络、使学习算法运行速度更快,调参过程更简单。
参考资料
https://www.learnopencv.com/batch-normalization-in-deep-networks/
https://www.cnblogs.com/guoyaohua/p/8724433.html
吴恩达深度学习笔记