论文解析:理论分析Inception模块和GoogLeNet

147 阅读9分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Inception-V1

目的

 自从卷积神经网络诞生以来,其标准范式就是堆叠的卷积层夹杂着池化层或者是归一化层,发展方向主要是在网络的大小上做文章,无论是增加网络的层数或者说是增加每层网络中神经元的大小,都都源于这一思路。但如果单单在网络大小上做文章,会引发两个问题:

  1. 网络参数过多会更可能引发过拟合问题,尤其是在数据集中标记数据有限的情况下。而人工标注的高质量数据集是很难得的,因为数据集中可能存在着相似性较高的异类数据,这种数据的标记需要极强的专业知识。
  2. 参数量过大时,需要耗费更多资源来储存,工业应用上的可能不足。除此之外,训练和推断时耗费的时间资源也值得权衡。 作者认为解决上述这两个问题最基础的方案就是用稀疏连接来代替网络中的稀疏连接,即使是在卷积操作中我们也可引入稀疏连接,而也就是Inception网络的根本思路。作为这一思路下的副产物,Inception模块也为网络带来了多尺度特征网络内网络的思路,这些特点在过去已有人研究过,如用一系列不同大小的Gabor filter获得多尺度特征、MLPconv的conv后接1*1conv形成内嵌网络。而Iecetion则在某种程度上将二者结合了起来。

灵感来源

 Inception模块的结构出于将卷积神经网络稠密化的考量,其理论基础除生物学上的神经元连接是稀疏的,还有以下几个方面:

  1. 首先是Arora证明了如果数据集的概率分布是由一个非常稀疏、非常大的深度神经网络所表征的,那么我们可以通过逐层分析前一级的高相关性激活结果、聚类高相关形的神经元得到。这就意味着具有表征意义的深度稀疏神经网络是可构造的。
  2. 依据hebbian理论,“同步激活的神经元当紧密连接”,同样是在描述如果两个神经元越趋向于同时激活,二者的联系应当更紧密,反之亦然,说明有些神经元之间应当连接,有些则不然,连接是稀疏的。

但是随着稀疏连接的引入,计算资源消耗并不能得到显著的减少,这是因为现在的计算结构对非均匀分布的稀疏计算支持效果并不好,主要是对并行的稠密计算有所优化。直接大范围的使用稀疏连接并不能减少计算量。

另外值得一提的是现有的卷积神经网络虽然从卷积的角度来看是具有“稀疏”的特性,但这种稀疏在实际实施起来就成为了对前一层不同patch内的稠密连接,可以从目前的计算结构中获益。这里需要岔开说一下卷积神经网络稀疏性的来源,因为卷积神经网络对传统的神经网络如NLP的改进点就在于“稀疏连接”和“权值共享”1,前者指的是一个神经元只负责激活输入图样中的一小部分区域,后者则是指所有区域的神经元共享权重,也就相当于一个神经元多次工作,激活输入图样不同patch的内容,使得后续的图样的每个输出值只和输入的部分连接。但单独考量每个patch的话,就可以认为是稠密连接了。

当然之前的深度网络也不是没有更激进的稀疏的策略,比如最早的LeNet-5就采用了通道层面的稀疏策略2,在C3层将输入图样的通道进行不同的组合以打破网络对称性、实现稀疏连接。而在AlexNet之后网络则又回到了稠密连接的路子。

Inception则想要在LeNet-5的基础上继续走下去,作者想要提出一种和LeNet-5一样利用卷积本身性质之外的,甚至是在通道层面的稀疏性(filter level)稀疏性的结构,而这种结构又得需要能利用现有硬件在稠密计算上的优势,即由稠密连接组成的稀疏性结构。而这也是为何组成的网络叫GoogLeNet,卷积神经网络走了一圈又回到了最初的通道层面稀疏连接。

解决方案

 问题来了,如何用稠密计算实现稀疏连接3,作者从数学方面获得了灵感--通过将稀疏矩阵化成多个子稠密矩阵可以使得稀疏矩阵相乘效果最优。基于此,作者给出了如下图的解决方案,用多尺度的卷积核来代替原始的同尺度卷积堆叠:

1.png

稀疏性解释

