深度学习---GoogLeNet

1、算法

文介绍的是著名的网络结构GoogLeNet及其延伸版本,目的是试图领会其中的思想而不是单纯关注结构网络

  • GoogLeNet Incepetion V1
    • Motivation
    • Architectural Details
    • GoogLeNet
    • Conclusion
  • GoogLeNet Inception V2
    • Introduction
    • General Design Principles
    • Factorizing Convolutions with Large Filter Size
    • 未完待续

GoogLeNet Incepetion V1

这是GoogLeNet的最先版本,出如今2014年的《Going deeper with convolutions》。之因此名为“GoogLeNet”而非“GoogleNet”,文章说是为了向早期的LeNet致敬。app

Motivation

深度学习以及神经网络快速发展,人们再也不只关注更给力的硬件、更大的数据集、更大的模型,而是更在乎新的idea、新的算法以及模型的改进。ide

通常来讲,提高网络性能最直接的办法就是增长网络深度和宽度,这也就意味着巨量的参数。可是,巨量参数容易产生过拟合也会大大增长计算量模块化

文章认为解决上述两个缺点的根本方法是将全链接甚至通常的卷积都转化为稀疏链接。一方面现实生物神经系统的链接也是稀疏的,另外一方面有文献1代表:对于大规模稀疏的神经网络,能够经过分析激活值的统计特性和对高度相关的输出进行聚类来逐层构建出一个最优网络。这点代表臃肿的稀疏网络可能被不失性能地简化。 虽然数学证实有着严格的条件限制,但Hebbian准则有力地支持了这一点:fire together,wire together。性能

早些的时候,为了打破网络对称性和提升学习能力,传统的网络都使用了随机稀疏链接。可是,计算机软硬件对非均匀稀疏数据的计算效率不好,因此在AlexNet中又从新启用了全链接层,目的是为了更好地优化并行运算。学习

因此,如今的问题是有没有一种方法,既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献代表能够将稀疏矩阵聚类为较为密集的子矩阵来提升计算性能,据此论文提出了名为Inception 的结构来实现此目的。测试

Architectural Details

Inception 结构的主要思路是怎样用密集成分来近似最优的局部稀疏结构。 
做者首先提出下图这样的基本结构: 
这里写图片描述 
对上图作如下说明: 
1 . 采用不一样大小的卷积核意味着不一样大小的感觉野,最后拼接意味着不一样尺度特征的融合; 
2 . 之因此卷积核大小采用一、3和5,主要是为了方便对齐。设定卷积步长stride=1以后,只要分别设定pad=0、一、2,那么卷积以后即可以获得相同维度的特征,而后这些特征就能够直接拼接在一块儿了; 
3 . 文章说不少地方都代表pooling挺有效,因此Inception里面也嵌入了。 
4 . 网络越到后面,特征越抽象,并且每一个特征所涉及的感觉野也更大了,所以随着层数的增长,3x3和5x5卷积的比例也要增长。优化

可是,使用5x5的卷积核仍然会带来巨大的计算量。 为此,文章借鉴NIN2,采用1x1卷积核来进行降维。 
例如:上一层的输出为100x100x128,通过具备256个输出的5x5卷积层以后(stride=1,pad=2),输出数据为100x100x256。其中,卷积层的参数为128x5x5x256。假如上一层输出先通过具备32个输出的1x1卷积层,再通过具备256个输出的5x5卷积层,那么最终的输出数据仍为为100x100x256,但卷积参数量已经减小为128x1x1x32 + 32x5x5x256,大约减小了4倍。ui

具体改进后的Inception Module以下图: 
这里写图片描述

GoogLeNet

GoogLeNet的总体结构以下图:

这里写图片描述

对上图作以下说明: 
1 . 显然GoogLeNet采用了模块化的结构,方便增添和修改; 
2 . 网络最后采用了average pooling来代替全链接层,想法来自NIN,事实证实能够将TOP1 accuracy提升0.6%。可是,实际在最后仍是加了一个全链接层,主要是为了方便之后你们finetune; 
3 . 虽然移除了全链接,可是网络中依然使用了Dropout ; 
4 . 为了不梯度消失,网络额外增长了2个辅助的softmax用于向前传导梯度。文章中说这两个辅助的分类器的loss应该加一个衰减系数,但看caffe中的model也没有加任何衰减。此外,实际测试的时候,这两个额外的softmax会被去掉。

下图是一个比较清晰的结构图:

这里写图片描述

Conclusion

GoogLeNet是谷歌团队为了参加ILSVRC 2014比赛而精心准备的,为了达到最佳的性能,除了使用上述的网络结构外,还作了大量的辅助工做:包括训练多个model求平均、裁剪不一样尺度的图像作屡次验证等等。详细的这些能够参看文章的实验部分。

本文的主要想法实际上是想经过构建密集的块结构来近似最优的稀疏结构,从而达到提升性能而又不大量增长计算量的目的。GoogleNet的caffemodel大小约50M,但性能却很优异。

GoogLeNet Inception V2

GoogLeNet凭借其优秀的表现,获得了不少研究人员的学习和使用,所以Google团队又对其进行了进一步发掘改进,产生了升级版本的GoogLeNet。这一节介绍的版本记为V2,文章为:《Rethinking the Inception Architecture for Computer Vision》

Introduction

14年以来,构建更深的网络逐渐成为主流,可是模型的变大也使计算效率愈来愈低。这里,文章试图找到一种方法在扩大网络的同时又尽量地发挥计算性能

