「深度学习」常见normalization方法原理及对比
0x00 标准化与归一化
这一节与本文要重点介绍的 normalization 无关,只是为了区别这两个概念。
1. 关于二者在概念上的勘误
网上各种资料,抄来抄去,而在于大家讨论的概念内涵不统一,导致 “标准化” (standardization) 和 “归一化” (normalization) 这两个词长期被混用并被传播。
根据维基百科 Feature scaling - Wikipedia ,”标准化”和”归一化”这两个中文词指代的是四种 Feature scaling (特征缩放)方法:
Rescaling (min-max normalization) :
$$x’ = \frac{x - min(x)}{max(x) - min(x)}$$
Mean normalization :
$$x’ = \frac{x - mean(x)}{max(x) - min(x)}$$
Standardization (Z-score normalization) :
$$x’ = \frac{x - \bar{x} }{\sigma}$$
Scaling to unit length :
$$x’ = \frac{x}{||x||}$$
也就是说,标准化实际上是的一种方式,标准化(standardization)也叫做 Z-score 归一化(Z-score Normalization)。
因而我们可以认为,归一化和标准化都是对数据做变换的方式,能够将原始的一列数据转换到某个范围,或者某种形态,具体的:
归一化(Normalization):将数据变换到某个固定区间(范围)中。通常情况下,这个区间是[0, 1]。
$$x’ = \frac{x - min(x)}{max(x) - min(x)}$$
广义的讲,可以是各种区间,比如映射到[0,1]一样可以继续映射到其他范围,图像中可能会映射到[0,255],其他情况可能映射到[-1,1];
标准化(Standardization):将数据变换为均值为0,标准差为1的分布。
$$x’ = \frac{x - \bar{x} }{\sigma}$$
切记,标准化后的数据分布并非一定是正态的。因为标准化只是把数据的均值和方差缩放到了0和1,但并不改变原始数据的分布,更不可能直接就成了标准正态分布,除非原始数据就遵循正态分布。
中心化:另外,还有一种处理叫做中心化,也叫零均值处理,就是将每个原始数据减去这些数据的均值。
2. 二者的区别与联系
本质上说,标准化和归一化都是对数据的线性变换。
区别在于,归一化会使得那些扁平分布的数据伸缩变换成类圆形,这就改变了原始数据的分布。而标准化把特征的各个维度标准化到特定的区间,使得不同度量之间的特征具有可比性,同时不改变原始数据的分布。
我们后文中提到的 Normalization ,实际上均为 Z-score Normalization ,即标准化操作,注意不要混淆即可。
0x01 为什么需要 Normalization ?
1. 深度学习中的 Internal Covariate Shift 问题及其影响
深度神经网络模型的训练为什么会很困难?其中一个重要的原因是,深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。
为了训好模型,我们需要非常谨慎地去设定学习率、初始化权重、以及尽可能细致的参数更新策略。
Google 将这一现象总结为 Internal Covariate Shift,简称 ICS.
那 ICS 会导致什么问题?
- 其一,上层参数需要不断适应新的输入数据分布,降低学习速度。
- 其二,下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。
- 其三,每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。
2. Normalization 的目的
为了解决 ICS 问题,在数据分析之前,我们通常需要先将数据标准化,利用标准化后的数据进行数据分析。
数据标准化处理主要包括数据同趋化处理和无量纲化处理两个方面:
数据同趋化处理主要解决不同性质数据问题。
对不同性质指标直接加总不能正确反映不同作用力的综合结果,须先考虑改变逆指标的数据性质,使所有指标对测评方案的作用力同趋化,再加总才能得出正确结果。
数据无量纲化处理主要解决数据的可比性问题。
经过标准化处理,原始数据均转换为无量纲化指标,即各指标值都处于同一个数量级上,可以进行综合测评分析。
也就说数据标准化(normalization)处理的目的是:
把特征的各个维度标准化到特定的区间
把有量纲表达式变为无量纲表达式
3. Normalization 的好处
数据标准化(normalization)处理有两个好处:
加快基于梯度下降法模型的收敛速度
如果特征的各个维度的取值范围不同,那么目标函数的等线很可能是一组椭圆,各个特征的取值范围差别越大,椭圆等高线会更加狭长。由于梯度方向垂直于等高线方向,因而这时优化路线会较为曲折,这样迭代会很慢(左图)。
相比之下,如果特征的各个维度取值范围相近,那么目标函数很可能很接近一组于正圆,因而优化路线就会较为直接,迭代就会很快(右图)。
如上图,x1的取值为0-2000,而x2的取值为1-5,假如只有这两个特征,对其进行优化时,会得到一个窄长的椭圆形,导致在梯度下降时,梯度的方向为垂直等高线的方向而走之字形路线,这样会使迭代很慢,相比之下,右图的迭代就很快。
提升模型的精度
在多指标评价体系中,由于各评价指标的性质不同,通常具有不同的量纲和量级。当各指标间的水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。因此,为了保证结果的可靠性,需要对原始指标数据进行标准化处理。
因而,Normalization 十分有必要,它可以让各个特征对结果做出的贡献相同。
0x02 Normalization 究竟在做什么?
Normalization 的通用框架与基本思想
深度神经网络中主要有两类实体:神经元和连接神经元的边,所以按照 normalization 涉及对象的不同可以分为两大类:
一类是对第 $L$ 层每个神经元的激活值或者说对于第 $L+1$ 层网络神经元的输入值进行 normalization 操作,比如 Batch Norm/Layer Norm/Instance Norm/Group Norm/Switchable Norm 等方法都属于这一类;
另外一类是对神经网络中连接相邻隐层神经元之间的边上的权重进行 normalization 操作,比如 Weight Norm 就属于这一类。
广义上讲,机器学习中在损失函数里加入的对参数的L1/L2正则项,也属于第二类标准化操作。
- L1正则的规范化目标是造成参数的稀疏化,就是争取达到让大量参数值取得0值的效果;
- 而L2正则的规范化目标是有效减小原始参数值的大小。
对于第一类 normalization 操作,就像激活函数层、卷积层、全连接层、池化层一样,normalization 也属于网络的一层,作用是将神经元的激活值规整为均值为0,方差为1的标准分布。
即不论哪种 normalization 方法,规范化函数统一都是如下形式:
$$\tau = \frac{a_i - \mu}{\sigma}$$
$$a_i^{norm} = \gamma_i \cdot \tau + \beta_i $$
其中,$\gamma$ 和 $\beta$ 分别被称为缩放和平移变量。
那为什么要引入 $\gamma$ 和 $\beta$ 这两个变量呢?
打个比方,比如网络中间某一层学习到特征数据本身就分布在S型激活函数的两侧,但你强制把数据的均值和标准差归一化处理到0和1,这就把数据分布变换到了s函数的中间部分,相当于这一层网络所学习到的特征分布被破坏了。
通过引入 $\gamma$ 和 $\beta$ 这两个可学习参数,保证了每一次数据经过归一化后还能保留原来学习到的特征,同时又能完成归一化操作。
本文重点介绍第一类 normalization 操作。
0x03 常见 Normalization 方法原理及对比
上一节我们提炼出了 normalization 的通用公式:
$$a_i^{norm} = \gamma_i \cdot \frac{a_i - \mu}{\sigma} + \beta_i$$
在这一节,我们将介绍并对比几个主流的 normalization 方法:Batch Normalization(2015年)、Layer Normalization(2016年)、Instance Normalization(2017年)、Group Normalization(2018年)、Switchable Normalization(2018年);
如果将输入图像的 shape 记为 [N, C, H, W]
,这几个方法主要的区别在于归一化所作用的神经元集合 S 不同。
为什么这些Normalization需要确定一个神经元集合S呢?
原因很简单,均值和方差是个统计指标,要计算这两个指标一定是在一个集合范围内才可行,这就要求必须指定一个神经元组成的集合,利用这个集合里每个神经元的激活来统计出所需的均值和方差,才能进一步归一化。
下面我们一一介绍。
1. Batch Normalization
MLP中的BN
在前向传播网络中,BN针对的是某个神经元,即输入数据的某一特征维度,对应 NxE 中的某一列 Nx1。
假设某个batch包含n个sample,那么每个实例在神经元k都会产生一个激活值,BN就是针对这n个激活值进行 normalization 的,如下图:

