CVPR2016(classification):ResNet-论文解读与复现《Deep Residual Learning for Image Recognition》

原文地址

https://arxiv.org/abs/1512.03385

论文阅读方法

三遍论文法

初识(Abstract & Introduction & Conclusion)

这篇文章就是大名鼎鼎的ResNet,属于CV领域必看经典,目前也是很多任务常用的backbone。获得了CVPR2016的Best Paper Award,这也是Kai Ming He大佬的第二篇Best Paper。
在这里插入图片描述
这篇文章主要解决的问题在于:当神经网络的层数加深时,模型效果出现了退化的问题(能力反而变差),如上图所示,将20层神经网络加深到56层之后,模型的training error和test error反而更高了。

首先一个阻碍层数增加的原因是:当层数变多时,会出现梯度消失的现象,这个可以通过Batch Normalization来解决,使得模型能够正常收敛。即使模型通过批次标准化可以正常收敛,但是另一个问题也随之暴露:模型能力退化,并且这个退化不是由过拟合导致的,因为从上图可以看到,56-layer的深层模型在训练集的error rate也增加了,证明模型的拟合能力确实出现了问题。

深层模型出现的退化问题表明了一个现象:并不是所有的模型都同样容易优化的。比如,我们现在要加深一个网络,先将原来的网络完全复制过来,再让新增的层作为恒等映射(恒等映射的简单理解:就是输入X,经过这些层最后还是输出X),按理说,这样构成的模型不可能比原先的网络效果差。但事实证明,在有限的时间内,优化器的无法训练到这种效果(模型反而出现退化)。这也就意味着,深层模型的优化是很困难的。
在这里插入图片描述
为了解决深层模型的优化问题,本文提出了一个残差结构:让新增的层不再去拟合基础映射(underlying mapping),而是拟合残差映射(residual mapping)。什么意思呢?例如,我们要学习H(x),让新增的非线性层去拟合映射F(x)=H(x)-x,H(x)就变成了F(x)+x。为什么这么设计呢,因为作者认为这样会使得模型的优化变得更容易,极端地说,假设新增的层为恒等映射才使得模型最优(即原始的网络就已经为最优模型,无论再怎么新增层数也不无法提升性能),那么,新增的非线性层在残差结构下学习如何变为0要比在非残差结构下学习恒等映射容易的多。

F(x)+x的实现如上图所示,使用了"shortcut connections",将恒等映射(identity mapping)与新增层的输出相加,这样既不增加参数量,也不增加计算复杂度。作者利用该网络在ImageNet上进行了实验,证明了自己的残差结构能够很容易优化深层模型,并且随着深度的增加,准确率也逐渐提升。利用该结构,在各个赛道上取得了很牛逼的结果,有多牛逼呢?贴段原文感受下:Our ensemble has 3.57% top-5 error on the ImageNet test set, and won the 1st place in the ILSVRC 2015 classification competition. The extremely deep representations also have excellent generalization performance on other recognition tasks, and lead us to further win the 1st places on: ImageNet detection, ImageNet localization, COCO detection, and COCO segmentation in ILSVRC & COCO 2015 competitions。

相知(Body)

2. Related Work

Residual Representation:首先介绍之前应用残差结构的工作,并且指出本文与他们的不同,说明良好的重构确实对模型的优化是有利的。

Shortcut Connection:与“highway”网络做了对比:本文的残差结构无需额外的参数,且无门控机制,网络永远在学习残差表示。

3. Deep Residual Learning

3.1 Residual Learning

这一部分简单地介绍了残差学习:理论上,多个非线性层能够拟合任意的复杂函数。假设,我需要让新增的非线性层去近似一个函数H(x)(原来的网络输出x),那么可以在残差结构下,让它去近似函数F(x)=H(x)-x。虽然最后的期望映射都为H(x),但是它们学习的难易程度不一样。

之前提到过,如果原来的模型已经是最优,那么新增的非线性层就要学会恒等映射,相比之下,在残差结构下让新增非线性层的权重变为零显然比学习恒等映射更容易。但是在现实情况中,往往已得到的模型不是最优的,这时期望通过增加层数来优化模型。如果最优模型需要新增的非线性模块接近恒等映射(但不是恒定映射,即非线性层学习的不是零映射),那么在残差结构下去学习与恒等映射之间的扰动比重新学习一个新函数要简单的多。

