[深度学习] Going Deeper with Convolutions(GooLeNet)阅读笔记

这是介绍Szegedy等人参加ILSVRC 2014比赛中提出的网络结构(GooLeNet)的论文,在这里GooLeNet使用了22层的神经网络,获得了当年比赛中Classification和Detection项目的第一名。下面来详细的介绍这篇论文的内容。

Abstract

作者在论文中提出了一种新的名为Inception的深度神经网络结构,并在ILSVRC 2014的classification和detection项目中取得了当时最好的结果。Inception结构主要是改进了网络内部中的计算资源的利用率,作者在固定计算资源的情况下对网络的深度和宽度都进行了增加。另外,Inception结构还遵循了Hebbian原则并增加了多尺度的处理。作者在比赛中使用的是基于这种结构的22层的深度神经网络GooLeNet并取得了非常好的结果。

1. Introduction

作者提到最近三年以来由于深度学习的发展,对于图像分类和目标检测都有了非常大的提升。同时,取得进展的原因不单单是靠更加强力的计算资源和更大的数据集和网络模型,更多的原因主要是人们对深度学习的新观念、新算法以及新的模型结构。作者提出,他们所用的网络结构用到的模型参数是AlexNet的 112 ,但是却极大的提升了识别结果。同时对于目标检测任务,当前的发展趋势也不是越来越大的网络结构,而是像R-CNN算法一样,使用深度学习和传统的计算机视觉算法结合的方式。
随着移动计算的兴起,高效率的算法非常重要,特别是他们需要的计算资源和内存占用的要求很高。因此本文中提出的模型结构设计的原则之一就是模型的高效性。
文章中提出的Inception结构是从Lin等人的Network in network中发展而来的,同时作者也提出,要想取得更好的识别结果,当前的深度神经网络结构需要变的更深。在这里“深”有两层含义:1)第一种是作者提出的Inception model是一种新的组织层次;2)直观意义上的深,即网络层数更多。

这一部分作者主要讲解与本文相关的工作,主要分为以下几个部分:
(1)从LeNet开始,卷积神经网络的结构基本没有大的变化,都是由卷积层——激活函数——[option] 池化层——[option]归一化层——全连接层组成。这种结构非常的流行,同时在像MNIST和CIFAR等数据集中去了非常好的成果;而对于像ImageNet上,最近的趋势则是采用更多层的网络结构并使用Dropout防止过拟合进行处理和识别。
(2)受灵长类的神经结构的启发,Srre使用了一系列不同大小的Gabor滤波以获得不同尺度上的特征,与之相同,本文中的Inception结构也使用了类似的处理,与之不同的是,这里的卷积核都是通过学习得到的,并处理的很多次;
(3)Lin等人提出的Network-in-Network最初用于提高神经网络的表达能力。在Lin等人的实验中采用 1×1 大小的卷积核进行了处理,从而提升的网络的深度和学习能力。在作者的实验中同样采用了 1×1 的卷积核,作用有二:1)用于降低特征的维度,从而降低计算需求;2)在没有损失多少特征的基础上增加网络深度的同时增加了网络的宽度;
(4)讲RCNN的部分,我对于RCNN没有太多兴趣,这里简单介绍一下:RCNN把目标检测分为了两个阶段,第一个阶段利用低层次的特征,如颜色和纹理等产生目标的候选位置区域,第二个阶段则是利用CNN来对候选区域的物体进行分类,从而完成定位。作者他们也采用了类似的方法进行检测,并在一定程度上进行了改进(有兴趣请看原文)

3. Motivation and High Level Considerations

