PyTorch神经网络中各种归一化算法

最近也在学习汇总神经网络中的小细节点,这次将pytorch神经网络中的各种归一化算法总结如下,供大家参考!2022.4.7

归一化的目的:1、可以避免一些不必要的数值问题,2、防止反向传播过程中部分数据的梯度值过大,导致梯度爆炸。

归一化函数:

归一化层,目前主要有这几个方法

Batch Normalization(2015年)

Layer Normalization(2016年)

Instance Normalization(2017年)

Group Normalization(2018年)

Switchable Normalization(2018年)

归一化位置:

将输入的图像shape记为pytorch框架的[N, C, H, W]

batchNorm是在batch上,对NHW做归一化,对小batchsize效果不好;

layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显;

instanceNorm在图像像素上,对HW做归一化,用在风格化迁移;

GroupNorm将channel分组,然后再做归一化;

SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。

一、batchNorm

batchNorm是在batch样本批次大小上,对NHW做归一化;将同一个batch中的所有样本的同一层特征图抽出来一起求mean和variance,加快收敛速度,允许网络使用更高的学习率。作为一个正则化函数,减少了对dropout的需求。但是当batch size较小时(小于16时),效果会变差,这时使用group norm可能得到的效果会更好。

batch normalization本质上就是强行将数据拉回到均值为0,方差为1的正太分布上,这样不仅数据分布一致,而且避免发生梯度消失。

class torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True)

计算过程:

1.沿着通道计算每个batch的均值 \mu_{c}

2.沿着通道计算每个batch的方差 \sigma_{c}^{2}

3.对x做归一化 x_{i}=\frac{x_{i} - \mu_{c}}{\sqrt{\sigma_{c}^{2} +\varepsilon}}

4.加入缩放和平移变量γ和β ,γ与β是可学习的大小为C(输入通道)的参数向量。默认γ取值为U(0,1),U均匀分布函数,β设置为0,归一化后的值 y_{i}=\gamma x_{i} + \beta

5.加入缩放平移变量的原因是:保证每一次数据经过归一化后还保留原有学习来的特征,同时又能完成归一化操作,加速训练。 这两个参数是用来学习的参数。

(最后对向量X做归一化和加入缩放、平移变量γ和β,在其他归一化函数中一样,不同的归一化函数只是在求均值和方差的方式不一样,最后的归一化过程和加入缩放、平移变量γ和β的原理一样,下面的归一化函数不在赘述归一化和加入缩放、平移变量γ和β的过程)

batch normalization存在以下缺点:1.对batchsize的大小比较敏感,由于每次计算均值和方差是在一个batch上,所以如果batchsize太小,则计算的均值、方差不足以代表整个数据分布;2.BN实际使用时需要计算并且保存某一层神经网络batch的均值和方差等统计信息,对于对一个固定深度的前向神经网络(DNN,CNN)使用BN,很方便;但对于RNN来说,sequence的长度是不一致的,换句话说RNN的深度不是固定的,不同的time-step需要保存不同的statics特征,可能存在一个特殊sequence比其他sequence长很多,这样training时,计算很麻烦。

二、layerNorm

layerNorm在通道方向上,对CHW归一化;即是将batch中的单个样本的每一层特征图抽出来一起求一个mean和variance,与batch size无关,不同通道有着相同的均值和方差。

BN与LN的区别在于:

BN是纵向归一化,而LN是横向归一化,LN中同层神经元输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差;BN中则针对不同神经元输入计算均值和方差,同一个batch中的输入拥有相同的均值和方差,所以,LN不依赖于batch的大小和输入sequence的深度,因此可以用于batchsize为1和RNN中对边长的输入sequence的normalize操作。LN用于RNN效果比较明显,但是在CNN上,不如BN。

CLASS torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True)

LN是针对深度网络的某一层的所有神经元的输入按以下公式进行normalize操作:

平均值和标准偏差分别计算在最后几个维数上,这些维数必须是normalized_shape指定的形状。如果elementwise_affine=True,则γ和β为两个可学习的仿射变换参数向量,大小为normalized_shape,与batch normalization和instance normalization不同,batch normalization使用affine选项为每个通道/平面应用标量尺度γ和偏差β,而layer normalization使用elementwise_affine参数为每个元素应用尺度和偏差。

三、instanceNorm

BN注重对每个batch进行归一化,保证数据分布一致,因为判别模型中结果取决于数据整体分布。但是图像风格化中,生成结果主要依赖于某个图像实例,所以对整个batch归一化不适合图像风格化中,因而对HW做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。

公式:

四、GroupNorm

Group Normalization (GN) 适用于占用显存比较大的任务,例如图像分割。对这类任务,可能 batchsize 只能是个位数,再大显存就不够用了。而当 batchsize 是个位数时,BN 的表现很差,因为没办法通过几个样本的数据量,来近似总体的均值和标准差。GN 也是独立于 batch 的,它是 LN 和 IN 的折中。

GroupNorm将channel分组;即是将batch中的单个样本的G层特征图抽出来一起求mean和variance,与batch size无关,当batch size较小时(小于16时),使用该normalization方法效果更好。

CLASS torch.nn.GroupNorm(num_groups, num_channels, eps=1e-05, affine=True)

计算过程:

GN 计算均值和标准差时,把每一个样本 feature map 的 channel 分成 G 组,每组将有 C/G 个 channel,然后将这些 channel 中的元素求均值和标准差,各组 channel 用其对应的归一化参数独立地归一化,如果affine=True,则γ和β这两个可学习的通道仿射变换参数向量的大小为num_channels。
这一层使用从训练和评估模式的输入数据计算得到的统计数据。

对于 BN,IN,GN, 其γ和β都是维度等于通道数 C 的向量。而对于 LN,其γ和β都是维度等于 normalized_shape 的矩阵。

五、SwitchableNorm

第一,归一化虽然提高模型泛化能力,然而归一化层的操作是人工设计的。在实际应用中,解决不同的问题原则上需要设计不同的归一化操作,并没有一个通用的归一化方法能够解决所有应用问题;

第二,一个深度神经网络往往包含几十个归一化层,通常这些归一化层都使用同样的归一化操作,因为手工为每一个归一化层设计操作需要进行大量的实验。

因此作者提出自适配归一化方法——Switchable Normalization(SN)来解决上述问题。与强化学习不同,SN使用可微分学习,为一个深度网络中的每一个归一化层确定合适的归一化操作。

公式:

编辑于 2022-04-11 09:40