Inception与VGGNet都是2014年ImageNet挑战赛的佼佼者, Inception取得了该年度第一名,VGGNet取得了第二名(图像定位项目的第一名)。二者都是基于“更深的网络准确率更高”的信念和AlexNet网络进一步增加网络深度而发明的,因此与AlexNet相比,它们的深度都是更深了,VGGNet最深达到了19层, Inception更是达到了22层。
与VGGNet不同的是, Inception对卷积神经网络存在的问题进行了深入的分析,并且针对几个主要问题提出了针对性的解决办法。首先是如何在增加网络深度的同时,尽可能地减少参数数量。其次是如何充分利用GPU的密集计算能力,特别是在参数减少、网络变得稀疏之后。最后是如何削弱卷积神经网络训练过程中容易出现的梯度消失的问题,尤其是浅层的神经元容易出现的梯度消失问题。
Inception这一名称来源于电影《盗梦空间》(英文名Inception),在电影中男主角经典台词就是“We need to go deeper(我们需要走向更深)”,卷积神经网络同样也需要更深的网络,因为更深的网络带来更高的准确率,所以在参加2014年的ILSVRC的时候,GoogLeNet团队将他们的网络命名为Inception。如果我们一定要把Inception翻译成中文的话,或许“更深的网络”比较合适。
Inception的开发团队是GoogLeNet,它的大部分成员都来自Google公司,为什么他们没有将自己团队称为 GoogleNet(Google+Net),而是GoogLeNet呢?这是为了向卷积神经网络的鼻祖LeNet网络致敬。
增加网络的深度(往往同时增加每层神经元数量)容易导致以下几个方面的问题。
不管是参数数量过多的问题,还是计算量过大的问题,解决的办法都是使网络变得稀疏,需要将网络从完全连接转换成部分连接,这正是卷积神经网络逐步取代全连接神经网络的根本原因。问题是卷积神经网络已经是部分连接了,还能更进一步地减少连接的数量吗?答案是肯定的。Inception借鉴了神经科学中的赫布理论:一起激发的神经元连接在一起。受此启发, Inception的网络架构中引入了“构件块”的概念,“构件块”包含了一组神经元,或者说包含了一系列的卷积层与池化层。
与此同时,GoogLeNet还注意到,现有的计算资源在稀疏的神经网络上运行的效率低下,这是因为现代的GPU设计目标是针对密集的矩阵运算场景。当神经网络变得稀疏时,即使算术计算量下降两个数量级,由于数据查找和缓存未命中导致的资源开销就会超过算术运算的开销,所需计算时间并不会减少。为了充分利用现有计算资源的密集计算和并行计算的能力,甚至已经出现将卷积神经网络转换回全连接神经网络的尝试,这与通过稀疏减少连接数量是矛盾的、冲突的。
现在问题转化成是否能找到一种网络结构,在保持卷积神经网络的稀疏性的同时,能够充分地发挥现有计算资源的密集计算、并行计算的能力?答案是肯定的,这种网络结构就是Inception模块。
值得注意的是,图中的最大池化层和旁路分类器分别位于图的上方和下方,其实最大池化层分别出现在第一构建层与第二构建层、第二构建层与第三构建层、第三构建层与第四构建层、第四构建层与第五构建层之间,为了让图不至于太大、容易查看,才将最大池化层画在图的上方。图中箭头依然展示了数据流向,从第一层流向最大池化层再流向第二层等,以此类推。旁路分类器分别从(4a)和(4d)接收输出数据,经过权重(0.3)调整后直接连接到输出层。
Inceptionv2和Inception v3都是在Inception网络的基础上,基于实验改进后的Inception 版本。它们的区别很小,所以我们将Inception v2和Inception v3放在一章中介绍。它们的主要区别在于集成了改进项目(排列组合)的多寡不同。其中, Inception v3比Inception v2集成了更多的改进,包括对7×7的过滤器进行了卷积分解,以及在旁路分类器执行了批标准化的操作。标准化操作就是让所有的输入变量减去均值,这样模型能够更快地拟合。批标准化操作,就是在每一个批次的训练数据集上执行标准化操作(均值是这个批次的均值,而不是全部数据的均值)。
具体措施:
优化思路与之前构建Inception的思路一脉相承,主要有以下几个方面:第一,继续增加网络的深度和宽度,提高模型的准确率,同时,竭尽所能地减少参数,避免参数过多导致模型无法训练和管理;第二,进一步优化Inception模块结构,提高并行计算的能力,尽可能地充分使用计算资源;第三,叠加以上各种要素,通过构建模型来实际验证的方式,发现实际可行的模型架构,比如之前提到的旁路分类器等。
增加网络的深度,主要是通过Inception模块的堆叠,以及在Inception模块内部增加网络层数。减少参数的数量主要是通过卷积分解实现,即将一个大的过滤器(卷积核)分解成两个小的过滤器。
优化Inception模块结构,提高并行计算能力是说将卷积和池化的两个过程并行执行,更加充分利用现代计算资源的并行计算和密集计算的特点。
堆叠其他各种要素以及旁路分类器等特点,将以上优化措施组合使用,通过实验对比的方法找到最优的网络架构。在各种优化措施的组合中,如果存在多种组合方案,那么与上一节的指导原则比较,尽可能选择符合上述指导原则的方案,并且尽量避免严重偏离上述指导原则的方案。
基于大规模的实验,并且构建了大量的各种不同的卷积神经网络架构,GoogLeNet团队提出了几个最佳实践原则。这些原则有推测的因素,需要进一步的实验数据验证。经过实验验证,严重偏离这些原则会导致网络的精准度降低,修复这些偏离之后,网络的精度能够提高。
总而言之,这些原则对于Inception网络架构的设计具有指导意义,这些原则包括以下几点。
这些原则具有指导意义,需要谨慎地应用才能发挥作用。
卷积分解并不是新鲜事物了,主要是将尺寸较大的过滤器用几个小的过滤器替代。但是之前的过滤器都是对称的,也就是宽度和高度都是一样的。那么如果宽度和高度不一样可以吗?答案是肯定的,非对称过滤器能够节省更多的参数。下图展示了一个3x3的过滤器替换成一个1x3和一个3
x1的过滤器。
理论已经证明,任何一个nxn的过滤器,都可以使用一个1xn和一个nx1来替换,并且n越大,所能节省的参数百分比越大。
在卷积神经网络中,常常需要通过池化操作来缩小特征图谱的尺寸。一般来说,为了避免出现特征瓶颈导致最终的准确率降低,往往在执行池化操作之前,增加过滤器的数量,期望借助更多的过滤器获取更多的特征,这种方式可以较好的避免了特征瓶颈的问题,但是消耗的计算资源变多了。
另一种方式是先池化,然后使用数量更多的过滤器来执行卷积操作,虽然减少了计算资源,但是可能会出现特征瓶颈的问题。
针对该问题,GoodLeNet团队提出来一种能够并行执行卷积核池化的方法。如下图。其中(a)部分是改进后的Inception模块,与之前的模块区别在于其中的过滤器的尺寸是3×3、步长都是2,这样卷积输出的尺寸缩小到原来的一半,池化操作也是类似的,步长也是2,所以针对相同的输入,二者输出的尺寸是相同的,它们的输出张量可以直接串联(堆叠)在一起,形成最终的输出,输入输出的张量形状如图11-4中(b)所示。
批量标准化是指在一批训练数据上的标准化操作,最常用的标准化操作如减去均值除以标准差操作。
根本原因是引入批量标准化操作能够解决层数很多的神经网络训练困难的问题。产生这个问题的原因有两个。
分析以上两个问题,可以发现根源在于不同批次训练数据的分布不同。批量标准化操作的本质在于将每批次的输入数据映射到一个标准正态分布,该分布满足均值为0方差为1。通过这种映射解决了不同批次之间的数据分布不同的问题,同时将绝大部分数据(大于95%的数据)映射到梯度不容易为线性的区域,对抗梯度消失和梯度爆炸的问题。
批量标准化的意义在于,将输入数据映射到均值为0、方差为1的正态分布区间,如图11-5中(a)所示。从概率分布可知,映射后的数据有95%的概率落入[-2,2]的取值区间,对于sigmod 这样的激活函数来说,[-2,2]的取值区间对应的梯度是比较大的,几乎是线性的,如图11-6中(a)所示。数据落入[-2,2]的取值区间之外时,对应的梯度很小,正是容易发生梯度消失的区域。
在生活中,一张图像(如照片)中往往不会只有一个对象(物体),在ILSVRC挑战赛中就有对象定位和对象分类识别比赛项目。实现思路:首先完成对象定位,即在原始图像中完成对象的检测,检测到对象大致在图像中的哪个区域,并将对象框选出来;然后将框选出来的区域里的那个类别的对象识别出来。
在第二个步骤中,由于一个图像包含多个对象,所以,框选的区域往往比较小,对应的图像分辨率会比较低,如果输入图像的分辨率(宽度和高度的像素个数较少)很低,这时我们该怎么办?
为了在低分辨率的输入图像上获得更高的准确率,我们的模型需要从模糊的特征中,发现能够用于识别图像的细节。一个简单的思路是,在模型的前两层中,减小过滤器的滑动步长,或者干脆取消池化层,这样做显然会增加计算量。我们想要知道的是,这样做增加的计算量是否是线性增长的,或者说是否是可以接受的。
团队对其进行了实验,结果如下
因此,结论就是,如果输入图像的分辨率比较低,可以在开始的前两层卷积中,通过减小过滤器的步长,以及取消池化层的办法来达到较高的识别准确率。但是这个结论不能滥用,盲目减小输入图像分辨率,会导致模型的准确率大幅度地降低。