从LeNet-5奠定的卷积神经网络(CNN)基础结构:堆积卷积层(stacked convolutional layers)(可选连接:对比归一化层(contrast normalization)和最大池化层(max-pooling))后面跟着一个或者多个全连接层(fully-connected layers)。
这个结构下有很多成功的升级变种,在MNIST、CIFAR、ImageNet取得了很好的结果,比如说2012的AlexNet和2013的ZFNet。现在的趋势就是增加模型的深度和宽度,同时使用dropout[7](译者注:Dropout是指在模型训练时随机让网络某些隐含层节点的权重暂时不更新,下次输入样本时又可能更新了)来处理过拟合问题。
虽然最大池化层会导致准确的空间信息的丢失,但它还是可以用于定位、目标检测和人体姿态估计。
Network-in-Network是Lin等人为了提高网络表达能力而提出的一种方法,其中提到可以用1×1卷积加Relu激活函数实现降维。它可以很容易地集成在当前的CNN通道中。在我们的架构GoogLeNet(Inception-V1)中使用了这种方法,有两个目的:最关键的是,它们主要是用来作为降维模块来移除计算瓶颈,否则将会限制我们网络的规格。其次采用1×1卷积不仅允许了深度的增加,而且允许我们网络的宽度增加,但没有明显的性能损失,提高非线性表示能力。
1x1卷积核,又称为网中网(Network in Network)。用长宽为1,通道数为输入的通道数的卷积核与输入对应位置相乘后求和得到一个二维的feature map。例如:当输入为6x6x32时,1x1卷积的形式是1x1x32,当只有一个1x1卷积核的时候,此时输出为6x6x1。此时便可以体会到1x1卷积的实质作用:降维。(1x1卷积一般只改变输出通道数(channels),而不改变输出的宽度和高度)
1x1卷积的作用:
降维,升维,跨通道信息交流,减少参数量,增加模型深度,提高非线性表示能力。
在目标检测上,目前领先的方法是Girshick等人提出的R-CNN。R-CNN将所有的检测问题分为两个子问题:在浅层利用颜色、超像素的一致性等信息检测,然后使用CNN分类器对这些部位进行识别分类。这两个步骤,在浅层利用了包围盒分割的准确性以及CNN强大的分类能力。在我们提交的检测网络中,我们使用了类似的通道,而且增强了这两个步骤,如多盒预测和全局方法。
提高深度神经网络的性能的最直接的方法就是增大它的规模。包括增加网络的深度(层数)和宽度(神经元数目)。这是训练一个更高性能的模型的简单和安全的方式,特别是当有一个有标记的大数据训练集可用的时候。但是这个简单的解决方案有两个主要的缺点:
更大的规模意味着更多的参数,将会使得这个更大规模的网络更容易过拟合,尤其是当有标记的训练样本集是有限的的时候。这可能会成为一个主要的瓶颈,因为创建一个高质量的训练集是非常棘手并代价昂贵的,特别是当有必要专家区分的如下图所示仅仅有细小纹理差别的种类的时候。
一味地增加网络尺寸的另一个缺点就是计算资源的急剧增加。比如:在一个深度视觉网络中,如果两个卷积层连接在一起,对它们的滤波器数目的任何等量增加都将会在计算量上造成一个平方级的增加。如果加入后效率很低(例如,如果大部分的权重最后的趋于0),那么很多的计算都是浪费的。由于实际上运算成本总是有限的,所以一个高效的计算资源的分配更倾向于以提高结果质量为主要目标的前提下可以任意地增大网络规模。
解决这两个问题的根本方法就是,从根本上用稀疏连接取代密集连接,包括卷积层内部。然而当涉及非均匀的稀疏数据结构的数值计算的时候,目前的基础计算设备效率非常低。即使运算操作减少100倍,查找的地址不在缓存中的开销是十分大的,所以转换为稀疏矩阵后并没有什么用。通过稳定提高、高度协调、允许利用底层CPU或者GPU硬件瞬间进行非常快速的稠密矩阵乘法的数值库的使用,缺点甚至被进一步放大。此外,非均匀稀疏模型要求更复杂的工程和计算设备。目前,大部分视觉导向的机器学习系统在空间域上只是通过卷积的优势来使用稀疏。但是,卷积和稠密连接的上一层的块集合是紧密联系的。卷积网络向来被用在随机稀疏连接表中来打破对称性和提高学习,想要将其变回全连接来更好地优化并行计算。结构的均匀性、大量滤波器以及更大的批量规模使得其允许使用高效稠密运算。
Inception架构的主要思想是考虑卷积视觉网络的最佳局部稀疏结构如何能够被现成的密集组件所近似和覆盖。请注意,假设翻译不变量意味着我们的网络将由卷积构件构建。我们所需要的是找到最佳的局部构造并在空间上重复它。Arora等人建议采用逐层构建的方法,即应该分析上一层的相关统计,并将其聚类为具有高相关性的单元组。这些群组形成下一层的单元,并与上一层的单元相连。我们假设前一层的每个单元都对应于输入图像的某个区域,这些单元被分组为滤波器组。在低层(靠近输入的层),相关的单元会集中在局部区域。因此,我们最终会有很多集群集中在一个区域,它们可以被下一层的1×1卷积层所覆盖。然而,我们也可以预期,在较大的斑块上会有较少数量的空间分布较广的集群可以被卷积覆盖,而且在越来越大的区域上会有越来越少的斑块。为了避免补丁对齐问题,Inception架构的当前化身被限制在过滤器大小为1×1、3×3和5×5的范围内;这个决定更多的是基于方便而不是必要。这也意味着建议的架构是所有这些层的组合,其输出滤波器组串联成一个单一的输出向量,形成下一阶段的输入。此外,由于池化操作对当前卷积网络的成功至关重要,它表明在每个这样的阶段中增加一个替代的平行池化路径也应该有额外的好处(见下图a)。
这些Inception模块一个一个堆积,它们输出的相关性统计值必然是不同的:更抽象的特征被更高的层获得,如果在我们到更高层的时候选择33和55卷积的比例,那么它们的空间集中度会降低。
上述模块的一个大问题就是,至少以这种原始的形式,即使是一个合适数量的5*5卷积,也会因为卷积层大量的滤波器而变得高消耗。当池化神经元添加到mix的时候这个问题变得更加明显:它们输出滤波器的数量和上个步骤的滤波器数量是相等的。卷积层的输出和池化层的输出的合并将会导致每个步骤过程中输出数量的不可避免的增加。即使这种架构可能被最优稀疏结构覆盖,但是它依然很低效,而导致在一定的步骤之内就会计算崩溃。
这就有了这个架构的第二个想法:当计算需求大幅提升的时候慎重地运用降维和投影。它基于嵌入的成功:即使低维嵌入可能包含大量关于一个比较大的图像块的信息。但是,稠密地嵌入代表性信息、压缩格式和压缩信息是很难写成模型的。我们将会在很多地方保持稀疏,同时只在必须聚集在一起的时候压缩信号。意思就是,11的卷积被用来在使用33和5*5卷积之前降维,同时也被用来修正线性激活特性。最后的结果如下图b所示。
一般来说,Inception网络是由上述类型的模块相互堆叠而成的网络,偶尔会有跨度为2的最大池化层,将网格的分辨率减半。由于技术原因(训练时的记忆效率),似乎只在较高的层使用Inception模块,而在较低的层保持传统的卷积方式才能发挥优势。当然这不是严格要求的,只不过是考虑到我们当前的一些基础设备效率低下而已。
这个架构的一个有用的方面是,它允许在每个阶段大幅增加单元的数量,而不至于在后期阶段出现不受控制的计算复杂度的爆炸。 这是通过普遍使用降维来实现的,在较大的补丁尺寸下,在昂贵的卷积法之前。 此外,该设计符合实际的直觉,即视觉信息应该在不同的尺度上进行处理,然后进行聚合,以便下一阶段可以同时从不同的尺度上抽象出特征。
对计算资源的改进允许增加每个阶段的宽度和阶段的数量,而不会陷入计算的困境。 我们发现,所有可用的旋钮和杠杆都允许对计算资源进行可控的平衡,从而使网络比非Inception架构的类似性能的网络快3-10倍,然而这需要仔细的手工设计。
我们还使用了一个更深更广的Inception网络,其质量略胜一筹,但将其加入到合集中,似乎只对结果有微小的改善。我们省略了该网络的细节,因为实验结果表明,确切的架构参数的影响相对较小。下表显示了比赛中最常用的Inception实例。这个网络(用不同的图像斑块采样方法训练)被用于我们组合的7个模型中的6个。
所有的包括Inception架构内的卷积都使用修正线性激活。我们的网络的感受野尺寸是224224的RGB色彩通道。“#3×3 reduce”和 “#5×5 reduce” 代表33和55卷积之前的降维层的11滤波器的数量。在“pool proj”这一列可以看到内置最大池化层后的投影层的1*1滤波器的数量。所有的这些降维/投影层也都采用修正线性激活。
该网络基于计算效率和实用性来设计,所以可以在个人设备或者那些有计算资源限制的设备上运行测试,特别是那些内存很小的设备。只算有参数的层的话,网络有22层(如果算上池化层的话那么有27层)。再加上一些独立模块的话,该网络总的大概有100层。但是这个数字取决于机器学习的设备系统的使用。分类之前,平均池化的使用是基于Network-in-Network的,虽然我们在具体实现的时候,和它有所不同,我们使用了一个额外的线性层。这使得我们在遇到其他标签集的时候可以很容易地改变和精细调整我们的网络来适应。它主要是为了方便,我们也不指望它能发挥什么大作用。结果表明,从全连接层到平均池化层的转变,Top-1的准确率提高了0.6%,但是dropout仍然是必不可少的。
鉴于网络比较深,所有层以一个有效的方式传播梯度回来的能力成为了一个问题。一个有趣的见解是,这个项目中浅层的网络的强大性能表明,从网络中间层产生的的特征应该是非常有识别性的(discriminative)。通过添加连接中间层的附加分类器,我们将能在分类中较早的步骤就增强识别性,增强获得的反向传播的梯度信号,并给予额外的正规化。这些分类器把更小的卷积网络添加到Inception(4a)和(4d)模块的输出之上。在训练的时候,它们造成的损失按照折算出来的权重被添加到网络的总损失里面(附加分类器所占的权重为0.3)。在测试阶段这些辅助网络就会被丢弃。后来的控制实验表明,辅助网络的影响相对较小(约0.5%),只需要其中一个网络就能达到同样的效果。
包括辅助分类器在内的边上的额外网络的具体结构如下:
1、一个拥有尺寸为5*5
的滤波器而且步长为3的平均池化层,在(4a)输出4*4*512
,在(4d)步骤输出4*4*528
。
2、一个拥有128个滤波器的1*1
的卷积来降维和修正线性激活
3、一个有1024个神经元和修正线性激活的全连接层
4、一个70%比例下降输出的dropout层
5、一个拥有用softmax损失来作为分类器的线性层(作为主要分类器来预测1000个类,但是在测试的时候移除)
我们的网络用DistBelief[4]分布式机器学习系统和数据并行(一个batch均分k份,让不同节点前向和反向传播,再由中央参数服务器优化更新权重。)进行训练。虽然我们只用CPU实现,但是可以粗略地估计到用数个高端GPU训练GoogLeNet网络的话在一周内就可以收敛,其中主要的限制因素是内存。我们训练的时候采用0.9动力(momentum)[17]的异步随机梯度下降,固定学习速率表(设定学习速率每8个周期下降4%)。测试的时候用Polyak平均来建立最终模型。
在过去的几个月里,为了竞赛我们的图像采样方法发生了很大的变化,模型训练的时候结合其他选项,有时候是变化的超参数,比如dropout和学习速率,所以很难给出一个明确的指导说哪个才是训练这些网络的最有效的方法。详细地说,模型的训练效果不一[8]。但是,如果采样的图像块面积均匀地分布在图像的8%到100%,同时纵横比随机选择3/4或者4/3,那么将会得到很好的效果,这个是在比赛之后就已经被证明了的。同时呢,我们发现Andrew Howard[8]的亮度失真可以在一定程度上防止过拟合。此外,我们开始使用随机插值方法是哪一个在起积极作用。
ILSVRC 2014分类竞赛的任务是将图像归在ImageNet的1000个类里。训练用图像大致有120万个,验证用图像有5万个,测试图像有十万个。分类器的性能是用它预测的最高分来衡量的。有两个数字经常报告出来:Top-1的准确率,Top-5的错误率。比赛以Top-5的错误率排名。
我们没有使用比赛以外的数据进行训练。除了上述训练技巧,我们在测试的时候也使用了一系列的精心设计的方法来得到更好的效果。
1、我们用GoogLeNet模型各自训练了7个版本(包括一个宽版本),得到了他们的预测结果并取综合值。这些模型初始设定都是相同的(连初始权重也是相同的,这主要是作为监督),不同的只是采样方法和随机的输入图像的顺序。
2、测试过程中,我们采用了比Krizhevsky更积极的方法。具体而言,我们把图像大小调整到4个尺寸,短边(高度或者宽度)的尺寸分别为256、288、320和352,取这些调整后的图像左侧、中间和右侧方块(在肖像图中,我们则取上方、中间、下方方块)。对于每个方块,我们取四个角和中间的224224大小的采样点,并把方块放缩到224224,同时复制出它们的镜像版本。这样每个图像的的采样个数就是436*2=144。早些年Andrew Howard也用了类似的方法,他使用的方法比我们给出的方法效果差一点点。我们注意到这样积极的采样在实际应用中可能是不必要的,因为在得到一个合理的采样数之后,再多的采样点发挥的作用就很小了。
3、softmax概率平均到各个采样点和所有的独立分类器,从而得到最后的预测。在我们的试验中,我们分析了验证数据的可选方法,例如在采样点最大池化和在分类器平均,但是性能都不如简单地取平均。
下表中我们还分析并报告了多个测试选择的性能,包括不同的模块数和预测时不同的采样数。我们会选择验证数据时Top-1错误率最低的那一个模块来使用。验证数据集报告出数字来让我们可以防止在测试数据统计的时候过拟合。
由上图可见模型集成的越多,图像裁决的越多,那么它的准确率越高,错误率越低。
ILSVRC 2014检测竞赛是要我们在属于200个可能的类的图像的物体周围产生包围盒。如果他们,如果检测出来的符合物体所属类别的真实属性,同时包围盒重叠部分至少有50%的话(使用Jaccard相似性指数),那么就可以认为正确检测到了目标。无关的错误识别会被惩罚。和分类不同,这里每个图像都可能包括多个目标或者根本没有目标,而且目标的尺寸可能很大也可能很小。得到的结果用平均精确度度表示(mAP)。
用GoogLeNet来识别的方法和R-CNN方法相似,相比之下GoogLeNet增加了Inception模块来作为区域分类器。此外,通过与多盒预测的Selective Search方法结合,来提高包围盒的召回率。为了减少错误识别,超像素的尺寸提高了两倍。这使得选择搜索算法得到的减半。我们又从多盒的结果里面加回200个结果,总的来说,我们大概采用了60%的R-CNN方法的结果,将覆盖率从92%提升到93%。可以看到,在单一模型上的效果是把平均精确度提高了1%。最后,在分类区域的时候,我们一同使用6个卷积网络,把结果精确度从40%提升到了43.9%。注意,和R-CNN不同,因为时间不够所以我们没有使用包围盒回归。
我们报告最好的检测结果和逐个检测版本以来的改进。和2013年的结果对比起来,准确度几乎是翻了一番,检测器性能最好的团队都使用了卷积网络。表4是官方给出的分数,以及这些团队的共同点:使用外部数据、集合模型或者联系模型。外部数据通常是ILSVRC12精确分类的分类数据,用以预训练模型。一些团队也提到了本地数据的使用。因为局部任务包围盒的良好分配不包括检测数据,所以可以用这些数据预训练总体包围盒回归量。而GoogLeNet没有使用本地数据来预处理。
我们的GoogLeNet只用了单模型,然而Deep Insight团队设计出来的模型性能最好,也意外地只比我们提高了0.3%,但是他那个用了三模型哦,GoogLeNet集合起来用的时候获得的结果会显著增强的。
我们的研究结果得到了这样的一个可靠的证据:将最佳稀疏结构稠密化是提高计算机视觉神经网络的有效方法。这种方法的主要优点在于,相比于又浅又窄的网络而言,只需要适度增加计算量,性能就能显著提升。
同时还注意到,我们的检测工作没有利用上下文,也没用执行包围盒回归,但是依然很有竞争力。这个事实进一步证明Inception架构是很强大的。
尽管用更复杂的拥有相同深度和宽度的网络也可以实现差不多的性能,但是我们已经确切证明了在通常情况下用稀疏架构师有效而且实用的。这表明,未来工作可以向基于《用稀疏分散的网络取代庞大臃肿的网络》通过自动的方式建立更加稀疏和设计更加精细的结构来发展。