扒一扒神经网络--Inception v2(Batch normalization)

Inception v2


Title: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

Author and affiliation: Google

Year: 2015

Honors: 4.9% top-5 test error and 20.1% top-1

Datasets: ILSVRC-2012 dataset 和 MNIST

Main contributions: 

综述:Inception v2和v1的区别是要在于两大方面:1.采用VGG提出的方式,把5*5的卷积改成3*3卷积 2.在每一层的非线性激活之前采用了batch normalization(BN)。这篇论文主要就是介绍BN,并在最后使用Inception v2对其性能进行了测试。

 文章在摘要部分就指出DCNN之所以复杂很大一部分是由于输入数据的分布和参数会随着层内的操作而改变,即为internal covariance shift,且这种分布的差异性会随着网络层次的加深而加大。因此,作者在每一层都加入了BN处理,它是一种mini batch的批规范化操作,使得输出结果的分布限制为均值为0,方差为1的分布。(虽然这并不代表每层数据都具有相同分布,但这种操作可以防止“梯度弥散”,下面会详述)

缘由:随机梯度下降SGD[1]在训练DCNN中被证明是一种很有效的算法,为了提高效率,使用小批量样本mini-batch(将所有样本分成等量m的子集,如果使用全部的数据,则为full-batch,当1 < mini batch size < m,也就是MBGD)分别对每一个子集做一次梯度下降。如下图,左边是full-batch,后边是mini-batch。我们可以看到左图明显呈下降的趋势,但这种full-batch的很容易陷入局部最优,右图由于是对每一个子集进行梯度下降,所以时好时坏,但总体的趋势也是下降的。

再看这一张图,

蓝色: BGD,full-batch,即 mini batch size = m,
紫色:SGD,随机梯度下降,即 mini batch size = 1,
绿色:MSGD,mini-batch ,即 1 < mini batch size < m。

对于一个epoch,full-batch一步的时候(计算更为复杂)mini-batch经过了n步(等同于子集的数目),也就是说mini-batch的速度更快。而随机梯度下降是每次对一个样本进行梯度下降,它只会在最小值附近波动,永远不会收敛。且相对于单样本的SGD,MSGD的更新方向更加准确(多个样本进行梯度下降)。

在本论文中,也对在SGD中mini-batch的好处进行了总结。1.由小批量计算出的损失函数的梯度是对整体训练集的损失函数梯度的估计,当batch size增大时,性能越好。2.目前的并行计算的发展,使得小批量的计算比进行单个样本的多次计算更高效。

虽然MSGD有其合理性和优势,但也存在一些瓶颈亟待解决。1.对高参数如其初始化十分敏感,如果初始化值不理想,会随着网络的加深,不断扩大其影响使得网络变得无法训练。2.每一层的输入分布是变化的使得参数要去不断去适应新的输入分布。特殊的,当对于一个模型的输入分布产生变化时(比如训练集和测试集的分布存在很大差异,如训练集是西方人脸,而测试集是东方人脸等),也就是[2]所说的covariance shift(注意这是发生的输入层的,而internal covariance shift是发生在隐层中),统计机器学习里一个经典的假设就是source domain和target domain的数据分布是一致的,这也是保证训练出的模型能在测试集上获得好的表现的基础。covariance shift影响了模型的泛化能力。Domain Adaptation[3](迁移学习的一种典型方法)可以用来解决这一问题。这个概念扩展到子层就变成了internal covariance shift,如果每一层的输入分布都在变化,那么在参数的过程中不仅要对loss函数负责,还要对每一层数据输入分布的变化做出“努力”,而且这种改变会随着网络的层数,一层层的传下去。假设某曾激活函数为sigmoid的隐层z=g(Wu+b)u为该层的输入,Wb分别为权重和偏置,g(x)=\frac{1}{1+e^{-x}},函数图像如下,当\left | x \right |增大时,g'(x)趋向于0,也就意味着梯度逐渐消失。如果x经过该层一下的计算最终使得它的激活值偏向于激活函数的非线性饱和端,并随着网络的加深不断加剧,最终导致网络难以训练。虽然使用ReLu[4]激活函数,合适的参数初始化方式和使用较小的学习率能够改善梯度弥散的问题,但如果能使得每层的输入分布稳定的话,不仅可以使得输入落入非线性饱和端的情况减少还可以加速网络的训练。

