Inceptionv2论文详解

原文地址:

https://arxiv.org/pdf/1502.03167.pdf

 

论文主要内容:

提出BatchNorm,加在InceptionV1上。

 

之前的问题:

模型训练起来困难,因为训练深度神经网络的复杂性在于,每层输入的分布在训练过程中会发生变化,因为前面的层的参数会发生变化。我们将这种现象称为内部协变量转移。

 

思路由来简介:

1.以往做法:

利用带动量的SGD等方法训练深度网络,使用小批量训练样本数据。

这里使用小批量数据进行梯度估计的好处或特点有:

1.小批量数据的梯度损失是训练集上的梯度估计,其质量随着批量增加而改善

2.对一个批次的计算比单个样本计算m次效率更高

2.以往做法的弊端:

1.需要调节各种超参数:

虽然随机梯度是简单有效的,但它需要仔细调整模型的超参数,特别是优化中使用的学习速率以及模型参数的初始值。

2.参数对网络层的影响比较大,特别是通过深度网路进行的逐层放大:

训练的复杂性在于每层的输入受到前面所有层的参数的影响——因此当网络变得更深时,网络参数的微小变化就会被放大。

3.以往做法弊端的原因分析:

每层输入的数据的统计学上的分布变化问题:

因为这些层需要不断适应新的分布。当学习系统的输入分布发生变化时,据说会经历协变量转移。协变量转移通常通过域适应来解决。

(协变量:和自变量一样影响响应结果,但不能被实验者操纵;协变量转移:训练过程中深度网络内部节点分布的变化)

但是,域适应解决协变量转移的方法是站在结果的角度考虑的,且其对源域的调整是针对整个网络的输入层的,而协变量转移的概念可以作为一个整体延伸出学习系统,比如子网络或者一个层,所以我们引入了自己的办法来解决。

4.固定分布的好处分析:

1.子网络的输入固定分布可以使父网络的参数便于训练,它们将不必重新调整来补偿输入分布的变化

2.子网络的输入分布对网络外的层的影响。如果是sigmoid激活,变化的输入分布会导致训练期间那些参数的改变使x的许多维移动到非线性的饱和状态并减慢收敛,而且整个影响会随整个网路的加深而放大。在实践中,已经有通过Relu、设计权重初始化、使用较小的学习率等方法来解决饱和问题和由此产生的梯度消失。但是,如果能保证输入在网络训练时保持更稳定,那优化器将不太可能陷入饱和状态,训练将加速。

5.批量标准化的提出:

 为解决深度网络内部协变量转移,提出批量归一化。希望通过它减小内部协变量的转移,加速深度神经网络的训练。通过批标准化修正层输入的均值和方差。

 

Batch Normalizaton的提出过程:

1.减小内部协变量转移:

以往思路:

对网络的输入进行白化操作,将输入线性变换为具有零均值和单位方差的变量,并去相关,从而实现输入的固定分布,消除内部协变量转移的不良影响,从而使网络训练收敛的更快。并对每一层的输入进行此项操作。

对每个训练步骤或者以一定间隔的激活函数进行白化的缺陷:

仅仅将这些修改与优化步骤直接穿插摆放,则梯度下降的步骤对参数的调整可能会改变激活输出的分布并导致重新归一化,梯度下降步骤可能会试图以要求标准化进行更新的方式来更新参数,而这有可能会使得梯度下降的效果减弱。总之:我们在最初的实验中已经观察到了这一点,当标准化参数在梯度下降步骤之外计算时,模型会爆炸。我的理解是当标准化操作独立于梯度下降时,将会使得梯度下降的效果减弱甚至更严重的影响。

产生缺陷的原因:

梯度下降优化没有考虑到标准化中发生的事实(也就是说梯度下降没有把归一化考虑进去),我们应该确保对于任何参数值,网络总是产生具有所需分布的激活值。这样做将允许关于模型参数损失的梯度来解释标准化,以及它对模型参数Θ的依赖。

尝试解决缺陷的方法:

设x为层的输入,将其看作向量,X(整个数据集的代表,所以,每次的输入是在整个训练集上进行分析的结果)是这些输入在训练集上的集合。标准化可以写为变换:

它不仅依赖于给定的训练样本x而且依赖于所有样本X——它们中的每一个都依赖于Θ。如果x是由另一层生成的,对于反向传播,我们将需要计算雅可比行列式

忽略后一项会导致上面描述的爆炸。

但是,在这个解决方案中,白化操作是昂贵的,因为它要求计算协方差矩阵和它的平方根倒数从而生成白化的激活和这些变换进行反向传播的偏导数,并且它并不是到处可微分的,这促使我们寻求一种替代方案,以可微分的方式执行输入标准化,并且在每次参数更新后不需要对整个训练集进行分析。另外,以前的一些方法使用通过单个训练样本计算的统计信息,或者在图像网络的情况下,使用给定位置处不同特征图上的统计。然而,通过丢弃激活值绝对尺度改变了网络的表示能力。所以,我们希望尽量在单个样本上保留更多的网络中的信息。所以我们相对于整个训练数据统计信息的单个训练样本的激活值进行归一化。

针对上述要求提出的新解决思路:

针对上述白化方案的改进:

1.单独标准化每个标量特征(替代在层输入输出对特征进行共同白化),使其具有零均和单位方差。

其中的方差和均值是在整个训练数据集上计算的。

这种标准化没有去相关,但是也加速了收敛。

