ResNet可以说是在过去几年中计算机视觉和深度学习领域最具开创性的工作。在其面世以后,目标检测、图像分割等任务中著名的网络模型纷纷借鉴其思想,进一步提升了各自的性能,比如yolo,Inception-v4等。

ResNet通过重构模型对残差映射(Residual mapping)进行拟合,而非以往那样拟合期望的潜在映射(Underlying mapping)。借助这一举措,ResNet解决了“退化问题”(Degradation problem),使得训练数百甚至数千层网络成为可能,且可以有效地提升网络性能

该论文的详细内容如下:

1. 背景

深度网络本质上以端到端的多层方式集成了低/中/高级特征和分类器,并且可以通过堆叠更多的层(加深)来丰富特征的“级别”。研究也表明,网络的深度对模型性能是至关重要的,这就导致出现的网络越来越深。

可是随着深度加深,网络在训练时会遇到著名的“梯度消失”和“梯度爆炸”问题,它们从训练一开始就阻止收敛。但是,这些问题已经通过 normalized initialization和 intermediate normalization layers(即BN层)基本被解决了,从而使得网络可以达到数十层的深度,并且可以使用反向传播算法有效地训练。

但是,在更深的网路开始收敛时,暴露出一个被称为“退化“(of training accuracy)的问题:随着网络深度增加,在训练集上的精度达到饱和,然后迅速下降。显然,这种现象不是过拟合造成的,因为过拟合会使得训练集上的精度极高。如果此时向一个深度适当的模型添加更多层的话会带来更高的训练误差,如Fig.1所示,56-layer网络的训练误差和测试误差都比20-layer网络要高。(:该段的意思是,对于一个网络,在层数较少时随着层数增加训练精度会不断提高,当然此时也会逐步加重过拟合的程度;达到一定深度时,训练精度会饱和,过拟合程度也很严重了;再进一步加深的话,训练精度会迅速下降,对于原因,作者在后面会给出猜测)

退化问题说明,不是所有的网络都很容易优化。为了解决退化问题,作者在该论文中提出了一种叫做“深度残差学习框架”(Deep residual learning framework)的网络。在该结构中,每个堆叠层(Stacked layer)拟合残差映射(Residual mapping),而不是直接拟合整个building block期望的潜在映射(Underlying mapping)。形式上,如果用表示整个building block的映射,那么building block中堆叠的非线性层(即building block中由若干卷积层组成的支路Stacked layer。另一条支路是线性层,表示成恒等映射或投影)拟合的就是另一个映射:,所以原映射就变成(整个building block表示的映射依然是H(x),但是拟合的是非线性堆叠层表示的残差映射F(x),没有像以前那样直接对H(x)进行拟合)。事实证明,优化残差映射比优化原来的unreferenced mapping容易很多。

可以用Fig.2所示的带“shortcut connections”的前馈神经网络实现。“shortcut connections”就是图中跨一层或更多层的连线,用来执行恒等映射(Identity mapping)。可见,identity shortcut connections不给模型额外添加参数和计算量。此外,整个网络依然能够端到端地使用反向传播算法训练,也可以很容易地使用公共库(如Caffe)实现,且无需修改求解器(solvers,应该是说SGD、RMSProp等训练方法)

作者在ImageNet上进行的实验说明:1)深度残差网络易于优化,但是对应的”plain” nets(即由若干层简单堆叠起来的网络)随着深度增加展现出更高的训练误差;2)深度残差网络很容易从大幅增加的深度上获得精度提升,结果要大幅优于之前的网络。

为了说明优化难度和残差学习的有效性不是仅限于ImageNet数据集,作者还在CIFAR-10数据集上进行了相关实验。实验中采用的模型超过100层,同时还尝试了超过1000层的模型。

深度残差网络在ImageNet取得的成功促使作者将应用范围扩展到其它识别任务,比如ImageNet detection、ImageNet localization、COCO detection、COCO segmentation,并且在当时都取得了第一名的成绩。这说明,残差学习准则(Residual learning principle)是通用的。

2. 深度残差学习(Deep Residual Learning)

2.1 Residual Learning

