概述
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发展
按照发展,分为:
- ResNet V2
- ResNeXt