CNN中的BN
我们知道,CNN中的核心结构为卷积层,假设每个卷积层有m个卷积核,那么输出图像的通道数即为m。对于第 i 个卷积核,它的输入为三维图像 [H, W, C] ,输出激活值为二维平面 [H, W, 1] ,对应输出图像的第 i 个通道,如下图。

在卷积层中,BN针对的是某个卷积核,即输入图像的某个通道。
由于每个实例在通道k都会产生一个二维激活平面 HxW ,那么 n 个实例在这个卷积核将产生 n 个这样的平面,BN 就是针对这 N 个二维平面进行 normalization 的,如下图。

看起来似乎有些复杂,但实际上,它和MLP的区别仅在于,MLP中神经元的输入输出都是一个数值,而CNN中卷积核的输入输出都是一个二维平面。
BN公式
BN针对的是某一隐藏层的某个神经元来说的,假设一个 batch 有 m 个实例,那我们就在这 m 个实例上做如下过程:

实际上,和前面抽象出的通用公式别无二异。
BN 存在的问题
- 对 batch size 大小比较敏感。如果size太小,计算的均值、方差不足以代表整个数据分布,会大大影响结果。
- 在图片风格转换等应用场景,使用BN会带来负面效果。这很可能是因为BN在 Batch 内多张无关的图片之间计算统计量,弱化了单张图片本身特有的一些细节信息。
- RNN等动态网络使用BN效果不佳且使用起来不方便。这是因为对于RNN来说,输入的Sequence序列是不定长的,这会使的BN得到的size不稳定,结果可信度下降。
上面所列BN的缺点,其实深入思考,都指向了幕后同一个黑手:
- 即BN要求计算统计量的时候必须在同一个 Batch 内的实例之间进行统计,这就形成了Batch内实例之间的相互依赖和影响的关系。
那如何从根本上解决这些问题?一个自然的想法是:转换统计集合范围。
- 在统计均值方差的时候,不依赖Batch内数据,只用当前处理的单个训练数据来获得均值方差的统计量,这样因为不再依赖Batch内其它训练数据,那么就不存在因为Batch约束导致的问题。在BN后的几乎所有改进模型都是在这个指导思想下进行的。
2. Layer Normalization
为了解决BN对size敏感的问题,我们完全可以直接用同一隐藏层的神经元的响应值作为集合S的范围来求均值和方差,这就是Layer Normalization的基本思想。
MLP中的LN
在前向传播网络中,LN针对的是某个实例的所有特征,即 NxE 中的某一行 1xE 。

