如何区分并记住常见的几种 Normalization 算法
文章目录
1.为什么要用归一化操作
1.1 内部协变量偏移(Internal Covariate Shift)
在介绍归一化操作之前,我们需要了解什么是内部协变量偏移。首先,协变量偏移是数据分布不一致的一种表现。已知贝叶斯公式:
p ( x , y ) = p ( x ∣ y ) p ( y ) = p ( y ∣ x ) p ( x ) p(\mathbf{x},y)=p(\mathbf{x}|y)p(y)=p(y|\mathbf{x})p(\mathbf{x}) p(x,y)=p(x∣y)p(y)=p(y∣x)p(x)
所谓协变量偏移指的是:源域和目标域的输入边际分布不同 p S ( x ) ≠ p T ( x ) p_S(\mathbf{x})≠p_T(\mathbf{x}) pS(x)=pT(x),但两者的后验分布相同 p S ( y ∣ x ) = p T ( y ∣ x ) p_S(y|\mathbf{x})=p_T(y|\mathbf{x}) pS(y∣x)=pT(y∣x),即学习任务相同。
而在深度神经网络中,中间某一层的输入是其之前的神经层的输出。因此,其之前的神经层的参数变化会导致其输入的分布发生较大的差异。在使用随机梯度下降来训练网络时,每次参数更新都会导致网络中间每一层的输入的分布发生改变。 越深的层,其输入的分布会改变得越明显。就像一栋高楼,低楼层发生一个较小的偏移,都会导致高楼层较大的偏移。
从机器学习的角度来看,如果某一层网络的输入的分布发生了变化,那么其参数就需要重新学习,我们将这种现象称为内部协变量偏移。归一化方法的引入可以使得每一个神经层的输入的分布在训练过程中保持一致。
1.2 梯度弥散
梯度弥散指的是,梯度在反向传播过程中由于网络太深或者网络激活值位于激活函数的饱和区而消失,深层的梯度无法顺利传播到神经网络的浅层,进而导致神经网络无法正常训练。

如上图常用的sigmoid激活函数,虚线为导数。当函数输入位于饱和区(函数值趋近于0或者1)时,梯度将接近为0。
那么如何解决这一现象呢?
- 一种做法是在网络的结构上做文章,例如ResNet中引入了跨层连接,梯度可以通过跨层连接传入底层网络层;
- 另一种做法就是将激活函数的输入限制在非饱和区。

通过使用归一化操作便可以达到这一目的。对网络层的输入进行归一化后,输入的数值便被限制在较小的区间进而保证了输入不会进入激活函数的饱和区。但是,直接将网络层的净输入归一化到[−1,1]区间会使得激活函数的取值区间限制在线性变换区间内,减弱了神经网络的非线性性质。因此,为了使得归一化不对网络的表示能力造成负面影响,可以通过一个附加的缩放和平移变换改变取值区间。
2. 神经网络中常见的归一化方法
神经网络中有各种归一化算法:Batch Normalization (BN)、Layer Normalization (LN)、Instance Normalization (IN)、Group Normalization (GN)。从公式看它们都差不多,如下述公式所示:无非是计算出均值方差,然后减去均值,除以标准差,再施以线性映射。
y = γ ( x − μ ( x ) σ ( x ) ) + β y=\gamma(\frac{x-\mu(x)}{\sigma(x)})+\beta y=γ(σ(x)x−μ(x))+β
上述这些归一化算法的主要区别在于操作的 feature map 维度不同。如何区分并记住它们,一直是件令人头疼的事。本文目的不是介绍各种归一化方式在理论层面的原理或应用场景,而是结合 pytorch 代码,介绍它们的具体操作,并给出一个方便记忆的类比。
2.1 Batch Normalization
Batch Normalization (BN) 是最早出现的,对于卷积神经网络通常也是效果最好的归一化方式。feature map的维度为:
x ∈ R N × C × H × W x\in \mathbb{R}^{N\times C\times H \times W} x∈RN×C×H×W
包含N个样本,每个样本通道数为C,高为H,宽为W。对其求均值和方差时,将在 N、H、W上操作,而保留通道 C 的维度。具体来说,就是把第1个样本的第1个通道,加上第2个样本第1个通道 … 加上第 N 个样本第1个通道,求平均,得到通道 1 的均值(注意是除以 N×H×W 而不是单纯除以 N,最后得到的是一个代表这个 batch 第1个通道平均值的数字,而不是一个 H×W 的矩阵)。求通道 1 的方差也是同理。对所有通道都施加一遍这个操作,就得到了所有通道的均值和方差。对于任意一个通道 c ∈ C c\in C c∈C,均值方差的具体计算公式为:
μ c ( x ) = 1 N H W ∑ n = 1 N ∑ h = 1 H ∑ w = 1 W x n c h w \mu_c(x)=\frac{1}{NHW}\sum_{n=1}^{N}\sum_{h=1}^{H}\sum_{w=1}^{W}x_{nchw} μc(x)=NHW1n=1∑Nh=1∑Hw=1∑Wxnchw
σ ( x ) = 1 N H W ∑ n = 1 N ∑ h = 1 H ∑ w = 1 W ( x n c h w − μ c ( x ) ) 2 + ϵ \sigma(x)=\sqrt{\frac{1}{NHW}\sum_{n=1}^{N}\sum_{h=1}^{H}\sum_{w=1}^{W}(x_{nchw}-\mu_c(x))^2+\epsilon} σ(x)=NHW1n=1∑Nh=1∑Hw=1∑W(xnchw−μc(x))2+ϵ