sigmoid函数

所以本论文提出了BN,并主要围绕以下几个点来进行改进,这里主要根据我自己的理解来进行分节与原论文的顺序不太一样,但点都会覆盖到。

a.reduce internal covariance shift

很多研究[5,6]证明,对输入数据进行白化操作可以加速模型的收敛,于是,作者尝试对每一层的输入都进行类似白化的操作,使得每一层的输入都为均值0,方差1的稳定分布。需要注意的是,将输入固定为均值0,方差1的分布并不意味着每一个是相同的分布,但作者想通过这个角度来让避免传统网络中存在的梯度弥散问题。

事实上,对于隐层的白化不仅可以在每一层的输入进行,也可以通过改变网络结构或者优化参数来进行。但作者发现,如果在优化步骤执行白化,这就意味着归一化在激活值之后进行,但这种方式会降低梯度下降的效果。比如,某层网络的输入是ub是该层对应的偏置值,x=u+b,也就是x是该层的激活值。对该层进行归一化,\hat{x}=x-E[x],其中\small E[x]=\frac{1}{N}\sum ^{N}_{i=1}x_{i},是N个样本的均值。此时的归一化操作是在激活之后进行的,那么这里\small b\small E[x]没有依赖(反之,如果在激活之前进行归一化,那么\small E[x]的自然会对\small b产生影响,即\small b依赖于\small E[x])。此时,对于\small b的更新:b\leftarrow b+\bigtriangleup b\bigtriangleup b\propto -\frac{\partial l}{\partial \hat{x}},那么x-E[x]=u+(b+\bigtriangleup b)-E[U+(b+\bigtriangleup b)]=u+b-E[u+b]=u+b-E[u]-b=u-E(u),最后一两个等式是由于\small b\small E[x]没有依赖。从这个长等式中,可以看出,该层的输出并不受\small b的影响,倘若\small b一直增长,可输出不变,损失函数就不变,那么就会造成梯度的爆炸。同时,如果此处的归一化不仅对激活值进行了中心化,还进行了缩放的话,这个现象会更加严重(个人理解为如果对其进行了缩放,会使得网络输出变小,但\small b还是在增长,让网络以为自己在朝好的梯度前进,但梯度还是会因为\small b的增长而爆炸)。

因此,我们希望在梯度下降的时候也考虑到归一化的结果,这样由期望分布产生激活值。同时,在文章的3.2中也指出,在线性激活之前进行标准化,对于前一层的输出(也就是这一层的输入)u-非线性的输出,分布有可能改变l了,Wu+b更具一致性,稀疏性(线性变换,使得数据分布稳定,同时非线性激活往往由于饱和端产生很多0值具有稀疏性,而Wu+b产生0的概率更小些,更具非稀疏性)。基于以上,\hat{x}=Norm(x,\chi )\chi为所有训练样本的集合。但如果每次的操作都要使用全部的训练集,计算量是很大的(因为白化操作需要先求通过PCA除去特征之间的相关性,而PCA需要计算\chi的协方差矩阵),而且也不是处处可导的,因此在BN中采用了mini-batch来进行简化。

b.mini-batch和模型能力的保持

在BN中,作者对每个特征标量(而不是用协方差矩阵,因为如果mini-batch的大小小于特征的维度,那协方差矩阵就会是一个奇异矩阵,而求方差-协方差矩阵的逆矩阵的时候就会发生错误)进行标准化,使得每一层的分布均值为0,方差为1。假设输入X=(x^{(1)}...x^{(d)}),那对于第k维也就是第k个通道进行如下式的计算:

\hat{x}^{(k)}=\frac{x^{(k)}-E[x^{(k)}]}{\sqrt{Var[x^{(k)}]}}       式1

LeCun[5]的工作证明了这种标准化的方式就算特征没有去相关性也可加速收敛。但可以看出通过这种方式将原来的非线性表达转换成了线性的,把输出局限在激活函数的线性部分(如下图红线部分),这样模型的表达能力就会受到影响。