作者最初受到对梯度退化问题的反直觉现象启发,想到是否可以将添加到plain nets中的层构造成恒等映射,但是尝试过程中还是出现了梯度消失问题,这说明求解器solvers在用多层非线性层逼近(拟合)恒等映射时或许有困难。因此,作者将原先的stacked layers重构成了Fig.2中的形式。

根据残差学习的公式可知,如果整个building block拟合的恒等映射(作者希望H(x)是恒等映射,设计过程可知)是理想的,那求解器solvers可能会驱动多层非线性层(Stacked layers)的权重向0靠近以逼近恒等映射。但在现实中不可能得到理想的恒等映射(即多层非线性层的权重不是0),不过没关系,残差学习或许能帮我们解决这个问题(就是说,虽然得不到理想的恒等映射,但是接近恒等映射的映射也行啊,足以缓解退化问题)。Fig.7中的实验结果就证明了这一点:学习到的残差函数通常响应很小(权重很小),说明近似的“恒等映射”给模型提供了合理的预处理。

2.2 Identity Mapping by Shortcuts

这里介绍了两种 Shortcut connections,第一种用于在特征相加时维度相等的情况下,即恒等映射,显然,第二种用于不相等的情况。

恒等映射不会给模型带来额外的参数和计算量。这一点不仅在实际中有很大的优势,在比较plain nets和residual metworks时也很重要,因为借助不含参的shortcut connections可以保证二者有相同的参数量、深度、宽度以及计算量。不过,使用不含参的shortcut connections需要xF(x)的维度相等,不然无法相加。

如果该条件不满足(比如,通道数不同)的话,我们还可以在shortcut connections中对输入执行一个线性投影Ws来匹配二者的维度,如下:

但是,后面的实验证明,恒等映射已经足够解决退化问题,并且是经济的,因此 Ws 只用在匹配维度上

值得注意的一点是,该论文中building blocks的堆叠层只有两层或三层,实际上更多层也是可以的。但是,如果堆叠层只有一层的话,整个building block就相当于是线性映射:y=(W+1)x。作者在论文中不建议使用单层堆叠层,因为作者尚未发现这种结构的优点。

上面出于简单性使用的是全连接层的公式,实际上对卷积层也是如此。

2.3 Network Architectures

为了便于讨论,作者在论文中提供了两个在ImageNet上的模型:Plain Network(34-layer plain)Residual Network(34-layer residual)。如Fig.3所示:

Plain Network该网络的设计主要是依据VGGNet。绝大多数卷积层使用3*3 filters,并且遵循两个简单的设计原则:(i)为了使输出的feature map尺寸相同,各层尽量使用相同数目的filters,和(ii)如果feature maps的尺寸减半,使用的filters数目就要加倍,目的是保证每层的计算复杂度不变,便于比较(Inception-v3中说这么做也可以避免表示瓶颈)。使用步长为2的卷积进行下采样。网络的最后使用了一层全局平均池化层(Global average pooling layer)和一层带Softmax的1000-way全连接层。总层数为34,详细结构见Fig.3

34-layer plain的计算复杂度比VGGNet低很多,其FLOPs(multiply-adds)数目(3.6 billion)仅占VGG-19(19.6 billion)的18%

Residual Networks:上述的Plain Network在插入shortcut connections后变成对应的residual version,如Fig.3中右图所示。图中实线显示的shortcut connection表示输入输出具有相同的维度.当维度增加时,就使用图中虚线表示的shortcut connection,对此有两种选择:一是在增加的维度上补0,这样做不会增加参数,但是作者认为这样做实际上没有进行残差学习;二是使用前面提到的Projection shortcut进行维度匹配(通过1*1卷积实现),这样可以增加网络的参数,网络的性能也会提升一些。但是实验证明,这两种方法对网络性能的影响不大,说明Projection shortcut对解决退化问题来说不是必不可少的。既然如此,作者就在网络中主要使用恒等映射,涉及维度增加的地方才使用Projection shortcut。这样可减少参数量,降低计算量和模型尺寸,对模型性能又不会造成太大影响。不然,如果在很深的网络中大量使用Projection shortcut,增加的计算量是十分庞大的,相较于稍微增加的精度,所付出的计算代价并不划算。

2.4 实现(Implementation)

