[深度学习]Deep Residual Learning for Image Recognition(ResNet,残差网络)阅读笔记



这一篇博文我们介绍的是大神何恺明的大作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):=Hx
,其中

x
为输入的数据,那么我们最初要学习的映射就是

F+x
,我们假设学习

F(x)
比学

H(x)
要简单。这样一来我们训练一个这样的网络,每一层学习到

F
的映射,然后我们人为的对在该层的输出加入原输入

x
。这其实就是ResNet的基本思路,思路简单,但作者能这么想,同时还有理论的支持(理论的支持在Related work,我不太了解,没看懂),真的非常厉害。理想的状态下问题就解决了,因为我们学习

F
比较容易,在加上

x
就是我们的心目中的映射了。ResNet的一个block如下图所示:




这里写图片描述




我们之前遇到的问题说明,现在的网络及训练方法可能很难让多个非线性层的映射结果去近似identity的映射,而使用Residual learning的方法,当我们的最优解就是求identity的映射时,我们直接让需要学的



F(x)
为0即可。虽然我们实际上我们求得最优解不太可能是identity映射,但是如果近似identity的话,让网络直接去学一个相对identity的扰动的话,肯定要比重新学一个新的映射方法要容易很多。作者在论文中用实验印证了这一点,用ResNet学到的



F(x)
的值一般都较小,如下图所示。





这里写图片描述




论文中说使用这种结构的网络具有两个优点:(1)收敛快,相比普通网络收敛快,容易训练;(2)可以通过简单的堆叠这种结构以获得更高的正确率(原文是enjoy…)

3. 网络实现及实验结果

3.1 Shortcuts的实现

在ResNet中,每隔几层就使用一次残差学习,如我们上面的Figure2。一般来说,每个残差单元定义如下:



y=F(x,Wi)+x

其中



x,y
分别为该单元的输入和输出。



y=F(x,Wi)
表示残差单元需要学习到的映射。对于Figure 2,其学习公式则为



F=W2σ(W1x)
其中



σ
表示ReLU映射,该公式中为了表达简洁省去了偏置项。学习完



F
以后再加上



x
。由于残差学习没有引入新的参数,其增加的计算量也可以忽略不计,所以增加了残差学习的网络在实用中非常好。

对于一个残差学习模块,可能是隔了2,3层,也可能是更多层,但是如果就隔1层,相当于一个钟线性变换,作者的实验表明这样做没有提升。

需要注意的是



y=F(x,Wi)+x
中要求



F




x
的维度相同,因此如果



F




x
维度不同的话,需要对x进行映射,即



y=F(x,Wi)+Wsx

。实际上对于



xF
维度相同时也可以考虑加入



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%。