白话超级详细解读(一)-----GoogLeNet(Inception V1-Inception V3)

一、背景

GoogLeNet、VGGNet分别是2014年ImageNet挑战赛的第一名和第二名,相对于VGGNet的网络结构,GoogLeNet则进行了大胆的尝试,提出了Inception结构,这种结构的最大的特点就是提高了计算资源的利用率。虽然GoogLeNet只有22层,但是整个网络的尺寸却比AlexNet和VGGNet小很多。GoogLeNet在扩大深度和宽度的同时,保持计算预算不变,这是非常难得的。

二、初识Inception结构

2.1 Inception naive version(原始版本Inception)

Inception结构经历了4个版本,其中,由于Inception V4是与残差神经网络进行结合,在此先不讲述。下面对Inception的各个版本进行详细介绍。
一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式存在以下问题:
(1)参数太多,如果训练数据集有限,很容易产生过拟合;
(2)网络越大、参数越多,计算复杂度越大,难以应用;
(3)网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。
解决这种问题的方式当然是在增加网络的宽度和深度的同时减少参数(减少参数是为了高性能的计算)。因此,Google团队提出了Inception结构,以保持高性能计算的同时增加网络的宽度和深度。
那么。Inception结构具体是什么样的呢?
Inception 未经修改的
图(a)中,将1*1、3*3、5*5卷积和3*3池化堆叠在一起,卷积池化后的feature map尺寸相同,对这结构设计的原因,我的理解是:众所周知,卷积核越大,说明感受野越大,提取的信息语义层次特征更高;卷积核越小,感受野越小,提取到的特征更为直观。将不同卷积核提取到的feature map叠加在一起,不仅有直观的特征,而且也有语义层次高的特征,这样特征信息会更加丰富。但设计Inception的初衷是为了保持高性能计算,这样5*5的卷积核的计算量显得未免也太大了,这与Inception设计的初衷相悖。于是Google团队对Inception的原始版本进行了改进,即Inception V1。

2.2 使用1*1卷积的优势

使用1*1卷积的优势:

  • 减少参数量,减少计算量
    • 假设输入feature map的维度是256维,要求输出维度也是256维,有以下两种操作:
      • (1)256维的输入直接经过一个3*3*256的卷积层,输出一个256维的feature map,那么参数量为:(3*3*256)*256 = 589824
      • (2)256维的输入先经过一个1*1*256*64的卷积层,再经过一个3*3*64的卷积层, 最后经过一个1*1*256的卷积层,输出256维,参数量为:(1*1*256*64)+(3*3*64*64)+(1*1*64*256) = 69532 可以看到,参数量减少了大约8.5倍
  • 实现跨通道的信息交互和信息整合
    • 使用1*1卷积核,其实就是对不同的channel间的信息做线性组合的一个变换过程。比如输入为3*3*3的feature map,后面添加一个1*1*3*64个的卷积核,就变成了3*3*64的feature map,原来的3个channels就可以理解为跨通道线性组合变成了64channels,这就是通道间的信息交互。
  • 增加非线性
    • 1*1卷积核,在获得相同感受野(reception feild)、保持feature map尺度不变的情况下,使用1*1卷积核的网络更深,而每一层网络后都会用Relu函数增加非线性,这样就增加了一层非线性特性。

2.3 Inception V1

在3*3卷积和5*5卷积之前,使用1*1卷积主要是为了减少参数量,从而减少计算。至于为什么减少了,上一小节已经描述了,在此不再赘述了。
Inception 降维

2.4 GoogLeNet结构