因此,作者在式1操作后,又加上了一个变换:y^{(k)}=\gamma ^{(k)}\hat{x}^{(k)}+\beta^{(k)}用于还原模型的表达能力,将原本的正态分布向左或向右且宽一点或窄一点,也可以理解为让模型找到一个兼容线性和非线性优点的平衡方法。当 \gamma ^{(k)}=\sqrt{Var[x^{(k)}]},\beta^{(k)}=E[x^{(k)}]时,y^{(k)}=x^{(k)},也就是恢复了原先的数据。

同时,这种对输入的同一维度进行标准化的操作也是符合卷积特性的:对于同一个feature map的不同区域,用相同的方式进行normalization。

因此,BN算法总结如下图算法1,其中\epsilon是一个很小的数,使得\hat{x}_i的分母不为0,保证方差的稳定性。

其中,根据求导的链式规则,关于参数经过后馈的更新如下计算:

链式关系

 

c.网络参数方面:更大的学习率和减少dropout

学习率控制了模型的学习速度,控制着在调整参数的幅度,在以往的CNN中,如果使用较大的学习率常常会导致梯度消失爆炸或者陷入局部的最小值,使得模型难以收敛。由于参数的更新“步伐”大小是由学习率决定的,例如w_{ij}\leftarrow w_{ij}-\alpha \cdot \frac{\partial l}{\partial w_{ij}}。因此,大的学习率会使得参数的尺度变大,从而在后馈过程中经过层级传递不断放大导致梯度的消失与爆炸。BN能够避免这种现象,比如在sigmoid中,输入会被标准化在函数的非饱和区,这样在一定程度上可以避免梯度的消失。如果从理论上讲,对于标量aBN((aW)u)=\gamma \cdot \frac{(a Wx+b)-a \mu }{\sqrt{a^2\sigma ^2}}=\gamma \cdot \frac{(Wx+b)- \mu }{\sqrt{\sigma ^2}}=BN(Wu),即BN(Wu)=BN((aW)u)。而对于每一层的后馈过程,通过BN(Wu)=BN((aW)u)可以很容易推出下式。在其第一行等式我们可以看到,每一层的雅克比行列式也不会受a的影响。此外,对于大权重反而会使梯度更小,避免了梯度爆炸现象。作者们推想可能BN会使得雅克比行列式的奇异值为1,加速了模型的收敛[7](作者在文章中并未证明).

此外,由于每层输入经过BN的标准化,所以,使用的BN的CNN不再产生一些权重很大的值,这对于模型的泛化是有好处的。因此,作者们发现可以减少Dropout的使用甚至直接不用。

总结:因此,当网络的收敛速度很慢,或者发生了梯度消失或爆炸等之类的难以训练的情况时,可以尝试使用BN来解决。同时,在一般情况下,BN也可以加快训练,提高精度。

Strcture:

在网络的测试阶段,由于常常只有一个样本去做预测,所以对于BN需要mini-batch来计算均值和方差就比较为难了。因此,在测试阶段的均值和方差由训练阶段的均值和方法进行全局统计,然后用对其进行无偏估计得出测试所需的均值和方差。主要运用的是滑动平均的方法,记录下moving_mean和moving_var,进行无偏估计用于测试阶段。

测试阶段的BN计算:\hat{x}=\frac{x-E[x]}{\sqrt{Var[x]+\epsilon }}

对于moving_mean和moving_var的计算主要为下式。对于每一个mini-batch的均值和方差进行记录,然后再下一次mini-batch进行更新。需要主要的是测试阶段的\gamma,\beta已经在训练阶段得出,因此可以直接用

moving_mean = momentum * moving_mean + (1 - momentum) * sample_mean
moving_var = momentum * moving_var + (1 - momentum) * sample_var

训练阶段的算法过程如下表。

Results:

a.BN的作用

作者先在MNIST数据集上用一个很简单的网络(只有三层全连接层,每一层有100个sigmoid激活单元)测试了BN的效果。网络的输入为28*28的二值图像。权值用随机高斯分布初始化,损失函数为交叉熵。

