在训练神经网络时,往往需要标准化(normalization)输入数据,使得网络的训练更加快速和有效。
然而SGD(随机梯度下降)等学习算法会在训练中不断改变网络的参数,隐藏层的激活值的分布会因此发生变化,而这一种变化就称为内协变量偏移(Internal Covariate Shift,ICS)。
为了解决ICS问题,批标准化(Batch Normalization)固定激活函数的输入变量的均值和方差,使得网络的训练更快。
除了加速训练这一优势,Batch Normalization还具备其他功能:
①应用了Batch Normalization的神经网络在反向传播中有着非常好的梯度流;
这样,神经网络对权重的初值和尺度依赖减少,能够使用更高的学习率,还降低了不收敛的风险。
②Batch Normalization还具有正则化的作用,Dropout也就不再需要了。
③Batch Normalization让深度神经网络使用饱和非线性函数成为可能。
一、Batch Normalization的实现方式
Batch Normalization在训练时,用当前训练批次的数据单独的估计每一激活值 x⁽ᴷ⁾ 的均值和方差。为了方便,我们接下来只关注某一个激活值 x⁽ᴷ⁾ ,并将 k 省略掉,现定义当前批次为具有 m 个激活值的 β:
β = Xi (i=1,...,m)
首先,计算当前批次激活值的均值和方差:
然后用计算好的均值 和 方差 δ_β ² 标准化这一批次的激活值
,得到