Batch Normalization (BN),由 Google 于 2015 年在论文 "Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift" 中首次提出,旨在解决神经网络层数较深时存在的训练速度慢、梯度易消失和爆炸、对初始化敏感等问题。本文对其关键技术进行回顾和总结,帮助作者加深记忆和理解。
原文
Training Deep Neural Networks is complicated by the fact that the distribution of each layer's inputs changes during training, as the parameters of the previous layers change. This slows down the training by requiring lower learning rates and careful parameter initialization, and makes it notoriously hard to train models with saturating nonlinearities. We refer to this phenomenon as internal covariate shift, and address the problem by normalizing layer inputs.
把神经网络看成一层一层的“特征变换器”,第 层的输入是第 层的输出,当你更新第 层的参数时,第 层看到的数据分布发生改变,因此第 层需要不断去适应一个在变化的数据分布。
总结来说: 在神经网络训练过程中,由于参数不断更新,某一层的输入分布会随着前面层参数的变化而不断改变,这种现象就称为 Internal Covariate Shift (ICS)
看上去很眼熟?
在实际任务中,我们经常遇到在数据集A上训练且表现良好的模型,在数据集B上却表现得很差,这通常是由于两组数据分布之间存在差异导致的,对在数据集A上训练获得的模型使用数据集B进行“微调”的过程,事实上就是调整模型使其适应数据集B中的数据分布。
在传统机器学习中,我们把数据集之间分布的差异称为 Covariate Shift (CS),CS 出现在网络外部,导致网络最前端的输入数据分布之间存在差异;而 ICS 发生在网络内部,导致网络中间的特征分布产生变化。作者认为只要能尽量消除ICS,使得网络在各层或某几层的输出保持一个较为稳定的分布,就能大幅提升训练效率。
警告
但是 Santurkar et al. 在2018年发表的论文 "How Does Batch Normalization Help Optimization?" 中推翻了设计BN的这一动机,他们人为引入ICS后发现模型训练仍能正常进行,在实验后他们得出的结论是“BN之所以能优化模型,是因为BN的引入使得特征空间的‘地形’更平滑”。
原文
We could consider whitening activations at every training step or at some interval, either by modifying the network directly or by changing the parameters of the optimization algorithm to depend on the network activation values
这里作者所说的归一化指的是在网络外进行的数据白化,这一思路的确是最符合直觉的。但是,在网络外进行数据白化会带来一个严重的问题,即“模型不知道在每一层或某一层后存在归一化操作”。
假设模型知道归一化操作的存在,则对于某一层激活值 及其归一化后的值 而言,有:
在最后的表达式中, 与 是无关的,因此在反向传播过程中对 求导时应该有:
因此参数 不应该被更新,这是十分合理的结论(从 的表达式上看,无论把 修改为多少,前向传播时 都不会变化, 更不会使 降低)
那么实际上?
实际上,由于模型根本不知道归一化的存在,因此在模型看来:
其中缺乏 项,导致反向传播求导时:
模型自然认为“更新参数 的值,和更新其他任何一个参数一样都能够使得梯度下降”,于是以下过程被执行:
然而,在下一次前向传播时,虽然 变了, 但 也跟着变了,归一化时 作为均值的一部分被减去,两相抵消, 仍在原地踏步。
如果模型能看到 项,则求导时前半部分值为 ,后半部分为 , 不需要更新的结论不变。
为了解决上文提出的两个问题,Batch Norm应运而生,原文中包含了BN的大量细节,这里我们挑出最关键的几个进行分析和记录。
Minibatch:为了在整个训练过程中保持特征分布稳定,我们需要统计整个数据集的在各维度上的均值和方差,用这样的“全量法”进行BN最准,但是没法训练。BN的实际做法是每次随机抽取一小堆数据(比如 32张 或 64张),算出这 32 张图在各维度上的临时均值和方差来代表整体分布进行归一化。
独立同分布:不像数据白化一样要求不同维度之间正交,这样需要大量协方差计算。BN对每个特征维度单独归一化,即:BN沿着Batch维度对每个特征维进行归一化,换句话说,BN是对训练过程中不同样本流经同一个神经元时取值的概率分布进行归一化,我们希望这个分布不要发生剧烈变化。
如果我们强制把每一层的输入都锁定成标准正态分布,相当于给网络穿上了“紧身衣”,而神经网络之所以强大,是因为它能学习各种各样的数据分布。例如:强行 N(0,1) 会导致 Sigmoid 陷入线性区,丧失表达能力。因此,BN层设计如下:
其中 为特征维度,作者通过引入可学习的重构参数,让网络有能力恢复原始分布(Identity Transform),把数据应该有何种分布的决定权交还给模型本身。
当我们引入参数 后,原本的偏置参数 就不再需要了,因为:
分子部分实际上是 ,而分母部分 存在与否不影响方差的值,这个参数的更新全无意义。
原文
To accomplish this, we introduce, for each activation x(k), a pair of parameters γ(k), β(k), which scale and shift the normalized value:
在 MLP 中,我们可以肯定的说,对于某一层的输出 ,BN层对 的每个特征维度都有一对独立的 和 ,因为BN的思想本身就是对每个特征维度单独进行归一化。
在 CNN 中,对于一个输入形状为 的张量,每个通道 共享一组 和 ,简单理解:对于卷积层而言,通道上的一个个像素显然不是我们使用卷积提取到的特征,真正的特征应该是单个通道的全部像素,这是卷积平移不变性的体现。
训练时 BN 层只能依赖于当前 Batch 的均值和方差进行归一化,但推理时存在差异,例如:假设只有一张影像,如何进行归一化?答案是,在训练时使用移动平均 (Running Average) 收集全局统计量,推理时直接使用这些固定的常数。
BN 使得反向传播时各层不受其参数数值缩放的影响,事实上,对于一个标量 :
因此反向传播时:
此外,对于权重参数 而言
因此权重越大在更新时梯度大小得到控制,有利于训练的稳定性。
警告
BN 为什么有效这一部分理由由论文作者给出,BN 有效的真实原因我觉得事实上没有人能真的知道,即使 Santurkar 通过实验推翻了消除 ICS 就能提高训练速度和稳定性,但随着时间的推移,或许后续研究又有新的发现,谁知道呢🙃
本文作者:MoooYuuu
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!