AlexNet 是 Alex Krizhevsky 等人在 2012 年发表的《ImageNet Classification with Deep Convolutional Neural Networks》论文中提出的,并夺得了 2012 年 ImageNet LSVRC 的冠军,引起了很大的轰动。AlexNet 可以说是具有历史意义的一个网络结构,在此之前,深度学习已经沉寂了很长时间,自 2012 年 AlexNet 诞生之后,后面的 ImageNet 冠军都是用卷积神经网络(CNN)来做的,并且层次越来越深,使得CNN成为在图像识别分类的核心算法模型,带来了深度学习的大爆发。
论文中的 AlexNet 如上图所示,有5个卷积层+3个全连接层,包含 60 millions个参数和 65 万个神经元,使用 2块GPU 故分上下两部分,模型的两部分仅在3/6/7/8层会使用对方的数据。ILSVRC-2012的Top-5错误率能达到18.2%,6个卷积层+3个全连接层能达到16.6%,多个CNN平均能达到15.3%。
该模型要解决的问题主要分为两点:(1)减少网络的训练时间;(2)防止过拟合。
模型的特点:AlexNet首次在CNN中成功应用了ReLU、Dropout、LRN等tricks。同时,使用了GPU进行运算加速。
总结:AlexNet中涉及了卷积层、激活层、池化层、正则化、全连接层等一系列操作,非常适合初学卷积神经网路的人入手,可以参考 卷积神经网络 AlexNet,获得网络每一层输出特征图计算的细节。
VGGNet 由牛津大学的视觉几何组(Visual Geometry Group)在 2015 年发表的《Very Deep Convolutional Networks for Large-Scale Image Recognition》论文中提出的,先是夺得了 2014 年 ImageNet LSVRC 定位任务第一名和分类任务第二名,随后发布了一些列以VGG开头的卷积网络模型。VGG全连接层有3层,根据卷积层+全连接层总数目的不同可以从VGG11~VGG19,最少的VGG11有8个卷积层,最多的VGG19有16个卷积层,隐藏层全部使用ReLU激活函数,参数量在133~144 millions。此外,VGG网络并不是在每个卷积层后面跟上一个池化层,还是总数5个池化层,分布在不同的卷积层之下,但是LRN似乎效果不明显,还消耗内存和时间。下图是VGG11 ~VGG19的结构图:
该模型要解决的问题是:探索在大规模图像识别中卷积网络深度对准确率的影响。
网络的深度,即卷积层的个数,深度网络集成了低、中、高层特征,多层特征可以通过网络的堆叠的数量(深度)来丰富其表达。网络的深度很重要,但是否能够简单的通过增加更多的网络层学习更好的网络?这个问题的障碍就是臭名昭著的梯度消失(爆炸)问题,这从根本上阻碍了深度模型的收敛。
网络的宽度,即卷积核的种类个数,一般神经网络都会有多个卷积核。宽度的增加在一开始对网络的性能提升是有效的。但是,随着广度的增加,对网络整体的性能其实是开始趋于饱和,并且有下降趋势,因为过多的特征(一个卷积核对应发现一种特征)可能会带来噪声的影响。
两者关系:增加更多的卷积核可以发现更多的特征,但是特征是需要进行组合的,只有知道了特征之间的关系才能够更好的表达图片内容,而增加深度就是组合特征的过程。
模型的特点:(1)小卷积核和小池化核,将卷积核全部替换为3×3 (极少用了1×1),相比AlexNet的3×3的池化核,VGG全部为2×2的池化核;(2)网络层数更深、特征图更宽 (基于上述第一点);(3)网络测试阶段将训练阶段的三个全连接替换为三个卷积,可以接收任意宽或高的输入。
总结:VGGNet 的结构非常简洁,验证了可以通过网络加深来提高性能。但是由于全连接层的存在,训练产生过多的参数量,造成了内存占用,也耗费了计算资源。
参考链接:卷积神经网络VGG 论文细读 + Tensorflow实现
GoogLeNet 是谷歌(Google)研究出来的深度网络结构,获得了 2014 年 ImageNet LSVRC分类任务第一名,在论文《Going Deeper with Convolutions》中首次提出了Inception结构。该网络也是使深度加深了,但是VGG继承了AlexNet的一些框架结构,而GoogLeNet则做了更加大胆的网络结构尝试,虽然深度有22层而它的参数大约为5 millions,是ALexNet的1/12。Inception是通过一个精心设计实现的,允许增加网络的深度和宽度的同时保持计算预算不变,提高了网络内部计算资源的利用率。Inception历经了v1、v2、v3、v4等多个版本的发展,不断趋于完善,下面一一进行介绍。
GoogLeNet要解决的问题是:仅增加网络容量(深度和宽度)来提高网络性能会带来两个缺点(1)在标注数据有限的情况下,网络容量大意味着大量的超参数,也就更容易过拟合;(2)提高网络的容量需要大量的计算资源。
Inception v1模型的特点:既能保持网络结构的稀疏性,又能利用密集矩阵的高性能计算。
如上图所示,Inception在网络结构中主要改进了两个部分:
对上述前两部分的详细解释可以参看链接https://baike.sogou.com/v175189344.htm?fromTitle=GoogLeNet
BN-Inception要解决的问题是:内部协变量转移(internal covariate shift)现象。论文链接:《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
Internal Covariate Shift:在神经网络的训练过程中,由于参数的更新改变,而引起的神经网络各层输入数据分布发生变化,这样使得训练DNN(Deep Neural Networks)变得复杂。因此,就要求使用更小的学习率和仔细地设置初始化参数,并且训练具有非线性饱和(如sigmoid激活函数的非线性饱和问题)的模型变得非常困难,导致训练很慢。迁移学习中经常遇到训练集和测试集的分布发生了改变,从而引起模型泛化性能不良的问题。
BN-Inception模型的特点:将归一化(Batch Normalization)层输入作为神经网络的结构,可以增大学习率加快收敛。
白化处理:对于每个像素值,white(value) = (value - 均值)/标准差,使图像均值为0,方差为1。白化处理主要是消除环境光线、摄影器材等因素给图像带来的动态影响。比如,同样的场景、不同时间得到的图像的亮度会有差别,通过白化处理便消除了这种影响。
《Rethinking the Inception Architecture for Computer Vision》这篇文章是Inception系列的第三篇,在文章中提出了Inception v2和v3(在CVPR2016上发表时主要以提出了Inception v3)。要解决的问题是:Inception架构的复杂性使得对网络进行更改变得更加困难,如果简单地将模型结构进行扩展,计算效率会下降。
模型的特点:通过适当的分解卷积和积极的正则化,尽可能有效地利用增加的计算量。
下面右图是结合上述特点的Inception结构,此网络的深度达到了42,但是计算花费只是GoogLeNet的2.5倍,并且比VGGNet更高效。
由于《Rethinking the Inception Architecture for Computer Vision》这篇文章在CVPR2016上发表时主要提出了Inception v3(应该是默认BN-Inception为Inception v2),论文中将我上面描述的Inception结构与BN-auxiliary结合的网络称为Inception v3。其中,BN-auxiliary是指辅助分类器的全连接层也是批归一化的,而不仅仅是卷积层。因此,通过适当的分解卷积和积极的正则化,尽可能有效地利用增加的计算量。
Inception v4在Inception中加入了残差网络的结构(在后面部分讨论),论文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》中介绍了inception-v4、Inception-ResNet-v1和Inception-ResNet-v2结构,模型要解决的问题是:探索将Inception架构与残差连接(Residual Connections)相结合是否有任何好处。实验证明,残差连接能够加速Inception网络的训练,并且精度上有少量的提升。
在进行集成这两个思想之前,作者也研究了能否将Inception变得更深更宽使其更高效,因为这个原因作者设计了新版本的Inception-v4,如下图所示。标记V(valid)的表示经过卷积后,特征图大小会减小,没有标记的表示带padding的same卷积方式。
之前,Inception在改变体系结构选择方面相对保守,实验仅限于改变孤立的网络组件,同时保持网络的其他部分稳定。Inception-v3不简化网络模块的话会导致网络看起来比原来GoogLeNet更复杂。因此,对于Inception-v4,为每个网格大小的Inception模块做出统一的结构选择。作者认为,不需要再像以前一样根据经验小心的调整每一层,现在可以更加标准化的设置每一层的参数。从上图可以很明显地看到,网络清晰地划分为一个一个的block,而且Inception的block都会重复使用。
这里只有两种模型,其中Inception-Resnet-v1,它的计算量和Inception-v3相当;另一种是Inception-Resnet-v2,它的计算量和新提出来的Inception-v4相当。另一个技术区别是,BN 只加在了传统的结构中,没有加入到 Residual Connection 结构中,主要是受到GPU memory的限制,理论上都用效果会更好。Inception-ResNet-v1和Inception-ResNet-v2 的框架如下图所示:
Inception-ResNet-v1、Inception-ResNet-v2 的区别在于:
作者发现,当滤波器个数增加到1000时,残差变体变得极度不稳定,网络在训练早期就停止更新。average pooling后的几层在几万次迭代后产生零,就算给这些层降低学习率或者增加额外的BN也没有作用。论文给出的解决方案是,在将这些残差模块加到前一层的激活函数的后面之前,引入一个尺度变换。
Inception-v4 网络结构是精心设计的,不容易迁移到其他任务中,而Xception的目标是设计出易迁移、计算量小、能适应不同任务,且精度较高的模型。论文《Xception: Deep Learning with Depthwise Separable Convolutions》中作者提出Xception体系结构的参数数量与Inception v3相同,而实验结果表明,Xception虽然在精度上略低于Inception-v3,但在计算量和迁移性上都好于Inception-v3。作者的改进出发点来源于,Inception中将通道上的相关性和空间上的相关性分别通过1×1和3×3的卷积核进行分解,但是,由于3×3的卷积是多通道的,因此通道间的相关性和空间相关性仍旧没有完全分离。要解决的问题是:将学习空间相关性和学习通道间相关性的任务实现完全分离。
模型特点:用可分离卷积(depthwise separable convolutions)来代替Inception模块。
具体的模型演变如下,最后将每一个通道单独去做卷积:
ResNet 是微软亚洲研究院(MSRA)的大佬们研究出来的深度网络结构,他们在ImageNet数据集上评估了深度高达152层的ResNet(比VGG深8倍但仍具有较低的复杂度),分类结果在ILSVRC 2015赢得了第一名。在论文《Deep Residual Learning for Image Recognition》(CVPR2016 best paper)中,作者提出了深度CNN网络达到一定深度后,再一味地增加层数并不能带来进一步地分类性能提高,反而会导致网络收敛变得更慢,训练集和测试集上的分类准确率都变得更差。因此ResNet的提出要解决的问题是:(1)随着网络的深入而导致的梯度消失,浅层的参数无法更新;(2)准确度变得饱和,然后开始下降的网络退化问题。
上述第一个问题,很大程度上可以通过归一化的初始化参数和中间层的归一化解决,这些方法确保几十层的网络能够在使用随机梯度下降(SGD)的反向传播过程中收敛。但是,当更深的网络能够开始收敛时,退化问题就暴露出来了。作者分析其原因是,后面的多层非线性网络无法通过训练去逼近恒等映射网络(即拟合y=x这个函数)。因此,ResNet通过引入一个深度残差学习框架,来解决退化问题。该模型的特点是:使用快捷连接(shortcut connections)执行简单的恒等映射(identity mapping),从而让堆叠的非线性层从拟合原来的最优解映射变成去拟合输出和输入的残差映射。
不同深度的ResNet信息如下:
设计网络的规则:对于输出特征图大小相同的层,有相同数量的filters,即channel数相同;当特征图大小减半时,filters数量翻倍。其中,下采样通过步长为2的conv3_1, conv4_1和conv5_1三层卷积执行。在每个卷积之后和激活之前,采用批量归一化(BN),即 Conv -> BN -> ReLU -> Conv 的顺序进行搭建。此外,未使用Dropout。
从上面的表格可以看出,ResNet有两种形式的block,如下图所示:
右图的主要目的就是为了减少参数量,从而减少计算量。 对于常规的ResNet,左图可以用于34层或者更少的网络中;对于更深的网络(如101层),则使用右图经过两个1x1的卷积降维和恢复。
参考链接:https://www.cnblogs.com/aiblbns/p/11143978.html#3493846935
上面有提到在《Identity Mappings in Deep Residual Networks》中,通过一系列消融实验证明了恒等映射的重要性,也进一步分析了残差块的反向传播公式。该论文也进一步探索了ResNet的改进,即改变残差单元的BN、ReLU、Conv的位置,从而得到更好的网络结构,如下图所示的最后一个结构:
几经折腾,他们终于发现将 BN + ReLu 放到 Conv 之前,模型训练的速度加块了、精度提高了,还容易回避过拟合的问题。最后一种残差结构有两个优点:(1)原始的残差单元中,主干单元和快捷连接相加后需要经过ReLU激活函数,输入中的某些负的元素就会受到影响,而当残差单元越多时,这种影响就越明显。现在的结构,因为主干单元和跳跃连接相加后为恒等映射,因此梯度传播更快。(2)在原始的残差单元中,尽管BN对特征进行了归一化,但是结果需要再加上快捷连接,因此融合后的特征就不再具有归一化的特性。而新提出的新残差单元把BN放在卷积之前,这样的话卷积后的结果加上快捷连接就是归一化的,并且在激活前使用BN使模型更具有正则化的能力。
简单来说就是,Inception团队把ResNet拿来搞了个Inception-ResNet,这头ResNet团队也把Inception拿来搞一个ResNeXt,真是一群魔鬼。《Aggregated Residual Transformations for Deep Neural Networks》论文的作者认为,尽管增大网络的深度和宽度可能提高模型的准确率,但与此同时带来的是网络的复杂度不断增大。因此,作者想解决的问题是设计一种网络结构,在不增加网络复杂度的基础上还能提高网络的性能。
模型特点:利用 split-transform-merge 结构,把ResNet的单个卷积改成了多支路的卷积。如下图所示:
图中左边部分是一个ResNet的block,右边是ResNeXt的block。其中,框内的参数分别代表输入通道数、卷积核尺寸、输出通道数。作者将网络进一步等价,如下所示:
(a):Aggregated residual transformations;
(b):把输出的1×1卷积合并到一起,得到等价网络拥有和 Inception-ResNet 相似的结构,不过ResNeXt的设计要比Inception简单得多;
(c):进一步把输入的1×1也合并到一起,得到等价网络和通道分组卷积的网络有相似的结构(分组卷积在AlexNet中曾用来并行分布在两个GPU上,Xception中的深度分离卷积也是分组卷积的一种特殊形式)。
上图中转换集的大小group=32,是一个具体的、可测量的维度,除了宽度和深度的维度外,它也是至关重要的,并且跟瓶颈宽度(上图中是4)有一定的关系。实验表明,增加基数(转换集)比获得更深或更宽的宽度更有效地获得准确性,尤其是当深度和宽度开始使现有模型的收益递减时。
通过上述回顾,我们可以发现,从2014年开始网络主要向更深更宽的方向发展,逐步解决了过拟合、梯度消失和梯度爆炸,加速了网络训练。从2017年以后,很多模型也开始使用分组卷积(Group Convolution)和 深度可分离卷积(depthwise separable convolution)进行网络压缩,如用在 Xception、MobileNet、ShuffleNet、CondenseNet等轻量型网络结构中属于必用结构。在我的下一篇博客介绍了其他耳熟能详的网络:卷积神经网络回顾之DenseNet、SENet、MobileNet系列、ShuffleNet系列。更多关于网络模型评估和网络性能的比较,可以参考我的另一篇博客:常用的基于ImageNet分类任务开发的backbone模型。