论文名称:《 Deep Residual Learning for Image Recognition 》

论文下载:https://arxiv.org/pdf/1512.03385.pdf

论文代码:https://github.com/tensorflow/models/blob/master/research/slim/nets/resnet_v2.py                  https://github.com/tensorflow/models/blob/master/research/slim/nets/resnet_utils.py


1、缘起何处:

CNN史上的一个里程碑事件是ResNet模型的出现,ResNet可以训练出更深的CNN模型,从而实现更高的准确度。ResNet模型的核心是通过建立前面层与后面层之间的“短路连接”(shortcuts,skip connection),这有助于训练过程中梯度的反向传播,从而能训练出更深的CNN网络。

(1)网络的深度很重要:

因为CNN能够提取low/mid/high-level的特征,网络的层数越多,意味着能够提取到不同level的特征越丰富。并且,越深的网络提取的特征越抽象,越具有语义信息。

(2)但是不能简单地增加网络层数:

  • 对于原来的网络,如果简单地增加深度,会导致梯度弥散或梯度爆炸。(对于该问题的解决方法是正则化初始化中间的正则化层(Batch Normalization),这样的话可以训练几十层的网络。)
  • 虽然通过上述方法能够训练了,但是又会出现另一个问题,就是退化问题,网络层数增加,但是在训练集上的准确率却饱和甚至下降了。这个不能解释为overfitting,因为overfit应该表现为在训练集上表现更好才对。
    退化问题说明了深度网络不能很简单地被很好地优化。作者通过实验:通过浅层网络+ y=x 等同映射构造深层模型,结果深层模型并没有比浅层网络有等同或更低的错误率,推断退化问题可能是因为深层的网络并不是那么好训练,也就是求解器很难去利用多层网络拟合同等函数。

(3)深度残差网络更易学习:

如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。那现在要解决的就是学习恒等映射函数了。 但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) + x。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 而且,拟合残差肯定更加容易。

2、算法思想:

深度学习中,只要有足够的容量,一个单层的“前馈神经网络”就已经足以表示任何函数了。但是,这个层可能会非常庞大,所以网络很容易会出现过拟合的问题。对此,常见的做法是让网络结构不断变深。

然而,我们不能通过简单地叠加层的方式来增加网络的深度。梯度消失问题的存在,使深度网络的训练变得相当困难。“梯度消失”问题指的是即当梯度在被反向传播到前面的层时,重复的相乘可能会使梯度变得无限小。因此,随着网络深度的不断增加,其性能会逐渐趋于饱和,甚至还会开始下降。

resnet自动检测 resnet目标检测_计算机视觉

深度网络的退化问题说明深度网络不容易训练。

但是我们考虑这样一个事实:现在你有一个浅层网络,你想通过向上堆积新层来建立深层网络,一个极端情况是这些增加的层什么也不学习,仅仅复制浅层网络的特征,即这样新层是恒等映射(Identity mapping)。在这种情况下,深层网络应该至少和浅层网络性能一样,也不应该出现退化现象

ResNet的基本思想是引入了能够跳过一层或多层的“shortcut connection”:

resnet自动检测 resnet目标检测_resnet自动检测_02

ResNet网络是参考了VGG19网络,在其基础上进行了修改,并通过短路机制加入了残差单元,如图5所示。变化主要体现在ResNet直接使用stride=2的卷积做下采样,并且用global average pool层替换了全连接层。

resnet自动检测 resnet目标检测_计算机视觉_03

ResNet的核心思想是:计算层到层的残差,即F(x),以F(x)+x作为输出。其特点为:A simple and clean framework of training “very” deep nets。

3、网络结构:

resnet自动检测 resnet目标检测_目标检测_04

简单介绍一下RestNet的细节:

①  在许多数据集中都能够观察到的普遍现象就是过深的普通网络具有更高的训练误差。但是,一个较深的模型理应具有更高的准确率。关于Residual Net如下图所示:

resnet自动检测 resnet目标检测_深度学习_05

ResNet使用两种残差单元,如上图所示。左图对应的是浅层网络,而右图对应的是深层网络。对于短路连接,当输入和输出维度一致时,可以直接将输入加到输出上。但是当维度不一致时(对应的是维度增加一倍),这就不能直接相加。有两种策略:(1)采用zero-padding增加维度,此时一般要先做一个downsamp,可以采用strde=2的pooling,这样不会增加参数;(2)采用新的映射(projection shortcut),一般采用1x1的卷积,这样会增加参数,也会增加计算量。短路连接除了直接使用恒等映射,当然都可以采用projection shortcut。

②  Residual Net:H(x)是输出,希望2层权重能够拟合F(x),使得:

H(x)=F(x)+x

F(x)是一个关于恒等式残差的映射。

a.      If identity were optimal, easyto set weights as 0;

b.      If optimal mapping is closer toidentity, easier to find small fluctuations.

③  网络设计:

a.      全部采用3×3 conv操作(或者大部分采用)

b.      Spatial size /2 -> # filter×2

c.      没有FC层和Dropout层

④  实验结果表明,ResNet能够在没有任何困难的情况下得到训练,并且实现更深的网络结构使其达到更低的训练误差和测试误差。

⑤  受设备计算能力限制,作者也提出了另一个与原始ResNet复杂度相同的BottleNeck模型,它是一个逐层深入且实际可行的方案。详细细节参考2.的链接及内容。

⑥  作者分析了学习深度学习模型存在的问题和本文提出的对策:

a.      表征能力:ResNet在表征能力上不存在明显优势(只是重复的参数化),但是,能够使加深模型变得切实可行;

b.      优化能力:能够使前向/反向传播算法更加平稳,极大程度简化/减轻(DBA)优化深度模型;

c.      一般化(Generalization)能力:ResNet未直接处理一般化问题,但是更深+更薄是一种很好的一般化手段。

以上对ResNet做了简要介绍,了解到ResNet在加深网络模型,提高学习任务准确率等方面都有很大的优势。

4、实验效果:

最后展示一下ResNet网络与其他网络在ImageNet上的对比结果,如表2所示。可以看到ResNet-152其误差降到了4.49%,当采用集成模型后,误差可以降到3.57%。

resnet自动检测 resnet目标检测_resnet自动检测_06

ResNet的一个重要设计原则是:当feature map大小降低一半时,featuremap的数量增加一倍,这保持了网络层的复杂度。从下图中可以看到,ResNet相比普通网络每两层间增加了短路机制,这就形成了残差学习,其中虚线表示featuremap数量发生了改变。下图展示的34-layer的ResNet,还可以构建更深的网络如表1所示。

resnet自动检测 resnet目标检测_目标检测_07

从表中可以看到,对于18-layer和34-layer的ResNet,其进行的两层间的残差学习,当网络更深时,其进行的是三层间的残差学习,三层卷积核分别是1x1,3x3和1x1,一个值得注意的是隐含层的feature map数量是比较小的,并且是输出feature map数量的1/4。