Deep Residual Learning for Image Recognition

论文完整翻译详见:https://blog.csdn.net/wspba/article/details/57074389

 重要参考:

https://blog.csdn.net/wspba/article/details/56019373

https://blog.csdn.net/lanran2/article/details/79057994

https://blog.csdn.net/abcjennifer/article/details/50514124

https://blog.csdn.net/yj3254/article/details/52244402

    ResNet——MSRA何凯明团队的Residual Networks(残差网络),是2015年ImageNet中classification、detection、localization以及COCO数据集上的detection和segmentation的冠军,而且Deep Residual Learning for Image Recognition也获得了CVPR2016的best paper。

1  Introduction

对于新的问题:训练一个更好的网络是否和堆叠更多的层一样简单呢?解决这一问题的障碍便是梯度消失/梯度爆炸,从一开始便阻碍了模型的收敛。归一初始化(normalized initialization)和中间归一化(intermediate normalization)在很大程度上解决了这一问题,它使得数十层的网络在反向传播的随机梯度下降(SGD)上能够收敛。

当深层网络能够收敛时,一个退化问题又出现了:随着网络深度的增加,准确率达到饱和然后迅速退化。这种退化并不是由过拟合造成的ResNet最根本的动机就是所谓的“退化”问题,即当网络深度越深时,它在训练集上训练网络的效率会有所减弱,导致错误率提高。如下图:

Deep Residual Learning for Image Recognition

但是模型的深度加深,学习能力增强,因此更深的模型不应当产生比它更浅的模型更高的错误率。而这个“退化”问题产生的原因归结于优化难题,当模型变复杂时,SGD的优化变得更加困难,导致了模型达不到好的学习效果。

为解决这个退化问题,本文介绍一种deep Residual learning 的框架:

Deep Residual Learning for Image Recognition

对于更深的模型,通过构建解决方案:恒等映射(identity mapping)(x)来构建增加的层,而其它层直接从浅层模型中复制而来。让这些层来拟合残差映射(residual mapping)(F(x)),而不是让每一个堆叠的层直接来拟合所需的底层映射(desired underlying mapping)。假设所需的底层映射为 (x) ,让堆叠的非线性层来拟合另一个映射: (x):=(x)x。因此原来的映射转化为:F(x)+x 。我们推断残差映射比原始未参考的映射(unreferenced mapping)更容易优化。在极端的情下,如果某个恒等映射是最优的,那么将残差变为0 ,比用非线性层的堆叠来拟合恒等映射更简单。

公式 Deep Residual Learning for Image Recognition可以通过前馈神经网络的“shortcut连接”来实现(Fig.2)。Shortcut连接就是跳过一个或者多个层。shortcut 连接只是简单的执行恒等映射,再将它们的输出和堆叠层的输出叠加在一起(Fig.2)。恒等的shortcut连接并不增加额外的参数和计算复杂度。同时却可以大大增加模型的训练速度、提高训练效果,并且当模型的层数加深时,这个简单的结构能够很好的解决退化问题。

 2. Related Work

2.1 残差表达 

在图像识别中,VLAD是残差向量对应于字典进行编码的一种表达形式,Fisher Vector可以看做是VLAD 的一个概率版本。对于图像检索和分类它们都是强力的浅层表达。对于向量量化,残差向量编码比原始向量编码更加有效。

在低级视觉和计算机图形学中,为了求解偏微分方程(PDEs),通常使用Multigrid法将系统重新表达成多尺度的子问题来解决,每一个子问题就是解决粗细尺度之间的残差问题。Multigrid的另外一种方式是分层基预处理,它依赖于代表着两个尺度之间残差向量的变量。实验证明 这些求解器比其他标准求解器的收敛要快得多,却并没有意识到这是该方法的残差特性所致。这些方法表明了一个好的重新表达或者预处理能够简化优化问题。

2.2 Shortcut连接

Shortcut连接已经经过了很长的一段实践和理论研究过程。训练多层感知器(MLPs)的一个早期实践就是添加一个连接输入和输出的线性层。在Szegedy2015GoingLee2015deeply中,将一些中间层直接与辅助分类器相连接可以解决梯度消失/爆炸问题。在 Szegedy2015Going中,一个“inception”层由一个shortcut分支和一些更深的分支组合而成。

与此同时,“highway networks”将shortcut连接与门控函数 结合起来。这些门是数据相关并且是有额外参数的,而我们的恒等shortcuts是无参数的。当一个门的shortcut是“closed”(接近于0)时,highway网络中的层表示非残差函数。相反的,我们的模型总是学习残差函数;我们的恒等shortcuts从不关闭,在学习额外的残差函数时,所有的信息总是通过的。此外,highway网络并不能由增加层的深度(例如, 超过100层)来提高准确率。

Deep Residual Learning for Image Recognition

3. Deep Residual Learning

3.1. Residual Learning

我们将(x)H(x)看作一个由部分堆叠的层来拟合的底层映射,其中xx是这些层的输入。假设多个非线性层能够逼近复杂的函数,这就等价于这些层能够逼近复杂的残差函数,例如, (x)x(假设输入和输出的维度相同)。所以我们明确的让这些层来估计一个残差函数:(x)=(x)x 而不是(x)。因此原始函数变成了(x)+x。尽管这两个形式应该都能够逼近所需的函数(正如假设),但是学习的难易程度并不相同。

