[深度学习]Inception Net (V1-V4)系列论文笔记

目录

一、论文下载地址

二、Inception V1

三、Inception V2

四、Inception V3

五、Inception V4

六、总结


一、论文下载地址

Google Inception Net  又被称为GoogLeNet 之所以这个名词,论文里面有提到“ This name is an homage to Yann LeCuns pioneering LeNet 5 network”,原来是想LeNet致敬。inception net一共有四个版本,分别是v1到v4,下面是四个版本的论文。

[v1] Going Deeper withConvolutions, 6.67% test error,2014.9

论文地址:http://arxiv.org/abs/1409.4842

[v2] Batch Normalization:Accelerating Deep Network Training by Reducing Internal Covariate Shift, 4.8% test error,2015.2

论文地址:http://arxiv.org/abs/1502.03167

[v3] Rethinking theInception Architecture for Computer Vision, 3.5%test error,2015.12

论文地址:http://arxiv.org/abs/1512.00567

[v4] Inception-v4,Inception-ResNet and the Impact of Residual Connections on Learning, 3.08% test error,2016.2

论文地址:http://arxiv.org/abs/1602.07261
 

二、Inception V1

Inception V1的最大特点是控制了计算量和参数量的同时获得了非常好的分类结果——top5错误率6.67%。论文里面提到了目前(当时是2014年)使用旧的方式一昧地增大网络的层数会出两个不能避免的问题:

1.容易造成过拟合,尤其是面对一些数据样本有限的数据集

2.计算资源的消耗,成本大

而解决这两个问题的根本方法是最终从完全连接到稀疏连接的架构,甚至在卷积内部,也就是后面会提到inception module。论文里引用了一篇Provable bounds for learning some deep representations所说的,如果数据集的概率分布可由大的,非常稀疏的深度神经网络表示,则可以通过分析激活的相关统计数据逐层构建最优网络拓扑。论文里面说这是基于Hebbian principle的原则,这个原则是说一起发射的神经元会连在一起“neurons that fire together, wire together”。一个很通俗的现象,学习生物的时候有这个实验:先摇铃铛,之后给一只狗喂食,久而久之,狗听到铃铛就会口水连连。这也就是狗的“听到”铃铛的神经元与“控制”流口水的神经元之间的链接被加强了,而Hebbian principle的精确表达就是如果两个神经元常常同时产生动作电位,或者说同时激动(fire),这两个神经元之间的连接就会变强,反之则变弱。

Inception V1有22层深。它之所以能够取得好的结果除了模型层数更深,表达能力更强之外还因为两点:

1.用全局平均池化层代替了最后的全连接层

全连接层几乎占据了alexnet和VGGnet中大部分的参数量,而且会引起过拟合,去除全连接层之后模型可以训练的更快且避免了过拟合的情况。

2.精心设计的inception module提高了参数的利用率

图片二图片三

左边是inception module的naive版本,简单点说就是采用不同大小的卷积核,意味着不同大小的感受野,这样可以增加网络对不同尺度的适应性。最后拼接意味着不同尺度特征的融合。这个版本的问题是运算量太大,汇集层的输出太“厚”了。它们的输出过滤器数量等于前一阶段中的过滤器数量。 汇集层的输出与卷积层的输出的合并将导致阶段之间的输出数量不可避免地增加。 即使这种架构可能覆盖最佳稀疏结构,它也会非常低效地工作,导致在几个阶段内计算爆炸。举一个简单的例子:

上一层的输出为100x100x128,经过具有256个输出的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256。其中,卷积层的参数为128x5x5x256。假如上一层输出先经过具有32个输出的1x1卷积层,再经过具有256个输出的5x5卷积层,那么最终的输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256,大约减少了4倍。

所以为了使得最后concaternation得到的结果不至于太“厚”和减少参数量,使用了右边这个改进的版本,这个版本加入了1*1的卷积层就起到了降维的作用。而这里是也借鉴了NIN的思想(Network In Network)。1*1的卷积性价比很高,用很小的计算量就能增加一层特征变换和非线性变化。

