GoogLeNetv1 论文研读笔记
Going deeper with convolutions
摘要
研究提出了一个名为“Inception”的深度卷积神经网结构,其目标是将分类、识别ILSVRC14数据集的技术水平提高一个层次。这一结构的主要特征是对网络内部计算资源的利用进行了优化。这一目标的实现是通过细致的设计,使得在保持计算消耗稳定不变的同时增加网络的宽度与深度
引言
在物体识别方面,最大的收获其实并不来自于深度网络或是大型模型的单独使用,而是来自深度结构和传统机器视觉的协同作用,比如R-CNN算法
此处关注的是一个应用于计算机视觉的深度神经网络,名为“Inception”。“深”有两层含义:首先,引入了一种高水平的组织方式来构建Inception的模块,同时以更加直接的方式来增加网络深度
相关研究
网中网(Network-in-Network)提出的目的是为了增加神经网络的表现力。当应用于卷积层的时候,这一方法可以看做一个额外的1×1卷积层,后面通常跟着一个修正的线性激活。这使得Network-in-Network能够轻松地集成到现有的CNN管道中。这种方法在本研究网络体系结构中被大量地使用。在此1*1卷积具有双重目的:最重要的一点是,它们被主要用于降维模块以打破计算瓶颈,否则网络规模会受到限制。这使得不仅可以加深网络,同时还可以加宽,而不造成明显的性能下降
R-CNN将整个检测问题分解为两个子问题:首先,使用低层线索比如组成潜在物体的颜色、超像素等,提取出一些类别不可知的信息,然后接下来利用CNN在这些区块信息上识别物体类别。这种双步方法中,低层线索会影响切分区块大小的准确性及CNN分类的准确度。本研究采用了同样的管道,但对其中的每一步都进行了加强,比如采用多盒预测以提高边界识别集合的召回率。还对bounding box提出的分类建议进行了不同方法的搭配合成,以获得更好的结果
动机与高层设计考虑
最直接提高深度神经网络性能的方法是增加其规模,但更大的网络规模往往意味着更多的参数,这使得扩大后的网络更易过拟合。另一个统一增加网络大小的缺陷是计算资源需求的暴增,在一个深度视觉网络,如果两个卷积层相连,任何增加过滤器数量的改动都会导致增加二次方倍数的计算量
结构细节
Inception的体系结构的主要设计思路是要在一个卷积视觉网络中寻找一个局部最优的稀疏结构,这个结构需要能够被可获得的密集组件覆盖和近似表达。需要做的只是寻找局部最优化结构并在空间上对其进行重复
一个逐层搭建的结构,需要分析其每一步的最后一层的统计关联性,并将高度相关的神经单元聚类为簇。这些簇组成了下一层的单元并与前一层的各个单元相连。假设前面一层的每个单元都对应输入图像的某些区域,而这些单元被分组分配给过滤器。在较低的层次(更靠近输入端),相关的单元聚焦于局部区域。这意味着能够得到大量聚焦于同一区域的簇,它们会被下一层的1*1卷积覆盖。然而,更少的在空间上传播更多的簇(这些簇会被区块更大的卷积所覆盖)是可以被期待的。这样,覆盖大型区域的区块数量就会减少。为了避免区块对齐问题,现有的Inception结构将过滤器大小限制为1*1,3*3 和 5*5.这也意味着合理的网络结构应该是将层次的输出过滤器bank结合起来,并将其合并为单一向量作为输出以及下一层的输入。另外,因为池化操作对于现有水平的卷积网络是很重要的,建议最好在每一步增加一条并行池化通路,这样应该也会有一些额外的好处,如下
Inception模块是一层一层往上栈式堆叠的,所以它们输出的关联性统计会产生变化:更高层抽象的特征会由更高层次所捕获,而它们的空间聚集度会随之降低,因为随着层次的升高,3*3和5*5的卷积的比例也会随之升高
但是上述模型,至少是naive版本的模型,即使只有很有限个数的5×5卷积,其最上层卷积层的巨量过滤器的开支都会让人望而却步。一旦把池化层加进来,这个问题会变得更加严重:它们的输出过滤器个数与前面过程的过滤器个数相等。池化层输出与卷积层输出的合并会导致无法避免的每步输出暴增。即使是这种结构覆盖了最优的稀疏结构,它可能依然还是很低效,从而导致少数几步的计算量就会爆炸式增长
基于此提出了第二种设想:审慎地把降维和投影使用到所有计算量可能急剧增加的地方。这是基于嵌入的成功来设计的:相对于一个大型的图像区块,即使是低维的嵌入也可能包含大量的信息。然而,嵌入会把信息以一种致密的,压缩的方式展现出来,而压缩信息是很难被建模的。研究想要在大部分位置保持稀疏性,而只在信号需要被聚合的时候压缩它们。因此,1*1卷积被用于在昂贵的3*3和5*5卷积之前以用来降维。除了用于降维,它们也被用于数据线性修正激活,这使之具有双重使命,如下
一般而言,一个Inception网络是由一系列上述结构栈式堆叠而成,有时候步长为2的最大池化层会把网络一分为二。出于技术原因(更高效的训练),只在高层使用Inception结构而把低层保留为传统的卷积模式似乎是有利的
这一结构一个有利的方面是它允许每一步的神经元大量增加,而不会导致计算复杂度的暴增。降维的普遍存在能够阻挡大量来自上一层的数据涌入下一层的过滤器,在大区块上对其进行卷积之前就对其进行降维。另一个在实践中很有用的方面是,它与视觉信息应该被多层次处理,然后被汇集到下面层次汇总,同时抽取多尺度特征的特性相一致
计算资源的优化利用允许增加每层网络的宽度以及层数,而无需面对增加的计算困难。另一种使用Inception架构的方法是开发一种质量稍差,但计算起来更便宜的版本
GoogLeNet
所有的卷积,包括那些Inception模块内的卷积,都使用修正线性激活函数。网络的感知域是一个RGB三色通道的224×224区域,并且经过了减去均值的处理。"#3*3"和"#5*5"表示在3*3和5*卷积层之前使用1*1过滤器的reduction层。1*1过滤器的数量可以在池化投影列中的最大池化层后面的投影层中看到。所有的降维层和投影层也都使用修正线性激活函数
架构图
对于相对更深的网络,穿过所有层次高效向后梯度传播的能力是很关键的。相对浅层的网络的强大性能表明网络中层所产生的特征是具有很好的区分度的。通过增加一些与这些中间层相连的附加的分类器,可以期待在分类器的低层增加向后传播的梯度信号,同时增加更多的正则化。这些分类器采用较小的卷积网络形式,被安置在Inception(4a)和(4d)模块的输出的顶部。在训练中,它们的偏差被折扣后加到总偏差中(附加分类器的偏差乘以0.3)。在预测过程中,这些附加网络会被抛弃
附加网络的结构,包括附加分类器的结构如下
一个平均池化层,过滤器为5*5,步长为3,在4(a)得到一个4x4x512的输出,在4(d)得到一个4x4x528的输出
一个1x1卷积,有128个过滤器,用于降维和规范化线性激活
一个拥有1024个单元和规范化线性激活的全连接层
一个会抛弃70%输出的dropout层
一个使用softmax偏差的线性层,这一层被用作分类器(与主分类器一样,它进行1000类分类,但在预测阶段,它会被抛弃)
训练方法
训练使用动量(momentum)为0.9的异步随机梯度下降,并将学习速率固定为每八次迭代减少0.04。Polyak均值被用于建立在推理过程中使用的最终模型
一个在比赛之后已经被证明非常有效的图片采样方案是将取样区块的大小平均分布在图片区域的8%到100%之间,宽高比随机分布与3/4和4/3之间。同时,发现光度变换对于对抗过拟合在某种程度上是很有用的
除了论文前述的训练技术,还采用了如下一系列测试技术去提高性能
- 独立训练了七个版本的相同的GoogLeNet模型(包括一个宽度更大的版本)然后将其联立起来进行预测。这些模型训练基于相同的初始化(主要由于一个oversight,甚至初始权值都是相同的)以及学习速率策略。唯一的不同是采样方法和图片输入顺序不同
- 在测试中,将图片重设为四种不同的尺度(高和宽),分别是256,288,320和352,包括左中右三块,(如果说肖像图,取顶中底三块),对于每一块,取其四角和中心,裁切出5个224*224的区块,同时取其镜像。结果每张图就得到了4*3*6*2 = 144个区块(当区块数超过合理范围之后,其带来的好处也就不那么重要了)
- softmax概率分布被平均到不同的裁切以及所有的单分类器上以获取最终的预测结果
结论
利用现有密集砌块逼近预想中的最佳稀疏结构,是一种可行的提高计算机视觉神经网络能力的方法。这种模型的主要优势是与浅层且较窄的网络相比,只要适度增加计算需求就能极大地提升质量。该检测技术即使没有使用上下文和边界回归,依然很有竞争力,这一事实提供了进一步的证据证明Inception结构的强大。虽然相同质量的网络可以被同样宽度和深度的更昂贵的网络实现,该方法却切实地证明了切换到一个更稀疏的结构上是一个在普遍情况下可行且有用的方法
总结
该论文指出获得高质量模型最保险的做法就是增加模型的深度(层数)或者是其宽度(层核或者神经元数),但是一般情况下更深或更宽的网络会出现以下问题
- 参数太多,容易过拟合,若训练数据集有限,这一问题更加突出
- 网络越大计算复杂度越大,难以应用
- 网络越深,梯度越往后传越容易消失,难以优化模型
GoogLeNet认为根本方法是将全连接甚至一般的卷积都转化为稀疏连接。传统的网络使用了随机稀疏连接,而计算机软硬件对非均匀稀疏数据的计算效率很低
针对这些问题,GoogLeNet给出了两个解决方案
- 深度方面,采用了22层,为了避免上述提到的梯度消失问题,引入了 2 个辅助分类器,它们本质上对 2 个 inception 模块的输出执行 softmax,并计算对同一个标签的 1 个辅助损失值
- 采用了Inception结构,这是一种网中网(Network In Network)的结构,即原来的结点也是一个网络
基于保持神经网络结构的稀疏性,又能充分利用密集矩阵的高计算性能的出发点,GoogleNet提出了名为Inception的模块化结构来实现此目的。依据是大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能
Inception是一种网中网(Network In Network)的结构,即原来的结点也是一个网络。用了Inception之后整个网络结构的宽度和深度都可扩大,能够带来2-3倍的性能提升
Inception的结构
- 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合
- 之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1后,只要分别设定pad=0、1、2,那么卷积后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了
- 文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了
- 网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3*3和5*5卷积的比例也要增加
- 使用5x5的卷积核仍然会带来巨大的计算量。 为此,采用1*1卷积核来进行降维
此外,该模型最后采用了平均池化来代替全连接层。但是,实际在最后还是加了一个全连接层,主要是为了方便以后大家微调
使用不同size卷积核的目的
- 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合
- 之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了
因为卷积核参数量过大,使用1*1卷积层来进行降纬,同时还可以用于修正线性激活
参考链接