ResNet残差神经网络 作者:马育民 • 2020-04-12 15:10 • 阅读:10495 # 概述 ResNet,Deep residual network,深度残差网络 作者:[何凯明](http://kaiminghe.com/ "何凯明") 由于 ResNet的优秀,摘得CVPR2016最佳论文奖 论文下载地址: https://arxiv.org/abs/1512.03385 # 为什么学习ResNet ### 优秀 ResNet网络 与 其他网络在 ImageNet 的对比结果 [![](https://www.malaoshi.top/upload/0/0/1EF5KZkrNWtw.png)](https://www.malaoshi.top/upload/0/0/1EF5KZkrNWtw.png) ### 突破 在ResNet出现之前,深度神经网络一般 **不超过20层**,随着层数越多,越容易引起 **退化**,准确率无法上升,甚至出现下降。 如:只有VGG16 和 VGG19,没有超过20层 ResNet 提出的思想,突破这一限制,有34层、50层、101层、152层 ### 启发 受到ResNet的启发,很多作者又提出了更优秀的神经网络,如:DenseNet等 # 为何难以突破20层 一般增加网络层数后,可以进行更加复杂的特征模式的提取,所以当模型更深时理论上可以取得更好的结果。 但是,当超过20层时,层数越多越会出现 **退化** 问题(Degradation problem):网络准确度出现饱和,甚至出现下降。 **注意:**不是过拟合导致的 如下图: [![](https://www.malaoshi.top/upload/0/0/1EF5KUgAWZNn.png)](https://www.malaoshi.top/upload/0/0/1EF5KUgAWZNn.png) 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): [![](https://www.malaoshi.top/upload/0/0/1EF5KVR4LufL.png)](https://www.malaoshi.top/upload/0/0/1EF5KVR4LufL.png) 当残差`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的网络结构对比图: [![](https://www.malaoshi.top/upload/0/0/1EF5KW6TpGnt.jpg)](https://www.malaoshi.top/upload/0/0/1EF5KW6TpGnt.jpg) ### 34-layer plain 按照VGG19的理论,继续加卷积层,加到34层网络时,训练此网络,会发生 **退化** 问题 ### 34-layer ResNet - 每两层增加了 **短路机制**,形成 **残差学习** - 虚线表示卷积核数量增加一倍,`stride=2`做下采样,即:feature map尺寸小一半、数量增加一倍,这保持了网络层的复杂度。 - 最后用`global average pool`层替换了全连接层,参数更少 ### 对比网络效果 对比18-layer 和 34-layer 的网络效果,如下图: [![](https://www.malaoshi.top/upload/0/0/1EF5KYYXSVrt.png)](https://www.malaoshi.top/upload/0/0/1EF5KYYXSVrt.png) 普通的 18-layer 和 34-layer 网络出现退化现象,但是ResNet 18-layer 和 34-layer 没有退化问题。 # ResNet各类网络结构 [![](https://www.malaoshi.top/upload/0/0/1EF5KW5v4dtq.png)](https://www.malaoshi.top/upload/0/0/1EF5KW5v4dtq.png) ### stage conv1 到 conv5_x,每一个称之为stage,即:stage1 到 stage5 ### block 每一个`[]`括起来的,称之为一个 block 也就是说,一个stage由若干个重复的block组成 # 50层以下的残差块 50层以下的残差块: [![](https://www.malaoshi.top/upload/0/0/1EF5KYkrZx90.png)](https://www.malaoshi.top/upload/0/0/1EF5KYkrZx90.png) 特点如下: - 每一个 block 由 2 层卷积 组成,每两层进行一次残差学习 - 所有的卷积核大小都是`3x3` - **下一个stage的卷积核数量是上一个的2倍** - 每个 stage,block 重复次数不同 对于短路连接(shortcut connection),当输入和输出维度一致时,可以直接将输入加到输出上 # 50层以上的残差块 超过50层的Resnet,残差块是 3层卷积操作,如下图: [![](https://www.malaoshi.top/upload/0/0/1EF5KYoAXao6.png)](https://www.malaoshi.top/upload/0/0/1EF5KYoAXao6.png) - 通过 第一层 卷积运算(卷积核大小:1x1,数量:上一层的1/4) **目的:**降低维度,为下一步卷积降低运算量,称之为:**bottleneck--瓶颈** - 通过 第二层 卷积运算(卷积核大小:3x3,数量与第一层相同) - 通过 第三层 卷积运算(卷积核大小:1x1,数量是上一层的4倍) 目的:升高维度,将复杂度恢复到之前 ### bottleneck 瓶颈 50层以上的ResNet,残差块的 **第一层** 相当于下图中的 **bottleneck 瓶颈**,其作用就是将上层的 输入 降维,否则运算量太大,第三层再将维度升上去,所以看上去就像下图: [![](https://www.malaoshi.top/upload/0/0/1EF5WTJseyMy.jpg)](https://www.malaoshi.top/upload/0/0/1EF5WTJseyMy.jpg) **合理的运用瓶颈,能减小运算量,而且不会影响网络性能** # ResNet发展 按照发展,分为: 2. ResNet V2 3. ResNeXt 原文出处:http://malaoshi.top/show_1EF5Ka4fKW9A.html