下图是v1版本的完整结构图。

图片一

这里可以看到inception net 里使用了辅助分类节点,,在中间的某一层输出分类结果,然后按一个较小的权重加到最终的分类结果中,这其实相当于模型融合,同时也增添了反向传播的梯度信号,避免梯度弥散。

这是论文里面的网络结构。

总结一下,论文的主要想法其实是想通过构建密集的块结构来近似最优的稀疏结构,从而达到提高性能而又不大量增加计算量的目的。

三、Inception V2

第二个版本主要是引入了batchnorm。

训练深度神经网络很复杂,由于前一层的参数会发生变化,每个层的输入分布在训练期间会发生变化。这会降低训练速度,因此需要较低的学习率和比较谨慎的参数初始化,这使得它非常难以训练具有饱和非线性的模型。我们将这种现象称为内部协变量偏移,并通过normalizing layer归一化层输入来解决问题。这种方法优势在于使标准化成为模型体系结构的一部分,并为每个培训小批量执行标准化。批量标准化允许我们使用更高的学习速率并且不太谨慎的权重初始化。它还可以充当regularizer正则化,在某些情况下可以消除对Dropout的需求。应用于最先进的图像分类模型,Batch Normalization与达到相同的精度的模型相比训练步数减少14倍,并且显著超过原始模型的精度。该论文使用一组batchnormalized网络,改进了ImageNet分类的最佳发布结果:达到4.9%的top-5验证错误(和4.8%的测试错误),超出了人类评估者的准确性(5%)。

论文使用到了mini-batch,它的优势是:首先,mini-batch损失的梯度是对训练集的梯度的估计,其质量随批量增加而改善。 其次,由于现代计算平台提供的并行性,mini-batch批量计算可以比单个示例的m次计算更有效。

由于每层输入的完全白化成本高昂且并非在各处都是可区分的,(关于什么是白化?举例来说,假设训练数据是图像,由于图像中相邻像素之间具有很强的相关性,所以用于训练时输入是冗余的。白化的目的就是降低输入的冗余性;更正式的说,我们希望通过白化过程使得学习算法的输入具有如下性质:(i)特征之间相关性较低;(ii)所有特征具有相同的方差。)因此我们进行了两次必要的简化。 首先,我们不是将图层输入和输出中的特征联合起来,而是将每个标量特征独立地归一化,使其均值为零,方差为1。

其次,请注意,简单地规范化图层的每个输入可能会改变图层可以表示的内容。 例如,对sigmoid输入进行归一化会将它们约束到非线性的线性状态,所以激活函数可能会失效。 为了解决这个问题,我们确保插入网络中的转换可以表示身份转换,即网络真正学到某些变化。 为了实现这一点,我们为每个激活x(k)引入一对参数γ(k),β(k),它们对归一化值进行缩放和移位:y(k)=γ(k)*x(k)+β(k)


这些参数与原始模型参数一起学习得来,并修复网络的表示能力。

下图就是batchnorn的算法流程。

其中,是常数,为数值稳定性添加到小批量方差中。

论文里面有更详细的前汇和反向传播的过程,以及这些参数是怎么求导的公式,这里就不详细展开了。当然,只是单纯地使用batchnorm获得的增益是不明显的,还需要一些trick:

增大学习率并加快学习衰减速度以适用bn规范化后的数据;去除dropout并减轻L2正则(这里是因为bn已经起到了正则的作用);去除LRN;更彻底对训练样本进行洗牌shuffle。有兴趣可以看论文的实现。

四、Inception V3

这个版本的网络主要有两方面的改造:

1.引入了非对称卷积的空间分解Spatial Factorization into Asymmetric Convolutions

