本文是深度学习经典算法解读的一部分,原文发之:https://www.datalearner.com/blog/1051558603213207
来源论文:Szegedy, Christian, et al. “Going deeper with convolutions.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2015.
GoogLeNet是谷歌在2014年提出的一种CNN深度学习方法,它赢得了2014年ILSVRC的冠军,其错误率要低于当时的VGGNet。它于2015年发表在CVPR上。GoogLeNet也称为Inception v1。因为后面它还提出了很多的改进版本,包括v2、v3、v4等。
与之前的深度学习网络思路不同,之前的CNN网络的主要目标还是加深网络的深度,而GoogLeNet则提出了一种新的结构,称之为inception。本文将详细讲述这种结构,以及基于此结构提出的GoogLeNet。
一般来说,同一个物体在不同图像中的位置差别很大,大小也不同。识别这种物体是很困难的。为了识别这种物体,需要准确的卷积操作。大的卷积核通常倾向于全局信息,而小的卷积核则主要捕获局部信息。为了解决这个问题,GoogLeNet的思路是在同一层使用多个不同大小的卷积核来捕捉信息,这种结构就是inception。下面我们根据论文思路来说明。
除此之外,GoogLeNet的主要目标是为了增加网络的宽度,并降低参数的数量。从结果来看,GoogLeNet利用inception结构组成了一个22层的巨大的网络,但是其参数却比之前的如AlexNet网络低很多。是一种非常优秀的CNN结构。
一、研究背景
过去几年深度学习的发展,图像识别和物体检测领域有了很大的进步。这些进步不仅仅是因为硬件算力的进步、更多的数据集和更深的网络,也有一部分新的思想的出现。在这篇论文中,坐着提出了GoogLeNet,它用到了更少的参数(比两年前的AlexNet少12倍),但是准确率更高。
对象检测(object-detection)这几年最大的进步并不是使用了深度学习,或者是利用了更大的模型。而是深度架构和传统计算机视觉方法的协同作用,例如R-CNN的提出。同时,随着移动和嵌入式计算的持续牵引,算法的效率也变得很重要。这篇论文考虑的算法不仅仅是围绕准确率来的,而是也考虑了计算的效率。大部分试验中,模型在推断中的计算都不会超过15亿次的multiply-adds。
这篇论文中提出了inception结构,来自于论文《Network in network》以及盗梦空间中的著名语句“we need to go deeper”。这里的“deep”有两个含义,一个是引入的inception模块,一个是更深的网络。
一般来说,我们可以把Inception模型当做是Network in Network模型的逻辑终点(culmination),尽管这项工作的灵感和指导是来自于Arora等人的理论工作。
二、相关工作
最近的论文都是使用更深的网络和更大的层来解决图像识别,并使用dropout来降低过拟合。尽管担心使用池化可能会降低空间信息的准确性,但是CNN依然取得了很大的成功。
Lin等人提出的Network-in-Network来增加网络的表示能力。他们的思想是在卷积层之后添加一个1x1的卷积,然后再接上ReLU激活函数。这样做与现在的CNN很容易结合。而GoogLeNet大量使用了这种结构。但是,在这篇论文中,1x1的卷积有两个作用:最重要的一个是做维度约减,提高计算效率。
目前,对象检测最好的方法是R-CNN(Regions with Convolutional Neural Networks)。这个方法采用两阶段的方式识别对象:第一步使用低级别的线索如颜色等找出可能的对象位置,然后使用CNN来分类。
作者在这篇论文中也使用了这个思路,但是使用了加强版。即在第一个阶段使用多个box来提高对象边界的召回率,并使用了更好的识别算法。
三、本文动机
使用更深更宽的网络是一个很稳妥的方案,但是也有两个重要的问题:
更大的网络意味着更多的参数,使得网络更容易过拟合。这可能是一个主要的问题,因为要获得高质量的训练数据是很困难的。这是解决过拟合最好的途径。
另一个问题是更大的网络需要更多的算力资源。例如,在一个深度视觉网络中,如果两个卷积层链式叠加,那么滤波器数量的均匀增加都会导致计算的两倍增加。如果增加的计算都是低效的(例如如果大多数权重都接近0的情况),那会浪费很多计算资源。但现实中,计算资源是很珍贵的。
解决这些问题最终的途径可能是从全连接的网络转向更加稀疏的连接结构,即便是卷积的内部也是如此。Arora等人的工作证明如果数据集的分布使用一个巨大的稀疏的深度神经网络表示的话,那么优化的工作可以通过分析最近一层的激活函数与输出之间高度相关的神经元之间的统计相关性来逐层构建(Their main result states that if the probability distribution of the data-set is representable by a large, very sparse deep neural network, then the optimal network topology can be constructed layer by layer by analyzing the correlation statistics of the activations of the last layer and clustering neurons with highly correlated outputs. )。尽管这个证明需要很强的假设条件,但是它和著名的Hebbian理论有共鸣:一起激发的神经元连在一起(neurons that fire together, wire together)。因此,即便不是很严格符合条件,实际中也可以运用类似的原理。这个原理告诉了我们稀疏连接的优化方向。
然而,今天的计算设施在非均匀稀疏数据结构上进行数值运算是很低效的。即便是运算操作降低100倍,查找和高速缓存命中失效的开销也占了绝大一部分的资源,以至于我们使用稀疏矩阵也无法获得理想的回报。这种情况在充分利用计算资源的CPU或者GPU上也没有得到缓解。在非均匀稀疏数据结构上进行数值运算需要更高的工程技巧和计算基础设施。大部分面向机器学习系统的计算机视觉都利用了卷积网络实现了空间上的稀疏性。然而,卷积是通过和之前的层进行密集连接得到的。为了更好的并行计算,打破对称性并提高了学习的随机稀疏连接的卷积也开始转向了全连接。
这就导致了一个问题:我们是否有一种架构,可以充分利用稀疏性(甚至是在滤波器层面),并通过密集矩阵的计算实现现有硬件资源的充分利用?有很多文献都考虑把稀疏矩阵聚类成相对较小的密集矩阵,然后计算。但这种方式目前在非均匀深度学习架构中并不能实现。
Inception是作者尝试的第一个案例,用来实现类似Network-in-Network的稀疏性的同时,但充分利用密集计算基础设施的优势。尽管Inception在计算机视觉中取得了成功。但是它的成功是否可以归结于其构建方式还不能确定。
四、架构细节
Inception架构最主要的思想是一个卷积网络中最优的局部稀疏结构如何通过容易获得的密集组件来近似并覆盖。Inception网络是从卷积层构建而来。所有的工作就是寻找最优的局部结构,并重复。Arora认为一个逐层构造(a layer-by-layer construction)的网络应该先分析最近层的相关性统计,然后将高相关的单元分到相同的簇中,这些簇形成了下一层的单元,并和前一层的单元相连接。本文假设前一层的每一个单元都和输入图像的某些区域相关,这些单元应该被分到一组滤波器中(filter banks)。在较低的层(接近输入层)中,这些单元集中在局部区域中。这意味着最后我们会得到很多簇,他们都关注同一个区域,他们都可以在下一层通过一个1x1的卷积覆盖。当然,也可以使用更大的滤波器来覆盖某些扩散的簇。在本文中,为了避免配对问题(patchalignment issues),inception中滤波器的大小是1x1、3x3和5x5,这种选择更多是基于方便的考虑,而不是必须这样。这意味着,所提的架构是将所有层的输出都串联到一个输出向量中,并将它们联合起来。此外,由于池化很重要,我们也在每一层加了池化的操作。
我们看一下一个inception的结构。如下图所示:
将前一层用三个单独的卷积核扫描,并加一个池化操作,然后把这四个操作的输出串联到一起作为下一层的输入。
但是注意,这种方式有点问题。像3x3或者5x5的操作会导致其输出的滤波器结果和输入层一样。池化层和卷积层的输出串联之后会导致滤波器的数量过大。因此,作者提出了第二种结构来降低滤波器的数量。如下图所示:
就是在3x3和5x5卷积之前加上一个1x1的操作,在3x3的池化操作之后加一个1x1的操作。我们知道1x1的卷积操作可以降低滤波器的数量。因此,这种结构可以有效降低整体的网络大小。Inception的这种使用1x1卷积操作的方式可以使得我们网络加宽。这个inception是GoogLeNet的基本结构。很多个Inception的联合就最终组成了GoogLeNet。
五、Inception v1的GoogleNet整体结构
基于Inception构建了GoogleNet的网络结构如下:
它总共有22层,但是总的参数比AlexNet还要小12倍。因此是非常高效的网络。
下图是GoogleNet的网络结构图细节:
注:上表中的“#3x3 reduce”,“#5x5 reduce”表示在3x3,5x5卷积操作之前使用了1x1卷积的数量。
六、GoogLeNet的特点总结
GoogLeNet是与众不同的一个深度学习的网络,它有很多优秀的特点。
GoogLeNet是个很大的网络,但是由于都是利用inception组合,其参数比之前的网络要少很多。
inception结构也充分利用了现有的计算基础设施,提高了运行的效率。
inception的模块化结构使得整个网络便于增加和修改。
GoogLeNet最后使用池化层代替全连接层,其思想来源于Network-in-Network,但为了灵活输出还是加了全连接层。
网络中保留了Dropout
为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。
参考:https://my.oschina.net/u/876354/blog/1637819