Knowledge Point (KP): BN, LN, IN,GN和SN的异同

本文首先讲解BN[1], LN[2], IN[3], GN[4]和SN[5]的异同,其次讲解BN为何有效的可能原因[6]。


BN、LN、IN、GN和SN的异同
Knowledge Point (KP): BN, LN, IN,GN和SN的异同_第1张图片
参考上图:

  • BN是在batch上,对N,H,W做归一化,对小batchsize效果不好,应优先考虑
  • LN在通道方向上,对C,H,W做归一化,主要用于RNN
  • IN在图像像素上,对H, W做归一化,主要用于风格迁移, GAN
  • GN将通道分组,然后归一化,适合mini-batch很小的情况
  • SN将BN,LN,IN结合,赋予权重,让网络自适应归一化层

基于机器学习领域的一个重要的假设: i i d iid iid假设,即假设训练数据和测试数据是满足相同的分布的,这是通过训练数据集获得的模型能够在测试集上获得好的效果的一个基本保障。

Batch Normalization
那么BN,简单的说,就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同的分布。
Knowledge Point (KP): BN, LN, IN,GN和SN的异同_第2张图片

尽管解决了ICS(ICS与CS是不同的,前者全称为internal covariate shift,是针对网络内部的,后者全称covariate shift,是针对输入数据的)的问题,并获得了很好的效果,比如加速模型收敛,不再依赖精细的参数初始化过程,可以调大学习率,同时引入的随机噪声能够对模型参数进行正则化,有利于增强模型的泛化性能。

但是也有不少问题:

  • 如果batch size太小,则BN效果明显下降
  • 对于有些像素级图片生成任务,效果不佳
  • 不适合RNN等动态网络,不方便且效果不佳
  • 训练时和推理时统计量不一致

Layer Normalization
为了能够在只有当前一个训练实例下,找到一个合理的统计范围,一个直接的想法是:把同一个卷积层作为集合,求均值和方差;对于RNN,就是把同层隐层神经元的响应值(不同时刻)作为集合,再求均值和方差。

Instance Normalization
LN是对所有的通道,那对一个通道做归一化是怎样呢!IN就是这么做的,单个通道的feature map作为集合,并在此集合上求均值和方差,这种像素级上的操作,使得IN对于一些图片生成类的任务效果明显优于BN,比如图片风格转换。

Group Normalization
LN是对于所有的通道,IN是对于单个通道,如果把所有通道分组,再各个组上做归一化又会怎样呢?这就是GN啦。通道分组也是CNN常用的优化技巧。GN在mini-batch比较小的场景或者物体检测、视频分类等场景下效果优于BN。