实现过程参考了AlexNet和VGGNet,细节如下:

  • 图像预处理:将图像随机调整成短边尺寸为[256,480]中的一个数值
  • 数据增强:从每幅图像中随机裁剪出224*224的区域;随机左右翻转;减去像素均值;标准的颜色增强
  • 在每层卷积之后和激活之前都使用batch normalization(BN),所以作者在模型中没有使用Dropout
  • 从0开始训练plain/residual nets,不使用预训练
  • 使用SGD,batch size为256;初始学习率为0.1,之后当训练误差持续不变时就缩减10倍;网络训练高达60万iteration
  • 权重衰减系数为0.0001,;动量为0.9
  • 测试时,为了与其它研究结果作对比,作者使用了standard 10-crop testing;为了获得更好的结果,作者使用了fully-convolutional form,并且平均在多尺度图像上的得分(图像的短边被调整成如下尺寸:{224, 256, 384,480, 640})

3. 实验(Experiments)

3.1 ImageNet Classification

使用ImageNet 2012 classification dataset,共有1000类,其中训练图片1.28 million张,验证图片50k张,测试图片100k张。评估的参数有 top-1 和 top-5 error rate

Plain Network:这里作者评估了 18-layer 和 34-layer 两个网络。34-layer plain net如Fig.3所示,而18-layer net则是一种与之相似的网路。详细结构参见Table 1

实验结果参见Table 2。可知,更深的 34-layer plain net比稍浅的18-layer plain net在验证集上拥有更高的错误率。为了揭示原因,作者在Fig.4中比较了二者训练时的训练错误率(training errors)和验证错误率(validation errors)。从中可以明显地看出退化问题(Degradation problem):在整个训练过程中,34-layer plain net都有更高的训练错误率,虽然18-layer的解空间只是34-layer的解空间的子空间。

另外,34-layer plain net出现的优化困难问题不可能会是梯度消失造成的,因为网络中使用了很多BN层,其作用就是确保正向传播的信号方差不为0。为了进一步确认,作者验证了反向传播的梯度,发现梯度并未消失。所以,原因不会是正向或反向的信号消失。实际上,34-layer的精度还是可以的(参见Table 3),说明求解器solver在一定程度上还是有效的。对于optimazation difficulties的真正原因,作者也不清楚,有待进一步研究。

Residual Networks:接下来作者评估了18-layer和34-layer的 residual nets(ResNets)。它们与前面的plain nets基本相同,不同的是每两层3*3卷积层会添加一条 shortcut connnection,如Fig.3(rright)所示。在第一个比较(Table 2 Fig.4)中,所有的shortcut connection都是恒等映射,增加维度的地方补0以匹配维度(option A)。所以该网络相较于plain nets并没有增加额外的参数,这样便于公平地比较。通过观察能够发现:(i)结果与plain nets相反,34-layer ResNet的性能优于18-layer ResNet。更重要的是,34-layer ResNet的训练错误率更低,在验证集上的泛化能力更强。这些现象说明 degradation problem已经被很好地解决了,并且从增加的深度中获得了精度的提升(换言之就是,与网络加深性能就提升的认识一致啦);(ii)与对应的plain版本比较,34-layer ResNet的top-1 error降低了(Table 2)。这验证了残差学习在极深网络中的有效性。

      第二个比较:18-layer plain/residual nets的精度相当(Table 2),但是18-layer ResNet收敛得更快(Fig.4 right vs. left)。精度相当是因为在18-layer时,当前的求解器(solver)SGD仍能够为plain net找到很好的解。此时,ResNet能在训练早期提供更快的收敛速度来加速优化。总之,不论网络的深浅,使用残差学习总是有好处的:浅时能够加快收敛,深时可以解决退化问题,使求解器找到较好的解。

Identity vs. Projection Shortcuts:为了确定恒等映射和Projection Shortcuts孰优孰劣,作者对如下三种选择进行了实验:(A)全部使用恒等映射,通过补0增加维度;(B)除了增加维度的地方使用Projection Shortcuts以外,其余的全部使用恒等映射;(C)所有的shortcuts都使用projection。Table 3展示了3种选择的实验结果。通过分析,作者认为使用 B 最合适,这样既能涉及残差学习又能减少参数量。