3.2 Identity Mapping by Shortcut

如图2所示,作者定义了一个残差模块,其公式如下:
在这里插入图片描述
x,y分别代表了对应层的输入输出向量,其中F(x,{wi})代表所学习的残差映射。

但在式子(1)中,x和F最后为直接的相加,所以它们的空间维度大小必须一致。对于不一致的情况,作者额外定义了一个残差公式:
在这里插入图片描述
使用一个线性映射Ws来调整x的维度大小。当然,矩阵Ws也可以用于x和F空间大小一致的情况,但从实验结果(下文)来看,恒等映射就已经可以很好地解决模型退化问题,并且不耗费算力。所以,Ws只用于匹配维度。

关于残差函数F的形式其实是很灵活的,本文的实验包含了2层或者3层,当然更多层也是可以的。如果只包含一层,其实残差模块就会退化成线性映射:W1 x + b,从实验现象来看,这种构造并没有任何优势。

3.3 Network Architecture

在这里插入图片描述
Plain Network: 中间为本文实验中的Plain Network(图中),它借鉴了VGG16的网络结构(图左)。主要由多个3x3卷积构成,主要有两点设计原则:1)对于输出同等特征图尺寸的层,它们的卷积核数量一致(输出通道数量相同)。2)特征图尺寸减半,对应的卷积核数量翻倍,保持每层的计算复杂度。下采样用的并不是max poolling,而是直接用步幅长度为2的卷积层替代。网络最后用了一个全局平均池化层+具有softmax的1000维的全连接层。值得注意的是,构造的Plain Network相比于VGG16, 卷积核数量更少,时间复杂度也更少。

Residual Network: 在Plain网络中插入Shortcut Connection,就能转换成与之对应的残差版本(图右)。式(1)可以直接在输入输出维度相等的层中(图中的实线);当维度增加时(图中虚线),作者考虑了两种方案:**A)shortcut仍让执行恒等映射,对于额外的维度用0填充,这种方法不需要增加参数量;B)使用式(2)进行升维(1x1卷积)。**不管哪种方法,当shortcut跨越两种尺寸的feature map时,步幅都为2。

3.4 Implementation

训练基本上是跟随AlexNet、VGG来配置,a) 将最短边随机缩放至[256, 480]区间内用于尺度增强; b) 在图像和对应的水平翻转上进行224x224的随机剪裁; c) 减去各通道像素均值; d) ALexNet中的颜色增强;e) 不同的是,在卷积后激活函数前使用了Batch Normalization;f) He初始化方法;g) mini batch=2565的SGD优化,初始学习率为0.1,当error rate不再下降时,除以10,weight decay=0.0001,momentum=0.9;h) 没有使用dropout。

在测试阶段,使用AlexNet中的10-crop测试方法(四个角的224x224 + 中心的224x224,以及它们的水平翻转),并且还采用了类似VGG中的全卷积形式,将平均得分作为输出结果(按最短边{224,256,384,480,640}进行缩放)。

4. Experiments

4.1 ImageNet Classification在这里插入图片描述

上图为实验所构造的Plain Network和对应的ResNet(在每个残差模块加入shortcut connection)详细结构,自50-layer之后,残差函数的结构发生了变化,由两层变为了三层,具体结构也可见下图。
在这里插入图片描述
在这里插入图片描述
Plain Network: 上图左边就是Plain Network的实验结果,细线为training error,粗线为validation error。可以看到模型从18层变为34层时出现了退化的情况,并且作者在结构中加了Batch Normalization,所以这种退化并不是梯度消失引起的。

Residual Networks: 使用shortcut connection(option A)将网络变为对应的ResNet之后,上图右边即为实验结果。从上图和Table 2中可以得到以下几个结论:1)退化问题在Residual Learning结构下被解决;2)残差学习在深度模型中十分有效的;3)Residual Learning能够使模型更快收敛。在这里插入图片描述
Identity vs. Projection Shortcuts: 接下来比较了Identity Shortcuts和Projection Shortcuts(之前的公式2),其中设计了三种网络:A)仍为Identity Shortcuts,但用零填充增加维度,无需额外参数;B)Projection Shortcut用来增加维度,其他部分仍为Identity Shortcuts;C)所有的Shortcuts均为Projection Shortcuts。