首先,GoogLeNet V1出现的同期,性能与之接近的大概只有VGGNet了,而且两者在图像分类以外的不少领域都获得了成功的应用。可是相比之下,GoogLeNet的计算效率明显高于VGGNet,大约只有500万参数,只至关于Alexnet的1/12(GoogLeNet的caffemodel大约50M,VGGNet的caffemodel则要超过600M)。

GoogLeNet的表现很好,可是,若是想要经过简单地放大Inception结构来构建更大的网络,则会当即提升计算消耗。此外,在V1版本中,文章也没给出有关构建Inception结构注意事项的清晰描述。所以,在文章中做者首先给出了一些已经被证实有效的用于放大网络的通用准则和优化方法。这些准则和方法适用但不局限于Inception结构。

General Design Principles

下面的准则来源于大量的实验,所以包含必定的推测,但实际证实基本都是有效的。

1 . 避免表达瓶颈,特别是在网络靠前的地方。 信息流前向传播过程当中显然不能通过高度压缩的层,即表达瓶颈。从input到output,feature map的宽和高基本都会逐渐变小,可是不能一会儿就变得很小。好比你上来就来个kernel = 7, stride = 5 ,这样显然不合适。 
另外输出的维度channel,通常来讲会逐渐增多(每层的num_output),不然网络会很难训练。(特征维度并不表明信息的多少,只是做为一种估计的手段)

2 . 高维特征更易处理。 高维特征更易区分,会加快训练。

3. 能够在低维嵌入上进行空间汇聚而无需担忧丢失不少信息。 好比在进行3x3卷积以前,能够对输入先进行降维而不会产生严重的后果。假设信息能够被简单压缩,那么训练就会加快。

4 . 平衡网络的宽度与深度。

上述的这些并不能直接用来提升网络质量,而仅用来在大环境下做指导。

Factorizing Convolutions with Large Filter Size

大尺寸的卷积核能够带来更大的感觉野,但也意味着更多的参数,好比5x5卷积核参数是3x3卷积核的25/9=2.78倍。为此,做者提出能够用2个连续的3x3卷积层(stride=1)组成的小网络来代替单个的5x5卷积层,(保持感觉野范围的同时又减小了参数量)以下图: 
这里写图片描述 
而后就会有2个疑问:

1 . 这种替代会形成表达能力的降低吗? 
后面有大量实验能够代表不会形成表达缺失;

2 . 3x3卷积以后还要再加激活吗? 
做者也作了对比试验,代表添加非线性激活会提升性能

从上面来看,大卷积核彻底能够由一系列的3x3卷积核来替代,那能不能分解的更小一点呢。文章考虑了 nx1 卷积核。 
以下图所示的取代3x3卷积: 
这里写图片描述

因而,任意nxn的卷积均可以经过1xn卷积后接nx1卷积来替代。实际上,做者发现在网络的前期使用这种分解效果并很差,还有在中度大小的feature map上使用效果才会更好。(对于mxm大小的feature map,建议m在12到20之间)。

总结以下图:

这里写图片描述

(1) 图4是GoogLeNet V1中使用的Inception结构;

(2) 图5是用3x3卷积序列来代替大卷积核;

(3) 图6是用nx1卷积来代替大卷积核,这里设定n=7来应对17x17大小的feature map。该结构被正式用在GoogLeNet V2中。

未完待续


  1. Sanjeev Arora, Aditya Bhaskara, Rong Ge, and Tengyu Ma. Provable bounds for learning some deep representations. CoRR, abs/1310.6343, 2013. 
  2. Min Lin, Qiang Chen, and Shuicheng Yan. Network in network. CoRR, abs/1312.4400, 2013. 
转载自


2、

好文推荐:

GoogLeNet的心路历程(一)

GoogLeNet的心路历程(二)
GoogLeNet的心路历程(三)
GoogLeNet的心路历程(四)
GoogLeNet的心路历程(五)

GoogLeNet V1,V2,V3


3、

V1:

问题:

一、提高网络性能最直接的办法就是增长网络深度和宽度,这也就意味着巨量的参数。可是,巨量参数容易产生过拟合也会大大增长计算量

二、传统的提升网络精度的方法:扩大网络规模 或 增大训练数据集

三、tf.concat()以后,维度爆炸

贡献:

一、从本质上提升网络性能,就得用sparsely connected architectures,即“稀疏链接结构”。Inception Architecture

二、取消全链接层,减小参数

三、利用1x1的卷积解决维度爆炸


V2:

贡献:

一、Batch Normalization(BN)


V3:

贡献:

一、分解大filters,使其小型化、多层化,其中有个“非对称卷积”很新颖

二、优化inception v1的auxiliary classifiers

三、提出一种缩小特征图大小的方法,说白了就是一种新的、更复杂的pooling层

四、Label smooth,“标签平滑”,很难用中文说清楚的一种方法


V4:

贡献:

一、在Inception v3的基础上发明了Inception v4,v4比v3更加复杂,复杂到难以想象

二、结合ResNet与GoogLeNet,发明了Inception-ResNet-v一、Inception-ResNet-v2,其中Inception-ResNet-v2效果很是好,但相比ResNet,Inception-ResNet-v2的复杂度很是惊人,跟Inception v4差很少

三、加入了Residual Connections之后,网络的训练速度加快了

四、在网络复杂度相近的状况下,Inception-ResNet-v2略优于Inception-v4

五、Residual Connections貌似只能加速网络收敛,真正提升网络精度的是“更大的网络规模