众所周知,提升深度神经网络识别能力的最直接的方式就是提升网络的大小,这不单单包括增加网络的深度,同时包括需要对网络的宽度进行扩展。这里网络的深度就是指网络的层数,而网络的宽度指的是每一层网络中单元的数量。这种做法简单有效,特别是当你有大量的带标签数据的情况下,然而这样做也带来了以下两个问题:
(1)网络的结构越来越大的意味着网络中的参数数量越来越多,如此多的参数会导致网络的学习能力过强,训练时非常容易过拟合,特别是当你的训练数据不够多的情况下(然而这正是绝大多数人面对的情况 = =||)。而给大量的数据进行分类是一种非常昂贵的做法,需要专业人士的大量人工操作,不现实。
(2)网络结构增大带来的另一个问题就是这个网络需要更多的计算资源。例如两个连续的卷积层中,随便增加一点点filter的数量就会极大的增大计算量,然而我们增加的filter还有很大的可能根本就是没用的,这就平白的浪费了很多的计算资源。在实际情况中,由于计算预算总是有限的,因此即使当主要目的是提高性能质量时,计算资源的有效分布也优于随机增加的大小。
解决上面问题的方式就是用稀疏的网络结构代替稠密的网络,这不单单是模仿生物中的网络结构,同时也具有坚实的理论基础。Arora等人提出使用一个非常大的,而且非常稀疏的深度网络表示事物,那么可以通过分析前面的层激活的相关统计并且使用高度相关的输出来聚类神经元来在后层构建最优网络拓扑。(这个实在没懂。。感觉有点扯淡了,虽然道理是这个道理)
不幸的是,当前的计算指令在处理非均匀的稀疏结构时非常的inefficient,这就带来一个问题,计算稀疏的结构很有可能是不划算的。当前人们实现的稀疏性主要是利用卷积的优点,但是通过卷积操作的到本层的feature本身就是前一层feature map上进行全连接操作一点一点计算出来的。这就又带来一个问题,难道就不能在当前的基础上更进一步了吗?作者提出既然稀疏性不能达到,那干脆退而求其次,使用在filter级别上稀疏性的架构,但是是通过当前的硬件对稠密矩阵进行的计算。(即,实现不了低层次上的稀疏操作,那么就利用一种更高层次上的稀疏架构做一点稀疏操作)Inception结构就是在这种思想下发展出来的。

4. Architectural Details

Inception架构的主要思想就是考虑如何使用一个密集的网络去近似我们前面提到的那个最佳的稀疏的卷积神经网络。Arora等人提出,我们建立的神经网络,可以通过分析最后的输出,然后把最后输出的结果中具有较强联系的聚合成多个clusters。网络中前一层输出的cluster要与网络中后一层输出的cluster相连。我们假定我们在网络的较浅的层中提取的特征都是针对图像中的某个部分,因此在较浅层中提取的特征将主要表达的是图像的局部特征。因此到最后我们能够得到图像中一个局部区域的多个特征(由较浅层网络提取的),并把这些特征使用conv 1×1 的卷积层进行降维。与此同时,我们也可以使用更大的卷积核提取特征,由于卷积核增大,它对应的图像区域就会更大,因此我们就不需要使用那么多的patches,而为了避免patch-alignment,作者目前实现的Inception架构中,卷积核的大小分别为 1×1,3×3,5×5 。也就是说,作者提到的Inception架构就是把这些卷积核卷积后提取的feature map进行组合作为输出,同时作者也提到了,max pooling在卷积神经网络中也取得了很好的成果,因此除了以上提到的3中卷积核,还有使用max pooling提取的结果,结构如下图所示:


[深度学习] Going Deeper with Convolutions(GooLeNet)阅读笔记_第1张图片

