大家好,又见面了,我是你们的朋友全栈君。
GoogLeNet Incepetion V1
这是GoogLeNet的最早版本,出现在2014年的《Going deeper with convolutions》。之所以名为“GoogLeNet”而非“GoogleNet”,文章说是为了向早期的LeNet致敬。
Motivation
深度学习以及神经网络快速发展,人们不再只关注更给力的硬件、更大的数据集、更大的模型,而是更在意新的idea、新的算法以及模型的改进。
一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,即增加隐层和以及各层神经元数目。但这种简单粗暴的方法存在一些问题:
- 会导致更大的参数空间,更容易过拟合
- 需要更多的计算资源
- 网络越深,梯度容易消失,优化困难(这时还没有提出BN时,网络的优化极其困难)
基于此,我们的目标就是,提高网络计算资源的利用率,在计算量不变的情况下,提高网络的宽度和深度。文章认为解决上述两个缺点的根本方法是将全连接甚至一般的卷积都转化为稀疏连接。一方面现实生物神经系统的连接也是稀疏的,另一方面有文献1表明:对于大规模稀疏的神经网络,可以通过分析激活值的统计特性和对高度相关的输出进行聚类来逐层构建出一个最优网络。这点表明臃肿的稀疏网络可能被不失性能地简化。 虽然数学证明有着严格的条件限制,但Hebbian准则有力地支持了这一点:fire together,wire together
早些的时候,为了打破网络对称性和提高学习能力,传统的网络都使用了随机稀疏连接。但是,计算机软硬件对非均匀稀疏数据的计算效率很差,所以在AlexNet中又重新启用了全连接层,目的是为了更好地优化并行运算。
所以,现在的问题是有没有一种方法,既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,据此论文提出了名为Inception 的结构来实现此目的。
Architectural Details
Inception 结构的主要思路是怎样用密集成分来近似最优的局部稀疏结构。 作者首先提出下图这样的基本结构:
对上图做以下说明:
- 采用不同大小的卷积核意味着不同大小的感受野,可以得到不同尺度的特征,最后拼接意味着不同尺度特征的融合;
- 采用比较大的卷积核即5*5,因为有些相关性可能隔的比较远,用大的卷积核才能学到此特征
- 之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了;
- 文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了。
- 网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3×3和5×5卷积的比例也要增加。
但是,使用5×5的卷积核仍然会带来巨大的计算量。 为此,文章借鉴NIN2,采用1×1卷积核来进行降维。 例如:上一层的输出为100x100x128,经过具有256个输出的5×5卷积层之后(stride=1,pad=2),输出数据为100x100x256。其中,卷积层的参数为128x5x5x256。假如上一层输出先经过具有32个输出的1×1卷积层,再经过具有256个输出的5×5卷积层,那么最终的输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 32x5x5x256,大约减少了4倍。
这个1*1的卷积核,它的作用就是:
- 降低维度,减少计算瓶颈
- 增加网络层数,提高网络的表达能力
具体改进后的Inception Module如下图:
Inception的作用就是替代了人工确定卷积层中过滤器的类型或者是否创建卷积层和池化层,让网络自己学习它具体需要什么参数。在具体的卷积神经网络中,Inception应该放在哪里,作者的建议,在底层保持传统卷积不变,在高层使用Inception结构。
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,但性能却很优异。
Inception-v2
这篇论文主要思想在于提出了Batch Normalization,其次就是稍微改进了一下Inception。
Batch Normalization
这个算法使得训练深度神经网络成为了可能。从一下几个方面来介绍。
- 为了解决什么问题提出的BN
- BN的来源
- BN的本质
为了解决什么问题提出的BN
训练深度神经网络时,作者提出一个问题,叫做“Internal Covariate Shift”。
这个问题是由于在训练过程中,网络参数变化所引起的。训练深度神经网络很复杂,由于前一层的参数会发生变化,每个层的输入分布在训练期间会发生变化。这会降低训练速度,因此需要较低的学习率和比较谨慎的参数初始化,这使得它非常难以训练具有饱和非线性的模型。我们将这种现象称为内部协变量偏移(Internal Covariate Shift),
为了解决这个问题,提出了normalizing layer归一化层输入。这种方法优势在于使标准化成为模型体系结构的一部分,并为每个小批量执行标准化。批量标准化允许我们使用更高的学习速率并且不太谨慎的权重初始化。它还可以充当regularizer正则化,在某些情况下可以消除对Dropout的需求。
应用于最先进的图像分类模型,Batch Normalization与达到相同的精度的模型相比训练步数减少14倍,并且显著超过原始模型的精度。该论文使用一组batchnormalized网络,改进了ImageNet分类的最佳发布结果:达到4.9%的top-5验证错误(和4.8%的测试错误),超出了人类评估者的准确性(5%)。
论文使用到了mini-batch,它的优势是:首先,mini-batch损失的梯度是对训练集的梯度的估计,其质量随批量增加而改善。 其次,由于现代计算平台提供的并行性,mini-batch批量计算可以比单个示例的m次计算更有效。
BN的来源
白化操作:假设训练数据是图像,由于图像中相邻像素之间具有很强的相关性,所以用于训练时输入是冗余的。白化的目的就是降低输入的冗余性;更正式的说,我们希望通过白化过程使得学习算法的输入具有如下性质:(i)特征之间相关性较低;(ii)所有特征具有相同的方差。
卷积神经网络的输入就是图像,白化操作可以加快收敛,对于深度网络,每个隐层的输出都是下一个隐层的输入,即每个隐层的输入都可以做白化操作。每层输入的完全白化成本高昂且并非在各处都是可区分的,因此我们进行了两次必要的简化。
首先,我们不是将图层输入和输出中的特征联合起来,而是将每个标量特征独立地归一化,使其均值为零,方差为1。
其次,请注意,简单地规范化图层的每个输入可能会改变图层可以表示的内容。 例如,对sigmoid输入进行归一化会将它们约束到非线性的线性状态,所以激活函数可能会失效。 为了解决这个问题,我们确保插入网络中的转换可以表示恒等转换,即网络真正学到某些变化。 为了实现这一点,我们为每个激活x(k)引入一对参数γ(k),β(k),它们对归一化值进行缩放和移位:
这些参数与原始模型参数一起学习得来,并修复网络的表示能力。
下图就是batchnorn的算法流程。
其中,
是常数,为数值稳定性,添加到小批量方差中。
论文里面有更详细的前向和反向传播的过程,以及这些参数是怎么求导的公式,这里就不详细展开了。当然,只是单纯地使用batchnorm获得的增益是不明显的,还需要一些trick:
- 增大学习率并加快学习衰减速度以适用bn规范化后的数据;
- 去除dropout并减轻L2正则(这里是因为bn已经起到了正则的作用);
- 去除LRN;
- 更彻底对训练样本进行洗牌shuffle。
有兴趣可以看论文的实现。
BN的本质
我的理解BN的主要作用就是:
- 加速网络训练
- 防止梯度消失
如果激活函数是sigmoid,对于每个神经元,可以把逐渐向非线性映射的两端饱和区靠拢的输入分布,强行拉回到0均值单位方差的标准正态分布,即激活函数的兴奋区,在sigmoid兴奋区梯度大,即加速网络训练,还防止了梯度消失。
基于此,BN对于sigmoid函数作用大。
sigmoid函数在区间[-1, 1]中,近似于线性函数。如果没有这个公式:
就会降低了模型的表达能力,使得网络近似于一个线性映射,因此加入了scale 和shift。
它们的主要作用就是找到一个线性和非线性的平衡点,既能享受非线性较强的表达能力,有可以避免非线性饱和导致网络收敛变慢问题。
Inception
把Inception-v1中5*5的卷积用2个3*3的卷积替换,这也是VGG那篇论文所提到的思想。这样做法有两个优点:
- 保持相同感受野的同时减少参数
- 加强非线性的表达能力
Inception V3
这篇论文两个思路:
- 提出神经网络结构的设计和优化思路
- 改进Inception
设计准则
- 避免网络表达瓶颈,尤其在网络的前端。feature map急剧减小,这样对层的压缩过大,会损失大量信息,模型训练困难
- 高维特征的局部处理更困难
- 在较低维度空间聚合,不会损失表达能力
- 平衡网络的宽度和深度
改进Inception
首先Inception取得了很好的效果,它的主要特点就是:参数、内存和计算资源比传统网络小得多。 由于Inception特殊性,对它进行改进比较困难,最简单直接的办法,就是堆积更多的Inception模块,但这样就失去了它的特点,因此作者做了三个方面的改进。
分解卷积核尺寸
这个也有两个办法
- 分解为对称的小的卷积核
- 分解为不对称的卷积核
其实第一种方法,我觉得就是VGG中的思想,将5*5的卷积核替换成2个3*3的卷积核:
上图左边是原来的Inception,右图是改进的Inception。
第二种方法就是将n*n的卷积核替换成 1*n 和 n*1 的卷积核堆叠,计算量又会降低。
但是第二种分解方法在大维度的特征图上表现不好,在特征图12-20维度上表现好。
不对称分解方法有几个优点:
- 节约了大量的参数,加速了运算并降低了过拟合
- 增加一层非线性,提高模型的表达能力
- 可以处理更丰富的空间特征,增加特征的多样性
论文里面指出,这种非对称拆分其实是比拆为几个更小的卷积核(长宽相同)的效果更好,可以处理更多更丰富的特征。
上图是不对称分解的两种方式。
使用辅助分类器
其实在第一篇论文中GoogLeNet中就使用了辅助分类器,使用了2个,那么它的优势就是
- 把梯度有效的传递回去,不会有梯度消失问题,加快了训练
- 中间层的特征也有意义,空间位置特征比较丰富,有利于提成模型的判别力
改变降低特征图尺寸的方式
设计准则的第一条,就是避免表达瓶颈。那么传统的卷积神经网络的做法,当有pooling时(pooling层会大量的损失信息),会在之前增加特征图的厚度(就是双倍增加滤波器的个数),通过这种方式来保持网络的表达能力,但是计算量会大大增加。
上图就是作者的改进方式。有两个通道,一个是卷积层,一个是pooling层,两个通道生成的特征图大小一样,concat在一起即可。
Inception-v4
这篇论文,没有公式,全篇都是画图,就是网络结构。
主要思想很简单:Inception表现很好,很火的ResNet表现也很好,那就想办法把他们结合起来呗。
Inception Module 结合 Residual Connection,结合 ResNet 可以极大地加速训练,同时极大提升性能,在构建 Inception-ResNet 网络同时,还设计了一个更深更优化的 Inception v4 模型,能达到相媲美的性能。
nception v4
Inception-ResNet v1(在Inception-v3上加入ResNet)
Inception-ResNet v2(在Inception-v4上加入ResNet)
还有几个作者通过实验总结的几个知识点:
Residual Connection
作者认为残差连接并不是深度网络所必须的(PS:ResNet的作者说残差连接时深度网络的标配),没有残差连接的网络训练起来并不困难,因为有好的初始化以及Batch Normalization,但是它确实可以大大的提升网络训练的速度。
Residual Inception Block
可以看到我画圈的部分,那个1*1的卷积层并没有激活函数,这个作用主要是维度对齐。
Scaling of the Residual
当过滤器的数目超过1000个的时候,会出现问题,网络会“坏死”,即在average pooling层前都变成0。即使降低学习率,增加BN层都没有用。这时候就在激活前缩小残差可以保持稳定。即下图
网络精度提高原因
残差连接只能加速网络收敛,真正提高网络精度的还是“更大的网络规模”。
总结
Inception V1——构建了1×1、3×3、5×5的 conv 和3×3的 pooling 的分支网络module,同时使用 MLPConv 和全局平均池化,扩宽卷积层网络宽度,增加了网络对尺度的适应性;
Inception V2——提出了 Batch Normalization,代替 Dropout 和 LRN,其正则化的效果让大型卷积网络的训练速度加快很多倍,同时收敛后的分类准确率也可以得到大幅提高,同时学习 VGG 使用两个3´3的卷积核代替5´5的卷积核,在降低参数量同时提高网络学习能力;
Inception V3——引入了 Factorization,将一个较大的二维卷积拆成两个较小的一维卷积,比如将3´3卷积拆成1´3卷积和3´1卷积,一方面节约了大量参数,加速运算并减轻了过拟合,同时增加了一层非线性扩展模型表达能力,除了在 Inception Module 中使用分支,还在分支中使用了分支(Network In Network In Network);
Inception V4——研究了 Inception Module 结合 Residual Connection,结合 ResNet 可以极大地加速训练,同时极大提升性能,在构建 Inception-ResNet 网络同时,还设计了一个更深更优化的 Inception v4 模型,能达到相媲美的性能。
参考
https://blog.csdn.net/loveliuzz/article/details/79135583
https://blog.csdn.net/kangroger/article/details/69218625
https://blog.csdn.net/wspba/article/details/68065564
https://blog.csdn.net/weixin_39953502/article/details/80966046
https://blog.csdn.net/sinat_33487968/article/details/83588372
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170452.html原文链接:https://javaforall.cn