BN和GN
引自:https://www.cnblogs.com/king-lps/p/8378561.html
5. 批量归一化(BN: Batch Normalization)
5.1 BN训练
1)随机梯度下降法(SGD)对于训练深度网络简单高效,但是它有个毛病,就是需要我们人为的去选择参数,比如学习率、参数初始化、权重衰减系数、Drop out比例等。这些参数的选择对训练结果至关重要,以至于我们很多时间都浪费在这些的调参上。那么使用BN(详见论文《Batch Normalization_ Accelerating Deep Network Training by Reducing Internal Covariate Shift》)之后,你可以不需要那么刻意的慢慢调整参数。
2)神经网络一旦训练起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。以网络第二层为例:网络的第二层输入,是由第一层的参数和input计算得到的,而第一层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。我们把网络中间层在训练过程中,数据分布的改变称之为:“Internal Covariate Shift”。Paper所提出的算法,就是要解决在训练过程中,中间层数据分布发生改变的情况,于是就有了Batch Normalization,这个牛逼算法的诞生。
3)BN的地位:与激活函数层、卷积层、全连接层、池化层一样,BN(Batch Normalization)也属于网络的一层。
4)BN的本质原理:在网络的每一层输入的时候,又插入了一个归一化层,也就是先做一个归一化处理(归一化至:均值0、方差为1),然后再进入网络的下一层。不过文献归一化层,可不像我们想象的那么简单,它是一个可学习、有参数(γ、β)的网络层。
5)归一化公式:
6)如果是仅仅使用上面的归一化公式,对网络某一层A的输出数据做归一化,然后送入网络下一层B,这样是会影响到本层网络A所学习到的特征的。比如我网络中间某一层学习到特征数据本身就分布在S型激活函数的两侧,你强制把它给我归一化处理、标准差也限制在了1,把数据变换成分布于s函数的中间部分,这样就相当于我这一层网络所学习到的特征分布被你搞坏了,这可怎么办?于是文献使出了一招惊天地泣鬼神的招式:变换重构,引入了可学习参数γ、β,这就是算法关键之处:
上面的公式表明,通过学习到的重构参数γ、β,是可以恢复出原始的某一层所学到的特征的。
7)引入了这个可学习重构参数γ、β,让我们的网络可以学习恢复出原始网络所要学习的特征分布。最后Batch Normalization网络层的前向传导过程公式就是:
8)BN层是对于每个神经元做归一化处理,甚至只需要对某一个神经元进行归一化,而不是对一整层网络的神经元进行归一化。既然BN是对单个神经元的运算,那么在CNN中卷积层上要怎么搞?假如某一层卷积层有6个特征图,每个特征图的大小是100*100,这样就相当于这一层网络有6*100*100个神经元,如果采用BN,就会有6*100*100个参数γ、β,这样岂不是太恐怖了。因此卷积层上的BN使用,其实也是使用了类似权值共享的策略,把一整张特征图当做一个神经元进行处理。
9)卷积神经网络经过卷积后得到的是一系列的特征图,如果min-batch sizes为m,那么网络某一层输入数据可以表示为四维矩阵(m,f,w,h),m为min-batch sizes,f为特征图个数,w、h分别为特征图的宽高。在CNN中我们可以把每个特征图看成是一个特征处理(一个神经元),因此在使用Batch Normalization,mini-batch size 的大小就是:m*w*h,于是对于每个特征图都只有一对可学习参数:γ、β。说白了吧,这就是相当于求取所有样本所对应的一个特征图的所有神经元的平均值、方差,然后对这个特征图神经元做归一化。
10) 在使用BN前,减小学习率、小心的权重初始化的目的是:使其输出的数据分布不要发生太大的变化。
11) BN的作用:
1)改善流经网络的梯度
2)允许更大的学习率,大幅提高训练速度:
你可以选择比较大的初始学习率,让你的训练速度飙涨。以前还需要慢慢调整学习率,甚至在网络训练到一半的时候,还需要想着学习率进一步调小的比例选择多少比较合适,现在我们可以采用初始很大的学习率,然后学习率的衰减速度也很大,因为这个算法收敛很快。当然这个算法即使你选择了较小的学习率,也比以前的收敛速度快,因为它具有快速训练收敛的特性;
3)减少对初始化的强烈依赖
4)改善正则化策略:作为正则化的一种形式,轻微减少了对dropout的需求
你再也不用去理会过拟合中drop out、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性;
5)再也不需要使用使用局部响应归一化层了(局部响应归一化是Alexnet网络用到的方法,搞视觉的估计比较熟悉),因为BN本身就是一个归一化网络层;
6)可以把训练数据彻底打乱(防止每批训练的时候,某一个样本都经常被挑选到,文献说这个可以提高1%的精度)。
注:以上为学习过程,在测试时,均值和方差(mean/std)不基于小批量进行计算, 可取训练过程中的激活值的均值。
5.2 BN测试
1)实际测试时,我们依然使用下面的公式:
这里的均值和方差已经不是针对某一个Batch了,而是针对整个数据集而言。因此,在训练过程中除了正常的前向传播和反向求导之外,我们还要记录每一个Batch的均值和方差,以便训练完成之后按照下式计算整体的均值和方差:
批量归一化和群组归一化
批量归一化(Batch Normalization,以下简称 BN)是深度学习发展中的一项里程碑式技术,可让各种网络并行训练。但是,批量维度进行归一化会带来一些问题——批量统计估算不准确导致批量变小时,BN 的误差会迅速增加。在训练大型网络和将特征转移到计算机视觉任务中(包括检测、分割和视频),内存消耗限制了只能使用小批量的BN。在这篇论文中,作者巧妙提出了群组归一化 Group Normalization (简称 GN) 作为 BN 的替代方案。
GN 将通道分成组,并在每组内计算归一化的均值和方差。GN 的计算与批量大小无关,并且其准确度在各种批量大小下都很稳定。在 ImageNet 上训练的 ResNet-50 上,GN 使用批量大小为 2 时的错误率比 BN 的错误率低 10.6%;当使用典型的批量时,GN 与 BN 相当,并且优于其他标归一化变体。而且,GN 可以自然地从预训练迁移到微调。在进行 COCO 中的目标检测和分割以及 Kinetics 中的视频分类比赛中,GN 可以胜过其竞争对手,表明 GN 可以在各种任务中有效地取代强大的 BN。在最新的代码库中,GN 可以通过几行代码轻松实现。
背景介绍
批量归一化已被证实为深度学习中非常有效的组成部分,在很大程度上推动了计算机视觉领域的发展。许多实践都证明了这一点,BN 使用(小)批计算的均值和方差对特征进行归一化,以简化优化使非常深的网络能够融合。批量统计的随机不确定性也可以作为一个正则化器,它可以适用于泛化。BN 一直是许多最先进的计算机视觉算法的基础。
尽管 BN 取得了巨大的成功,但其存在的弊端也是由于其独特的归一化行为造成的。
图1. ImageNet分类错误与批量大小的对比图,这是一个ResNet-50模型,使用8张GPU卡在ImageNet训练集中进行训练,并在验证集中进行评估。
特别是,BN 要求有足够大的批量才能工作。小批量会导致批量统计数据的估算不准确,并且减少 BN 的批量大小会显著增加模型误差(图 1)。因此,最近的许多模型都是用较大的批量来进行训练的,这些大批量都是很耗费内存的。反过来,训练模型时对 BN 有效性的高度依赖性阻碍了人们用有限内存探索更高容量的模型。
计算机视觉任务(包括检测、分割、视频识别和其他基于此的高级系统)对批量大小的限制要求更高。例如,Fast / er 和 Mask R-CNN 框架使用批量为 1 或 2 的图像,为了更高的分辨率,其中 BN 通过变换为线性层而被「固定」;在 3D 卷积视频分类中,时空特征的出现导致在时间长度和批大小之间需要作出权衡。BN 的使用通常要求这些系统在模型设计和批大小之间作出妥协。
本文提出群组归一化(GN)作为 BN 的替代方案。作者注意到像 SIFT 和 HOG 这样的许多经典特征是分组特征并且包括分组规范化。例如,HOG 矢量是几个空间单元的结果,其中每个单元由归一化方向直方图表示。同样,作者提出 GN 作为一个层,将通道划分为组,并对每个组内的特征进行归一化(图 2)。GN 不用批量维度,其计算与批量大小无关。
GN 在大范围的批量下运行都非常稳定(图 1)。在批量大小为 2 的样本中,GN 比 ImageNet 中的 ResNet-50 的 BN 对应的误差低 10.6%。对于常规的批量规格,GN 与 BN 表现相当(差距为 0.5%),并且优于其它归一化变体 。此外,尽管批量可能会发生变化,但 GN 可以自然地从预训练迁移到微调。在 COCO 目标检测和分割任务的 Mask R-CNN 上,以及在 Kinetics 视频分类任务的 3D 卷积网络上,相比于 BN 的对应变体,GN 都能获得提升或者超越的结果。GN 在 ImageNet、COCO 和 Kinetics 上的有效性表明 GN 是 BN 的有力竞争者,而 BN 在过去一直在这些任务上作为主导方法。
图2
已有的方法,如层次归一化(LN)和实例归一化(IN)(图 2),也避免了沿着批量维度进行归一化。这些方法对训练序列模型(RNN / LSTM )或生成模型(GANs)是有效的。但正如论文中通过实验表明的那样,LN 和 IN 在视觉识别方面取得的成功是有限的,GN 可以提供了更好的性能表现。甚至,GN 可以用来替代 LN 和 IN,来适用于有序或生成模型。这超出了本文的研究重点,但它对未来的研究提供了启示。
视觉表现的通道并不完全独立。SIFT ,HOG 和 GIST 的典型特征是按设计分组表示的,其中每组通道由某种直方图构成。这些功能通常通过每个直方图或每个方向上的分组归一化进行处理。VLAD 和 Fisher Vector(FV)等更高级的特征也是群组特征,其中一组可以被认为是相对于一个群集计算的子向量。
类似地,没有必要将深层神经网络特征看作非结构化向量。例如,对于网络的 conv1(第一卷积层),期望滤波器及其水平翻转在自然图像上呈现类似的滤波器响应分布是合理的。如果 conv1 碰巧近似学习这一对滤波器,或者如果通过设计将水平翻转(或其他变换)设计为架构 ,则可以将这些滤波器的相应通道一起归一化。
越高层的图层越抽象,它们的行为也不那么直观。然而,除了方向(SIFT ,HOG )之外,还有许多因素可能导致分组,例如频率,形状,光照度和质地,它们的系数可以相互依存。事实上,神经科学中广为接受的计算模型是在细胞反应中归一化 ,「具有各种感受野中心(包括视野)和各种时空频率音调;这不仅可以发生在初级视觉皮层,而且可以发生在「整个视觉系统」。受到这些研究的启发,我们提出了新的泛神经网络的泛型归一化。
图3
GN 可以通过 PyTorch 和 TensorFlow 中的几行代码轻松实现,图 3 显示了基于 TensorFlow 的代码。事实上,只需要指定如何计算均值和方差(「矩」),用归一化方法定义的适当的坐标轴。
实验部分
在三个不同类型的数据集上做了实验对比。分别是 ImageNet 中的图像分类,COCO 中的对象检测和分割,Kinetics 中的视频分类。具体的实验方法、实验步骤,以及实验结果,原论文中有详细描述。
GN 在检测,分割和视频分类方面的改进表明,GN 对于当前处于主导地位的 BN 技术而言是强有力的替代。
总结
论文中把 GN 作为一个有效的归一化层且不用开发批量维度,同时也评估了 GN 在各种应用中的行为表现。不过,论文作者也注意到,由于 BN 之前拥有很强的影响力,以至于许多先进的系统及其超参数已被设计出来。这对于基于 GN 的模型可能是不利的,不过也有可能重新设计系统或搜索 GN 的新超参数将会产生更好的结果。
此外,作者表明,GN 与 LN 和 IN 有关,LN 和 IN 两种归一化方法在训练循坏(RNN / LSTM)或生成(GAN)模型中特别成功。这表明将来 GN 也会研究这些领域。另外作者还将探索 GN 在强化学习(RL)任务学习表征方面的表现,其中 BN 在训练非常深的模型中起着重要作用 。