独立同分布(iit)的数据可以简化常规机器学习模型的训练、提升机器学习模型的预测能力,因此,在把数据喂给机器学习模型之前,“白化(whitening)”是一个重要的数据预处理步骤。白化一般包含两个目的:
(1)去除特征之间的相关性 —— 独立;
(2)使得所有特征具有相同的均值和方差 —— 同分布。
白化最典型的方法就是PCA。
对于神经网络的各层输出,由于它们经过了层内操作作用,其分布显然与各层对应的输入信号分布不同(但条件概率相同),而且差异会随着网络深度增大而增大,但是label不变,这就是ICS(Internal Covariate Shift),ICS会导致收敛速度下降。
(1)BN的公式
批量归一化实质是在mini-batch上做normalization,且针对的是单个维度。在上图所示的公式中——
m是mini-batch的大小,一般情况下,m的规模越大,归一化的效果越好;
eps默认1e-5,目的是避免方差为0;
γ和β是可学习的参数,分别表示缩放和平移,输入的x则是均值为0,方差为1的标准分布,经过缩放、平移后(均值为β,方差为γ2),能够允许BN层做identity transformation(论文中的表达,实际上输入和输出不会完全一样),保证网络模型的学习能力。
(2)在训练和推理时的区别
从上述算法可以看到,训练的时候每次迭代都要计算新的均值方差,但是推理的时候我们可能没那么多数据,这时BN用的均值和方差是固定的常量(这个常量是在模型训练时每次迭代通过移动平均法更新的全局量)。
moving_mean = moving_mean * momentum + mean * (1 - momentum);
moving_var = moving_var * momentum + var * (1 - momentum);
paper采用无偏估计来表示Var[x]。见无偏估计的推导。
(3)在batch上做normalization的作用
训练的时候为了模型稳定,需要在当前batch中维持隐藏层激活值的稳定,因此不用考虑别的数据,而且不同mini-batch间的均值和方差可能有一点差别,这个差别实际上能够增加模型鲁棒性,一定程度上减少过拟合。
然而当mini-batch间分布差别较大时,模型的训练难度就会提升,这也就是为什么m越大越好的原因。
针对时序模型,如RNN,BN的表现不太好。
针对上述的BN的不足之处,LN提出了考虑隐藏层整层的所有维度输入。
(1)LN针对单个训练样本进行,不依赖于其他数据,同一层的hidden units共享相同的均值和方差,因此可以避免BN中受mini-batch间数据分布差异的影响,这样LN就与batch size无关了;
(2)在小的batch size上效果可能会比BN好,但是大的batch size的话还是BN效果好;
(4)LN对于一整层的训练得到同一个转换——所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别(比如颜色和大小),那么LN的处理可能会降低模型的表达能力。
BN、LN、IN、GN都是对输入数据X的规范化,而WN提出对权重进行规范化。
举个例子,对Alg. 2最后得到y,之后需要进行的线性变换 f ( y ) = w ∗ y f(y)=w*y f(y)=w∗y,其中w就是需要规范化的权重,其实本质上都是对数据的规范化。
BN注重对mini-batch归一化,但是在图像风格化任务中,生成的风格结果主要依赖于某个图像实例,所以对整个batch数据进行归一化是不合适的,因而提出了只对HW维度进行归一化。(GAN中表现很好)
IN和LN非常相似,但有一些细微的差异。IN应用于某个如RGB图像的每个通道数据,但LN通常应用于整个样本,且一般应用于NLP任务。此外,LayerNorm会进行affine变换(γ、β),而IN通常不进行该变换。
GN先对通道进行分组,每个组内的所有C、W、H维度求均值和方差进行规范化,与batch size无关。
不能简单的将GN应用到之前使用BN的模型中。(许多SOTA的模型和BN联系紧密,需要重新设计模型或寻找更适合的超参数)
https://zhuanlan.zhihu.com/p/115949091
https://zhuanlan.zhihu.com/p/33173246
https://arxiv.org/pdf/1502.03167.pdf
https://arxiv.org/pdf/1607.06450v1.pdf
https://arxiv.org/pdf/1803.08494.pdf