目录
一、为什么用Batch Normalization
1.Batch Normalization简述
在网络训练过程中,更新之前的权重时,每次迭代时中间**层的输出分布都会发生改变。这种现象我们称之为内部协变量移位(ICS)。为了防止这种现象的发生,就需要修正所有的分布。简单说,就是分布要移动,要限制住这个分布,不让它移动,来帮助梯度优化和防止梯度消失,使得神经网络训练的更快。减少内部协变量移位推动了Batch Normalization的发展。
2.Batch Normalization工作原理
Batch Normalization通过batch上减去经验平均值除以检验标准差来对前一个输出层的输出进行归一化。类似于高斯分布。
x
i
‾
=
x
i
−
μ
β
σ
B
2
+
ϵ
\overline{x_i} = \frac{x_i-\mu_\beta}{\sqrt[]{\sigma_{B}^{2}+\epsilon}}
xi=σB2+ϵ
xi−μβ
其中
μ
\mu
μ和
σ
2
\sigma^{2}
σ2分别是批均值和批方差。
x
i
‾
=
x
i
−
μ
B
σ
B
2
+
ϵ
\overline{x_i} = \frac{x_i-\mu_{B}}{\sqrt{\sigma_{B}^{2}+\epsilon}}
xi=σB2+ϵ
xi−μB
并且学习了一个新的平均值和协方差
γ
\gamma
γ和
β
\beta
β。简而言之,Batch Normalization是控制batch分布的一阶和二阶的动量。
vgg16网络的中间卷积层的特征分布输出。
3.Batch Normalization优点
- 更快的收敛
- 降低初始权重的重要性
- 鲁棒的超参数
- 更快的需要较少的数据进行泛化
二、Batch Normalization 的局限性
1. 估计统计的准确度不稳定
Batch Normalization通过计算平均值和方差,在batch中对之前的输出进行归一化。如果batch比较大的时候,估计是比较准确的。随着batch大小的减小,估计的准确度会随着减小。
从上图可以推断出,如果batch大小保持在32,最终验证误差在23左右,并且随着batch大小的减小,误差会继续减小。
然而,在finetune时,不能使用大的batch,以免过高的梯度对模型造成伤害。在分布训练的时候,大的batch最终将作为一组小的batch分布在各个实例中。
2. 增加了训练时间
3. 训练和推理不一样的结果
例如,在真实世界中做“物体检测”。在训练一个物体检测器时,我们通常使用大batch(YOLOv4和Faster-RCNN都是在默认batch大小= 64的情况下训练的)。但在投入生产后,这些模型的工作并不像训练时那么好。这是因为它们接受的是大batch的训练,而在实时情况下,它们的batch大小等于1,因为它必须一帧帧处理。考虑到这个限制,一些实现倾向于基于训练集上使用预先计算的平均值和方差。另一种可能是基于你的测试集分布计算平均值和方差值。
4.对于在线学习不好
由于它依赖于外部数据源,数据可能单独或批量到达。由于每次迭代中batch大小的变化,对输入数据的尺度和偏移的泛化能力不好,最终影响了性能。
5.对于循环神经网络不好
Batch Nornalization 可以提高卷积神经网络的训练和泛化能力。但是,对于递归结构,却很难应用。其中,归一化是“垂直”应用,即每个RNN的输出,可以用在RNN堆栈之间。但是它不能“水平”的应用,例如在时间同步之间,因为重复的重新缩放而产生爆炸性的梯度伤害到模型的训练
三、可替代Bach Normalization方法
- Layer Normalization
- Instance Normalization
- Group Normalization
- Synchronous Normalization
四、总结
Batch Normalization是深度学习发展中的一项里程碑技术。然而,对batch维度进行归一化,同时也引入了一些问题。因此,归一化技术还有很多的改进空间。