Deeper Bottleneck Architectures:这部分作者介绍了三种更深的nets:50-layer ResNet101-layer152-layer ResNets

在网络很深时,模型的训练时间会难以让人接受。考虑到这个问题,作者就将building block修改成了如Fig.5所示的bottleneck design。具体修改是:将stacked layer由两层换成三层,三层分别为1*1、3*3和1*1卷积层。其中1*1卷积层先负责降维,再负责升维(恢复维度),3*3卷积层是输入输出维度更小的bottleneck。Building block和bottleneck design有相近的时间复杂度(因为二者参数量相近)。

需要指出的是,无参的恒等映射对bottleneck architectures来说相当重要。如果projection shortcuts取代恒等映射的话,模型的尺寸和参数量都会加倍,因为它两端连接的都是高维特征。因此,恒等映射使模型更加高效。

i50-layer ResNet:通过将34-layer net中的每个2-layer block替换成Fig.5中的bottleneck design获得,结果为50-layer ResNet(Table 1)。增加维度时使用 option B;该模型一共有3.8 billion个FLOPs

ii101-layer and 152-layer ResNets:作者通过使用更多3-layer blocks构建了 101-layer 和 152-layer ResNets,如Table 1所示。虽然152-layer ResNet(11.3 billion FLOPS)已经非常深,但是计算量仍然比VGG-16/19 networks(15.3/19.6 billion FLOPS)低

50/101/152-layer ResNets都比34-layer ResNets精度高很多(Table 3 and 4)。所以,随着网络层数的增加,我们并没有看到退化问题,反而在性能上获得了重大提升。这证明残差学习在一定程度上解决了退化问题,使得网络能够继续从增加的深度中获得性能提升。

Comparisons with State-of-the-art Methods. Table 4将ResNets与以前最好的single-model做了比较,从中可以看出在single model result中,ResNets的性能超过其它任何模型。在Table 5中,作者比较了多个ensemble models的性能。结合Table 4 and Table 5可以发现,ResNets的 single-model result甚至超过了以往模型的ensemble results,残差学习的效果可见一斑。


3.2 CIFAR-10 and Analysis(第二个实验)

这一部分不详细记录,具体见论文。

多个模型在CIFAR-10 测试集上的分类错误率比较如下Table 6所示:

各个ResNets在CIFAR-10上的训练情况参见Fig.6:

Analysis of Layer Responses. Fig.7展示了层响应的标准差(std)(Standard deviations of the layer responses)。所谓的响应,指的是每个3*3卷积层的输出经过BN层后的结果(在非线性激活层之前,如ReLU/addition)。作者求响应的标准差是为了分析残差函数的响应强度。从Fig.7可以看出,ResNets的响应通常比它们对应的plain nets更小。这个结果证明了作者之前的猜测:残差函数或许会比非残差函数更接近于0!此外,通过对比几个ResNets的响应,作者发现,ResNet越深,其响应就越小。

Exploring Over 1000 layers  作者还尝试了一个极其深的模型:超过1000层的1202-layer ResNet(Fig.6,right),其测试误差仍然相当好(7.93%,Table 6)。但是1202-layer ResNet的测试结果不如110-layer ResNet,虽然二者有相似的训练误差。作者猜测这是overfitting导致的,1202-layer net(19.4M)相对于CIFAR-10来说太大了。

3.3 Object Detection on PASCAL and MS COCO(目标检测)

这部分也不详细记录。

深度残差网络在其他识别任务中也有很好的泛化性能。Table 7和Table 8就展示了ResNet-101和VGG-16在PASCAL VOC 2007和2012以及COCO数据集上的目标检测结果。

此外,作者还对Faster RCNN进行了修改:将执行分类的VGG-16换成ResNet-101,结果有28%的性能提升。除此之外,基于深度残差网络,作者当时还在ILSVRC & COCO 2015竞赛中的几个任务上取得第一的成绩:ImageNet detection、ImageNet localization、COCO detection 及 COCO segmentation。具体的修改方式及相关内容参见论文附录

参看文章:

