深度学习-各种归一化(Batch Norm、Layer Norm、Group Norm、InstanceNorm、Spatially-Adaptive Norm)

深度学习之归一化:BN、LN、GN、IN、SPADE

  • 0.总述
    • 0.1.为什么要归一化处理
    • 0.2.大体上看BN、LN、IN、GN
  • 1.批量归一化(Batch Normalization,BN)
    • 1.1.作用
    • 1.2.计算过程
    • 1.3.优势
    • 1.4.缺点
    • 1.4.使用
  • 2.层归一化(Layer Normalization)
    • 2.1.作用
    • 2.2.计算过程
    • 2.3.与BatchNormalization的区别
  • 3.Group Normalization
    • 3.1.计算过程
  • 4.Instance Normalization
  • 5.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],我们不对其进行归一化处理,我们针对这两个特征设计机器学习算法,然后我们画出它的损失函数的图像,如下图所示
深度学习-各种归一化(Batch Norm、Layer Norm、Group Norm、InstanceNorm、Spatially-Adaptive Norm)_第1张图片
红色的圈代表的是两个特征的等高线。因为两个特征X1和X2的区间相差非常大,其所形成的等高线为长椭圆形,非常尖。使用梯度下降法寻求最优解的过程也就是在寻找使得损失函数值最小的 参数θ1,θ2,当数据没有归一化的时候,梯度下降很有可能走之字型路线(它会垂直等高线走,因为梯度的方向与等高线切线方向垂直),因为梯度下降路线波动很大,从而导致需要迭代很多次才能收敛,这就是非归一化操作的神经网络训练速度慢的直观体现。现在我们对训练集数据进行归一化处理,此时我们画出损失函数的图像,如下所示
深度学习-各种归一化(Batch Norm、Layer Norm、Group Norm、InstanceNorm、Spatially-Adaptive Norm)_第2张图片
而数据归一化后,损失函数变量θ前面的系数差距已不大,这样的话,图像的等高面近似圆形,此时求解得到的梯度方向更能直指圆心,在梯度下降进行求解时能较快的收敛,效率也就更高了,这样神经网络的训练速度也会相应加快。这就是数据归一化操作加快神经网络训练速度的直观体现,因此如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则收敛速度会很慢,甚至不能收敛。
神经网络都是多层结构,上一层 的输出即为下一层的输入,所以即使输入数据做了归一化,由于经过了线性变换以及激活函数,下一层的输入在取值范围可能又会有比较大的差别。从机器学习角度来看,如果某个神经层的输入分布发生了改变,那么其参数需要重新学习,这种现象叫做内部协变量偏移(Internal Covariate Shift)。
为了解决内部协变量偏移问题,就要使得每一个神经层的输入的分布在训练过程中保持一致,

0.2.大体上看BN、LN、IN、GN

深度学习-各种归一化(Batch Norm、Layer Norm、Group Norm、InstanceNorm、Spatially-Adaptive Norm)_第3张图片
上图为四种归一化方法,其中N为批量,C为通道,(H,W)表示feature map,蓝色像素代表相同的均值和方差归一化
将输入的图像shape记为[N, C, H, W],这几个方法主要的区别就是在,

  • BatchNorm是在batch上,对NHW做归一化,对小batchsize效果不好;
  • LayerNorm通道方向上,对CHW归一化,主要对RNN作用明显;
  • InstanceNorm图像像素上,对HW做归一化,用在风格化迁移;
  • GroupNormchannel分组,然后再做归一化;

归一化的一般流程是数据先减去均值再除以方差,即先归一化到[0, 1]范围内,然后再将数据进行特定的仿射变换,这个仿射变换的参数就是我们希望网络学到的参数,仿射变换的过程称为调制**(modulate)。本来已经归一化的数据经过仿射变换就不再是normalized**,而是denormalized

1.批量归一化(Batch Normalization,BN)

1.1.作用

在训练过程中,每层输入的分布不断的变化,这使得下一层需要不断的去适应新的数据分布,在深度神经网络中,这让训练变得非常复杂而且缓慢。对于这样,往往需要设置更小的学习率、更严格的参数初始化。通过使用批量归一化(Batch Normalization, BN),在模型的训练过程中利用小批量的均值和方差调整神经网络中间的输出,从而使得各层之间的输出都符合均值、方差相同高斯分布,这样的话会使得数据更加稳定,无论隐藏层的参数如何变化,可以确定的是前一层网络输出数据的均值、方差是已知的、固定的,这样就解决了数据分布不断改变带来的训练缓慢、小学习率等问题。

1.2.计算过程

