Going Deeper With Convolution(GoogLeNet的理解)(1)

181 阅读9分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情

相关工作

从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卷积不仅允许了深度的增加,而且允许我们网络的宽度增加,但没有明显的性能损失,提高非线性表示能力。

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倍,然而这需要仔细的手工设计。