Table3展示了无论是A)B)C)那种方案,均优于plain network。其中,B)略优于A),作者认为这主要是由于A)中零填充的部分没有进行残差学习;C)略由于B),这可以归功于额外参数的引入。但是三者之间的差距很微小,这证明Projection Shortcuts对于解决Model的退化问题并不是必须的。在这里插入图片描述
Deeper Bottleneck Architecutres: 如下图所示(Figure 5 右),随着网络层数的加深,考虑所能负担的训练时长,将Building Block修改为bottleneck设计。对于每一个残差函数F,使用3层代替2层,3层分别为:1x1,3x3以及1x1。1x1卷积层主要是用来减少/恢复特征图的维度,使得3x3层在进行卷积的时候,输入/输出维度都比较小。图5左右两种设计模式,虽然它们的层数不一样,但是它们的时间复杂度是相似的。同时,对于bottleneck网络来说,identity shortcuts是更高效的选择,由于shortcuts连接了两个高纬度的终端,如果使用Projection Shortcuts的话,时间复杂度和模型大小会加倍。

在这里插入图片描述
50-layer ResNet: 从50层之后,就开始使用”bottleneck“结构,具体结构见之前的结构图。

101-layer and 152-layer ResNets: 在Residual Learning结构下,模型只需要不断地加深,就可以获得更好的结果。并且即使模型的层数达到了152层,但从参数量来看,模型仍比VGG16/19要更小。

Comparisons with State-of-the-art Methods: 首先,ResNet在ImageNet竞赛classification赛道上荣登第一,然后在提交时,作者结合了6个不同深度的Model进行ensemble(其中有2个ResNet152)。

4.2 CIFAR-10 and Analysis

在CIFAR-10数据集上,作者还做了相应的实验,实验的目的是为了观察深层网络,并不是为了获得SOTA的结果。与之前用于ImageNet的Plain Network结构类似,这个的网络主要由3x3 Conv组成(见下图),经过卷积之后,会进行一个average pooling,10-way全连接+softmax。所以,总共有6n+2层权重层。在这里插入图片描述
shortcut connection全用的为Identity Shortcuts,使得对应的ResNet与Plain Net复杂度一致。在这里插入图片描述
左边为PlainNet在CIFAR-10上的结果,出现了model退化的结果,这证明model退化是一个基础问题;中间是ResNet的结果,解决了Model退化的问题;右边将ResNet增加到1202层,可以看到,虽然1202层和110层的training error很相近,但是ResNet-1202的test error比110要更高,这个现象可以归于过拟合,因为结构中没有用到maxout和dropout等强正则化的手段。在这里插入图片描述
上图展示了每层响应的标准差,它是在BN层之后,ReLU之前的输出。对于ResNet来说,这展示残差函数的响应强度,结果展示,ResNet相比于它的Plain Network有更小的响应,这个结果也就支持了作者之前的动机:残差函数比原始函数更接近零(3.1节)。并且也说明,当层数越多时,ResNet每一层的改动幅度越小。

回顾(Review)

看完整篇论文,一个词:牛逼。全篇主要解决了的一个问题就是:随着模型层数的加深,优化越来越难,网络的性能出现了退化。这个问题如果让我去想,可能抠破脑袋也想不出,而ResNet解决了。ResNet并没有大多复杂的数学原理,只是改变了一下模型的表达形式:Residual Learning (H(x) -> H(x)=F(x)+x)。现在回顾这篇工作,可以发现深度学习领域也确实是从ResNet之后,才真正地变为“深度”学习:模型的层数变得越来越深,达到了百层以上。

代码

等我复现之后,贴上链接。当然,github上关于ResNet的复现代码也有很多。

github链接(基本上与Pytorch的官方实现一致hhh):https://github.com/Classmate-Huang/CV_ImageClassification/tree/master/ResNet


以上为个人的浅见,水平有限,如有不对,望大佬们指点。

未经本人同意,请勿转载,谢谢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值