【深度学习】深度学习的归一化方法的演变(局部响应LRN,BN,LN, IN, GN, FRN, WN, BRN, CBN, CmBN)

【深度学习】深度学习的归一化方法的演变(局部响应LRN,BN,LN, IN, GN, FRN, WN, BRN, CBN, CmBN)

1. 介绍

归一化相关技术已经经过了几年的发展,目前针对不同的应用场合有相应的方法,在本文将这些方法做了一个总结,介绍了它们的思路,方法,应用场景。主要涉及到:LRN,BN,LN, IN, GN, FRN, WN, BRN, CBN, CmBN等。

值得注意的是,几乎在BN后出现的所有归一化方法都是针对BN的三个缺陷改进而来,在本文也介绍了BN的三个缺陷。相信读者会读完此文会对归一化方法有个较为全面的认识和理解。

2. 归一化方法

2.1 LRN(Local Response Normalization 2012)

局部响应归一化(Local Response Normalization,即LRN)首次提出于AlexNet。自BN提出后,基本被抛弃了

  • LRN的创意来源于神经生物学的侧抑制,被激活的神经元会抑制相邻的神经元。用一句话来形容LRN:让响应值大的feature map变得更大,让响应值小的变得更小。
  • 其主要思想在于让不同卷积核产生feature map之间的相关性更小,以实现不同通道上的feature map专注于不同的特征的作用,例如A特征在一通道上更显著,B特征在另一通道上更显著。
    在这里插入图片描述
  • 这个公式中的a表示卷积层(包括卷积操作和池化操作)后的输出结果,这个输出结果的结构是一个四维数组[batch,height,width,channel],这里可以简单解释一下,
    • batch就是批次数(每一批为一张图片),height就是图片高度,width就是图片宽度,channel就是通道数可以理解成一批图片中的某一个图片经过卷积操作后输出的神经元个数(或是理解成处理后的图片深度)。
  • ai(x,y)表示在这个输出结构中的一个位置[a,b,c,d],可以理解成在某一张图中的某一个通道下的某个高度和某个宽度位置的点,即第a张图的第d个通道下的高度为b宽度为c的点。
  • 论文公式中的N表示通道数(channel)。
  • a,n/2,k,α,β分别表示函数中的input,depth_radius,bias,alpha, beta,其中n/2,k,α,β都是自定义的,
    • 特别注意一下∑叠加的方向是沿着通道方向的,即每个点值的平方和是沿着a中的第3维channel方向的,也就是一个点同方向的前面n/2个通道(最小为第0个通道)和后n/2个通道(最大为第d-1个通道)的点的平方和(共n+1个点)。而函数的英文注解中也说明了把input当成是d个3维的矩阵,说白了就是把input的通道数当作3维矩阵的个数,叠加的方向也是在通道方向。

以下代码可以帮助你理解,其实就是复杂化的:

import tensorflow as tf
import numpy as np
x = np.array([i for i in range(1,33)]).reshape([2,2,2,4])
y = tf.nn.lrn(input=x,depth_radius=2,bias=0,alpha=1,beta=1)
 
with tf.Session() as sess:
    print(x)
    print('#############')
    print(y.eval())

在这里插入图片描述

2.2 BN(Batch Normalization 2015)

通常来说,数据标准化预处理对于浅层模型就足够有效了。随着模型训练的进行,当每层中参数更新时,靠近输出层的输出较难出现剧烈变化。但对深层神经网络来说,即使输入数据已做标准化,训练中模型参数的更新依然很容易造成靠近输出层输出的剧烈变化。这种计算数值的不稳定性通常令我们难以训练出有效的深度模型。

论文中关于BN(batch normalization)提出的解释:训练深度神经网络非常复杂,因为在训练过程中,随着先前各层的参数发生变化,各层输入的分布也会发生变化,图层输入分布的变化带来了一个问题,因为图层需要不断适应新的分布,因此训练变得复杂,随着网络变得更深,网络参数的细微变化也会放大。

由于要求较低的学习率和仔细的参数初始化,这减慢了训练速度,并且众所周知,训练具有饱和非线性的模型非常困难。我们将此现象称为内部协变量偏移,并通过归一化层输入来解决该问题。

其它的解释:假设输入数据包含多个特征x1,x2,…xn。每个功能可能具有不同的值范围。例如,特征x1的值可能在1到5之间,而特征x2的值可能在1000到99999之间。

如下左图所示,由于两个数据不在同一范围,但它们是使用相同的学习率,导致梯度下降轨迹沿一维来回振荡,从而需要更多的步骤才能达到最小值。且此时学习率不容易设置,学习率过大则对于范围小的数据来说来回震荡,学习率过小则对范围大的数据来说基本没什么变化。

如下右图所示,当进行归一化后,特征都在同一个大小范围,则loss landscape像一个碗,学习率更容易设置,且梯度下降比较平稳。

