
这些年来,提出了几个normalization的方法,这里做一个总结。主要包括以下几个:
- Batch Normalization
- Layer Normalization
- Instance Normalization
- Group Normalization
先提出一个问题:
internal covariate shift
指的是,神经网络的层层叠加,每一层的输入依靠上一层的输出。当层数过高时,底层的微小的变化会导致高层输入的差异很大,使得高层的输入分布会发生非常剧烈的变化,这使得高层需要不断适应这种数据输入分布的变化。
简单的处理方式就是,对每一层的数据进行一个转换,使得他们能够在一个区间之间。
$$
h = f\left (g \cdot\frac{x-\mu}{\sigma} + b \right )
$$
$\mu$是平移参数(shift parameter)
$\sigma$是缩放参数(scale parameter)
通过这两个参数进行 shift 和 scale 变换。使得数据分布满足均值为0,方差为1。 但是如果只有这样的话,模型的表达能力有限,非线性拟合能力就会下降,这样一来,作者引入了两个新的参数$g,b$来提高模型的线性拟合能力。这两个参数是模型学习得到的。
$g$ 进行再缩放(re-scale parameter)
$b$进行再平移(re-shift parameter)
最终得到的数据符合均值为 $b$ 、方差为 $g^2$ 的分布。
如何理解”模型的表达能力有限,非线性拟合能力下降”?
对于一些激活函数,例如 sigmoid函数,它的激活可以分为饱和区和非饱和区,如果仅有第一步的缩放,那么数据都会在sigmoid的非饱和区间,这时候,只有模型只有线性表达能力,这样一来就降低了模型的表达能力。如果再进行一次缩放平移,数据就会映射到饱和区域,这样一来,就又有了非线性表达能力。
虽然论文说BN解决了ICS,但是有人提出来说,没有证据表明BN解决了它。反而,有人提出,BN解决的是梯度弥散问题(消失或者爆炸),他做到了优化空间变得平滑。
BN存在的问题:
- batchsize减小的话,效果不好
- 对于像素级的图像生成,效果不好
- RNN使用不便
- 训练时和推理时统计量不一致
BatchNorm:batch方向做归一化,算$N\times H \times W$的均值
LayerNorm:channel方向做归一化,算$C\times H\times W$的均值
BN在RNN中用起来很不方便,而Layer Normalization这种在同隐层内计算统计量的模式就比较符合RNN这种动态网络,目前在RNN中貌似也只有LayerNorm相对有效,但Layer Normalization目前看好像也只适合应用在RNN场景下,在CNN等环境下效果是不如BatchNorm或者GroupNorm等模型的。
InstanceNorm:一个channel内做归一化,算$H\times W$的均值
对于RNN或者MLP,如果在同一个隐层类似CNN这样缩小范围,那么就只剩下单独一个神经元,输出也是单值而非CNN的二维平面,这意味着没有形成集合S,所以RNN和MLP是无法进行Instance Normalization操作的,这个很好理解。
GroupNorm:将channel方向分group,然后每个group内做归一化,算$ (C//G) \times H \times W$ 的均值
通道分组是CNN常用的模型优化技巧,所以自然而然会想到对CNN中某一层卷积层的输出或者输入通道进行分组,在分组范围内进行统计。这就是Group Normalization的核心思想,是Facebook何凯明研究组2017年提出的改进模型。理论上MLP和RNN也可以引入这种模式,但是还没有看到相关研究,不过从道理上考虑,MLP和RNN这么做的话,分组内包含神经元太少,估计缺乏统计有效性,猜测效果不会太好。