【DeepLearning】GoogLeNet Incepetion V1 V2 V3创新点比较总结汇总

一、GoogLeNet Incepetion V1 总结创新点:
为解决巨大的参数量带来的 过拟合 和 大大增加的计算成本 问题,提出了Inception结构:
  • 对于inception结构而言:
1.密集成分 来近似 最优的局部稀疏结构2.
2.使用NIN,采用1*1卷积进行降维,降低参数量
  • 对于整体结构而言:
1 . 显然GoogLeNet采用了模块化的结构,方便增添和修改;
2 . 网络最后采用了average pooling来代替全连接层,想法来自NIN,事实证明可以将TOP1 accuracy提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便以后大家finetune;
3 . 虽然移除了全连接,但是网络中依然使用了Dropout ;
4 . 为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。文章中说这两个辅助的分类器的loss应该加一个衰减系数,但看caffe中的model也没有加任何衰减。此外,实际测试的时候,这两个额外的softmax会被去掉。
二、GoogLeNet Incepetion V2 总结创新点:
  • 加入了Batch Normalization ,简称BN。
  • BN加快学习,减小计算量
首先,图像数据是高度相关的,假设其分布如下图a所示(简化为2维)。
由于初始化的时候,我们的参数一般都是0均值的,因此开始的拟合y=Wx+b,基本过原点附近,如图b红色虚线。因此,网络需要经过多次学习才能逐步达到如紫色实线的拟合,即收敛的比较慢。
如果我们对输入数据先作减均值操作,如图c,显然可以加快学习。
进一步,我们对数据再进行去相关操作,使得数据更加容易区分,会加快训练,如图d
但是考虑到,在进行方差归一化时,要对每一层的所有数据计算协方差矩阵和求逆等操作,所以计算量太大,所以,基于MINI-Batch 来对数据处理,减小计算量
其次,如果直接进行方差归一化之后,会把数据先知道均值为0的局部范围,在使用**函数之后,相当于仅使用了**函数的线性部分,显然会降低模型的表达能力。所有,对归一化的输出又增加了两个参数 ( r & b):
即: y = r * x^ + b
【DeepLearning】GoogLeNet Incepetion V1 V2 V3创新点比较总结汇总
  • 解决梯度消失和梯度爆炸问题

三、GoogLeNet Incepetion V3 总结创新点:
之前版本表现很好,但是想要简单方法Inception结构来构建更大的网络,则会立即提高计算成本。
(1)给出了一些已经被证明有效的用于放大网络的通用准则和优化方法。这些准则和方法适用但不局限于Inception结构。主要有以下准则:
1 . 避免表达瓶颈,特别是在网络靠前的地方。 信息流前向传播过程中显然不能经过高度压缩的层,即表达瓶颈。从input到output,feature map的宽和高基本都会逐渐变小,但是不能一下子就变得很小。比如你上来就来个kernel = 7, stride = 5 ,这样显然不合适。
另外输出的维度channel,一般来说会逐渐增多(每层的num_output),否则网络会很难训练。(特征维度并不代表信息的多少,只是作为一种估计的手段)
这种情况一般发生在pooling层,字面意思是,pooling后特征图变小了,但有用信息不能丢,不能因为网络的漏斗形结构而产生表达瓶颈,解决办法是作者提出了一种特征图缩小方法,更复杂的池化。
2 . 高维特征更易处理。 高维特征更易区分,会加快训练。
3. 可以在低维嵌入上进行空间汇聚而无需担心丢失很多信息。 比如在进行3x3卷积之前,可以对输入先进行降维而不会产生严重的后果。假设信息可以被简单压缩,那么训练就会加快。
4 . 平衡网络的宽度与深度。
(2)优化INcepton结构
【DeepLearning】GoogLeNet Incepetion V1 V2 V3创新点比较总结汇总

(1) 图4是GoogLeNet V1中使用的Inception结构;
(2) 图5是用3x3卷积序列来代替大卷积核;
(3) 图6是用nx1卷积来代替大卷积核,这里设定n=7来应对17x17大小的feature map。该结构被正式用在GoogLeNet V2中。即非对称个卷积核,其实类似于卷积运算中,二维分解为1维计算,提高了计算速度。
(3)优化辅助分类器
作者发现,V1中的辅助分类器有点问题:auxiliary classifiers在训练初期的时候并不能加速收敛,只有当训练快结束的时候它才会略微提高网络精度。
然后Szegedy就把第一个auxiliary classifiers去掉了!还说,auxiliary classifiers能够起到regularizer的作用
(4)优化池化
按照传统的做法,在pooling之前,为了防止信息丢失,应当加入了expand层,如下图右半部分。
【DeepLearning】GoogLeNet Incepetion V1 V2 V3创新点比较总结汇总

Unefficient grid size reduction
这么做有个问题,会增加运算量,于是Szegedy就想出了下面这种pooling层。
【DeepLearning】GoogLeNet Incepetion V1 V2 V3创新点比较总结汇总

Efficient grid size reduction
上图可以这么理解,Szegedy利用了两个并行的结构完成grid size reduction,分别是conv和pool,就是上图的右半部分。左半部分是右半部分的内部结构。
(5)优化标签
Labels的脉冲性质会引发两个不良后果:一是over-fitting,另外一个是降低了网络的适应性。
Szegedy在阐述完上面两个缺点后,补充了一句话,说不良后果的产生就是因为网络太依赖它所预测的结果。
Intuitively, this happens because the model becomes too confident about its predictions.
好了,先不管这么多,这个label smooth具体是怎么实现的?就是下式:
【DeepLearning】GoogLeNet Incepetion V1 V2 V3创新点比较总结汇总

label smooth
为了方便理解,转换成python代码,就是这样的:
new_labels = (1.0 - label_smoothing) * one_hot_labels + label_smoothing / num_classes
Szegedy在网络实现的时候,令 label_smoothing = 0.1,num_classes = 1000。Label smooth提高了网络精度0.2%。
我对Label smooth理解是这样的,它把原来很突兀的one_hot_labels稍微的平滑了一点,枪打了出头鸟,削了立于鸡群那只鹤的脑袋,分了点身高给鸡们,避免了网络过度学习labels而产生的弊端。