2.这么简单做,会限制层的表达能力,数据在0附近的话,如果是sigmoid函数只用到了他0附近的线性部分。从而降低模型的表达能力。   所以引入两个参数对数据进行平移和拉伸,使数据分散地更均匀。使得输出仍旧保持一定的灵活性。这两个参数都是可以学习的.

通过设置:

可以重新获得原始的激活值。

3.每个训练步骤的批处理设置是基于整个训练集的,我们将使用整个训练集来标准化激活值。然而,当使用随机优化时,这是不切实际的。因为这就需要在训练之间计算整个数据集的各项特征的均值方差。因此,我们使用小批量数据代替整个样本。
 

2.批标准化过程描述:

1.前向传播过程:

2.反向传播过程:

3.BN特点分析:

1.BN变换是将标准化激活引入到网络中的可微变换。

2.它让模型训练时,层可以继续学习输入分布(βγ可以用梯度反向传播更新),表现出更少的内部协变量转移,从而加快训练。

 

 

BN网络的训练:

训练时使用小批量数据的标准化,测试时我们使用总体估计来进行标准化(不是小批量数据统计)。

样本总方差使用无偏估计获得:

关于批归一化使用的具体位置的分析:

在卷积或者全连接之后,在进入激活函数之前的位置(也就是对Wu+b而不是u)进行批归一化最好。

原因:

1.u可能是另一个非线性的输出(上一个激活函数的输出),它的分布可能在训练过程中改变,并且训练过程会限制第一矩和第二矩不能去除协变量转移。

2.Wu+b更可能具有对称,非稀疏分布,即“更高斯”,对其标准化可能产生具有稳定分布的激活。

 

批归一化的好处:

减小内部协变量的转移,使得网络更容易训练,从而可以提高学习率:

1.在传统的深度网络中,学习率过高可能会导致梯度爆炸或梯度消失,以及陷入差的局部最小值。批标准化有助于解决这些问题。

2.通过标准化整个网络的激活值,在数据通过深度网络传播时,它可以防止层参数的微小变化被放大。例如,这使sigmoid非线性更容易保持在它们的非饱和状态,这对训练深度sigmoid网络至关重要,但在传统上很难实现。

3.批标准化也使训练对参数的缩放更有弹性。

通常,大的学习率可能会增加层参数的缩放,这会在反向传播中放大梯度并导致模型爆炸。然而,通过批标准化,通过层的反向传播不受其参数缩放的影响。我们在这里用标量a代表权重被放大,

BN(Wu)=BN((aW)u),Wu和aWu是我们BN的对象x,其中的a会在BN过程被约掉。

因此,标量不会影响层的雅克比行列式,从而不影响梯度的反向传播。相反,更大的权重会导致更小的梯度,所以,批标准化会稳定参数的增长。

 

实验验证批归一化:

Mnist数据:

ImageNet分类:

将批标准化简单添加到网络中不能充分利用我们方法的优势。为此,我们进行了以下修改:

1.提高学习率

在批标准化模型中,我们已经能够从高学习率中实现训练加速,没有不良的副作用

2.删除丢弃

我们发现从BN-Inception中删除丢弃可以使网络实现更高的验证准确率。我们推测,批标准化提供了类似丢弃的正则化收益,因为对于训练样本观察到的激活受到了同一小批量数据中样本随机选择的影响。

3.更彻底地搅乱训练样本

我们启用了分布内部搅乱训练数据,这样可以防止同一个例子一起出现在小批量数据中。这导致验证准确率提高了约1%,这与批标准化作为正则化项的观点是一致的:它每次被看到时都会影响一个样本,在我们的方法中内在的随机化应该是最有益的。

4.减少L2权重正则化。

虽然在Inception中模型参数的L2损失会控制过拟合,但在修改的BN-Inception中,损失的权重减少了5倍。我们发现这提高了在提供的验证数据上的准确性。

5.加速学习率衰减。

在训练Inception时,学习率呈指数衰减。因为我们的网络训练速度比Inception更快,所以我们将学习速度降低加快6倍。

6.删除局部响应归一化。

虽然Inception和其它网络(Srivastava等人,2014)从中受益,但是我们发现使用批标准化它是不必要的。

7.减少光照扭曲。

因为批标准化网络训练更快,并且观察每个训练样本更少的次数,所以通过更少地扭曲它们,我们让训练器关注更多的“真实”图像。

单网络分类结果:

                         Inception和它的批标准化变种在单个裁剪图像上的验证准确率以及训练步骤的数量

达到Inception最大准确率(72.2%)所需要的训练步骤数量

组合网络分类结果:

对于我们的组合,我们使用了6个网络。每个都是基于BN-x30的,进行了以下一些修改:增加卷积层中的初始重量;使用Dropout(丢弃概率为5%或10%,而原始Inception为40%);模型最后的隐藏层使用非卷积批标准化。每个网络在大约6⋅106个训练步骤之后实现了最大的准确率。组合预测是基于组成网络的预测类概率的算术平均。组合和多裁剪图像推断的细节与(Szegedy et al,2014)类似。

 

 

欢迎批评指正,讨论学习~
最近在github放了两份分类的代码,分别是用Tensorflow和Pytorch实现的,主要用于深度学习入门,学习Tensorflow和Pytorch搭建网络基本的操作。打算将各网络实现一下放入这两份代码中,有兴趣可以看一看,期待和大家一起维护更新。
代码地址:
Tensorflow实现分类网络
Pytorch实现分类网络

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值