Jayxbx的博客

deep learning

Rethinking the Inception Architecture for Computer Vision 论文笔记

0 摘要

自从2014之后,深度卷积网络成为了计算机视觉解决方案的主流。模型的大小和计算成本的增加可以直接转换成质量收益。但是对于像移动视觉和大数据场景,计算效率和低参数计算仍是限制因素。本论文探索一种扩大网络的方法,目标是通过适当的分解卷积和积极的正则化来尽可能地有效利用增加的计算。

1 介绍

从2014年开始,通过利用更深更宽的网络,网络架构的质量得到了明显改善。VGGNet和GoogLeNet在2014 ILSVRC分类挑战上取得了类似的高性能。一个有趣的发现是在分类性能上的收益趋向于转换成各种应用领域上的显著质量收益。这意味着深度卷积架构上的架构改进可以用来改善大多数越来越多地依赖于高质量、可学习视觉特征的其它计算机视觉任务的性能。

VGGNet的架构简洁,但这样做成本很高,评估网络需要大量计算。Inception架构在被设计为在内存和计算预算严格限制的情况下也能表现良好。GoogLeNet仅有500万参数,是AlexNet的1/12;VGGNet的参数是AlexNet的1/3。

Inception架构的计算成本远低于VGGNet,而且它的性能也高于其他后继者。在大量数据需要以合理成本处理的情况下或在内存或计算能力固有地受限情况下,利用Inception网络变得可行。然而,Inception架构的复杂性使得更难以对网络进行更改。如果单纯地放大架构,大部分的计算收益可能会立即丢失,使得它难以在适应新用例的同时保持其效率。如果增大Inception模型的容量,如果只是双倍增加滤波器组的数量,参数量和计算量将会增大4倍;在许多场景中,不允许这样设计。在本文中,我们描述一些一般原则和优化思想,能够以有效的方式扩展卷积网络。这些原则不局限于Inception网络。

2 通用设计原则

原则1

设计网络的时候需要避免 representational bottlenecks(表示瓶颈)。
层与层之间进行信息传递时,要避免这个过程中的数据的extreme compression,也就是说,特征图的尺寸不能减小的太快,数据从输入到输出大致是减少的,这个变化过程一定要缓慢,而不是快速的。如果信息过度压缩,将会丢失大量的信息,对模型的训练也造成了困难。
理论上来说,不能仅仅通过增加维度得到信息,因为它已经丢弃了许多重要特征例如相关结构,维度只能代表信息的粗略估计。(个人理解:一个不合理的例子,比如在网络输出层的shape是227x227x3,经过第一层卷积层之后可能会变成200x200x64,维度的增加可以理解成通道数由原来的3增加到64,通道数的增加获得的信息不能弥补特征图尺寸的急剧压缩丢失的信息。)

原则2

不太容易理解。原文如下:
Higher dimensional representations are easier to process locally within a network. Increasing the activations per tile in a convolutional network allows for more disentangled features. The resulting networks will train faster。
结合 figure7 下面的注释,个人理解在高维表示时,稀疏表示是最重要的。对于局部的特征更容易处理,意思就是local卷积,用1x1或者3x3,不要用太大的。

原则3

空间聚合可以在较低维度嵌入上完成,而不会在表示能力上造成许多或任何损失。例如,在执行大尺度卷积(3x3)之前,可以在空间聚合之前,先对输入进行降维,这样不会带来严重影响。鉴于这些信号应该易于压缩,因此降维甚至会促进更快的学习。

原则4

平衡网络的宽度和深度。要使得计算资源平衡的分配在模型的深度和宽度上面,才能最大化的提高模型的性能。

3 大滤波器尺寸分解卷积

GoogLeNet性能优异很大程度在于使用了降维。降维可以看做分解卷积的一种特例。比如在1x1卷积之后接3x3卷积。我们将在各种设定中探索卷积分解的方法,是为了提高解决方案的计算效率。因为Inception结构是全卷积,每个权重对应每个激活的一次乘法。因此减小计算量意味着减少参数。通过适当的分解,我们可以得到更多的解耦参数,可以加快训练。利用节省下来的计算和内存增加filter-bank大小,来提升网络性能。

3.1 分解到更小的卷积

这里写图片描述
大的卷积(5x5或者7x7)计算量更大,例如filter相同情况下,5x5卷积核比3x3卷积核计算量大25/9=2.78倍。5x5卷积核相比3x3卷积核有广阔“视野”,可以捕捉到更多信息,单纯减小卷积核大小会造成信息损失。那么是否可以通过使用具有相同输入尺寸和输出深度的参数较小的多层网络替代5x5卷积?把5x5网络看做全卷积,每个输出是卷积核在输入上滑动,可以通过2层的3x3的全卷积网络替换。这样,我们最终得到一个计算量减少到(9+9)/25倍的网络,通过这种分解减少了28%的参数。这种替换是否会导致任何表征力的丧失?如果我们的主要目标是对计算的线性部分进行分解,是不是建议在第一层保持线性激活?实验结果表明,在分解的所有阶段中使用线性激活总是逊于使用修正线性单元。也就是全部使用 relu 激活函数会好一些。我们将这个收益归因于网络可以有更多的非线性变化,使得网络对特征的学习能力更强。

