Inception V1

作者: 18587a1108f1 | 来源:发表于2018-12-19 11:23 被阅读1次

    Inception的名字来源非常有意思,作者说其灵感来自于《盗梦空间 (Inception) 》中的梗,“We need to go deeper.” 即在神经网络中,需要“go deeper”。


    本文以及之后的系列文章,会总结和说明Inception的发展历程以及各个版本的模型结构。

    Inception[V1]: Going Deeper with Convolutions, 2014
    Inception[V2-V3]:Rethinking the Inception Architecture for Computer Vision, 2015
    Inception[V4]: Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning, 2016


    Inception V1

    论文:Going Deeper with Convolutions

    ILSVRC 2014(ImageNet Large Scale Visual Recognition Competition) 上,取得了最好的成绩的网络为 GoogLeNet。GoogLeNet 对网络中的传统卷积层进行了修改,提出了被称为 Inception 的结构,用于增加网络深度和宽度,提高深度神经网络性能。

    《Going Deeper with Convolutions》 中提出,传统情况下,最直接提升深度神经网络的方法就是 增加网络的尺寸,包括宽度和深度。深度也就是网络中的层数,宽度指每层中所用到的神经元的个数。但是这种简单直接的解决方式存在的两个重大缺点
    (1) 网络尺寸的增加也意味着参数的增加,也就使得网络更加容易过拟合
    (2) 计算资源的增加。

    《Going Deeper with Convolutions》 原文:The fundamental way of solving both issues would be by ultimately moving from fully connected to sparsely connected architectures, even inside the convolutions. Besides mimicking biological systems, this would also have the advantage of firmer theoretical underpinnings due to the ground-breaking work of Arora et al. [2]. 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.

    如上文所述,作者提出,根本的解决方法就是将 全连接的结构转化成稀疏连接的结构
    稀疏连接有两种方法:
    一种是 空间(spatial)维度的稀疏连接,也就是传统的CNN卷积结构:只对输入图像的某一部分进行卷积,而不是对整个图像进行卷积,共享参数 降低了总参数的数目,减少了计算量;
    另一种是在 特征(feature)维度进行稀疏连接,在多个不同的尺寸上进行卷积再聚合,把相关性强的特征聚集到一起,每一种尺寸的卷积只输出所有特征中的一部分,这也是种稀疏连接。( 这种方法的理论基础来自于Arora et al的论文Provable bounds for learning some deep representations )


    Native Inception


    Native Inception 的结构如上图所示。对输入做了4个分支,分别用不同尺寸的filter进行卷积或池化,最后再在特征维度上拼接到一起。

    问题1:这样做的好处是什么呢?!(记笔记!!!划重点!!!)


    解释1:在直观感觉上,在多个尺度上同时进行卷积,能提取到不同尺度的特征,特征更为丰富,也意味着最后分类判断时更加准确。
    解释2:把稀疏矩阵分解成多个子密集矩阵计算,来加快收敛速度。传统的卷积层的输入数据只和一种尺度(比如3x3)的卷积核进行卷积,输出固定维度(比如256个特征)的数据,所有256个输出特征基本上是均匀分布在3x3尺度范围上,这可以理解成输出了一个稀疏分布的特征集;而inception模块在多个尺度上提取特征(比如1x1,3x3,5x5),输出的256个特征就不再是均匀分布,而是相关性强的特征聚集在一起(比如1x1的的96个特征聚集在一起,3x3的96个特征聚集在一起,5x5的64个特征聚集在一起),这可以理解成多个密集分布的子特征集。这样的特征集中因为相关性较强的特征聚集在了一起,不相关的非关键特征就被弱化,同样是输出256个特征,inception方法输出的特征“冗余”的信息较少。用这样的“纯”的特征集层层传递最后作为反向计算的输入,自然收敛的速度更快。

    举个栗子!下图左侧是个稀疏矩阵(很多元素都为0,不均匀分布在矩阵中),和一个2x2的矩阵进行卷积,需要对稀疏矩阵中的每一个元素进行计算;如果像右图那样把稀疏矩阵分解成2个子密集矩阵,再和2x2矩阵进行卷积,稀疏矩阵中0较多的区域就可以不用计算,计算量就大大降低。


    解释3:赫布原理(Hebbian Principle)。Hebbin原理是神经科学上的一个理论,用一句话概括就是fire togethter, wire together。赫布认为“两个神经元或者神经元系统,如果总是同时兴奋,就会形成一种‘组合’,其中一个神经元的兴奋会促进另一个的兴奋”。比如狗看到肉会流口水,反复刺激后,脑中识别肉的神经元会和掌管唾液分泌的神经元会相互促进,“缠绕”在一起,以后再看到肉就会更快流出口水。用在inception结构中就是要把相关性强的特征汇聚到一起。因为训练收敛的最终目的就是要提取出独立的特征,所以使用1x1,3x3,5x5多个尺度的卷积核,可以预先把相关性强的特征汇聚,起到加速收敛的作用。

    问题2:为什么是1x1,3x3,5x5和Max Pooling(而不是2x2...9x9...)?

    解释1:为什么卷积核选择奇数,可见我之前写的 《卷积神经网络CNN》,有进行详细解释。

    原文:In order to avoid patch alignment issues, current incarnations of the Inception architecture are restricted to filter sizes 1×1, 3×3 and 5×5, however this decision was based more onconvenience rather than necessity.
    翻译:为了避免区块对齐问题(patch alignment issues),现有的 Inception 结构将过滤器大小限制为 1×1,3×3 和 5×5,然而这种设定更多是为了方便而不是必要的。

    原文:Additionally, since pooling operations have been essential for the success in current state of the art convolutional networks, it suggests that adding an alternative parallel pooling path in each such stage should have additional beneficial effect, too
    翻译:另外,因为池化操作对于现有水平的卷积网络是很重要的,建议最好在每一部增加一条并行池化通路,这样应该也会有一些额外的好处。

    解释2:根据上面摘录的原文描述,我们可知道这种设定主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了!


    Inception V1的提出

    Native Inception 的网络结构实现了将稀疏矩阵聚类成相对稠密子空间,来对稀疏矩阵的计算优化。
    但是有个问题!滤波器数量的增加,以及加上池化操作,使得滤波器的计算开销非常大,尤其是网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加,使用5x5的卷积核会带来 巨大的计算量。 处理十分低效,引起计算爆炸。
    因此,作者在Native Inception的基础上,引入了 Network in Network(NIN)文中提到的 1x1卷积核,来解决计算问题。


    Inception V1版本的网络结构就如上图所示了!
    和Native Inception相比,Inception v1在3x3和5x5层前,各自增加一个1x1的卷积操作;在max pooling后面也添加了一个1x1卷积操作。

    问题3:1x1卷积块有什么用处呢?(记笔记!!!划重点!!!)

    解释1:使用1x1卷积进行降维,降低了计算复杂度。当某个卷积层输入的特征数较多,对这个输入进行卷积运算将产生巨大的计算量;如果对输入先进行降维,减少特征数后再做卷积计算量就会显著减少。
    举个栗子!
    输入:一组有192特征、32x32大小的数据(32x32x192)
    之前计算:通过一个3x3卷积(192维,256个)计算
    优化后计算:通过一个1x1卷积(192维,96个)和3x3卷积(96维,256个)计算
    输出:256特征,32x32大小的数据(32x32x256)
    优化前:直接用3x3卷积,需要192x256x3x3x32x32=452984832次乘法
    优化后:先用1x1的卷积降到96个特征,再用3x3卷积恢复出256个特征,需要192x96x1x1x32x32+96x256x3x3x32x32=245366784次乘法
    使用1x1卷积降维的方法节省了一半的计算量!
    解释2:使用1x1卷积进行降维,减少了需要训练的参数个数。
    再举个栗子!
    假设Inception中输入的feature map是28×28×192,1×1卷积通道为64,3×3卷积通道为128,5×5卷积通道为32,那么native Inception卷积核参数为1×1×192×64+3×3×192×128+5×5×192×32;
    而Inception v1中,对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层,这样卷积核参数就变成了1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32),参数大约减少到原来的三分之一。
    解释3:在相同尺寸的感受野中叠加更多的卷积,能提取到更丰富的特征。卷积计算后面都紧跟着激活函数(比如relu),所以将两个卷积串联,就能组合出更多的非线性特征。
    再再举个栗子!
    假设第1个3x3卷积+激活函数近似于f1(x)=ax2+bx+c,第二个1x1卷积+激活函数近似于f2(x)=mx2+nx+q,那f1(x)和f2(f1(x))比哪个非线性更强,更能模拟非线性的特征?答案是显而易见的。


    问题4:用1x1卷积降维会影响最后训练的效果么?

    解释:答案是否定的,只要最后输出的特征数不变(256组),中间的降维类似于压缩的效果,并不影响最终训练的结果


    Inception V1总结

    inception V1结构的主要贡献有两个:
    一是使用1x1的卷积来进行升降维;
    二是在多个尺寸上同时进行卷积再聚合。


    参考文献

    1. Going deeper with convolutions
    2. 深入理解GoogLeNet结构(原创)
    3. GoogLeNet系列解读
    4. One by One [ 1 x 1 ] Convolution - counter-intuitively useful
    5. 【转】CNN卷积神经网络 GoogLeNet 之 Inception(V1-V4)
    6. 从Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets, ShuffleNet..

    相关文章

      网友评论

        本文标题:Inception V1

        本文链接:https://www.haomeiwen.com/subject/acebqqtx.html