一、 深度学习中的 Internal Covariate Shift(ICS)

深度学习的训练过程可以看成很多层的叠加,而每一层的参数更新会导致下一层输入数据的分布发生变化,通过层层累加,高层的输入分布变化会非常剧烈导致上层的数据需要不断去变化以适应底层参数的更新。因此学习率,初始化权重等超参数的设置对模型的收敛非常重要,从而导致训练困难。总结下来,每个神经元的输入数据不再是独立同分布的,这样会造成:

  1. 上层参数需要不断适应新的输入数据分布,降低学习速度

  2. 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使学习过早停止

  3. 每层的更新都会影响到其他层

这种现象被称为深度学习中的 (Internal Covariate Shift, ICS) 。因此,在数据喂给机器学习模型之前,需要进行白化处理,去除特征之间的相关且保证所有的特征具有相同的均值和方差。

二、Normalization 的通用框架

以一个神经元为例,接收一组输入向量 \(x = (x_{1},x_{2},...x_{n})\),输出一个标量 \(y\),即:

\[y = f(x)
\]

由于ICS问题的存在,输入向量 \(x\) 的元素之间的差别极大,因此需要对每一层的输入数据都进行白化,保证 \(x\) 之间独立同分布。然而标准的白化操作代价很大。因此随着Google在2015年首先提出的Batch Normalization操作,很多Normalization操作也都被设计出来。基本思想是在将 \(x\) 送给神经元之前,先做平移和伸缩变换,将其分布规范在固定区间的标准分布:

\[h = f(g\times \dfrac{x-u}{\sigma}+b)
\]

首先将输入向量 \(x\) 归一化为 \((0,1)\) 的标准分布,讲道理来说这一步已经做了白化操作,然而为了保证模型的表达能力不因为规范化而下降,继续通过再缩放参数 \(g\) 和再平移参数 \(b\) 进一步得到符合 \((b, g^{2})\) 的分布。因为如果不进行再平移和再缩放,无论下层神经元学到了什么,在输入上层神经元之前都被调整为这一固定范围。因此定义可学习参数 \((b, g^{2})\) 来保证网络 的学习能力。

那么通过先白化再变换之后,引入了两个新参数 \((b, g^{2})\) ,导致新的输入向量的均值只跟可学习的参数有关,从而去除了与下层计算的相关性。

三、主流的Normalization框架

一文详解深度学习中的Normalization

  1. Batch Norm是在 batch 上对 \([B, H, W]\) 做归一化,而保留通道 \(C\) 的维度。可以看成一共 \(B\) 张图,每张图有 \(C\) 个通道,每个通道有 \([H, W]\) 个像素,因此BN的均值和方差可以看成第1张图的第1个通道上所有像素与第2张图的第1个通道的所有像素相加,除以像素总数 \(2\times H \times W\) 就得到了均值 \(u \in R^{1\times C \times 1 \times 1}\),即不同图片对应的相同通道上所有像素全部加起来,再除以像素总数 \(B\times H \times W\)BN 独立地规范所有batch size的不同维度的所有数据,这就要求每一个batch之间以及batch与整体数据之间应该是近似同分布的,如果分布差距较大,那么不同batch的数据将会进行不一样的数据变化,同样增加了模型训练的难度。因此BN适用于每个mini-batch比较大,数据比较接近的场景,如CNN。然而而Batch Size过大又会占用过多的显存,一种折中的办法就是梯度累积来实现大Batch Size 的效果。
  2. Layer Norm针对 BN 不适用深度固定不变的网络的问题,在通道方向上,对 \([C, H, W]\) 做归一化,相当于把每张图片的所有像素加起来,再除以该图片的像素总数 \(C\times H \times W\),得到的均值 \(u \in R^{B \times 1 \times1 \times 1}\),主要适用于 RNN。
  3. Instance Norm在图像像素上对 H, W做归一化,相当于把每个通道的所有像素加起来,再除以该通道的像素综述 H*W, 得到的均值 \(u \in R^{B \times C \times1 \times 1}\),主要用在图像的风格迁移。因为在图像风格化中,生成结果主要依赖于某个图像实例,feature map 的各个 channel 的均值和方差会影响到最终生成图像的风格。所以对整个batch归一化不适合图像风格化中,因而对H、W做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。
  4. Group Norm相当于将通道进行分组,对每一组的数据进行 Layer Norm。为了解决BN对较小的mini-batch size效果差的问题。GN 适用于占用显存比较大的任务,例如图像分割。对这类任务,可能 batch size 只能是个位数,再大显存就不够用了。而当 batch size 是个位数时,BN 的表现很差,因为没办法通过几个样本的数据量,来近似总体的均值和标准差。就像在显存不够的情况下,计算n个mini batch的梯度值后再进行梯度更新,实现小batch size更准确的梯度值。

四、Normalization 有效性的分析

  1. 权重伸缩不变性:当权重 \(W\) 按照常量 \(\lambda\) 进行伸缩时,得到的规范化后的值保持不变,即:
\[Norm(\lambda Wx) = Norm(g\dfrac{\lambda WX-\lambda u}{\lambda \sigma}+b) = Norm(Wx)
\]

因此权重伸缩变化对反向传播没有影响。

2)数据伸缩不变性:当数据 \(x\) 按照常量 \(\lambda\) 进行伸缩时,得到的规范化后的值保持不变,即:

\[Norm(W \lambda x) = Norm(Wx)
\]

数据伸缩不变性仅仅对BN,LN成立, 因为这两者在对数据进行规范化时,数据进行伸缩其均值和方差也会变化,分子分母相互抵消。