从结果图中,可以看出使用了BN的收敛速度明显加快,而且有更高的准确度。在(b)和(c)中可以看出,BN使得输入数据的分布更加稳定,这意味着BN在一定程度可以减少internal covariate shift。

b.ImageNet 分类

这里就是用的inception v2网络啦,网络结构如下表格,与v1的主要区别在于:1)将5*5的卷积改成了两个3*3(与VGG相同),用更小的计算量却达到了相同的感受野。2)去掉了dropout层和全连接层。3)在卷积层的非线性激活之前加入了BN进行标准化。

这里也po上inception v1的网络结构图用于对比。

除了以上在网络结构上的优化,为了加速网络,作者还对网络参数的以下方面做了调整:1)加大学习率以加速训练。2)丢弃dropout,之前已经说过BN已经能让网络具有很强的泛化能力了。3)减少用于防止过拟合的正则项L2的权重(除以5),提高了准确率。4)v2的网络训练的更快,因此比v2中对学习率的衰减速度比v1快了六倍。5)去掉了Alexnet提出的LRN。6)采用了更彻底的shuffle,防止相同样本总是被安排在同一个mini-batch中。7)由于网络训练的更快,对于同一个样本的次数减少。因此v2中不再使用v1所用的photometric distortions来进行数据增强。

作者在LSVRC2012数据库上对网络进行了评估,主要有以下五个网络用来作对比:1)Inception:未做BN的inception v2,学习率初始化为0.0015。2)BN-Baseline:inception v2,学习率初始化为0.0015。3)BN-x5:inception v2,学习率初始化为0.0075。以后的衰减与上段4)。4)BN-x30:inception v2,只是初始化学习率比BN-x5大,为0.045。5)BN-x5-sigmoid:将BN-x5中激活函数由ReLu换成了sigmoid。

 

从结果对比中,可以看出加了BN的inception的收敛速度要快很多,准确率上也有所提高。BN-x5和BN-x30效果相近,虽然BN-x5的收敛速度更快但BN-x30的准确率更高,可见。此外,使用sigmoid替代ReLu使网络收敛变慢,准确率也变低了。

c.组合分类

 

在以往的ImagNet分类比赛中,最佳结果通常是传统模型的组合,作者也组合了六个网络(基于BN-x30),最终结果是各个模型类别概率的均值。

对于BN-x30主要做了如下修改:加大了初始权重大小;使用了dropout;在最后一个隐藏使用了非卷积的BN。

Github:

Tensorflow 实现: inception v2

Reference:

[1] Sutskever, Ilya, Martens, James, Dahl, George E., and Hinton, Geoffrey E. On the importance of initialization and momentum in deep learning. In ICML(3), volume 28 of JMLR Proceedings, pp. 1139–1147.
JMLR.org, 2013

[2] Shimodaira, Hidetoshi. Improving predictive inference under covariate shift by weighting the log-likelihood
function. Journal of Statistical Planning and Inference, 90(2):227–244, October 2000.

[3] Jiang, Jing. A literature survey on domain adaptation of statistical classifiers, 2008.

[4] Nair, Vinod and Hinton, Geoffrey E. Rectified linear units improve restricted boltzmann machines. In ICML, pp. 807–814. Omnipress, 2010.

[5] LeCun, Y., Bottou, L., Orr, G., and Muller, K. Efficient backprop. In Orr, G. and K., Muller (eds.), Neural Networks: Tricks of the trade. Springer, 1998b

[6] Wiesler, Simon and Ney, Hermann. A convergence analysis of log-linear training. In Shawe-Taylor, J., Zemel, R.S., Bartlett, P., Pereira, F.C.N., and Weinberger, K.Q. (eds.), Advances in Neural Information Processing Systems 24, pp. 657–665, Granada, Spain, December 2011.

[7] Saxe A M , Mcclelland J L , Ganguli S . Exact solutions to the nonlinear dynamics of learning in deep linear neural networks[J]. Computer Science, 2013.


作者:miya_xu 出处:https://blog.csdn.net/u012885745/article/details/84779930 欢迎转载或分享,但请务必声明文章出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值