那么这种不同尺度卷积核的应用是如何为我们的网络带来稀疏性呢?给出以下两种推测:

  1. 卷积核尺度上的稀疏性4:我们可以认为存在着一个卷积核尺度空间,它包含了各种尺度的卷积核的各种参数选择,当我们使用256个3*3的卷积核时,由于初始参数设置是随机的,可以认为它们在3*3这个尺度上均匀分布,提取到的特征也就对应稀疏分布在3*3这个尺度上。而当我们采用了64个1*1,128个3*3,32个5*5,32个pooling,单独查看每一组核在对应尺度空间上仍然是稀疏的,但总的来看,3*3部分至少是在同一尺度下的,彼此间更加稠密,也就是彼此距离不变,但尺度空间总体分布更稀疏显得卷积核同尺度内相对稠密了。
  2. 输出通道层面的稀疏性:这一稀疏性推测是从LeNet-5的角度来对GoogLeNet分析,如果按照LeNet-5的思路来利用网络稀疏性,那么在输入处,对于每个卷积核(神经元)我们都应该选取输入不同通道组合作为真实输入以实现稀疏,因此输出特征图在同一空间位置的不同通道上的值对应着输入同空间层面不同通道层面的感受野,通道稀疏;而Inception模块同则类似此思路,采用了多个尺度卷积核,使得输出特征图在同一空间位置的不同通道上的值对应着输入同通道层面不同空间层面的感受野,3*3的感受野相对5*5的显然更具稀疏性,1*1亦然,这就是空间稀疏;与这二者不同的是原始卷积网络在同一空间位置的不同通道上的输出的感受野在输入上无论通道还是空间层面都相同,具体见下图。而这就体现了Incetpion的稀疏性,更进一步的随着网络的加深,这些通道随着后续卷积操作的进行而混杂在一起,深层输出的某一位置的感受野就是更加反映了不同位置处的稀疏混杂。

2.png

(第一种猜测主要是4中的分析,但本人觉得这种尺度空间相对稀疏有点牵强,就联系GooLeNet的名字给出了第二种分析。) 此外,这一多尺度卷积也与之前的数学原理对应,使用5*5的的卷积核去与“稀疏输入”运算可化成卷积核与稠密的部分运算,也就是如果我们认为卷积过程中有很多0值相乘,不如化成多个小区域相乘,对应使用1*1或者3*3的区域小尺寸卷积。

相关性解释

 我们用不同尺度的卷积实现了稀疏,稀疏性的卷积同样也符合灵感部分的相关性构建,也就是我们应该将前一层高度相关的输出聚类在一起来构造下一层神经元。相关性高在这里就解释为了感受野相同,因此使用1*1卷积就是在进行这一聚类,而我们也不能忽略随着层数增加,更大片区域的感受野都是类似的,因此我们附加了3*3和5*5的卷积,但这种卷积核大小的构造并没有强制规定,只是为了对齐方便而选择了3和5。

堆叠隐忧

 即使这种结构是稀疏的,但你使用这种Inception结构不断堆叠仍然可能使得网络参数爆炸,因为随着输入通道数会随着concate不可避免的维持在一个较大值,而Pooling输入输出等通道的概念则更加重了这一状况。解决方案也很简单,使用1*1conv来减少通道数,那在哪里使用呢?每个模块最终输出结尾?不行,按照Arora的想法,我们应该尽量使得网络保持大而稀疏,使用1*1conv本质是对通道的稠密连接,会打破这一构想,因此折中方案是在计算会消耗大量资源时引入1*1conv,也就是conv前,pooling后,见下图:

3.png 此外,这种布置也类似NIN的思路,通过在1*1conv后使用激活增加了网络的非线性能力。

细节

 由Inception模块构成的GoogLeNet基本就就是模块的堆叠夹杂着pooling以降维,此外出于训练效率的考量,网络初期仍然是最原始的conv结构,在后期再采用了Inception结构。

总结

 整体来看,Inception模块最根本的设计思路其实不是我一直认为的获取多尺度特征,这只是一个副产物,它重在关注网络的稀疏性,利用稀疏性来构造一个更大、更深但是参数量更少的网络,用稠密连接实现稀疏连接。遗憾的是最后也没有完全把握住这个稀疏性到底体现在什么方面,只能给出几个猜测性的结果,而文章给出的两个重要理论基础,逐层构建大的稀疏分布和稀疏矩阵化成稠密矩阵,也没完全搞懂和架构的联系在哪。

参考文献

Footnotes

  1. CNN学习笔记(1)稀疏连接和权值共享的理解

  2. Deep Learning(深度学习)学习笔记整理系列之(七)

  3. 深度学习网络篇——GoogLeNet

  4. 深入理解GoogLeNet结构(原创) 2