自2012年AlexNet在Imagenet一鸣惊人之后,国内外顶尖团队都开始着手研究CNN在CV上的应用。12-15年基本上每一年都可以诞生一副经典之作,16-17年表现平淡,感觉各大团队已经在图像分类上已然通关。研究重心更加偏向目标识别,语义分割领域,以及如何压缩网络。
120万张训练图片,5万验证集,15万测试集,涵盖1000类图片。网络需要对测试图片进行分类。
多伦多大学Alex Krizhevsky以及Hinton大神(Alex导师)在Lenet基础上设计出Alexnet。
Lenet是2层卷积核1 fc,而Alexnet是5层卷积和3 fc. 在深度上Alexnet是对Lenet进行了扩展。由于12年,GPU显存局限性,因此Alexnet在训练时,不得已对卷积进行分组训练,在两块GPU上并行计算。在后续网络中,GPU显存显著提高,不在需要分卡计算,因此后续网络均不在采用分组的方式。但是,该技术却埋下了伏笔,直到17年被何凯明团队和谷歌团队挖掘出,并进一步改善Resnet和GoogleNet.
网络深度和宽度的增加,会增强网络的容量,提高精度,但是会带来两大问题: (1)数据集不足以导致的过拟合。(2)梯度消失(爆炸)造成训练时,网络无法收敛。纵观CNN发展,无不再致力于解决上述两个问题。
训练:
Alexnet针对训练提出一下几点:
(1)Relu,深层网络采用relu作为激活函数,其好处是可以图像中看出来的。那就是在正域时,梯度恒为1。然而,relu存在两个缺点,一个是在负域时,梯度恒为0,造成该神经元无法继续学习,另一个是relu的值域是0->正无穷,容易造成数值问题。
(2)卷积分组训练,Alex使用的GTX-580,显存只有3GB。而Alexnet有6000万参数,过于庞大,不得已需要分GPU训练。并声称该方法可以提高精度。
(3)Local Response Normalization, 该方法是来源生物神经中侧抑制理论。对相同位置,相邻的不同通道进行归一化。这是为了控制Relu输出的值域问题。该方法亲测极其消耗计算量,能增加三分之一的网络训练时间,而对于精度实在没什么贡献。在后续除了Googlenet(InceptionV1)中使用,其余再没有应用。
(4)Overlapping Pooling,该方法是在池化层,使stride小于kerner_size。为获得更多的信息。同LRN一样,后续网络并没有使用该技术。
(5)数据集增强,Alex对数据集增强采用两种方法,第一种是常规的图像随机裁剪,水平翻转。Alexnet采用该方法将图像集增大了2048倍。第二种是做PCA计算。这一步又是及其费操作的一步,海康威视16年参加比赛使用了。
(6)Dropout, 该技术能很好的解决过拟合问题,但是会增加一倍的训练时间。
Alex在paper中提出来的6点,其中1,5,6在后续使用广泛。第2点,在17年在开始被应用。Alex通过消融实验后提出,8层网络每一层都很重要,减少任一一层后,网络精度都会大幅下降。Alex凭借CNN在ImageNet比赛上一鸣惊人,并且掀开了CNN的潮流。但遗憾的是,Alex并没有在论文中说明,为什么CNN在图像分类上能取得成功。
Z和F是两个来自纽约大学的学生,他们13年参加了ImageNet并获得了第一名。他们相比于Alexnet并没有做出多大的改进。但是他们的研究,揭开了CNN神秘的面纱。
ZFNet是在Alexnet的基础上改了Alexnet第一层卷积参数,使得精度进一步提升。听起来像是Alex实验没做完,被这两人捡漏了。实际不是,ZF通过反复实验Alexnet,提出理论,并从理论出发,指导实验,从而获得成功。
(1)底层网络专注于图像纹理信息,例如边缘特征。高层网络会不断聚合底层特征,关注与更高层面的信息,例如目标的轮廓。
(2)在训练时,底层网络很快就会饱和,具备特征不变性。意思是,底层网络关注的过于细节,纵使图片千变万化,但是都是这些基础特征组合而成。因此对于底层网络来说,有大量的学习样本,因此饱和很快。高层网络会在训练后期才逐渐收敛。所以在训练网络时,要具备足够耐心,让网络多跑一会。
(3)特征不变性,卷积操作并不局限与特征在图片上具体位置,图片经过裁剪,平移后,对高层没有什么影响。但是对底层影响很大,因为底层卷积核感受野通常都很小,而高层基本具备全局感受野。特征不变性,不包括旋转不变性,除非物体是轴对称。
(4)Alexnet第一层卷积使用11*11 filter size和4的stride。这样会造成第一层提取的信息基本为高频和低频,缺少了中频信息。而过大的stride会造成第二层提取信息的走样。因此ZF将第一层参数改为 7*7 和2的stride 以解决上述问题。
(5)CNN不仅在抽取目标特征,还会计算特征之间相对关系。例如,挡住一只狗的眼睛,会使得识别率大幅度下降。
ZF通过提出的反卷积操作,使得我们可以将feature map抽取的特征映射回原图,从而逐步解开了CNN工作原理。并对优化网络提出进一步指导。
VGG是14年ImageNet第二名,这一年可谓江山备有才人出。经过前两年铺垫,在这一年有很多研究成果。VGG在深度上对网络进行进一步改进。并且认可了ZF的成果,大的卷积核会造成特征走样。因此在VGGNet中所有卷积核均使用3*3。
(1)明确指出LRN(AlexNet中使用)对网络精度没有贡献,而且会增加内存消耗和计算。
(2)指出大的卷积核,会增大计算量,可以采用两个小卷积核代替,例如两个3*3卷积可以替代一个5*5,3个3*3可以替代一个7*7卷积。而且可以极大的计算量,以及参数,有利于缓和过拟合。
(3)提出stack的概念,意思是我的网络都是3*3堆积出来的,你们也不要纠结尺寸了。用我的网络,我给你固定好。你在fine-tuning的时候,只用去调整学习率等参数就行。这一点主要是针对googleNet。
(4)VGGNet一口气将网络深度提高到19层,并得到更好的精度,从而给出强力的证明,网络的深度对精度有很大的影响。
(5)采用1*1卷积增加非线性能力(由NIN中提出)
这里有一个训练trick,那就是19层网络已经很难训练了,因为梯度消失。所以VGG团队先训练了一个8层网络,然后取其前3层卷积,前两层fc参数去初始化19层网络。但是该方法显然效率极其低。
何凯明提出来的MSRA Net从成绩上来看,没有什么亮点。但是通过论文可以看出其数学功底。整篇论文一半都在推公式。
众所周知,训练网络,特别害怕进入局部极小值,这样得到的结果很差,而且网络还停止学习。因此权值初始化要格外小心。最普遍用的是采用0.01方差的高斯分布。之后采用的是Xaiver方法,该方法认为一层到一层的方法分布应该控制到1,如不然的话。如果大于1,则经过几层累计,输出值会过大,如果小于1,几层之后,值趋于0。这都是造成网络训练不前的原因。因此根据方差为1,他提出来Xaiver方法。然后他是根据线性函数推导出的方差。何凯明认为relu显然是非线性激活函数,所以不能采用该方法,于是凭借自己数学功底,从非线性函数出发推导出新的方法。实际上与Xaiver结果差距不大,差了一个根号2。何凯明通过推导解释了VGG为什么训练慢。针对relu激活函数。何凯明提出了Prelu来解决激活函数负域为0的问题。在实验上,何凯明增加了网络的宽度,获得了更好的精度。
NIN本身没有多大的成绩,但是提出的思想极大的影响了GoogleNet。NIN是(network in network)的缩写,意思是,既然网络这么强,卷积操作是一个线性的(广义线性模型),那么我何不用一个网络去代替卷积的线性操作。GLM在解线性问题非常的好,但是图像分类这个显然是非线性的,所以CNN采用逐格移窗的方法,采集大量的特征,去覆盖潜在的变化,显然存在大量冗余计算。那就用MaxOut来分线段去逼近,从而得到更佳的拟合效果。第一个使用了1*1卷积,用于提高网络的非线性拟合能力。
另一个贡献是,global average pooling。 这个真心牛逼了,作者认为反向传播时候,softmax分类函数到fc这一层,实在想不明白为什么。为什么不同的类别可以反向传播到特征空间。因此提出global average pooling代替fc层,这样可以更加自然的解释反向传播的过程。并比较Alexnet做出了对比试验,采用global average pooling可以明显的减少过拟合问题。AlexNet 6000万参数,两层全连接层占了3000万。用了global average pooling就是一刀均分了AlexNet,当然能解决过拟合问题。不过作者进一步指出,global average pooling精度是可以超过Alexnet的,但是如果Alexnet用的dropout后,精度就稍差了。这个现象是因为Alexnet层数还尚浅,两层fc虽然造成了过拟合问题,但是这两层对网络又进一步抽象,有助于精度。如果卷几层过深,那么完全不再需要fc层,这一种情况global average pooling无疑占极大的优势,因此后续网络,都采用该方法。
何凯明凭借Resnet基本上拿下了15年所有的第一名。大家都认为网络越深对精度提升越高。而在大家都停留在20+层时候,何凯明已经提出152层的网络,其在Cifar10数据集上提出了1202层网络。无疑,业内炸了。
Resnet主要采用的是残差的概念。在这里不具体介绍细节了。作者通过实验发现,40层网络没有20层的精度高,认为网络存在退化现象。其根本是因为网络不存在恒等映射。因此作者引入将网络改为学习输入的恒等映射+残差的方式。提供了一条恒等映射的通路。并且由于这条恒等映射的路,使得反向传播可以很好的将梯度传播到浅层,而不像传统网络中梯度消失(爆炸)。从而使得深层网络得以训练。Resnet借鉴了VGG的设计理念,即时我的网络是有残差块组合的,你使用过程中,也不用改这些参数了。使得应用上也极为方便。
GoogleNet V1:
是和VGG同时参加14年比赛,并取得第一的成绩。InceptionV1得益于神经学,认为如果数据集的概率分布可以被一个很大很稀疏的神经网络表示,那么构建该网络的最佳方法是逐层构建,将上一层高度相关的节点聚类,并连接起来。
神经学用到的主要是Hebbian原理,认为两个神经元A和B距离很近,如果A参与了对B重复,持续的兴奋,那么会导致A将作为使B兴奋的细胞。人脑神经元是稀疏的,所以作者认为大型神经网络也应该是稀疏的,而CNN刚好就是稀疏网络。所以为符合Hebbian的原理,应该把相关性较高的神经元节点连接在一起,而同一空间位置在不同通道的卷积核输出结果相关性极高,因此采用1*1卷积核将这些不同通道的特征连接起来。
以上是GoogleNet构建思路。之前网络都是纵向一字长蛇阵。而GoogleNet采用了并行结构,并称为一个Inception单元。将1*1,3*3,5*5以及pooling值加起来作为一个输出。采用不同的感受野,提取的特征粒度不一样。这样方便下一阶段可以从不同的尺度上同时抽取特征。GoogleNet22层网络,为了训练,采用了辅助分类器,同样是方便梯度更好的流向浅层。不得不说GoogleNet结构看起来复杂,但是参数还是非常少的。然后复杂的结构带来的问题就是很难扩展。它的设计思路是逐层构建,那么更换数据集之后,如何构建就成了问题。显然该问题困惑了谷歌4个版本,直到Xception解决。
GoogleNet V2:
这篇提出了有名的BN层。作者认为每一层学习不同,会使得输出分布发生改变,而上一层输出分布的改变,造成下一层难以收敛。从而造成深层网络很难训练。如果采用Lenet方式对每一层做白化问题,那可以解决这个问题。但是白化问题过于消耗计算量。因此BN实际取了白化的第一步,归一化。但是归一化之后输出值,其实已经变了,这样网络学习到的特征就有问题了。因此需要想办法能把输出变回去。这变回去的方法看起来也蛮简单的,但真的是鬼斧神工的一手。之后的网络,没有见过不用BN的,可见其功效确实强力。BN的归一化可以控制输出值落在激活函数非饱和区域,加速训练,因此训练网络可以采用较大的训练之。
GoogleNet V3:
这一篇论文提问叫做rethinking。主要提出了自己网络确实难以扩展,因此提出一些设计准则吧。可见当初标新立异挖的坑,现在确实也填不下去了。从成绩上来看,googleNet也不错,但是扩展性制约了它的发展。V3在准则之外,玩的更花了,提出将N*N卷积改为N*1 ,1*N两层网络,还增加了非线性拟合能力,减少了参数。听起来效果确实好,但是着实增加了设计上困难。
GoogleNet V4:
到了V4已经是16年了,这时候Resnet已经横行于世了。于是谷歌把Resnet残差概念吸收进来,将网络改为 Inception-resNet。于是本身就很花的网络框架,更加的庞杂了。
总结一下GoogleNet, 其受到NIN很大影响,所以通过并行卷积来提高网络拟合能力。另外不得不说谷歌在学术上研究能力,其BN的影响力,不言而喻。然而如何在GoogleNet在其他数据集上快速应用,一直是其没有解决的问题。即使谷歌宣称,自己网络参数小,可以跑在终端设备。
17年最新论文,首先感觉上到了这个时候,图像分类已经没什么玩的了。这些老牌强队都开始搞其他图像问题去了。另外一点是16年华人团队的大量参加。不得不说,国内团队为了参加比赛,无所不用其极。至此在也看不到像BN, Resnet这样让人为之一振的技术。
ResNeXt是何凯明对Resnet的改进,何凯明发现除了网络深度,宽度增加外,卷积分组可以极大增加网络精度。该分组技术可以回溯到12年AlexNet中因为GPU内存不足,不得已不分组。何凯明提出了组的概念,通过实验发现100层的ResNeXt要比200层resnet好。可见分组的效果。
Xception很有意思,从名字看像是谷歌Inception系列终极版,在这篇论文中,谷歌也提出了卷积分组的概念。并极大的重建了inception模块。
从结果来看,Xception和ResNeXt网络非常的像,感觉像是两条路,最终走向了相同的终点。
至此,近五年的CNN在图像分类上发展历程算是讲述明白了。每一年都是在上一年的基础上,不断改进,针对每一环节,力求创新,最终使得图像分类准确率远远超过人类水平。当然,我们可以从这些paper的引用中看出,还有很多其他优秀的文章,创新点。但在此不一一详述了。