Switchable Normalization
归一化,虽能提高模型的泛化能力,但BN,LN, IN, GN都是人工设计的,是否可以放开手脚,让网络自适应呢!这是个更加generic的做法。
h ^ n c i j = γ h n c i j − ∑ k ∈ Ω w k μ k ∑ k ∈ Ω w k ′ σ k 2 + ϵ + β \hat{h}_{ncij} = \gamma \frac{h_{ncij} - \sum_{k \in \Omega}w_k \mu_k}{\sqrt{\sum_{k \in \Omega} w_k^{'} \sigma_k^{2} + \epsilon}} + \beta h^ncij=γkΩwkσk2+ϵ hncijkΩwkμk+β

where
w k = e λ k ∑ z ∈ i n , l n , b n e λ 2 , k ∈ i n , l n , b n w_k = \frac{e^{\lambda_k}}{\sum_{z \in {in, ln, bn}} e^{\lambda^2}}, k\in{in, ln, bn} wk=zin,ln,bneλ2eλk,kin,ln,bn
μ i n = 1 H W ∑ i , j H , W h n c i j , σ i n 2 = 1 H W ∑ i , j H , W ( h n c i j − μ i n ) 2 \mu_{in} = \frac{1}{HW} \sum_{i,j}^{H, W} h_{ncij}, \sigma_{in}^{2} = \frac{1}{HW} \sum_{i,j}^{H, W}(h_{ncij} - \mu_{in})^2 μin=HW1i,jH,Whncij,σin2=HW1i,jH,W(hncijμin)2
μ l n = 1 C ∑ c = 1 C μ i n , σ l n 2 = 1 C = ∑ c = 1 C ( σ i n 2 + μ i n 2 ) − μ l n 2 \mu_{ln} = \frac{1}{C} \sum_{c=1}{C} \mu_{in}, \sigma_{ln}^2 = \frac{1}{C} = \sum_{c=1}^{C}(\sigma_{in}^2 +\mu_{in}^2) - \mu_{ln}^2 μln=C1c=1Cμin,σln2=C1=c=1C(σin2+μin2)μln2
μ b n = 1 b n = 1 N ∑ n = 1 N μ i n , σ b n 2 = 1 N ∑ n = 1 N ( σ i n 2 + μ i n 2 ) − μ b n 2 \mu_{bn} = \frac{1}{bn} = \frac{1}{N} \sum_{n=1}^{N} \mu_{in}, \sigma_{bn}^2 = \frac{1}{N} \sum_{n=1}^{N}(\sigma_{in}^2 + \mu_{in}^2) - \mu_{bn}^2 μbn=bn1=N1n=1Nμin,σbn2=N1n=1N(σin2+μin2)μbn2


BN为何有效

原论文里认为,BN可以解决神经网络训练过程中的ICS问题,即由于深度网络是由很多隐层构成,在训练过程中因底层网络参数不断变化,导致上层神经元激活值的分布逐渐发生很大的变化和偏移,而这不利于有效稳定的训练神经网络。(以下是一个有趣的观点,来自[6])

ICS问题在较深的网络中确实普遍存在,但这并非导致深层网络难以训练的根本原因。实验一方面证明:即使应用了BN,网络隐层中的输出仍然存在严重的ICS问题;另一方面也证明:在BN层输出后人工假如噪音模拟ICS现象,并不妨碍BN的表现。因此BN解决了ICS问题可能有点牵强。

那么BN解决了什么?BN的真正用处在于:通过归一化操作,使得网络的参数重整,它对非线性非凸问题复杂的损失曲面有很好的平滑作用,参数重症后的损失曲面比未重整前的参数损失曲面平滑许多。

用L-Lipschitz函数来评估损失平面的平滑程度,L-Lipschitz的函数如下,对于所有的 x 1 x_1 x1 x 2 x_2 x2
∣ f ( x 1 ) − f ( x 2 ) ∣ ≤ L ∣ ∣ x 1 − x 2 ∣ ∣ | f(x_1) - f(x_2)| \le L || x_1 - x_2|| f(x1)f(x2)Lx1x2
直观的理解就是,对于定义区间内的任意取值 x 1 x_1 x1, x 2 x_2 x2,用它们的距离和经过函数映射后的值的距离进行比较,如果存在值 L L L满足上述公式,即函数映射后的距离一定在任意两个 x x x差值的 L L L倍以内。也就意味着, L L L的大小代表了函数曲面的平滑程度, L L L越小曲面越平滑, L L L越大,则曲面越凹凸不平。

因此,归一化通过对激活值进行参数重整,产生参数re-scaling不变的效果,更有利于SGD寻优找到问题的优解。


参考文献
[1] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift, https://arxiv.org/abs/1502.03167 [2015]
[2] Layer Normalization, https://arxiv.org/pdf/1607.06450v1.pdf [2016]
[3] Instance Normalization: The Missing Ingredient for Fast Stylization, https://arxiv.org/pdf/1607.08022.pdf [2017]
[4] Group Normalization, https://arxiv.org/pdf/1803.08494.pdf [2018]
[5] Differentiable Learning to Normalize via Switchable Normalization, https://arxiv.org/pdf/1806.10779.pdf [2018]
[6] https://zhuanlan.zhihu.com/p/43200897
[7] https://blog.csdn.net/liuxiao214/article/details/81037416

你可能感兴趣的:(Go,knowledge,point)