深度学习之归一化:BN、LN、GN、IN、SPADE
参考:
知乎:深度学习之9逐层归一化(BN,LN)——做大饼馅儿的韭菜
知乎:数据的归一化操作——幻风
知乎:【动手学计算机视觉】第十三讲:批量归一化——Jackpop
知乎:模型优化之Layer Normalization——大师兄
知乎:从Style的角度理解Instance Normalization——in rainbows
知乎:SPADE 论文阅读–Semantic Image Synthesis with Spatially-Adaptive Normalization——圆圆要学习
0.总述
0.1.为什么要归一化处理
数据的归一化操作是数据处理的一项基础性工作,在一些实际问题中,我们得到的样本数据都是多个维度的,即一个样本是用多个特征来表示的,数据样本的不同特征可能会有不同的尺度,这样的情况会影响到数据分析的结果。为了解决这个问题,需要进行数据归一化处理。原始数据经过数据归一化后,各特征处于同一数量级,适合进行综合对比评价。我们可以将归一化操作进行可视化
首先我们需要知道的是神经网络的训练速度是由梯度下降算法的速度决定的,只要梯度下降的速度变快,那么神经网络的训练速度也会相应的变快。所以为了解释这个问题,我们从损失函数梯度下降的角度来分析这个问题。假如我们的样本只有两个特征x1、x2,这两个特征尺度相差很大,假设特征X1区间是[0,2000],而X2区间是[1,5],我们不对其进行归一化处理,我们针对这两个特征设计机器学习算法,然后我们画出它的损失函数的图像,如下图所示
红色的圈代表的是两个特征的等高线。因为两个特征X1和X2的区间相差非常大,其所形成的等高线为长椭圆形,非常尖。使用梯度下降法寻求最优解的过程也就是在寻找使得损失函数值最小的 参数θ1,θ2,当数据没有归一化的时候,梯度下降很有可能走之字型路线(它会垂直等高线走,因为梯度的方向与等高线切线方向垂直),因为梯度下降路线波动很大,从而导致需要迭代很多次才能收敛,这就是非归一化操作的神经网络训练速度慢的直观体现。现在我们对训练集数据进行归一化处理,此时我们画出损失函数的图像,如下所示
而数据归一化后,损失函数变量θ前面的系数差距已不大,这样的话,图像的等高面近似圆形,此时求解得到的梯度方向更能直指圆心,在梯度下降进行求解时能较快的收敛,效率也就更高了,这样神经网络的训练速度也会相应加快。这就是数据归一化操作加快神经网络训练速度的直观体现,因此如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则收敛速度会很慢,甚至不能收敛。
神经网络都是多层结构,上一层 的输出即为下一层的输入,所以即使输入数据做了归一化,由于经过了线性变换以及激活函数,下一层的输入在取值范围可能又会有比较大的差别。从机器学习角度来看,如果某个神经层的输入分布发生了改变,那么其参数需要重新学习,这种现象叫做内部协变量偏移(Internal Covariate Shift)。
为了解决内部协变量偏移问题,就要使得每一个神经层的输入的分布在训练过程中保持一致,
0.2.大体上看BN、LN、IN、GN
上图为四种归一化方法,其中N为批量,C为通道,(H,W)表示feature map,蓝色像素代表相同的均值和方差归一化
将输入的图像shape记为[N, C, H, W],这几个方法主要的区别就是在,
- BatchNorm是在batch