下图为GoogLeNet中的Inception模块结构
GoogLeNet中的Inception模块结构

下图为按原则3设计,改进的Inception模块结构
按原则3设计,改进的Inception模块结构

3.2 空间分解为不对称卷积

这里写图片描述
上述结果表明,大于3x3的卷积核可能不是很有用,因为它们总是可以简化为3×3卷积层。那么是否可以把3x3的卷积分解成更小?比如2x2。然而,通过使用非对称卷积,可以做出甚至比2×2更好的效果,非对称卷积比如n×1。例如一个3x1卷积,后面跟一个1x3卷积,相当于3x3的卷积。如果输入和输出滤波器的数量相等,将3×3卷积分解为一个3×1卷积和一个1×3卷积的参数少了33%。相比之下,将3×3卷积分解为两个2×2卷积表示仅节省了11%的计算量。
在理论上,可以进一步论证,可以通过1×n卷积和后面接一个n×1卷积替换任何n×n卷积,并且随着n增长,计算成本节省显著增加。实际上,在比较前面的层使用这种结构,效果并不好。但是对于中等网格尺寸(在m×m特征图上,其中m范围在12到20之间),其给出了非常好的结果。在这个水平上,通过使用1×7卷积,然后是7×1卷积可以获得非常好的结果。

下图为非对称分解后Inception模块结构
这里写图片描述
这里写图片描述
这里写图片描述

4 利用辅助分类器

GoogLeNet引入的辅助分类器可以改善深度神经网络的收敛。最初的动机是将有用的梯度推向较低层,使其立即反向传播,避免非常深的网络中的消失梯度问题,从而提高训练过程中网络的收敛。但是,我们发现辅助分类器在训练早期并没有导致改善收敛情况。在两个模型达到高精度之前,有无辅助分类器的网络训练进度看起来几乎相同。接近训练结束时,辅助分支网络开始超越没有任何分支的网络的准确性,达到了更高的稳定水平。
去掉GoogLeNet网络低层的辅助分类器对最终网络的质量没有不良的影响。GoogLeNet最初的假设,这些分支有助于演变低级特征有可能不适当。相反,我们认为辅助分类器扮演者正则化的角色。如果侧分支使用了批标准化或具有dropout的层,那么网络的主分类器性能更好。

5 减少有效的网格尺寸

传统上,卷积网络使用一些池化操作来减小特征图的网格大小。为了避免表示瓶颈,在应用最大池化或平均池化之前,常常增加feature map个数。例如一个带有k个filters的d×d的网格,如果我们想要达到2k个filters的d2×d2的网格,我们首先需要对k个d×d的网格进行一次有2k个filters,步长为1的卷积,得到2k个d×d的网格,然后再进行池化。

下图示例,假如有一个35×35×320的特征图,最终要变成17×17×640的特征图。左边的做法在池化前没有增加通道数,这样会导致表示瓶颈。右边的做法先对35×35×320进行步长为1,640个卷积核的卷积运算,得到35×35×640的特征图,和原来相比增加了通道数,然后再池化,符合原则1的要求,不会导致表示瓶颈。
这里写图片描述
但是左图的方式先池化后卷积的计算量为2(d2)2k2,右图的方式先卷积后池化的计算量为2d2k2。虽然右边的方式避免了表示瓶颈,但是右边的计算成本比左边的高了4倍。
本文提出了一种变体,降低了计算成本,而且又可以避免表示瓶颈。这是一种并行的结构,使用两个并行的步长为2的模块,P和C。P是一个池化层,C是一个卷积层,然后将两个模型的响应组合到一起。

下图是减小网格尺寸的同时扩展filters的Inception模块。它不仅廉价并且避免了原则1中提出的表示瓶颈。右侧的图是从网格大小的角度来看。
这里写图片描述

6 Inception-v2

基于以上的介绍,提出了一种新的结构。

下图Inception-v2
这里写图片描述
把7x7卷积替换为3个3x3卷积。包含3个Inception部分。第一部分是35x35x288,使用了2个3x3卷积代替了传统的5x5;第二部分减小了feature map,增多了filters,为17x17x768,使用了nx1->1xn结构;第三部分增多了filter,使用了卷积池化并行结构。网络有42层,但是计算量只有GoogLeNet的2.5倍。

7 低分辨率输入上的性能

在这里还想提到的就是低分辨率的问题,机器所要识别的目标并不总是高分辨率的,有可能是比较小,或者分辨率比较低的。 常用的做法是使用更高分辨率的接受域,但是有时候我们需要分清,究竟是使用更高分辨率接受域的效果,还是更大的模型容量和计算量的效果。 如果我们只是改变输入的分辨率而不进一步调整模型,那么我们最终将使用计算上更便宜的模型来解决更困难的任务。作者提出的方法如下:针对低分辨率的图像输入,应该降低前两层的步长,或移除第一个池化层。

8 实验

这里写图片描述

9 总结

Inception V3设计了3种形式的Inception模块,包括将大滤波器进行分解、分解成不对称的结构、以及通过并行结构来解决信息损失的问题,虽然模型的拓扑结构更加复杂了,但是计算量大大降低,而且模型性能大大提高了。

阅读更多
文章标签: CNN结构
上一篇tensorflow实践-batch normalization(一)
下一篇Deep Residual Learning for Image Recognition 论文笔记
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