在这里插入图片描述
BN层中,对每个样本的同一通道,计算它们的均值和方差,再对数据进行归一化,归一化的值具有零均值和单位方差的特点,最后使用两个可学习参数gamma和beta对归一化的数据进行缩放和移位。
在这里插入图片描述

此外,在训练过程中还保存了每个mini-batch每一BN层的均值和方差,最后求所有mini-batch均值和方差的期望值,以此来作为推理过程中该BN层的均值和方差。另外,BN放在激活函数后比放在激活函数前效果更好

实际效果:

  • 1)与没有BN相比,可使用更大的学习率
  • 2)防止过拟合,可去除Dropout和Local Response Normalization
  • 3)由于dataloader打乱顺序,因此每个epoch中mini-batch都不一样,对不同mini-batch做归一化可以起到数据增强的效果。
  • 4)明显加快收敛速度
  • 5)避免梯度爆炸和梯度消失

注:BN存在一些问题,后续的大部分归一化论文,都是在围绕BN的这些缺陷来改进的。

  • 第一个缺陷是依赖Batch size,
  • 第二个缺陷是对于RNN这样的动态网络效果不明显
  • 第三个缺陷是当mini-batch中的样本非独立同分布时,性能比较差。

为了行文的方便,这些缺陷也会在后面各篇论文中逐一提到。

2.3 IN(Instance Normalization 2016)

Instance Normalization和Batch Normalization一样,也是Normalization的一种方法,只是IN是作用于单张图片,但是BN作用于一个Batch。

在这里插入图片描述
BN对Batch中的每一张图片的同一个通道一起进行Normalization操作,而IN是指单张图片的单个通道单独进行Normalization操作。如下图所示,其中C代表通道数,N代表图片数量(Batch)。

在图像视频等识别任务上,BN的效果是要优于IN的。

  • 但在GAN,style transfer和domain adaptation这类生成任务上,IN的效果明显比BN更好。

从BN与IN的区别来分析产生这种现象的原因:BN对多个样本统计均值和方差,而这多个样本的domain很可能是不一样的,相当于模型把不同domain的数据分布进行了归一化。

2.4 LN(Layer Normalization 2016)

BN的第一个缺陷是依赖Batch size,第二个缺陷是对于RNN这样的动态网络效果不明显,且当推理序列长度超过训练的所有序列长度时,容易出问题。为此,提出了Layer Normalization。

Layer Normalization是针对自然语言处理领域提出的,例如像RNN循环神经网络。为什么不使用直接BN呢,因为在RNN这类时序网络中,时序的长度并不是一个定值(网络深度不一定相同),比如每句话的长短都不一定相同,所有很难去使用BN,所以作者提出了Layer Normalization(注意,在图像处理领域中BN比LN是更有效的,但现在很多人将自然语言领域的模型用来处理图像,比如Vision Transformer,此时还是会涉及到LN)。
在这里插入图片描述只看公式的话感觉和BN没什么区别,都是减均值,再除以标准差。同样也有两个可训练的参数β , γ 。不同的是,

  • BN是对一个batch数据的每个channel进行Norm处理,
  • 但LN是对单个数据的指定维度进行Norm处理,与batch无关。
  • 而且在BN中训练时是需要累计moving_mean和moving_var两个变量的(所以BN中有4个参数:moving_mean,moving_var,β,γ),但LN不需要累计只有β , γ \beta, \gammaβ,γ两个参数。

LN的应用场合:RNN,transformer等。

2.5 GN(Group Normalization 2018)

如下图所示,当batch size减少时,BN退化明显,而Group Normalization始终一致,在batch size比较大的时候,略低于BN,但当batch size比较小的时候,明显优于BN。
在这里插入图片描述
但GN有两个缺陷,

  • 其中一个是在batchsize大时略低于BN,
  • 另一个是由于它是在通道上分组,因此它要求通道数是分组数g的倍数。

GN应用场景:在目标检测,语义分割等要求尽可能大的分辨率的任务上,由于内存限制,为了更大的分辨率只能取比较小的batch size,可以选择GN这种不依赖于batchsize的归一化方法。
在这里插入图片描述

小结:BN、LN、IN和GN的区别与联系

下图比较明显地表示出了它们之间的区别。(N表示N个样本,C表示通道,这里为了表达方便,把HxW的二维用H*W的一维表示。)
在这里插入图片描述
后面这三个解决的主要问题是BN的效果依赖于batch size,当batch size比较小时,性能退化严重。可以看到,IN,LN和GN都与batch size无关。

它们之间的区别在于计算均值和方差的数据范围不同,LN计算单个样本在所有通道上的均值和方差,IN值计算单个样本在每个通道上的均值和方差,GN将每个样本的通道分成g组,计算每组的均值和方差。

  • 它们之间的效果对比。(注:这个效果是只在同一场合下的对比,实际上它们各有自己的应用场景,且后三者在各自的应用场合上都明显超过了BN)
    在这里插入图片描述

