训练深度神经网络非常复杂,因为在训练过程中,随着先前各层的参数发生变化,各层输入的分布也会发生变化,图层输入分布的变化带来了一个问题,因为图层需要不断适应新的分布,因此训练变得复杂,随着网络变得更深,网络参数的细微变化也会放大。由于要求较低的学习率和仔细的参数初始化,这减慢了训练速度,并且众所周知,训练具有饱和非线性的模型非常困难。我们将此现象称为内部协变量偏移,并通过归一化层输入来解决该问题。
Batch Normalization通过将归一化作为模型体系结构的一部分并为每个训练小批量执行归一化来汲取其优势。批处理规范化使我们可以使用更高的学习率,而对初始化则不必那么小心。它还可以充当正则化器,在某些情况下,不需要Dropout,BN朝着减少内部协变量偏移迈出了一步,并且在此过程中极大地加速了深度神经网络的训练。它通过固定图层输入的均值和方差的归一化步骤来完成此操作。
BN应用于最先进的图像分类模型,以较少的14倍训练步骤即可达到相同的精度,并且在很大程度上击败了原始模型。使用批归一化网络的模型在 ImageNet分类中达到4.9%的top-5验证错误(和4.8%的测试错误),超过了人类评分者的准确性。
Batch-Normalization实现
最开始的想法是通过白化来实现分布归一化,然而考虑到白化需要在梯度下降外计算协方差矩阵,因此白化层将严重影响计算量。后来选择了在mini-batch中使用如下公式实现归一化:
请注意,简单地标准化图层的每个输入可能会更改该图层可以表示的内容。例如,对S形输入进行归一化会将其约束为非线性的线性状态。为了解决这个问题,我们确保网络中插入的转换可以表示身份转换(the transformation inserted in the network can represent the identity transform)。因此,我们为每次激活x(k)引入一对参数γ(k),β(k),它们可缩放和移动标准化值:
其中,γ(k) = Var[x(k)]开根号,β(k) = E[x(k)]
具体实现算法伪代码如下:
在训练期间,我们需要通过此变换反向传播损耗gradient的梯度,以及计算与BN变换的参数有关的梯度。我们使用链式规则,如下所示(在简化之前):
因此,BN转换是将标准化激活引入网络的可微分转换。这样可以确保在训练模型时,各层可以继续学习内部协变量偏移较少的输入分布,从而加快了训练速度。此外,将学习到的仿射变换应用于这些规范化激活,可以使BN变换表示身份变换并保留网络容量。
Batch-Normalization在卷积层中应用
卷积网络中添加BN前的映射方程为z = g(W u + b),这里g是激活函数。在添加BN后变为了z = g(BN(W u)),这里去除了b,由于我们对W u + b进行了归一化,因此可以忽略偏差b,因为其作用将被随后的均值减法抵消(偏差的作用在前面的式子中由β所实现)
Batch-Normalization有利于使用更大的学习率
在传统的深度网络中,过高的学习率可能会导致梯度爆炸或消失,以及陷入不良的局部最小值。批处理规范化有助于解决这些问题。通过对整个网络的激活进行标准化,可以防止对参数的细微更改放大为梯度激活中的较大和次佳的更改。例如,它可以防止训练陷入非线性的饱和状态。
批归一化还使训练对参数规模更具弹性。通常,较高的学习率可能会增加图层参数的规模,然后放大反向传播期间的梯度并导致模型爆炸。但是,使用批归一化,通过层的反向传播不受其参数范围的影响。确实,对于标量a, 假设BN (W u) = BN ((aW )u),(这里可以这么假设的原因,个人理解是BN有仿射变换,可以实现不同卷积参数大小得到相同的结果),等式两边分别对u和W求导,
对此,比例尺a不会影响雅可比层,也不会影响梯度传播。而且,较大的权重反而有较小的梯度,并且“批归一化”将稳定参数的增长。
Batch-Normalization实际效果
1. 增加学习率
2. 可去除Dropout
3. 减少L2权重正则化
4. 加速学习率衰减
5. 不再需要局部响应归一化(LRN)(在BN提出来之前是使用LRN)
6. 更彻底地混洗训练示例
7. 减少光度失真
后两个不太好理解,例如第七点,原文的说法是“由于批量归一化的网络训练速度更快,并且观察每个训练示例的次数更少,因此,我们使训练者可以通过减少畸变来专注于更多“真实”的图像。“我个人的理解是可以减少对图像进行畸变这种数据增强方式,因为有了BN后能更关注于真实图像,但这种理解不够直观,并不知道为什么会可以这样。
实验效果,收敛速度明显更快,精度更高。
如有错误或不合理之处,欢迎在评论中指正。