GoogLeNet网络结构

  • 1.网络的最后采用全局平均池化代替全连接层,该想法来自NIN。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整。网络中虽然用全局平均池化替代了全连接层,但是网络模型还是用到了dropout,来减少过拟合现象。
  • 2.为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在推理过程时,这两个额外的softmax会被去掉。(摘自https://my.oschina.net/u/876354/blog/1637819

2.5 GoogLeNet细节图

GoogLeNet网络结构

三、Batch Normalization

推荐阅读博文(深入了解BN):https://blog.csdn.net/dongjinkun/article/details/109001484

3.1 BN的相关概念

什么是Batch Normalization?在了解什么是Batch Normalization之前,需要先了解3个概念,第一个是IID独立同分布假设,第二个是covariate shift,第三个是internal covariate shift。

  • IID独立同分布假设:假设训练数据和测试数据是满足独立同分布的,这是通过训练数据学得的模型能够在测试集上获得好的效果的一个基本保障。
  • internal covariate shift:神经网络是一个包含很多隐层的网络结构,在训练过程中,因为各层参数不停在变化,所以每个隐层都会面临covariate shift的问题,也就是在训练过程中,隐层的输入分布老是变来变去,这就是所谓的“Internal Covariate Shift”,Internal指的是深层网络的隐层,是发生在网络内部的事情,而不是像covariate shift问题只发生在输入层。
  • covariate shift:covariate shift只针对输入层,含义输入的输入分布总是变来变去,这不符合IID独立同分布假设,网络模型很难学习到稳定的特征,结果是网络模型的泛化能力很差。

3.2 BN的本质思想

BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其输入分布逐渐发生偏移或者变动,之所以模型训练收敛慢,一般是输入整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因。
在这里插入图片描述
BN是要干什么呢?
BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,将,激活输入分布固定下来,这样使得激活输入值落在非线性函数对输入比较敏感的区域(对于Sigmoid函数来说,输入会更大概率的落在[-2,2]区间上,该区间上梯度较为明显),意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

3.3 训练阶段如何做BN变换

对于d维数据,对每一维的数据都做BN变换,使其变为均值为1、方差为0的标准正态分布,下面以第k维举例:
手推公式
BN变换算法流程(算法1):
训练阶段如何做BN变换
未添加BN层:
在这里插入图片描述
添加BN层之后:
在这里插入图片描述
经过BN变换后,神经元的激活X形成了均值为0,方差为1的正态分布,目的就是把X变换至梯度明显的区域,但是这样会导致网络表达能力下降,为了防止这一点,每个神经元增加两个调节参数(scale和shift),这两个参数是通过训练来学习到的,用来对变换后的激活反变换,使得网络表达能力增强,即对变换后的激活进行如下的scale和shift操作,这其实是BN变换的反操作:
BN变换的反操作

3.4 BN的推理过程

BN在训练的时候可以根据Mini-Batch里的若干训练实例进行激活数值调整,但是在推理(inference)的过程中,输入就只有一个实例,那么这时候怎么对输入做BN呢?可以用从所有训练实例中获得的统计量来代替Mini-Batch里面m个训练实例获得的均值和方差统计量。如何求训练集的均值和方差呢?这里不进行解释了,只提供方法,均值是利用了滑动平均法求得,方差是使用的无偏估计。
BN的推理过程
对上述算法的一点解释:

  • 1-7行:其实就是算法1,也就是对K维数据分别进行BN变换,使得每一维的数据分布都为均值为1、方差为0的标准正态分布。
  • 8-12行:是模型的推理过程。
  • 第11行公式是具体怎么来的?
    • 其实就是一个简单的恒等变换,推导过程如下:
      11行公式推导过程

3.5 添加BN层后的Inception结构

在这里插入图片描述

3.6 BN的优势

  • 1.加快模型的收敛速度
  • 2.使用BN,可以设置大的学习率,并且对于权重的初始化要求也不那么严格
  • 3.BN还可以充当正则化器,减缓dropout的使用

四、Inception V2

Inception V2最主要的工作就是对大的卷积(3*3、5*5)进行分解,例如,一个5*5卷积核获得的感受野和两个3*3卷积核叠加获得的感受野相同,但是3*3卷积核的参数量要比5*5卷积核的参数量要少约2.78倍,所以,1个5*5的卷积核可以由2个3*3代替。

4.1 卷积分解(Factorizing Convolutions)

卷积分解
分解5*5卷积后,Inception结构变成如下:
分解卷积示意图
这时,google团队又思考了,能不能进一步的分解卷积,例如,将卷积核分解成2*2卷积,然而,事实证明,使用非对称卷积可以做得比2*2卷积更好。例如:在保持获得相同感受野的前提下,使用1个3*1卷积+1个1*3卷积可以代替3*3卷积。

4.2 非对称卷积( Asymmetric Convolutions)

非对称卷积
使用非对称卷积后:
非对称卷积示意图
然而,Google团队发现,这种非对称卷积在神经网络早期的效果并不理想,换句话说,这种非对称卷积方式在比较大的feature map(size:n*n,12≤n≤20)上使用时,效果会比较好。在这个层次上,使用1个1*7卷积+1个7*1卷积会得到一个比较好的结果。

4.3 降低feature map的尺寸

原文提到,降低feature map尺寸的方式有2种:

  • 1.先对feature map进行池化,然后再做Inception卷积。这种方式虽然会减少计算量,但是会造成特征信息缺失,也就是会遇到特征瓶颈,因为池化只是提取了最明显的特征(这里以最大池化为例,因为现在最大池化用的较多,平均池化基本不用了)。
    在这里插入图片描述
  • 2.先对feature map进行Inception卷积,然后再进行池化。这种方式是正常的缩放,但这种方式计算量很大。为了同时保持特征表示且降低计算量,将网络结构改为下图,使用两个并行化的模块来降低计算量(卷积、池化并行执行,再进行合并)
  • 在这里插入图片描述 保持特征表示的同时,减少计算量

五、Inception V3

5.1 GoogLeNet发展历程

总结一下GoogLeNet的发展历程:

  • 1.Inception的原始版本
  • 2.Inception V1版本
  • 3.Inception-BN版本
  • 4.Inception V2版本(其中,依次包括卷积分解、非对称卷积)
  • 5.Inception V3版本,见下文。

5.2 Inception V3

论文中提到:
在这里插入图片描述
红笔标记处提到:表格3中最后一行的模型称之为Inception V3,也就是Inception V2+Batch Normalization = Inception V3。
在这里插入图片描述
至此,除Inception V4版本,其余版本已经介绍完,其中,有很多细节由于篇幅问题没有详细说明,详细了解还需要仔细阅读文章。

七、参考文献

猜你喜欢

转载自blog.csdn.net/dongjinkun/article/details/109185101