在深度学习中,由于采用full batch的训练方式对内存要求较大,且每一轮训练时间过长;我们一般都会采用对数据做划分,用mini-batch对网络进行训练。因此,Batch Normalization也就在mini-batch的基础进行计算。
对于神经网络的第l层,设其输入为z(l),输出为a(l)
a(l)=f(z(l))=f(Wa(l-1)+b)
为了减少内部协变量偏移问题,就要使得净输入z(l)的分布一致,比如都归一化到标准正态分布。但是逐层归一化需要在中间层进行操作,要求效率比较高,因此复杂度比较高的白化方法就不太合适。为了提高归一化效率,一般使用标准归一化,将净输入z(l)的每一维都归一到标准正态分布:
在这里插入图片描述
E(z(l))和var(z(l))指当前参数下,z(l)的每一维在整个训练集上的期望和方差。因为目前主要的训练方法是基于小批量的随机梯度下降方法,因此z(l)的期望和方差通常用当前小批量样本集的均值和方差近似估计
对净输入z(l)的标准归一化会使得其取值集中在0附近,如果使用sigmoid型函数时,这个取值区间刚好接近线性变换区间,减弱了神经网络的非线性性质,因此,为了使得归一化不对网络的表示能力造成负面影响,我们可以通过一个附加的缩放和平移变换改变取值区间
在这里插入图片描述
其中γ和β别代表缩放和平移的参数向量,当:
在这里插入图片描述在这里插入图片描述
批量归一化可以看作是一个特殊的神经层,加在每一层非线性激活函数之前,即
在这里插入图片描述

1.3.优势

BN中的γ和β的作用

  • 保证了模型的capacity,意思就是,γ和β作为调整参数可以调整被BN刻意改变过后的输入,即能够保证能够还原成原始的输入分布。BN对每一层输入分布的调整有可能改变某层原来的输入,当然有了这两个参数,经过调整也可以不发生改变,既可以改变同时也可以保持原输入,那么模型的容纳能力(capacity)就提升了。
  • 适应激活函数,如果是sigmoid函数,那么BN后的分布在0-1之间,由于sigmoid在
  • 近0的地方趋于线性,非线性表达能力可能会降低,因此通过γ和β可以自动调整输入分布,使得非线性表达能力增强。
    如果激活函数为ReLU,那么意味着将有一半的激活函数无法使用,那么通过β可以进行调整参与激活的数据的比例,防止dead-Relu问题。

解决“internal covariate shift”的问题,神经网络目的就是通过训练模型,可以让模型能够最好的拟合数据的真实分布。在训练时,训练数据经过层间操作,会出现数据分布的微小偏移,随着网络层数的加深,这种偏移量与label的差别逐渐扩大,导致模型需要学习调整样本的分布,训练效率低下。BN将每层的数据进行标准化,并通过可学习参数γ和β两个学习参数来调整这种分布。这样会缓解内部协变量偏移的问题,大大增加了训练速度。
避免了梯度弥散和爆炸,BN可以控制数据的分布范围,在遇到sigmoid或者tanh等激活函数时,不会使数据落在饱和区域导致梯度弥散。并且BN可以避免ReLU激活函数数据死亡的问题。
降低权重初始化的困难,在深度网络中,网络的最终训练效果也受到初始化的影响,初始化决定了神经网络最终会收敛到哪个局部最小值中,具有随机性。通过BN来标准化分布,可以降低初始化权重的影响。
BN可以起到和dropout一样的正则化效果,在正则化方面,一般全连接层用dropout,卷积层用BN。

1.4.缺点

BN很受batch大小的影响
通过实验证明:BN需要一个足够大的批量,小的批量大小会导致对批统计数据的不准确率提高,显著增加模型的错误率。比如在检测、分割、视频识别等任务中,比如在faster R-cnn或mask R-cnn框架中使用一个batchsize为1或2的图像,因为分辨率更高,其中BN被“冻结”转换为线性层;在3D卷积的视频分类中,空间时间特征的存在引入了时间长度和批处理大小之间的权衡。BN的使用经常会使这些系统在模型符号和批量大小之间做出妥协。
对于不同长度的样本数据无法很好处理
比如在RNN中,RNN可以展开成一个隐藏层共享参数的MLP,随着时间片的增多,展开后的MLP的层数也在增多,最终层数由输入数据的时间片的数量决定,所以RNN是一个动态的网络。
在一个batch中,通常各个样本的长度都是不同的,当统计到比较靠后的时间片时,例如下图中t>4 时,这时只有一个样本还有数据,基于这个样本的统计信息不能反映全局分布,所以这时BN的效果并不好。
另外如果在测试时我们遇到了长度大于任何一个训练样本的测试样本,我们无法找到保存的归一化统计量,所以BN无法运行。
深度学习-各种归一化(Batch Norm、Layer Norm、Group Norm、InstanceNorm、Spatially-Adaptive Norm)_第4张图片

1.4.使用

一般来说在网络中的位置为:
Conv->Relu->BatchNorm->Dropout

2.层归一化(Layer Normalization)

2.1.作用

批量归一化是对一个中间层的单个神经元进行归一化操作,因此要求小批量样本的数量不能太小,否则难以计算单个神经元的统计信息。层归一化(Layer Normalization)是和批量归一化非常类似的方法。和批量归一化不同的是,层归一化是对某一层的所有神经元进行归一化

2.2.计算过程

假设某一层有M个神经元,那么该层的输入 zl为{zl1,zl2……,zlM}
均值和方差为:
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
与批量归一化类似,层归一化也得附加一个缩放和平移变换的取值区间,操作方法与批量归一化一样。

