内部协变量偏移
深度神经网络模型的训练为什么会很困难?其中一个重要的原因是,深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上一层输入数据分布发生变化,通过层层叠加,高层的输入分布会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。Google 将这一现象总结为Internal Covariate Shift.(ICS)
Normalization的通用框架
是平移参数,
是缩放参数。通过这两个参数进行shift和scale变换:
,得到的数据符合均值为0、方差为1的标准分布
- B是再平移参数,g是再缩放参数。将上一步得到的
进一步变换为:
,最终得到的数据符合均值为b、方差为
的分布
再变换的目的
- 标准分布的表达能力有限,对其再平移和再缩放(rescale和reshift的参数都是可学习的)使得每个神经元的输入范围是针对该神经元量身定制的一个确定范围(均值为b、方差为 ),从而Normalization层可以学习如何去适应底层的学习结果
- 恢复模型的非线性表达能力。Sigmoid等激活函数通过区分饱和区和非饱和区,使得神经网络的数据变换具有了非线性计算能力。而第一步的规范化会将几乎所有数据映射到激活函数的非饱和区(线性区),仅利用到了线性变换的能力,从而降低了神经网络的表达能力。再变换可将数据从线性区变换到非线性区,恢复模型的表达能力。
目前在实践上,倾向于把BN放在ReLU后面。原理未知。
BN、LN、IN、GN
深度网络中的数据维度一般是 [N, C, H, W] 或者 [N, H, W,C] 格式,N是batch size,H、W、C分别是feature的高、宽、通道,将H、W用一个维度表示,则四维数据可以表示为以上的三维图。
此数据可以类比为一叠书,这叠书有 N 本,每本有 C 页,每页有 H 行,每行 W 个字。
| Batch Normalization | Layer Normalization | Instance Normalization | Group Normalization |
公式 |
| |
|
|
针对维度 | N、H、W混一操作,通道C独立 | H、W、C混一操作,样本N独立 | H、W混一操作,C、N独立 | H、W与分段的C混一操作,N独立 |
类比 | 把所有书的第一页抽出来合到一起平均成一个字,把所有书的第二页抽出来合到一起平均成一个字…… | 第一本书平均成一个字,第二本书平均成一个字…… | 第一本书的第一页平均成一个字,第二页平均成一个字…… 第二本书…… | 第一本书0到C/G页平均成一个字,C/G到2C/G页平均成一个字…… 第二本书…… |
特点 | 需要较大batchsize,可能导致内存不够,也很难应用在训练数据长度不同的 RNN 模型上。 | 可以用于小mini-batch场景,动态网络场景和RNN,特别是自然语言处理领域;LN对于一整层的神经元训练得到同一个转换,如果不同输入特征不属于相似的类别(比如颜色和大小),那么LN的处理可能会降低模型的表达能力。 | 适用于GAN和style transfer;在生成模型中, feature map 的各个 channel 的均值和方差会影响到最终生成图像的风格 | 每一个样本 feature map 的 channel 分成 G 组,每组求一个均值和标准差;适用于占用显存比较大的任务,例如图像分割 |
此外,还需要注意它们的映射参数 和
的区别:对于 BN,IN,GN, 其
和
都是维度等于通道数 C 的向量。而对于 LN,其
和
都是维度等于 normalized_shape 的矩阵。
最后,BN 和 IN 可以设置参数: momentum 和 track_running_stats来获得在全局数据上更准确的 running mean 和 running std。而 LN 和 GN 只能计算当前 batch 内数据的真实均值和标准差。
除了上面这些归一化方法,还有基于它们发展出来的算法,例如 Conditional BatchNormalization 和 AdaIN.