CNN中的LN
在卷积层中,LN针对的是该层的所有卷积核,即输入图像的所有通道。
对每个实例来说,n个卷积核将产生n个通道,即n个二维激活屏幕 HxW,LN 就是针对这 n 个二维平面进行 normalization 的,如下图。

RNN中的LN
不再赘述。

LN公式
LN针对的是某一隐藏层的所有神经元的输入,假设有 H 个神经元(对应H个特征或H个通道),按以下公式进行 normalization 操作:

LN与BN的区别
Batch Normalization 是以batch为单位计算归一化统计量;
Layer Normalization 则是对同一个样本的所有特征做归一化统计量,它是一个独立于batch size的算法,针对网络中某一层的所有神经元的输入进行归一。

3. Instance Normalization
Layer Normalization 为了能够抛开对 Mini-Batch 的依赖,很自然地把同层内所有神经元的响应值作为统计范围,那么我们能否进一步将统计范围缩小?对于CNN来说是显而易见的。
因为同一个卷积层内每个卷积核会产生一个输出通道,而每个输出通道是一个二维平面,也包含多个激活神经元,自然可以进一步把统计范围缩小到单个卷积核对应的输出通道内部。
CNN中的IN
下图展示了CNN中的 Instance Normalization。

对于图中某个卷积层来说,每个输出通道内的神经元会作为集合S来统计均值方差。
对于RNN或者MLP,如果在同一个隐藏层类似CNN这样缩小范围,那么就只剩下单独一个神经元,输出也是单值而非CNN的二维平面,这意味着没有形成集合S,所以RNN和MLP是无法进行Instance Normalization操作的,这个很好理解。
IN公式

其中,[t, i, j, k] 分别代表 [N, C, H, W] ,$\mu_{ti}$ 与 $\sigma_{ti}^2$ 均代表一个二维矩阵。
IN与BN的区别
我们回想下CNN中的BN,针对的是相同通道进行 normalization。也就是说,看上去,IN 就像是 BN 的一种 batch size = 1
的特例情况。
- BN适用于判别模型中,比如图片分类模型。因为BN注重对每个batch进行归一化,从而保证数据分布的一致性,而判别模型的结果正是取决于数据整体分布。
- IN适用于生成模型中,比如图片风格迁移。因为图片生成的结果主要依赖于某个图像实例,所以对整个batch归一化不适合图像风格化中,在风格迁移中使用Instance Normalization不仅可以加速模型收敛,并且可以保持每个图像实例之间的独立。
4. Group Normalization
从前面的 Layer Normalization 和 Instance Normalization 的过程可以看出,这是两种极端情况:
- LN 是将同一层所有神经元作为统计范围;
- IN 则是将同一卷积层中每个卷积核对应的输出通道单独作为自己的统计范围。
那么,有没有介于两者之间的统计范围呢?
我们自然而然会想到对某一卷积层的所有输出通道进行分组,并在分组范围内分别进行统计,这就是Group Normalization的核心思想。
CNN中的GN
下图展示了CNN中的 Group Normalization。
GN公式

Group Normalization在要求Batch Size比较小的场景下或者物体检测/视频分类等应用场景下效果是优于BN的。
第一类 Normalization 方法对比
我们将输入图像的 shape 记为 [N, C, H, W],这四种方法的区别如下图所示:

为了方便表示,我们将 H,W 压缩到一维,上图中一个竖列代表一张图片。
- Batch Norm:在N张图片的相同通道上,对batch进行Normalization,共进行C次。
- Layer Norm:在一张图片的所有通道上,对通道方向进行Normalization,共进行N次。
- Instance Norm:在一张图片的一个通道上,对单张图像进行Normalization,共进行NxC次。
- Group Norm:将通道分组,并在单张图片的每一组内,对通道方向进行Normalization,共进行Nx~次。
5. Weight Normalization
参考这篇文章。
0x04 参考文章
[1] Normalization
[3] 详解深度学习中的Normalization,BN/LN/WN
[4] Batch Normalization和Layer Normalization的对比分析
[5] BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm、SwitchableNorm总结