这一篇博文我们介绍的是大神何恺明的大作ResNet的论文,Kaming He绝对是我目前最崇拜的计算机视觉方面的大神,从12年的暗通道去雾的论文到这篇残差网络的论文,看完简直不能更爽,这里一定要隆重介绍一下。
这篇文章是介绍Kaming He等人组成的微软亚洲研究院的队伍参加ILSVRC 2015比赛中所用的网络结构的论文,残差网络一出,简直是把ImageNet上的classification任务给做烂了,top5的正确率达到了惊人的96%以上,已经超过了人类的识别率,网络的层数达到了152层,甚至上千层(要知道2014年的VGGNet中的22层已经用very deep来形容了),2016年的ILSVRC上的第一名也没能提出更有名的网络结构,目前人们应用的最广泛的也就是GoogLeNet、VGGNet和ResNet了。可以这么说ResNet一出,简直一骑绝尘。好了,说了这么多,下面我们来好好介绍一下大名鼎鼎的ResNet。
Abstract
文章是从一个难以解决的问题入手的,从2012年的AlexNet到2014年的GooLeNet和VGGNet,网络结构越来越复杂,层数也越来越深,现在我们也都了解到,只要有足够的训练数据,网络层数越深就越具有更强的学习能力,也就能够拟合出更好的模型,从而获得更好的结果。但是研究人员发现,随着网络层数的加深,网络越来越难以训练。为了解决这个问题,作者提出了我们要介绍的ResNet网络架构,在网络的输入层加入前面网络层的的输出结果,这种结构能够能够使得网络达到更深的层数,同时也易于训练。作者提出的152层的残差网络结构比VGGNet具有更强的学习能力,同时比VGGNet参数更少。不仅仅对于分类任务具有更好的效果,对于detection任务,ResNet同样具有很好的表现,在COCO物体检测的数据集中取得了28%的进步,同时你咋ILSVRC & COCO 2015的比赛中,获得了ImageNet上的classification、detection和localization以及COCO detection、segmentation项目上的第一名。
总之一句话,非常牛叉!
1. 问题导入
从2012年到2015年中近几年深度学习的发展可以看出,人们使用的网络越来越深,而深层的网络往往又表示网络具有更强大的学习能力,能取得更好的结果。作者就提出了一个问题,是不是单纯的堆叠更多层,让网络变得更深就更好呢?我们都知道网络越深就越难拟合,越难训练,同时也会造成梯度消失。目前梯度消失的问题已经被SGD训练算法和一系列的初值赋值方法和Batch Normalization(非常厉害的算法,下一篇文章介绍它)解决掉了。
那么有了这些算法我们可以继续堆网络了吗?现实还是很残酷的,因为实验发现随着网络不断的加深,识别率开始饱和,然后网络再深的话识别率开始下降。有时更深的网络的结果反倒不如浅层的网络(这里的深浅是相对而言的),如下图所示:
然而造成这种问题的原因并不是过拟合(作者好像没说原因)。其实存在这样一种让网络加深的办法,假设我们加深的层没做任何事情(论文中的identity mapping),而剩下的层参数与之前学到的浅层的网络参数相同,这样的话深层的网络识别效果至少不必浅层的网络差,但是我们现在的训练方法并不能学到这种模型。问题就来了,那怎么解决这个问题呢?
2. 问题解决:残差网络(ResNet)
既然我们现在的网络训练方法难以训练处我们现在心中完美的模型(我们心中完美的就是新加层之后的表现很好,能够提高正确率),那么我们退一步,让我们的模型学到更容易学到的,稍差的模型。假设我们心目中的模型,新加的层本来要学到这样一个映射
H
F(x):=H−x
x
F+x
F(x)
H(x)
F
x
F
x
我们之前遇到的问题说明,现在的网络及训练方法可能很难让多个非线性层的映射结果去近似identity的映射,而使用Residual learning的方法,当我们的最优解就是求identity的映射时,我们直接让需要学的
F(x)
F(x)
论文中说使用这种结构的网络具有两个优点:(1)收敛快,相比普通网络收敛快,容易训练;(2)可以通过简单的堆叠这种结构以获得更高的正确率(原文是enjoy…)
3. 网络实现及实验结果
3.1 Shortcuts的实现
在ResNet中,每隔几层就使用一次残差学习,如我们上面的Figure2。一般来说,每个残差单元定义如下:
y=F(x,Wi)+x
其中
x,y
y=F(x,Wi)
F=W2σ(W1x)
σ
F
x
对于一个残差学习模块,可能是隔了2,3层,也可能是更多层,但是如果就隔1层,相当于一个钟线性变换,作者的实验表明这样做没有提升。
需要注意的是
y=F(x,Wi)+x
F
x
F
x
y=F(x,Wi)+Wsx
。实际上对于
x和F
Ws
3.2 网络结构
残差网络的结构如下图所示:
作者为他的实验设计了3种网络,第一个就是普通的VGG-19,第二个作者成为plain网络,与结构VGG-19相似,最终的残差网络就是在plain网络的基础上加入了shortcuts连接。作者提出对于同维度的情况下(即feature maps数目相同,如图中实线),直接相加即可,对于不同维度的情况下(如图中虚线),采用了两种方式:(1)将多出来的feature maps初始化为0;(2)使用1×1的卷积层将输入的feature maps数目映射到与输出的feature maps数目相同。
值得注意的是,作者在使用的网络中每个conv层后面都跟上了Batch normalization层,没有加入dropout层,同时使用全局平均池化层代替全连接层,从而减少参数模型的大小。
作者训练时的参数介绍见原文。
作者在实验时用到的网络结构如下图所示:
实验结果如下图,可以从图中看出,残差网络已经解决了我们上面提到的问题:
另外作者对前面的shortcuts的映射方法进行了实验,有三种做法:(A)新增的维度采用初始化为0的feature maps,原来的保持不变;(B)对于要增加维度的情况下,采用1×1卷积层映射将维度增加;(C)对于所有情况,都用1×1的卷积层进行映射。效果是C>B>A,但是差距不大,然而C相比B占用更多的计算资源,同时参数相比B也有很大的增加,因此在最后作者并没有选用C做法。
最后,作者尝试改善我们前面提到的残差学习模块,改变的方式如下图所示:
作者称这种改进的结构为bottleneck结构,即先用1×1卷积核降低feature maps的数目,然后使用3×3的卷积层,最终对得到的结果在用1×1的卷积层升维,作者将这种bottleneck结构前面我们介绍残差学习模块,最终得到了更好的结果,如下图所示:
其中ResNet-50,101和152都是使用bottleneck结构的,单个在ImageNet上取得了top5正确率为惊人的95.51%的正确率,通过多个模型投票最终得到的top5正确率为96.43%。