这个重新表达的动机是由退化问题这个反常的现象(Fig.1,左)。正如我们在introduction中讨论的,如果增加的层能以恒等映射来构建,一个更深模型的训练错误率不应该比它对应的浅层模型的更大。退化问题表明了,求解器在通过多个非线性层来估计恒等映射上可能是存在困难的。而伴随着残差学习的重新表达,如果恒等映射是最优的,那么求解器驱使多个非线性层的权重趋向于零来逼近恒等映射。

在实际情况下,恒等映射不太可能达到最优,但是我们的重新表达对于这个问题的预处理是有帮助的。如果最优函数更趋近于恒等映射而不是0映射,那么对于求解器来说寻找关于恒等映射的扰动比学习一个新的函数要容易的多。通过实验(Fig.7)表明,学习到的残差函数通常只有很小的响应,说明了恒等映射提供了合理的预处理。

3.2. Identity Mapping by Shortcuts

我们在堆叠层上采取残差学习算法。一个构建块如Fig.2所示。本文中的构建块定义如下(Eq.1): 

Deep Residual Learning for Image Recognition

Eq.1中的shortcut连接没有增加额外的参数和计算复杂度

如果F(x)和x的channel个数不同怎么办,因为F(x)和x是按照channel维度相加的,channel不同怎么相加呢? 

在Eq.1中可以使用方阵Ws,用来解决维度不匹配的问题。
针对channel个数是否相同,要分成两种情况考虑,如下图: 

Deep Residual Learning for Image Recognition

图3 两种Shortcut Connection方式 
如图3所示,我们可以清楚的”实线“和”虚线“两种连接方式, 
实线的的Connection部分(都是3x3x64的特征图,他们的channel个数一致,所以采用计算方式: 
y=F(x)+xy=F(x)+x 
虚线的的Connection部分分别是3x3x64和3x3x128的特征图,他们的channel个数不同(64和128),所以采用计算方式: 
y=F(x)+Wxy=F(x)+Wx 
其中W是卷积操作,用来调整x的channel维度的;

3.3. Network Architectures

首先构建了一个18层和一个34层的plain网络,即将所有层进行简单的铺叠,然后构建了一个18层和一个34层的residual网络,仅仅是在plain上插入了shortcut,而且这两个网络的参数量、计算量相同,并且和之前有很好效果的VGG-19相比,计算量要小很多。(36亿FLOPs VS 196亿FLOPs,FLOPs即每秒浮点运算次数。)这也是作者反复强调的地方,也是这个模型最大的优势所在。

Deep Residual Learning for Image Recognition

Deep Residual Learning for Image Recognition

首先表1提出了5种深度的ResNet,分别是18,34,50,101和152,最左侧所有的网络都分成5部分,分别是:conv1,conv2_x,conv3_x,conv4_x,conv5_x,之后其他论文也会专门用这个称呼指代ResNet50或者101的每部分。 
拿101-layer那列,我们先看看101-layer是不是真的是101层网络,首先有个输入7x7x64的卷积,然后经过3 + 4 + 23 + 3 = 33个building block,每个block为3层,所以有33 x 3 = 99层,最后有个fc层(用于分类),所以1 + 99 + 1 = 101层,确实有101层网络; 
注:101层网络仅仅指卷积或者全连接层,而**层或者Pooling层并没有计算在内; 
这里我们关注50-layer和101-layer这两列,可以发现,它们唯一的不同在于conv4_x,ResNet50有6个block,而ResNet101有23个block,查了17个block,也就是17 x 3 = 51层。

4. Experiments

4.1实现的 tricks

  1. 图片resize:短边长random.randint(256,480)
  2. 裁剪:224*224随机采样,含水平翻转
  3. 减均值
  4. 标准颜色扩充[2]
  5. conv和activation间加batch normalization[3] 帮助解决vanishing/exploding问题
  6. minibatch-size:256
  7. learning-rate: 初始0.1, error平了lr就除以10
  8. weight decay:0.0001
  9. momentum:0.9
  10. 没用dropout[3]
Plain Networks vs. Residual Networks

模型构建好后进行实验,在plain上观测到明显的退化现象,而且ResNet上不仅没有退化,34层网络的效果反而比18层的更好,而且不仅如此,ResNet的收敛速度比plain的要快得多。

Deep Residual Learning for Image Recognition

Identity vs. Projection Shortcuts.

对于shortcut的方式,作者提出了三个选项:

A. 使用恒等映射,如果residual block的输入输出维度不一致,对增加的维度用0来填充;

B. 在block输入输出维度一致时使用恒等映射,不一致时使用线性投影以保证维度一致;

C. 对于所有的block均使用线性投影。

对这三个选项都进行了实验,发现虽然C的效果好于B的效果好于A的效果,但是差距很小,因此线性投影并不是必需的,而使用0填充时,可以保证模型的复杂度最低,这对于更深的网络是更加有利的。

4.2 Deeper Bottleneck Architectures.

进一步实验,作者又提出了deeper的residual block:

Deep Residual Learning for Image Recognition

这两种结构分别针对ResNet34(左图)和ResNet50/101/152(右图),一般称整个结构为一个”building block“。其中右图又称为”bottleneck design”,目的一目了然,就是为了降低参数的数目,第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。 
对于常规ResNet,可以用于34层或者更少的网络中,对于Bottleneck Design的ResNet通常用于更深的如101这样的网络中,目的是减少计算和参数量(实用目的)。

这相当于对于相同数量的层又减少了参数量,因此可以拓展成更深的模型。于是作者提出了50、101、152层的ResNet,而且不仅没有出现退化问题,错误率也大大降低,同时计算复杂度也保持在很低的程度。