2.6 WN(Weights Normalization 2016)

前面的方法都是基于feature map做归一化,这篇论文提出对Weights做归一化。

解释这个方法要费挺多笔墨,这里用一句话来解释其主要做法:

  • 将权重向量w分解为:一个标量g和一个向量v,
    • 标量g表示权重向量w的长度,
    • 向量v表示权重向量的方向。

这种方式改善了优化问题的条件,并加速了随机梯度下降的收敛,不依赖于batch size的特点,适用于循环模型(如 LSTM)和噪声敏感应用(如深度强化学习或生成模型),而批量归一化不太适合这些应用。

Weight Normalization也有个明显的缺陷:WN不像BN有归一化特征尺度的作用,因此WN的初始化需要慎重,为此作者也提出了对向量v和标量g的初始化方法。

2.7 BRN(Batch Renormalization 2017)

前面我们提到的BN使用训练过程中,每个mini-batch的均值和方差的期望作为推理过程中的均值和方差,这样做的前提是mini-batch与样本总体是独立同分布的。因此BN的第三个缺陷是当mini-batch中的样本非独立同分布时,性能比较差。

基于第一个缺陷batchsize太小时性能退化和第三个缺陷,作者提出了Batch Renormalization(简称BRN)。

BRN与BN的主要区别在于:

  • BN训练过程中每个mini-batch的均值和方差的期望来当作整个数据集的均值和方差,而训练过程中每个mini-batch都有自己的均值和方差,因此在推理阶段的均值和方差与训练时不同,
  • 而BRN提出在训练过程中就不断学习修正整个数据集的均值和方差,使其尽可能逼近整个数据集的均值和方差,并最终用于推理阶段。

在这里插入图片描述
注:这里r和d表示尺度缩放和平移,不参与反向传播。

当使用小batchsize或非独立同分布的mini-batch进行训练时,使用BRN训练的模型的性能明显优于BN。同时,BRN保留了BN的优势,例如对初始化的敏感性和训练效率

2.8 Cross-GPU BN(Cross-GPU Batch Normalization 2018)

在使用多卡分布式训练的情况下,输入数据被等分成多份,在各自的卡上完成前向和回传,参数更新,BN是针对单卡上的样本做的归一化,因此实际的归一化的样本数并不是batchsize。例如batchsize=32,用四张卡训练,实际上只在32/4=8个样本上做归一化。

Cross-GPU Batch Normalization的思想就是在多张卡上做归一化。
在这里插入图片描述

2.9 FRN(Filter Response Normalization 2019)

FRN仍然是基于小batchsize会退化性能的问题改进的。

FRN由两个组件构成,一个是Filter Response Normalization (FRN),一个是Thresholded Linear Unit (TLU)。

前者跟Instance Normalization非常相似,也是基于单样本单通道,所不同的是IN减去了均值,再除以标准差。而FRN没有减去均值。作者给出的理由如下:虽然减去均值是归一化方案的正常操作,但对于batch independent的归一化方案来说,它是任意的,没有任何理由。

TLU则是在ReLU的基础上加了一个阈值,这个阈值是可学习的参数。这是考虑到FRN没有减去均值的操作,这可能使得归一化的结果任意地偏移0,如果FRN之后是ReLU激活层,可能产生很多0值,这对于模型训练和性能是不利的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.10 CBN(Cross-Iteration BN 2021)

CBN的主要思想在于将前k-1个iteration的样本参与当前均值和方差的计算。但由于前k-1次iteration的数据更新,因此无法直接拿来使用。论文提出了一个处理方式是通过泰勒多项式来近似计算出前k-1次iteration的数据。

在这里插入图片描述
在Yolo_v4中还提出改进版CmBN,在每个batch中只统计四个mini-batches的数据,并在第四个mini-batch后才更新权重,尺度缩放和偏移。
在这里插入图片描述

3. 总结

本文介绍了目前比较经典的归一化方法,其中大部分都是针对BN改进而来,并比较详尽地介绍了它们的主要思想,改进方式,以及应用场景,部分方法并没有详细介绍实现细节,对于感兴趣或有需要的读者请自行阅读论文原文。

  • 除了以上方法外,还有很多归一化方法,例如Eval Norm,Normalization propagation,Normalizing the normalizers等。但这些方法并不常用,这里不作赘述。

4. 参考

【1】https://blog.csdn.net/weixin_48967543/article/details/117416273
【2】https://blog.csdn.net/yangdashi888/article/details/77918311
【3】https://blog.csdn.net/qq_43360533/article/details/107432073
【4】https://blog.csdn.net/Rocky6688/article/details/110249664

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋冬无暖阳°

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值