2.3.与BatchNormalization的区别

注意与批量归一化的区别:批量归一化是不同训练数据之间对单个神经元的归一化,层归一化是单个训练数据对某一层所有神经元之间的归一化。
如下图中 N表示样本轴,C表示通道轴, F是每个通道的特征数量。BN如右侧所示,它是取不同样本的同一个通道的特征做归一化;LN则是如左侧所示,它取的是同一个样本的不同通道做归一化
深度学习-各种归一化(Batch Norm、Layer Norm、Group Norm、InstanceNorm、Spatially-Adaptive Norm)_第5张图片

3.Group Normalization

Group Normalization(GN)是针对Batch Normalization(BN)在batch size较小时错误率较高而提出的改进算法,因为BN层的计算结果依赖当前batch的数据,当batch size较小时(比如2、4这样),该batch数据的均值和方差的代表性较差,因此对最后的结果影响也较大。
GN 将通道分成几组,并在每组内计算归一化的均值和方差。 GN 的计算与批量大小无关,其准确性在很宽的批量大小范围内都很稳定。简单讲就是要使归一化操作的计算不依赖batch size的大小

3.1.计算过程

首先描述特征归一化的公式,x是由层计算的特征,特征大小为:(N, C, H W):
在这里插入图片描述
计算均值和标准差,m是该集合的大小:
在这里插入图片描述 在这里插入图片描述
其中:Si因不同的归一化方法而不同,在GN中:
在这里插入图片描述
G是组的数量,是预定义的超参数(默认为G=32)。C/G是每组的通道数,GN沿着(C/G,H,W)来计算μ和σ
因此GN的思想就是在相同feature map的相同group中进行归一化操作,而group只是在channel维度上进行划分,因此归一化操作就和batch size无关。

  • 如果我们将组号设置为G = 1,则GN变为LN 。LN假设层中的所有通道都做出“类似的贡献”。GN比LN受限制更少,因为假设每组通道(而不是所有通道)都受共享均值和方差的影响; 该模型仍然具有为每个群体学习不同分布的灵活性。这导致GN相对于LN的代表能力提高。
  • 如果我们将组号设置为G = C(即每组一个通道),则GN变为IN。 但是IN只能依靠空间维度来计算均值和方差,并且错过了利用信道依赖的机会。

4.Instance Normalization

BN注重对每个batch进行归一化,保证数据分布一致,因为判别模型中结果取决于数据整体分布。
但是图像风格化中,生成结果主要依赖于某个图像实例,所以对整个batch归一化不适合图像风格化中,因而对HW做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。
也就是说,对于IN,计算每个样本的每个通道(H,W)的μ和σ
在这里插入图片描述
在计算机视觉中,IN本质上是一种Style Normalization,它的作用相当于把不同的图片统一成一种风格。这个视角是在《Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization》中看到的。
黄勋等人提出,图像的风格(artistic style)就是特征图各个feature channel跨空间的统计信息,比如mean和variance。迁移各个channel的mean和variance就可以实现风格迁移,为此他们提出了Adaptive Instance Normalization。

5.SPADE

来自论文《Semantic Image Synthesis with Spatially-Adaptive Normalization》
SPatially-Adaptive DEnormalization (SPADE),是一种类似BN(batch normalization)的方法,但是跟BN有很大的不同。
上述的四种归一化方法可以分为两类:

  • 无约束的归一层(Unconditional normalization layers):比如BN、LN、GN,因为他们的计算不需要额外的数据,也就是说这种归一化跟输入数据无关。
  • 有约束的归一层 (Conditional normalization layers):比如AdaIN,需要额外的数据计算,比如在风格转换中,AdaIN需要风格图像的均值和方差,这里风格图像就是额外的数据。

SPADE当然属于第二种归一化方法,即有约束的normalization,在BN中,我们对归一化后的数据再次进行放缩和偏移操作(scale and shift),这个放缩和偏移超参就是γ和β,如 下图公式所示, xki是第k层网络的输入,yki是网络的输出,这里 γ和β是 一个向量。
在这里插入图片描述
在 SPADE 里面,如下图3所示, γ和β不是一个向量或数值,而是张量tensor,它的尺寸和输入的特征图(feature map)保持一致,这个 γ和β 是由分割mask通过卷积得到的,对语义分割mask来说,每个像素值表示的是该像素点的类别,比如下图的分割mask,蓝色区域表示天空,这个区域的所有像素值都相同,白色的区域表示草地,这个区域的像数值都相同。正是因为这个性质,使得γ和β具有空间性,且这个空间性与分割mask保持一致,所以说SPADE是SPatially-Adaptive的。
深度学习-各种归一化(Batch Norm、Layer Norm、Group Norm、InstanceNorm、Spatially-Adaptive Norm)_第6张图片
深度学习-各种归一化(Batch Norm、Layer Norm、Group Norm、InstanceNorm、Spatially-Adaptive Norm)_第7张图片

你可能感兴趣的:(深度学习,深度学习,人工智能,数据分析,python)