深度学习基础(五)ResNet_Deep Residual Learning for Image Recognition的更多相关文章

  1. 深度学习基础系列(五)| 深入理解交叉熵函数及其在tensorflow和keras中的实现

    在统计学中,损失函数是一种衡量损失和错误(这种损失与“错误地”估计有关,如费用或者设备的损失)程度的函数.假设某样本的实际输出为a,而预计的输出为y,则y与a之间存在偏差,深度学习的目的即是通过不断地 ...

  2. 深度学习基础网络 ResNet

    Highway Networks 论文地址:arXiv:1505.00387 [cs.LG] (ICML 2015),全文:Training Very Deep Networks( arXiv:150 ...

  3. 算法工程师<深度学习基础>

    <深度学习基础> 卷积神经网络,循环神经网络,LSTM与GRU,梯度消失与梯度爆炸,激活函数,防止过拟合的方法,dropout,batch normalization,各类经典的网络结构, ...

  4. 深度学习基础系列(九)| Dropout VS Batch Normalization? 是时候放弃Dropout了

    Dropout是过去几年非常流行的正则化技术,可有效防止过拟合的发生.但从深度学习的发展趋势看,Batch Normalizaton(简称BN)正在逐步取代Dropout技术,特别是在卷积层.本文将首 ...

  5. [笔记] 基于nvidia/cuda的深度学习基础镜像构建流程 V0.2

    之前的[笔记] 基于nvidia/cuda的深度学习基础镜像构建流程已经Out了,以这篇为准. 基于NVidia官方的nvidia/cuda image,构建适用于Deep Learning的基础im ...

  6. TensorFlow深度学习基础与应用实战高清视频教程

    TensorFlow深度学习基础与应用实战高清视频教程,适合Python C++ C#视觉应用开发者,基于TensorFlow深度学习框架,讲解TensorFlow基础.图像分类.目标检测训练与测试以 ...

  7. 深度学习编译与优化Deep Learning Compiler and Optimizer

    深度学习编译与优化Deep Learning Compiler and Optimizer

  8. 论文笔记——Deep Residual Learning for Image Recognition

    论文地址:Deep Residual Learning for Image Recognition ResNet--MSRA何凯明团队的Residual Networks,在2015年ImageNet ...

  9. [论文理解]Deep Residual Learning for Image Recognition

    Deep Residual Learning for Image Recognition 简介 这是何大佬的一篇非常经典的神经网络的论文,也就是大名鼎鼎的ResNet残差网络,论文主要通过构建了一种新 ...

随机推荐

  1. VS2012遇到一个问题:"链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的"

    解决方法: 1.打开该项目的“属性页”对话框. 2.单击“链接器”文件夹. 3.单击“命令行”属性页. 4.将 /SAFESEH:NO 键入“附加选项”框中,然后点击应用.

  2. 解决jenkins构建job报错“NoClassDefFoundError” in jenkins/scm/RunWithSCM问题

    现象 使用Jenkins 2.8,当我运行一个简单的Jenkins工作时,构建一个job获取源代码,出现下面的错误 FATAL: jenkins/scm/RunWithSCM java.lang.No ...

  3. 【git】将本地项目上传到远程仓库

    飞机票 一. 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址,下载后一路直接安装即可: htt ...

  4. 网络层HTPPS和HTTP的概念与区别

    HTPPS和HTTP的概念 HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP ...

  5. linux下安装redis并开机自启动

    分享一个博客地址, 写的太好了, 满满的都是干货 ! https://www.cnblogs.com/renzhicai/p/7773080.html

  6. 20165328 实验四《Andriid应用开发》实验报告

    一.实验一:Andriod Stuidio的安装测试: 实验要求: 参考                                                                 ...

  7. jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结

    1.选择器 (1)通配符: $("input[id^='code']");//id属性以code开始的所有input标签 $("input[id$='code']&quo ...

  8. Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  9. 如何导出chrome已安装的拓展程序

    如何导出chrome已安装的拓展程序 已安装的chrome插件可以在浏览区中输入*chrome://extensions*便可以查看插件列表. 对于windows系统来说,这些插件对应的目录为: C: ...

  10. 实时流式计算框架——JStorm

    1.本地调试 a.步骤:生成Topology——实现Spout接口——实现Bolt接口——编译运行 b.加入依赖 <!-- JStorm --> <dependency> &l ...