简单点说就是可以将一个大的二维卷积拆成两个较小的一维卷积,比如上图中3*3可以拆成1*3和3*1的卷积。这样做的好处是可以减少大量的参数,加速了运算并降低了过拟合;而另一个方面增加了一层非线性来扩展模型表达能力。注意,论文里面指出,这种非对称拆分其实是比拆为几个更小的卷积核(长宽相同)的效果更好,可以处理更多更丰富的特征。

2.对inception module进行优化

提供了35*35,17*17,8*8三种不同结构的module,看右图中在分支中继续使用分支,可以说是network in nerwork in network。

除此之外,论文还是用了Auxiliary Classifiers辅助分类器,以及通过标签平滑进行模型正则化等手段提高准确率,有兴趣可以查阅论文。最后放上实验结果:

五、Inception V4

这个版本主要研究了 Inception Module 结合 Residual Connection,结合 ResNet 可以极大地加速训练,同时极大提升性能,在构建 Inception-ResNet 网络同时,还设计了一个更深更优化的 Inception v4 模型,能达到相媲美的性能。

先来看看整体的结构图:

下面是stem和Inception-A部分结构图,对照上图的结构图里面的stem和inception-A.

stem部分其实就是多次卷积+2次pooling,pooling采用了Inception-v3论文里提到的卷积+pooling并行的结构,来防止bottleneck问题。stem后用了3种共14个Inception模块(上图),三种Inception模块具体是怎么取舍参数的论文没有过多解释,估计还是靠经验判断吧。三种Inception模块间的Reduction模块起到pooling作用,同样使用了并行的结构来防止bottleneck问题。

reduction-A,inception-B,reduction-B和inception-C也是这么复杂的结构,这里就不贴出来占位置了,可以去查看论文。

论文里除了提到了Inception V4,还有Inception-Resnet-v1,Inception-ResNet-v2这两个个版本。在论文中Szegedy重点描述了Inception-ResNet-v1(在Inception-v3上加入ResNet)和Inception-ResNet-v2(在Inception-v4上加入ResNet),具体结构见图:

测试结果详情请阅读论文。

六、总结

Inception V1——构建了1x1、3x3、5x5的 conv 和3x3的 pooling 的分支网络module,同时使用 MLPConv 和全局平均池化,扩宽卷积层网络宽度,增加了网络对尺度的适应性;

Inception V2——提出了 Batch Normalization,代替 Dropout 和 LRN,其正则化的效果让大型卷积网络的训练速度加快很多倍,同时收敛后的分类准确率也可以得到大幅提高,同时学习 VGG 使用两个3´3的卷积核代替5´5的卷积核,在降低参数量同时提高网络学习能力;


Inception V3——引入了 Factorization,将一个较大的二维卷积拆成两个较小的一维卷积,比如将3´3卷积拆成1´3卷积和3´1卷积,一方面节约了大量参数,加速运算并减轻了过拟合,同时增加了一层非线性扩展模型表达能力,除了在 Inception Module 中使用分支,还在分支中使用了分支(Network In Network In Network);


Inception V4——研究了 Inception Module 结合 Residual Connection,结合 ResNet 可以极大地加速训练,同时极大提升性能,在构建 Inception-ResNet 网络同时,还设计了一个更深更优化的 Inception v4 模型,能达到相媲美的性能。
 

参考文献:

[1] Going Deeper withConvolutions, 6.67% test error,2014.9   http://arxiv.org/abs/1409.4842

[2] Batch Normalization:Accelerating Deep Network Training by Reducing Internal Covariate Shift, 4.8% test error,2015.2 http://arxiv.org/abs/1502.03167

[3] Rethinking theInception Architecture for Computer Vision, 3.5%test error,2015.12 http://arxiv.org/abs/1512.00567

[4] Inception-v4,Inception-ResNet and the Impact of Residual Connections on Learning, 3.08% test error,2016.2 http://arxiv.org/abs/1602.07261

[5]《TensorFlow实战》

猜你喜欢

转载自blog.csdn.net/sinat_33487968/article/details/83588372