深度学习网络基础—GoogLeNet 学习笔记

深度学习网络基础—GoogLeNet 学习笔记

引言

在过去的三年里(2014年),主要由于深度学习的进步,更具体地说是卷积网络的发展,图像识别和目标检测的质量以惊人的速度发展。这些进展不仅仅是更强大的硬件、更大的数据集和更大的模型的结果,而且主要是新想法、算法和改进的网络架构的结果

主要贡献
前瞻性的关注深度学习算法在移动设备上的实用性

  • 提出 Inception 结构,人为构建稀疏连接,引入多尺度感受野和多尺度融合
  • 使用 1 ∗ 1 1*1 11 卷积层进行降维,减少计算量
  • 使用均值池化取代全连接层,大幅度减少参数数目和计算量,一定程度上引入了正则化,同时使得网络输入的尺寸可变

灵感来源

原文:

The most straightforward way of improving the performance of deep neural networks is by increasing their size.

提高深度神经网络性能的最直接的办法就是增加网络的尺寸。它包括增加网络的深度和宽度两个方面。深度层面,就是增加网络的层数,而宽度方面,就是增加每层的 filter bank 尺寸。
但是,这种方式有两点不足:

  • 更大的尺寸通常意味着更多的参数,也更容易导致网络的过拟合,尤其是样本不足的情况下
  • 即使均匀的增加网络每层的尺寸,也会急剧(指数形式)增加总的运算量。且网络容量利用不足时,将会导致大量的运算被浪费。
    解决这一问题的根本方法在于,最终将 dense 连接转换为为稀疏连接。

结构

原文:

The main idea of the Inception architecture is based on finding out how an optimal local sparse
structure in a convolutional vision network can be approximated and covered by readily available
dense components.
All we need is to find the optimal local construction and to repeat it spatially

Inception架构的主要思想是基于如何发现卷积视觉网络中用密集成分来近似最优的局部稀疏结构。我们所需要的就是找到最优的局部构造,并在空间上重复它。
原始Inception
图1
深度学习网络基础—GoogLeNet 学习笔记_第1张图片

  • 1、采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合。
  • 2、之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了
  • 3、文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了。
  • 4、网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加
  • 5、在所有卷积核运算结束之后,通过 concatenate 运算(在 depth 维度上进行),将结果进行组合。整个 GoogLeNet 网络通过大量 Inception 模块堆叠而成

在上面的 Inception 模块中,存在一定的问题 —— 卷积运算运算量过大。当上一层的输出通道数较大时,当前 Inception 模块的运算量将很大,且由于多组卷积核并联运算,因此这是随着层数的堆叠而爆炸式增长的!

针对这一问题,我们使用1 x 1卷积作为 reduction 层,来缩减通道数,从而减少计算量。具体做法为:在每一个3 x 35 x 5 的卷积层之前,加上1 x 1 的卷积层。其在减少计算量的同时,还引入了非线性,进一步增加了网络的表达能力

如何理解引入非线性

使用1 x 1卷积核,实现降维和升维的操作其实就是通道间信息的线性组合变化,3 x 3,64 channels的卷积核前面添加一个1 x 1,28 channels的卷积核,就变成了3 x 3,28 channels的卷积核,原来的64个channels就可以理解为跨通道线性组合变成了28个channels,这就是通道间的信息交互。因为1 x 1卷积核,可以在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数),把网络做的很深,增加非线性特性

这种设计的优点有:

  • 它使得可以显著增加网络每一层的神经元数量,同时不会导致计算量的不可控增长
  • 维度减约的设计,使得在网络层之间传递大量的特征层
  • 间接的引入了多尺度处理,使得网络可以同时综合考虑不同尺度的信息
    这种计算方式的改善,使得在不增加计算量的同时,拓宽每一层的宽度,并增加网络的深度。

图2
深度学习网络基础—GoogLeNet 学习笔记_第2张图片

关键点解析

图中有多个黄色的1x1卷积模块的作用:

  • 1、在相同尺寸的感受野中叠加更多的卷积,能提取到更丰富的特征
  • 2、使用1x1卷积进行降维,降低了计算复杂度。图中间3x3卷积和5x5卷积前的1x1卷积都起到了这个作用。当某个卷积层输入的特征数较多,对这个输入进行卷积运算将产生巨大的计算量;如果对输入先进行降维,减少特征数后再做卷积计算量就会显著减少。

多个尺寸上进行卷积再聚合

参考地址https://zhuanlan.zhihu.com/p/32702031

图2可以看到对输入做了4个分支,分别用不同尺寸的filter进行卷积或池化,最后再在特征维度上拼接到一起.

  • 1、在直观感觉上在多个尺度上同时进行卷积,能提取到不同尺度的特征。特征更为丰富也意味着最后分类判断时更加准确。
  • 2、利用稀疏矩阵分解成密集矩阵计算的原理来加快收敛速度。举个例子下图左侧是个稀疏矩阵(很多元素都为0,不均匀分布在矩阵中),和一个2x2的矩阵进行卷积,需要对稀疏矩阵中的每一个元素进行计算;如果像右图那样把稀疏矩阵分解成2个子密集矩阵,再和2x2矩阵进行卷积,稀疏矩阵中0较多的区域就可以不用计算,计算量就大大降低。这个原理应用到inception上就是要在特征维度上进行分解!传统的卷积层的输入数据只和一种尺度(比如3x3)的卷积核进行卷积,输出固定维度(比如256个特征)的数据,所有256个输出特征基本上是均匀分布在3x3尺度范围上,这可以理解成输出了一个稀疏分布的特征集;而inception模块在多个尺度上提取特征(比如1x1,3x3,5x5),输出的256个特征就不再是均匀分布,而是相关性强的特征聚集在一起(比如1x1的的96个特征聚集在一起,3x3的96个特征聚集在一起,5x5的64个特征聚集在一起),这可以理解成多个密集分布的子特征集。这样的特征集中因为相关性较强的特征聚集在了一起,不相关的非关键特征就被弱化,同样是输出256个特征,inception方法输出的特征“冗余”的信息较少。用这样的“纯”的特征集层层传递最后作为反向计算的输入,自然收敛的速度更快。
    深度学习网络基础—GoogLeNet 学习笔记_第3张图片
  • 3、解释3:Hebbin赫布原理。Hebbin原理是神经科学上的一个理论,解释了在学习的过程中脑中的神经元所发生的变化,用一句话概括就是fire togethter, wire together。赫布认为“两个神经元或者神经元系统,如果总是同时兴奋,就会形成一种‘组合’,其中一个神经元的兴奋会促进另一个的兴奋”。比如狗看到肉会流口水,反复刺激后,脑中识别肉的神经元会和掌管唾液分泌的神经元会相互促进,“缠绕”在一起,以后再看到肉就会更快流出口水。用在inception结构中就是要把相关性强的特征汇聚到一起。这有点类似上面的解释2,把1x1,3x3,5x5的特征分开。因为训练收敛的最终目的就是要提取出独立的特征,所以预先把相关性强的特征汇聚,就能起到加速收敛的作用。

在inception模块中有一个分支使用了max pooling,作者认为pooling也能起到提取特征的作用,所以也加入模块中。注意这个pooling的stride=1,pooling后没有减少数据的尺寸

你可能感兴趣的:(ML&DL,深度学习,网络,学习)