【动手学深度学习】06-ResNet解析

目录

ResNet解析

0 前言

1 基础

2 残差块

3 总结

参考


ResNet解析

0 前言

论文:《Deep Residual Learning for Image Recognition》

论文地址:Deep Residual Learning for Image Recognition | IEEE Conference Publication | IEEE Xplore

1 基础

经典网络ResNet(Residual Networks)由Kaiming He等人于2015年提出, 它在2015年的ImageNet图像识别 挑战赛夺魁,并深刻影响了后来的深度神经⽹络的设计。

在ResNet网络提出之前,传统的卷积神经网络都是通过将一系列卷积层与下采样层进行堆叠得到的。但是当堆叠到一定网络深度时,就会出现两个问题。

1)梯度消失或梯度爆炸。

2)退化问题(degradation problem)。

在ResNet论文中说通过数据的预处理以及在网络中使用BN(Batch Normalization)层能够解决梯度消失或者梯度爆炸问题。但是对于退化问题(随着网络层数的加深,效果还会变差,如下图所示)并没有很好的解决办法。

【动手学深度学习】06-ResNet解析_第1张图片

随着我们设计越来越深的⽹络,深刻理解“新添加的层如何提升神经⽹络的性能”变得⾄关重要。更重要的是设计⽹络的能⼒,在这种⽹络中,添加层会使⽹络更具表现⼒。假设有⼀类特定的神经⽹络结构 F,它包括学习速率和其他超参数设置。对于所有f\epsilon F ,存在⼀些参数集(例如权重和偏置),这些参数可以通过在合适的数据集上进⾏训练而获得。现在假设f^{^{*}} 是我们真正想要找到的函数,如果是 {f^{*}}\epsilon F^{} ,那我们可以轻而易举的训练得到它,但通常我们不会那么幸运。相反,我们将尝试找到⼀个函数 f_{F}^{*},这是我们在 F 中的最佳选择。例如,给定⼀个具有 X 特性和 y 标签的数据集,我们可以尝试通过解决以下优化问题来找到它:
f_{F}^{*}:=argmin(X,y,f), f\epsilon F
怎样得到更近似真正 f^{*} 的函数呢?唯⼀合理的可能性是,我们需要设计⼀个更强⼤的结构 F 。换句 话说,我们预计 f^{*}_{F^{'}}   f^{*}_{F} “更近似”。然而,如果 F\nsubseteq F^{'} ,则⽆法保证新的体系“更近似”。 如下图 所⽰,对于⾮嵌套函数( non-nested function)类(下图左),较复杂的函数类并不总是向“真”函 数 f^{*}靠拢(复杂度由 F 1 F 6 递增)。 虽然 F 3 F 1 更接近 f^{*},但 F 6 却离的更远了。相 反对于下图 右侧的嵌套函数( nested function )类 F 1 . . . ⊆ F 6 ,我们可以避免上述问题。

 

【动手学深度学习】06-ResNet解析_第2张图片

只有当较复杂的函数类包含较小的函数类时,我们才能确保提⾼它们的性能。对于深度神经⽹络,如 果我们能将新添加的层训练成 恒等映射(identity function f ( x ) = x ,新模型和原模型将同样有效。同时,由于新模型可能得出更优的解来拟合训练数据集,因此添加层似乎更容易降低训练误差。
从另一个角度来理解:

我们可以设想:当我们直接对网络进行简单的堆叠到特别长,网络内部的特征在其中某一层已经达到了最佳的情况,这时候剩下层应该不对改特征做任何改变,也就是说,对一个特别深的深度网络而言,该网络的浅层形式的解空间应该是这个深度网络解空间的子集,换句话说,相对于浅层网络更深的网络至少不会有更差的效果,但是因为网络degradation的问题,这并不成立。

那么,我们退而求其次,已知有网络degradation的情况下,不求加深度能提高准确性,能不能至少让深度网络实现和浅层网络一样的性能,即让深度网络后面的层至少实现恒等映射的作用。
 

针对这⼀问题,何恺明等⼈提出了残差⽹络( ResNet。残差⽹络的核⼼思想是:每个附加层都应该更容易地包含原始函数作为其元素之⼀。于是,残差块(residual blocks )便诞⽣了,这个设计对如何建⽴深层神经⽹络产⽣了深远的影响。

2 残差块

假设我们的原始输⼊为 x ,而希望学出的理想映射为 f ( x ) ,下图 左图虚线框中的部分需要直接拟合出该映射 f ( x ) ,而右图虚线框中的部分则需要拟合出残差映射 f ( x ) x 残差映射在现实中往往更容易优化。以本节开头提到的恒等映射作为我们希望学出的理想映射 f ( x ) ,我们只需将下图 中右图虚线框内上⽅的加权运算(如仿射)的权重和偏置参数设成 0 ,那么 f ( x ) 即为恒等映射。实际中,当理想映射 f ( x ) 极接近于恒等映射时,残差映射也易于捕捉恒等映射的细微波动。 右图是 ResNet 的基础结构--残差块( residual block )。在残差块中,输⼊可通过跨层数据线路更快地向前传播。

【动手学深度学习】06-ResNet解析_第3张图片

ResNet 沿⽤了 VGG 完整的 3 × 3 卷积层设计。残差块⾥⾸先有 2 个有相同输出通道数的 3 × 3 卷积层。每 个卷积层后接⼀个批量归⼀化层BN和 ReLU 激活函数。然后我们通过跨层数据通路,跳过这 2 个卷积运算,将输⼊直接加在最后的 ReLU 激活函数前。这样的设计要求 2 个卷积层的输出与输⼊形状⼀样,从而可以相加。如果想改变通道数,就需要引⼊⼀个额外的 1 × 1 卷积层来将输⼊变换成需要的形状后再做相加运算。

【动手学深度学习】06-ResNet解析_第4张图片

使用残差块之后随着网络层数的加深,效果变好而不是变差(图来自论文)。【动手学深度学习】06-ResNet解析_第5张图片

 

ResNet 的前两层为:输出 通道数为 64 、步幅为 2 7 × 7 卷积层,后接步幅为 2 3 × 3 的最⼤汇聚层。
ResNet 则使⽤ 4 个由残差块组成的模块,每个模块使⽤若⼲个同样输出通道数的残差块。第⼀个模块的通道数同输⼊通道数⼀致。由于之前已经使⽤了步幅为2 的最⼤汇聚层,所以⽆须减小⾼和宽。之后的每个模块在第⼀个残差块⾥将上⼀个模块的通道数翻倍,并将⾼和宽减半。
每个模块有 4 个卷积层(不包括恒等映射的 1 × 1 卷积层)。加上第⼀个 7 × 7 卷积层和最后⼀个全连接层,共有 18 层。
注:恒等映射的 1 × 1 卷积层能够在top1上提升大概0.5%的准确率

 

【动手学深度学习】06-ResNet解析_第6张图片

 RseNet 网络具体参数图

【动手学深度学习】06-ResNet解析_第7张图片

3 总结

  1. 学习嵌套函数(nested function)是训练神经⽹络的理想情况。在深层神经⽹络中,学习另⼀层作为恒等映射(identity function)较容易(尽管这是⼀个极端情况)。
  2. 残差映射可以更容易地学习同⼀函数,例如将权重层中的参数近似为零。
  3. 利⽤残差块(residual blocks)可以训练出⼀个有效的深层神经⽹络:输⼊可以通过层间的残余连接更快地向前传播。
  4. 残差⽹络(ResNet)对随后的深层神经⽹络设计产⽣了深远影响,⽆论是卷积类⽹络还是全连接类⽹络。
  5. 使用BN层加速训练,丢弃了Dropout.

参考

李沐 《动手学深度学习》

(44条消息) 深度学习网络篇——ResNet_PRIS-SCMonkey的博客-CSDN博客_深度学习网络

(44条消息) 六、ResNet网络详细解析(超详细哦)_会哭泣的猫的博客-CSDN博客_resnet网络 

你可能感兴趣的:(动手学深度学习,pytorch,深度学习,机器学习)