ResNet残差神经网络

概述

ResNet,Deep residual network,深度残差网络

作者:何凯明

由于 ResNet的优秀,摘得CVPR2016最佳论文奖

论文下载地址:
https://arxiv.org/abs/1512.03385

为什么学习ResNet

优秀

ResNet网络 与 其他网络在 ImageNet 的对比结果

突破

在ResNet出现之前,深度神经网络一般 不超过20层,随着层数越多,越容易引起 退化,准确率无法上升,甚至出现下降。
如:只有VGG16 和 VGG19,没有超过20层

ResNet 提出的思想,突破这一限制,有34层、50层、101层、152层

启发

受到ResNet的启发,很多作者又提出了更优秀的神经网络,如:DenseNet等

为何难以突破20层

一般增加网络层数后,可以进行更加复杂的特征模式的提取,所以当模型更深时理论上可以取得更好的结果。

但是,当超过20层时,层数越多越会出现 退化 问题(Degradation problem):网络准确度出现饱和,甚至出现下降。

注意:不是过拟合导致的

如下图:

56层的网络比20层网络效果还要差。这不是过拟合,因为56层网络的训练误差同样高。

过拟合:是模型在训练数据上的损失值不断减小,在测试数据上的损失值先减小再增大

深层网络存在着 梯度消失梯度爆炸 的问题,这使得深度学习模型很难训练。但是现在已经存在一些技术手段如BatchNorm来缓解这个问题。因此,出现深度网络的退化问题是非常令人诧异的。

关于 梯度消失梯度爆炸 参见:
https://www.malaoshi.top/show_1EF5UETXH6tN.html

残差学习

启发

浅层网络,通过堆积新层来建立深层网络,最差的情况是: 新增加的层什么也不学习仅仅复制浅层网络的特征,即这样新层是恒等映射(Identity mapping)。

在这种情况下,深层网络应该至少和浅层网络性能一样,不应该出现退化现象

短路连接(shortcut connection)

何凯明 提出了残差学习来解决退化问题。对于一个堆积层结构(层堆积而成)当输入为 x 时其学习到的特征记为H(x) (由上面可知,网络越深,H(x)越难以训练)

但是可以学习残差(Residual) F(x)=H(x)-x

如下图(此结构也称之为block):

当残差F(x)为0时,此时堆积层仅仅做了 恒等映射,至少网络性能不会下降,实际上残差不会为0,这也会使得堆积层在输入特征基础上学习到新的特征

核心思想

原本学习的是直接通过卷积得到的图像特征H(X),现在学习的是 图像与特征的残差 H(X)-X

因为残差学习相比原始特征的直接学习更加容易。以下进行一个简单的证明。

短路连接的实现

  • 上图中的weight layer表示卷积层
  • 输入x,经过2次卷积运算,用F(X)表示
  • F(X)与输入x相加,然后用relu激活

总结

残差学习相比直接学习更容易。当残差为0时(即:F(x)为0时),此时堆积层仅仅做了恒等映射,至少网络性能不会下降,实际上残差不会为0,这也会使得堆积层在输入特征基础上学习到新的特征,从而拥有更好的性能。

这种类似与电路中的“短路”,所以是一种短路连接(shortcut connection)。

ResNet34的网络结构

ResNet网络是参考了VGG19网络,在其基础上进行了修改,并通过短路机制加入了残差单元

下图是VGG19、普通的34层网络 和 ResNet34的网络结构对比图:

34-layer plain

按照VGG19的理论,继续加卷积层,加到34层网络时,训练此网络,会发生 退化 问题

34-layer ResNet

  • 每两层增加了 短路机制,形成 残差学习

  • 虚线表示卷积核数量增加一倍,stride=2做下采样,即:feature map尺寸小一半、数量增加一倍,这保持了网络层的复杂度。

  • 最后用global average pool层替换了全连接层,参数更少

对比网络效果

对比18-layer 和 34-layer 的网络效果,如下图:

普通的 18-layer 和 34-layer 网络出现退化现象,但是ResNet 18-layer 和 34-layer 没有退化问题。

ResNet各类网络结构

stage

conv1 到 conv5_x,每一个称之为stage,即:stage1 到 stage5

block

每一个[]括起来的,称之为一个 block

也就是说,一个stage由若干个重复的block组成

50层以下的残差块

50层以下的残差块:

特点如下:

  • 每一个 block 由 2 层卷积 组成,每两层进行一次残差学习
  • 所有的卷积核大小都是3x3
  • 下一个stage的卷积核数量是上一个的2倍
  • 每个 stage,block 重复次数不同

对于短路连接(shortcut connection),当输入和输出维度一致时,可以直接将输入加到输出上

50层以上的残差块

超过50层的Resnet,残差块是 3层卷积操作,如下图:

  • 通过 第一层 卷积运算(卷积核大小:1x1,数量:上一层的1/4)
    目的:降低维度,为下一步卷积降低运算量,称之为:bottleneck—瓶颈

  • 通过 第二层 卷积运算(卷积核大小:3x3,数量与第一层相同)

  • 通过 第三层 卷积运算(卷积核大小:1x1,数量是上一层的4倍)
    目的:升高维度,将复杂度恢复到之前

bottleneck 瓶颈

50层以上的ResNet,残差块的 第一层 相当于下图中的 bottleneck 瓶颈,其作用就是将上层的 输入 降维,否则运算量太大,第三层再将维度升上去,所以看上去就像下图:

合理的运用瓶颈,能减小运算量,而且不会影响网络性能

ResNet发展

按照发展,分为:

  1. ResNet V2
  2. ResNeXt

原文出处:http://malaoshi.top/show_1EF5Ka4fKW9A.html