深度学习中各种Normalization

为什么需要Normalization

独立同分布与白化

独立同分布并非所有机器学习模型的必然要求(比如Naive Bayes 模型就建立在特征彼此独立的基础之上,而Logistic Regression和神经网络则在非独立的特征数据上依然可以训练出很好的模型),但独立同分布的数据可以简化常规机器学习模型的训练,提升机器学习模型的预测能力,这已经是一个共识了。

在把数据喂给机器学习模型之前,白化(whitening)是一个重要的数据预处理步骤,白化一般包含两个目的:
(1)去除特征之间的相关性——>独立;
(2)使得所有特征具有相同的均值和方差——>同分布

白化最经典的方法就是PCA.

深度学习中的Internal Covariate Shift

深度神经网络模型的训练为什么会很困难?其中一个重要的原因是,深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上一层输入数据分布发生变化,通过层层叠加,高层的输入分布会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。
Google 将这一现象总结为Internal Covariate Shift.(ICS)

在统计机器学习中的一个经典假设是”源空间”和目标空间的数据分布是一致的。如果不一致,那就会出现新的机器学习问题,如transfer learning、domain adaptation等。

而covariate shift就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件概率是一致的,但其边缘概率不同,即:对所有x∈X

但是$P_s(X)≠P_t(X)$
大家细想便会发现,的确,对于神经网络的各层输出,由于他们经过了层内操作作用,各层的输入信号的分布显然不同,而且差异会随着网络深度增大而增大,可是他们所能”指示”的样本标记(label)仍然是不变的,这便符合了covariate shift的定义。

简而言之,每个神经元的输入数据不再是”独立同分布”

  1. 上层参数需要不断适应新的输入数据分布,降低了学习速度
  2. 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止
  3. 每层的更新都会影响到其他层,因此每层的参数更新策略需要尽可能谨慎

解决方法

通用框架

在将X送给神经元之前,先对其做平移和伸缩变换,将x的分布规范化成在固定区间范围的标准分布。
通用变换框架如下所示:

其中
(1)\mu是平移参数,\sigma是缩放参数。通过这两个参数进行shift和scale变换:

得到的数据符合均值为0、方差为1的标准分布
(2)b是再平移参数,g是再缩放参数。将上一步得到的$\hat{x}$进一步变换为:

最终得到的数据符合均值为b、方差为$g^2$的分布

再变换的目的

  1. 第一次变换得到均值为0、方差为1的标准分布,表达能力有限,下层神经元可能很努力地在学习,但不论其如何变化,其输出地结果在交给上层神经元进行处理之前,将被粗暴地重新调整到这一固定范围。为了更好的应用底层神经网络的学习结果,我们将规范化后的数据进行再平移和再缩放,使得每个神经元对应的输入范围是针对该神经元量身定制的一个确定范围(均值为b、方差为$g^2$).rescale和reshift的参数都是可学习的,这就使得Normalization层可以学习如何去适应底层的学习结果
  2. 除了充分利用底层学习的能力,另一方面的重要意义在于保证获得非线性的表达能力。Sigmoid等激活函数在神经网络中有着重要作用,通过区分饱和区和非饱和区,使得神经网络的数据变换具有了非线性计算能力。而第一步的规范化会将几乎所有数据映射到激活函数的非饱和区(线性区),仅利用到了线性变换的能力,从而降低了神经网络的表达能力。而进行在变化,则可将数据从线性区变换到非线性区,恢复模型的表达能力

主流Normalization

