而深层模型,每层输入的分布和权重在同时变化,训练相对困难。上一篇文章介绍了卷积神经网络CNN的结构和CNN模型,这篇文章介绍CNN优化方式:批量归一化。
文章目录
2.1.BN基本思想
2. 2BN算法整体流程如下图
2.3 Batch Normalization的反向传播
前言
BN的思想是2015年由谷歌的团队提出来的一种模型训练优化方法。参考论文:Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift,这是一个深度神经网络训练的技巧 ,目前BN已经成为几乎所有卷积神经网络的标配技巧了。在这里,结合论文及网络一些优秀的博文,简单地介绍批次归一化,主要从背景,BN原理,BN作用,和BN在cnn中的使用四个方面简介。
论文摘要:
由于每层输入的分布在训练过程中随着前一层的参数发生变化而发生变化,因此训练深度神经网络很复杂。 由于需要较低的学习率和仔细的参数初始化,这会减慢训练速度,并且使得训练具有饱和非线性的模型变得非常困难。我们将这种现象称为内部协变量偏移( Internal Covariate Shift),并通过归一化层输入来解决该问题。
我们的方法的优势在于将标准化作为模型架构的一部分,并为每个训练小批量执行标准化。 Batch Normalization 允许我们使用更高的学习率并且在初始化时不那么小心,并且在某些情况下消除了 Dropout 的需要。
应用于最先进的图像分类模型,批量归一化以减少 14 倍的训练步骤实现相同的精度,并以显着的优势击败原始模型。使用批量归一化网络的集合,我们改进 在 ImageNet 分类上发布的最佳结果:达到 4.82% 的 top-5 测试错误,超过人类评估者的准确性
一、 背景介绍
(0)常规的归一化方法
对于数据归一化的常见方法有零均值和PCA,
如下图,左图中,如果我们用红线去拟合绿线,在第一张图这种我们需要做多次迭代,才可以得到我们需要的目标直线,右图我们做了零均值操作,让数据的均值为零,这样的调节能够提高我们的训练速度。
PCA白化操作即为:就是对输入数据分布变换到0均值,单位方差的正态分布,对输入数据做了标准化处理:处理后的任意一个特征在数据集中所有样本上的均值为0、标准差为1。标准化处理输入数据使各个特征的分布相近:这往往更容易训练出有效的模型。
通常来说,数据标准化预处理对于浅层模型就足够有效了。随着模型训练的进行,当每层中参数更新时,靠近输出层的输出较难出现剧烈变化。 但对深层神经网络来说,即使输入数据已做标准化,训练中模型参数的更新依然很容易造成靠近输出层输出的剧烈变化。这种计算数值的不稳定性通常令我们难以训练出有效的深度模型。
(1) “Internal Covariate Shift”问题
论文刚开始作者比较了Mini-Batch SGD和One Example SGD,并指出小批次SGD的优势在于梯度更新方向更准确;并行计算速度快;缺点在于调参麻烦。之后,作者提出了 Internal Covariate Shift,在训练过程中,隐层的输入分布老是变来变去,这就是所谓的“Internal Covariate Shift”,Internal指的是深层网络的隐层,是发生在网络内部的事情,
网络一旦训练起来,参数就要发生更新,除了输入层的数据外,其它层的数据分布是一直发生变化的,因为在训练的时候,网络参数的变化就会导致后面输入数据的分布变化,比如第二层输入,是由输入数据和第一层参数得到的,而第一层的参数随着训练一直变化,势必会引起第二层输入分布的改变,把这种改变称之为:Internal Covariate Shift,BN就是为了解决这个问题的。
随后,作者提出了BN的基本思想:能不能让每个隐层节点的激活输入分布固定下来呢?
BN的主要的思想可以理解为对深层神经网络每个隐层神经元的激活值做简化版本的白化操作。
(2)单层视角看BN
在单层神经网络中,对于中间的某一层,其前面的层可以看成是对输入的处理,后面的层可以看成是损失函数,如下图所示:
一次反向传播过程会同时更新所有层的权重W1,W2,…,WL,前面层权重的更新会改变当前层输入的分布,对 的更新是在假定其输入不变的情况下进行的。对于某一层某个节点的输入而言,y=w1x1+w2x2+b。
在单层神经网络中,直线调整了位置,输入分布又在发生变化,直线再调整位置,就像是直线和分布之间的“追逐游戏”。当分布发生变化时,调整参数,使得直线拟合分布,比较容易,而深层模型,每层输入的分布和权重在同时变化,训练相对困难。
(3)多层视角看BN
在多层中,反向传播过程中,每层权重的更新是在假定其他权重不变的情况下,向损失函数降低的方向调整自己。问题在于,在一次反向传播过程中,所有的权重会同时更新,导致层间配合“缺乏默契”,层数越多,相互配合越困难,文中把这个现象称之为 Internal Covariate Shift,示意图如下。为了避免过于震荡,学习率不得不设置得足够小,足够小就意味着学习缓慢。
一个较为形象的理解,参数间的细小变化在神经网络中都可能引起“雪崩”,即
多层神经网络对于数据的敏感性使得每次都需要考虑学习率的超参数,如果对每层的输入做Normalization,这样可以降低对参数的学习。
二、BN介绍
1.BN基本思想
BN基本思想在于:
因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近,所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因。
而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,就是把越来越偏的分布强制拉回比较标准的分布,使得激活输入值落在非线性函数对输入比较敏感的区域,这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
就像激活函数层、卷积层、全连接层、池化层一样,BN也是网络的一层。该算法本质是: 在网络的每一层输入的时候,插入了一个归一化层, 然后再进 入网络的下一层。BN算法在实际使用的时候会把特征给强制性的归到均值为0,方差为1的数学模型下。把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。
综上:BN的基本思想在于BN其实就是把每个隐层神经元的激活输入分布从偏离均值为0方差为1的正态分布,通过平移均值压缩或者扩大曲线尖锐程度,调整为均值为0方差为1的正态分布。
如果都通过BN,这意味着网络的表达能力下降了,也意味着深度的意义就没有了。所以BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift),每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。论文作者并未明确这样说。但是很明显这里的scale和shift操作是会有争议的。
2.BN算法实现
2.1 BN算法实现
cnn循环网路中包括卷积层,激励层,池化层等,现在,需要加入BN层,BN被建议插入在(每个)ReLU激活层前面,BN就是在神经网络的训练过程中对每层的输入数据加一个标准化处理:
传统的神经网络,只是在将样本输入层之前对进行标准化处理(减均值,除标准差),以降低样本间的差异性。BN是在此基础上,对输入层的输入数据进行标准化,对每个隐藏层的输入进行标准化。
BN算法的具体实现过程:
具体计算过程示例如下:
1. 计算mini-batch内样本的均值
例如输入mini-batch包含3个样本,每个样本有2个特征,分别是:
对每个特征分别计算mini-batch内样本的均值:
则样本均值是:
2. 计算mini-batch内样本的方差
上面的计算公式先计算一个批次内样本的均值μB和方差σ2B,然后再对输入数据做归一化,将其调整成均值为0,方差为1的分布。
对于上述给定的输入数据x(1),x(2),x(3),可以计算出每个特征对应的方差
则样本方差是:
3. 计算标准化之后的输出
对于上述给定的输入数据x(1),x(2),x(3),可以计算出标准化之后的输出:
在标准化之后,BatchNorm会紧接着对数据做缩放和平移。
其中γ和β是可学习的参数,可以赋初始值γ=1,β=0,在训练过程中不断学习调整。
2.2 BN算法整体流程如下图
输入:待进入激活函数的变量
输出:1.对于K维的输入,假设每一维包含m个变量,所以需要K个循环。每个循环中按照上面所介绍的方法计算γ与β。这里的K维,在卷积网络中可以看作是卷积核个数,如网络中第n层有64个卷积核,就需要计算64次。需要注意,
在正向传播时,会使用γ与β使得BN层输出与输入一样。
2.在反向传播时利用γ与β求得梯度从而改变训练权值(变量)。
3.通过不断迭代直到训练结束,求得关于不同层的γ与β。如网络有n个BN层,每层根据batch_size决定有多少个变量,设定为m,这里的mini-batcherB指的是特征图大小*batch_size,即m=特征图大小*batch_size,因此,对于batch_size为1,这里的m就是每层特征图的大小。
4.不断遍历训练集中的图片,取出每个batch_size中的γ与β,最后统计每层BN的γ与β各自的和除以图片数量得到平均直,并对其做无偏估计直作为每一层的E[x]与Var[x]。
5.在预测的正向传播时,对测试数据求取γ与β,并使用该层的E[x]与Var[x],通过图中11:所表示的公式计算BN层输出。
注意,在预测时,BN层的输出已经被改变,所以BN层在预测的作用体现在此处
2.3 Batch Normalization的反向传播
对于目前的神经网络计算框架,BatchNorm的梯度该如何求取?
在正向传播的时候,通过可学习的γ与β参数求出新的分布值
在反向传播的时候,通过链式求导方式,求出γ与β以及相关权值
根据反向传播的顺序,首先求取损失ℓ对BN层输出yi的偏导∂ℓ / ∂yi,然后是对可学习参数的偏导∂ℓ / ∂γ和∂ℓ / ∂β,用于对参数进行更新, 然后对变量μ、σ2和x^的偏导,根据链式法则再求这些变量对x的偏导 。
三、BN主要作用
BN的主要作用在于避免梯度爆炸或者梯度消失。
BN的作用:
(1)允许较大的学习率;
(2)减弱对初始化的强依赖性
(3)保持隐藏层中数值的均值、方差不变,让数值更稳定,为后面网络提供坚实的基础;
(4)有轻微的正则化作用(相当于给隐藏层加入噪声,类似Dropout)
如下图,在sigmoid函数中, 当X到一定的数值,就变化很小,
如果输入很大,其对应的斜率就很小,我们知道,其斜率(梯度)在反向传播中是权值学习速率。所以就会出现如下的问题,
这会造成的影响是在一个很大的深度网络中,浅层基本不学习,权值变化小,后面几层一直在学习,结果就是,后面几层基本可以表示整个网络,失去了深度的意义。
当我们进行归一化操作时,
a中左图是没有经过任何处理的输入数据,曲线是sigmoid函数,数据在梯度很小的区域,那么学习率就会很慢甚至陷入长时间的停滞。b)图中进行归一化操作之后,减均值除方差后,数据就被移到中心区域如右图所示,
而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
四、BN在CNN中的使用
目前在CNN中最流行的结构是:卷积+BN+激活函数,
假设对于一个深层神经网络来说,其中两层结构如下:
要对每个隐层神经元的激活值做BN,可以想象成每个隐层又加上了一层BN操作层,它位于X=WU+B激活值获得之后,非线性函数变换之前,其图示如下:
而BN算法的具体操作是:
BN算法的思路如下
在最后做归一化操作时出现前向传到公式为:
其结构图如下:
BN算法的实现过程如下:
五、BN的优点
BN层的有效性已有目共睹,其原因在于:
1,BN层让损失函数更平滑。添加BN层后,损失函数的landscape(losssurface)变得更平滑,相比高低不平上下起伏的loss surface,平滑losssurface的梯度预测性更好,可以选取较大的步长。如下图所示,
2,BN更有利于梯度下降。VGG和NIN网络在有无BN层的情况下,loss surface的差异,包含初始点位置以及不同优化算法最终收敛到的local minima位置,如下图所示。没有BN层的,其loss surface存在较大的高原,有BN层的则没有高原,而是山峰,因此更容易下降。
注:
其他常见的归一化方法有:
常用的Normalization方法主要有:Batch Normalization(BN,2015年)、Layer Normalization(LN,2016年)、Instance Normalization(IN,2017年)、Group Normalization(GN,2018年)。它们都是从激活函数的输入来考虑、做文章的,以不同的方式对激活函数的输入进行 Norm 的。
总结
BN的作用就是把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。
参考:
1, BN(Batch Normalization) 原理与使用过程详解
2, 5.10. 批量归一化