我们都知道,在卷积神经网络中较浅的层中提取的是一些局部特征,如边缘、角点等;而网络中较深的层得到的一般则是较高的特征,而局部特征则会较少,因此后面的Inception model中的 3×3,5×5 的filter在整个model的filter总数占比要提高。
然而如上图这种Inception model的缺点则是需要大量的计算能力,即使是 5×5 这样的卷积核,在较深的层次中由于filter的数量较多,特别是pooling,因为pooling不会改变feature map的数量,导致该层输出的feature map数量会越来越多,因此会耗费大量的计算资源。作者提出,尽管这种结构可能能够近似我们要得到的稀疏结构,然而这是非常非常的不高效的,很有可能网络还没有几个Inception结构时,就已经超出了我们的计算能力了(文中称为computational blow up,很形象,爆掉了)。
这个问题的解决方法就是在进行 3×3,5×5 之前,以及在pooling以后跟上一个 1×1 的卷积层用以降维,从而降低计算量。(例如:上一层的输出为100x100x128,经过具有256个输出的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256。其中,卷积层的参数为128x5x5x256。假如上一层输出先经过具有32个输出的1x1卷积层,再经过具有256个输出的5x5卷积层,那么最终的输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256,大约减少了4倍。 来源:GoogLeNet系列解读
关于 1×1 大小的卷积层的作用,可以参考 One by One [ 1 x 1 ] Convolution - counter-intuitively useful原文并不在这里,只不过原文我打不开,原文在 http://iamaaditya.github.io/2016/03/one-by-one-convolution/
改进后的Inception结构如下:

[深度学习] Going Deeper with Convolutions(GooLeNet)阅读笔记_第2张图片

(注意:这里的每个 1×1 卷积后面都要跟ReLU等激活函数,使得网络具有非线性)
以上就是Inception的架构,Inception网络就是由多个上面介绍的Inception model堆叠起来的,其中Inception model之间可能通过max pooling使得feature map大小减小(注意,这里的max pooling不是Inception model中的max pooling)。作者提出,从技术层面上出发(memory efficiency),最好前几层按照正常的CNN网络的套路来,在深层的时候使用Inception model,然而这也不是一定要严格遵守的,看自己的训练任务来吧。
作者提出,使用Inception model的好处就是得益于 1×1 卷积层的降维,使得我们可以在不显著增加计算量的情况下加深和扩宽网络结构,使得网络具有更强的学习能力。同时根据人们的直觉感官来看,视觉信息经过不同尺度的处理结果会更好,而Inception的另一个好处就是可以提取来自不同尺度下的特征,使得下一个layer可以得到来自不同尺度的特征。作者最后提出,具有Inception结构的网络可以比与他具有相同的识别结果的网络快上3~10倍。

5. GooLeNet

GooLeNet是作者参加比赛时所用的网络,网络结构如下所示:


[深度学习] Going Deeper with Convolutions(GooLeNet)阅读笔记_第3张图片

表中的 #1×1 #3×3 #5×5 列分别表示Inception中的三种不同的卷积层中的feature map数目, #3×3reduce ,和 #5×5reduce 分别表示Inception中这卷积层之前的 1×1 的卷积层的filter数目,可以看出 1×1 通过降低输出的feature map数目,从而起到降维减少计算量的作用。pool proj表示Inception中使用 1×1 后输出的feature map的数目。
作者在最后使用的average pooling代替了FC层(包括后面的残差网络中也是如此,我还没用过average pooling,不知效果如何,不过计算量应该比fc层要小)。作者提出他们使用的22层的神经网络是按照depth列中数值相加计算得到的,每个Inception算两层(因为有 1×1 卷积层)
作者提出由于GooLeNet层数较多,为了避免梯度消失,作者在网络中加上了两个辅助的分类器以增读的传播,同时两个辅助分类器的loss分别为0.3,而在实际测试时则不使用这两个辅助的分类器。但是作者最后又提到,通过后面的实验看出辅助的分类器作用并不明显,并且不需要两个,有一个就可以达到同样的效果。
具体的GooLeNet网络结构太大了,截图不清楚,可以看论文中图片。

剩下的介绍就是GooLeNet在比赛中的训练方法以及实验结果,我这里就不多赘述了。

6. Conclusion

GooLeNet通过使用Inception网络结构提取了图像中多个尺度的信息,也就能够提取更多的特征,而同时使用 1×1 大小的卷积层进行降维,使得计算量能够降低好几倍,这也就是GooLeNet最厉害的地方和创新点吧。以后自己的网络中也可以试着增加Inception网络结构,或者在后面当feature map数量过多时使用 1×1 卷积核降维,降低计算量。

你可能感兴趣的:(深度学习,深度学习,GooLeNet)