Norm
从左到右一次是BN,LN,IN,GN 众所周知,深度网络中的数据维度一般是[N, C, H, W]或者[N, H, W,C]格式,N是batch size,H/W是feature的高/宽,C是feature的channel,压缩H/W至一个维度,其三维的表示如上图!
四种Normalization的工作方式:

  • BN主要在Batch的维度上Norm,归一化维度为[N,H,W],对batch中对应的channel归一化;
  • LN避开了batch维度,归一化的维度为[C,H,W];
  • IN归一化的维度为[H,W]
  • 而GN介于LN与IN之间,其首先将channel分为许多组(group),对每一组做归一化,及先将feature的维度由[N,C,H,W]reshape为[N,G,C//G,H,W],归一化的维度为[C//G,H,W]

BN的问题

BN是在batch这个维度上的Normalization,但是这个维度并不是固定不变的,比如训练和测试时一般不一样,一般都是训练的时候在训练集上通过滑动平均,预先计算好均值mean和方差variance,在测试的时候不再计算这些值,而是直接调用这些预先计算好的平均mean和方差variance参数。但是,当训练数据和测试数据分布有差别时,训练时预计算好的数据并不能代表测试数据,这就导致在训练,验证,测试这三个阶段存在inconsistency。

此外过小的batchsize会导致其性能下降,一般来说每GPU上batch设为32最合适,但是对于一些其他深度学习任务batchsize往往只有1-2,比如目标检测,图像分割,视频分类上,输入的图像数据很大,较大的batchsize显存吃不消。

明确了问题,解决时就考虑在归一化的时候避开batch这个维度是不是可行呢,于是就出现了layer normalization和instance normalization等工作。

Layer Normalization

LN针对单个训练样本进行,不依赖于其他数据,因此可以避免BN中受mini-batch数据分布影响问题,可以用于小mini-batch场景,动态网络场景和RNN,特别是自然语言处理领域。此外,LN不需要保存mini-batch的均值和方差,节省了额外的存储空间

但是,BN的转换是针对单个神经元可训练的——不同神经元的输入经过再平移和再放缩后分布在不同的区间,而LN对于一整层的神经元训练得到同一个转换——所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别(比如颜色和大小),那么LN的处理可能会降低模型的表达能力。

Instance Normalization

在GAN和style transfer的任务中,目前的IN normalization要好于BN,IN主要用于对单张图像的数据做处理,而BN主要对Batch的数据做处理。由于BN在训练时每个batch的均值和方差会由于shuffle都会改变,所以可以理解为一种数据增强,而IN可以理解为对数据做一个归一化的操作。

换句话说,BN的计算是要受其他样本影响的,由于每个batch的均值和标准差不稳定,对于单个数据而言,相对于是引入了噪声,但在分类这种问题上,结果和数据的整体分布有关系,因此需要通过BN获得数据的整体分布。而Instance norm得信息都是来自于自身得图片,相当于对全局信息做了一次整合和调整,在图像转换这种问题上,BN获得的整体信息不会带来任何收益,带来的噪声反而会弱化实例之间的独立性:这类生成式方法每张图片自己的风格比较独立不应该与batch中其他的样本产生太大联系

Group Normalization

group normalization优化了BN在较小的mini-batch情况下表现不太好的劣质。批量维度进行归一化会带来一些问题——批量统计估算不准确导致批量变小时,BN的误差会迅速增加。在训练大型网络和将特征转移到计算机视觉任务中(包括检测、分割和视频),内存消耗限制了只能使用小批量的BN.事实上,GN的极端情况就是LN和IN

在深度学习没有火起来之前,提取特征通常是使用SIFT,HOG和GIST特征,这些特征有一个共性,都具有按group表示的特性,每一个group由相同种类直方图的构建而成,这些特征通常是对在每个直方图(histogram)或每个方向(orientation)上进行组归一化(group-wise norm)而得到。

从深度学习上来讲,完全可以认为卷积提取的特征是一种非结构化的特征或者向量,拿网络的第一层卷积为例,卷积层中的的卷积核filter1和此卷积核的其他经过transform过的版本filter2(transform可以是horizontal flipping等),在同一张图像上学习到的特征应该是具有相同的分布,那么,具有相同的特征可以被分到同一个group中,按照个人理解,每一层有很多的卷积核,这些核学习到的特征并不完全是独立的,某些特征具有相同的分布,因此可以被group。

References

1.『计算机视觉』各种Normalization层辨析

-------------本文结束感谢您的阅读-------------