6.3 Batch Normalization
在权重的初始化中,我们观察了各层的激活值分布,并从中了解到如果设定了合适的权重初始值,则各层的激活值分布会有合适的广度,从而可以顺利地进行学习。那么为了使各层拥有适当的广度,“强制性”地调整激活值的分布会怎样呢?Batch Normalization就是基于这个方法而产生的。
Batch Normalization(简称Batch Norm)是2015年提出的方法,他可以
- 可以使学习快速进行(可以增大学习率)
- 不那么依赖初始值(对于初始值不用那么神经质)
- 抑制过拟合(降低Dropout等的必要性)
如前所述,Batch Norm的思路是调整各层的激活值分布使其拥有适当的广度。为词,要向神经网络中插入对数据分布进行正规化的层,即Batch Normalization层(下文简称Batch Norm层)。一般放在放在Affine层和Relu层之间。
Batch Norm,顾名思义,以进行学习时的mini-batch为单位,按mini-batch进行正规化。具体而言,就是进行使数据分布的均值为0,方差为1的正规化。用数学式表达为:
对输入的集合B={x1,x2,…xn}求均值μ和方差σ。然后对输入数据进行均值为0,方差为1(合适的分布)的正规化。最后分母中的
为一个微小值(比如之前用过的,1e-7)为了防止出现分母为0的情况。
如果归一化了训练数据,那么就需要保存参数μ\muμ和σ\sigmaσ,之后用保存的训练集上的μ和σ来归一化测试集,而非分别在训练集和测试集上计算μ和σ。这样可以让测试集和训练集都经过相同的μ和σ定义的数据转换
归一化图示:
直观地理解Batch Norm的优点:
- BN层强制性地调整各层的激活值分布使其拥有适当的广度,使激活值落在非饱和区从而缓解梯度消失问题,加速网络收敛,同时也避免了表现力不足的问题。
- 通过BN层可使后面的层对前面层的输出不那么敏感(没有BN层的话,当前面层参数改变时,输出值范围变化,导致后面层的参数也不得不调整),抑制了参数微小变化随网络加深而被放大的问题,减小耦合,是每一层都能独立学习,提升学习速率。(reduce the internal covariate shift)
- 如上节所述,归一化所有输入特征可以加速网络学习(enables higher learning rates)
- μ和σ只是由一个mini-batch计算得到的,而非是整个数据集上的μ和σ,因此相当于加入了一些噪声(add some noise to each hidden layer’s activations),因此有轻微的正则化效果(regularization effect)。(如果用更大的mini-batch 就会减小噪声,进而减弱正则化效果)
Batch Norm的缺点:
- 因为是在batch维度归一化,BN层要有较大的batch才能有效工作,而例如物体检测等任务由于占用内存较多,限制了batch的大小,进而也限制了BN层的归一化功能
- 测试时直接拿训练集的均值与方差对测试集进行归一化,可能会使测试集依赖于训练集
实际上,在不使用Batch Norm的情况下,如果不赋予一个尺度好的初始值,学习将完全无法进行
为什么需要归一化:
当输入都在相近范围内时,损失函数优化起来更简单更快速,从而加速网络学习。
参考博文:
https://blog.csdn.net/weixin_42437114/article/details/106593926