本文首先讲解BN[1], LN[2], IN[3], GN[4]和SN[5]的异同,其次讲解BN为何有效的可能原因[6]。
BN、LN、IN、GN和SN的异同
参考上图:
- 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,简单的说,就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同的分布。
尽管解决了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+ϵhncij−∑k∈Ωwkμk