精读《ResNet-Deep Residual Learning for Image Recognition》

精读《ResNet-Deep Residual Learning for Image Recognition》

[论文原地址:] Deep Residual Learning for Image Recognition (arxiv.org)

一、前期知识储备

1.1 梯度消失/爆炸

\quad \quad 梯度消失和梯度爆炸的根源主要是因为深度神经网络结构以及反向传播算法,目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过反向传播的方式,指导深度网络权值的更新。梯度消失和梯度爆炸两种情况产生的原因可以总结成2类原因:

​ 1.深层网络的结构

​ 2.不合适的损失函数比如Sigmoid函数。梯度爆炸一般出现在深层网络和权值初始化值太大的情况下。

1.2 过拟合

\quad \quad Overfitting 也被称为过度学习,过度拟合。 通俗一点地来说过拟合就是模型把数据学习的太彻底,以至于把噪声数据的特征也学习到了,这样就会导致在后期测试的时候不能够很好地识别数据,即不能正确的分类,模型泛化能力太差。它是机器学习中常见的问题,例如下面Classification(分类)的例子:

\quad \quad 图中黑色曲线是正常模型,绿色曲线就是overfitting模型。尽管绿色曲线很精确的区分了所有的训练数据,但是并没有描述数据的整体特征,对新测试数据的适应性较差, 因为他不能成功的表达除了训练数据以外的其他数据,这就叫做过拟合Overfitting。

​ 解决方法:

(1)清洗数据:导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。

(2)数据增广:增大数据的训练量,我们用于训练的数据量太小,训练数据占总数据的比例过小。

(3)采用正则化方法:正则化方法包括L0正则、L1正则和L2正则,而正则一般是在目标函数之后加上对于的范数。但是在机器学习中一般使用L2正则,下面看具体的原因。

\quad \quad L0范数是指向量中非0的元素的个数。L1范数是指向量中各个元素绝对值之和,也叫**“稀疏规则算子”(Lasso regularization)**。两者都可以实现稀疏性,既然L0可以实现稀疏,为什么不用L0,而要用L1呢?个人理解一是因为L0范数很难优化求解(NP难问题),二是L1范数是L0范数的最优凸近似,而且它比L0范数要容易优化求解。所以大家才把目光和万千宠爱转于L1范数。

\quad \quad L2范数是指向量各元素的平方和然后求平方根。可以使得W的每个元素都很小,都接近于0,但与L1范数不同,它不会让它等于0,而是接近于0。L2正则项起到使得参数w变小加剧的效果,但是为什么可以防止过拟合呢?一个通俗的理解便是:更小的参数值w意味着模型的复杂度更低,对训练数据的拟合刚刚好(奥卡姆剃刀),不会过分拟合训练数据,从而使得不会过拟合,以提高模型的泛化能力。还有就是看到有人说L2范数有助于处理 condition number不好的情况下矩阵求逆很困难的问题<–具体这儿我也不是太理解–>。

(4)采用dropout方法:也就是我们之前提到过的随机失活方法,它可以让一些神经元以一定的概率失活,从而模拟出多种不同结构模型带来更好的效益。

1.3 1*1的卷积层是怎么实现维度变换的?

1 ∗ 1 1*1 11的卷积核主要有两个功能: \quad

  • 改变维度
  • 减少参数

\quad \quad 这里主要讲一下维度改变,输入一个三维矩阵用来代表输入图像的height\width\channles,对于该输入给定卷积核大小和数量,假定给定卷积核尺寸为1*1,深度和输入图像的深度一致,图像尺寸为 56 ∗ 56 ∗ 3 56*56*3 56563,卷积核为 1 ∗ 1 ∗ 3 1*1*3 113。每个卷积核在图像上挨个像素(stride=1)进行卷积运算都会得到 56 ∗ 56 ∗ 1 56*56*1 56561的特征图,假定给定卷积核的数量为32个,则就得到 56 ∗ 56 ∗ 32 56*56*32 565632的输出,实现了升维。同理,利用卷积核数量也能实现降维。

img

img

二、论文精读

2.1 ResNet解决了什么问题?

\quad \quad ResNet是何凯明等人在2015年提出的模型,获得了CVPR最佳论文奖。

\quad \quad 众所周知,深度卷积神经网络在CV领域实现了一系列突破。深度神经网络能够自然地将低/中/高级特征和分类器以端到端多层方式进行集成,特征的“级别”可以通过堆叠层的数量(深度)来丰富。经验表明网络深度至关重要,在具有挑战性的ImageNet数据集上领先的结果都采用了“非常深”的神经网络模型,例如:从LeNetAlexNet,再到VGGNetGoogLeNet,网络的深度在不断加深,深度从16(VGG-16)到30 之间。许多其它重要的视觉识别任务也从非常深的模型中得到了极大受益。然而随着网络模型深度增加的趋势,人们同时也发现了一些问题:

(1)梯度消失/爆炸。这是一个众所周知的问题,因为它会从网络训练的开始就阻碍收敛。然而,这个问题通过标准初始化(normalized initialization) 中间标准化层在很大程度上已经解决,这使得数十层的网络能通过具有反向传播的随机梯度下降(SGD优化器)开始收敛。

(2)退化degradation。即网络层数越深时,准确率达到饱和(这可能并不奇怪)然后迅速下降,如下图所示是论文中给出的深度网络退化现象。

\quad \quad 从上图中我们可以看到,作者在CIFAR-10数据集上测试了20层和56层的深度网络(仿照vgg搭建的plain network),结果就是56层的训练误差和测试误差反而比层数少的20层网络更大,并且在适当的深度模型上添加更多的层会导致更高的训练误差,这就是ResNet网络要解决的深度网络退化问题。这个问题违反了人们的直觉反应,随着模型层数加深,应该有更大的解空间,按理不应该出现这种现象,然而作者解释,这种退化现象并不是由Overfitting所引起的。

\quad \quad 在论文中,作者通过引入深度残差学习框架解决了退化问题。下图为一个残差块的内部结构图(用全连接层解释,卷积层类似):

\quad \quad H ( x ) H(x) H(x)表示几个堆叠层期望拟合的基础映射(underlying mapping) F ( x ) F(x) F(x)表示这几个堆叠层的残差映射( residual mapping),之所以说是残差映射,是因为 F ( x ) = H ( x ) − x F(x)=H(x)-x F(x)=H(x)x, x x x表示的是输入。假设 H ( x ) H(x) H(x) x x x同维度,那么拟合 H ( x ) H(x) H(x)与拟合残差函数 F ( x ) = H ( x ) − x F(x)=H(x)-x F(x)=H(x)x等价。则原函数变为 H ( x ) = F ( x ) + x H(x)=F(x)+x H(x)=F(x)+x,于是直接在原网络的基础上加上一个快捷连接(shortcut connections),这里的跨层连接也很简单,就是 将 x x x恒等映射(Identity Mapping) 传递过去。作者假设残差映射比原始的、未参考的映射更容易优化。在极端情况下,如果一个恒等映射是最优的,那么将残差置为零比通过一堆非线性层来拟合恒等映射更容易。从上图可以看出,快捷连接跳过多层,简单地执行恒等映射,并将其输出添加到堆叠层的输出(之后跟着激活函数ReLU)。恒等快捷连接既不增加额外的参数也不增加计算复杂度。整个网络仍然可以由带有反向传播的SGD进行端到端的训练,并且可以使用公共库(例如,Caffe [19])轻松实现,而无需修改求解器。

\quad \quad 在传统深度网络的基础上添加了残差模块形成**残差网络(ResNet)**后,作者们通过对比实验发现取得了很好的效果:

(1)极深的残差网络易于优化,但当深度增加时,对应的“简单”网络(简单堆叠层)表现出更高的训练误差,而本文提出的网络则误差较小;

(2)深度残差网络可以从大大增加的深度中轻松获得准确性收益,生成的结果实质上比以前的网络更好。

\quad \quad 下图是在ImageNet数据集上两种网络的效果对比:

\quad \quad 从图中可以看出,在没有采用ResNet结构之前,如左图所示,34层网络plain-34的性能误差要大于18层网络plain-18的性能误差。而采用ResNet网络结构的34层网络结构ResNet-34性能误差小于18层网络ResNet,同时ResNet-18也比plain-18收敛的更快。因此,采用ResNet网络结构的网络层数越深,则性能越佳。

​ 下图是在CIFAR-10数据集上两种网络的效果对比:

CIFAR-10数据集上也显示出类似的现象,这表明了优化的困难以及该文的方法的影响不仅仅是针对一个特定的数据集。

2.2 ResNet的表现

\quad \quad ResNet在ImageNet分类数据集中获得了很好的结果,他们的152层残差网络是ImageNet上最深的网络,同时还具有比VGG网络更低的复杂性。ResNet模型集合在ImageNet测试集上有3.57% top-5的错误率(下图所示)。并且ResNet在以下比赛中都取得了第一名:

  1. ImageNet Classification

  2. ImageNet Detection

  3. ImageNet Localization

  4. COCO Detection

  5. COCO Segmentation

在这里插入图片描述

\quad \quad 这些成绩表明残差学习准则是通用的,极深的残差学习网络具有很好的泛化性,在多类别视觉任务上都取得的成绩验证了这一点,这就解释了为何现在许多CV Tasks中都喜欢采用ResNet系列模型,常用的有ResNet 50和ResNet 101。

2.3 ResNet中的细节和网络结构
2.3.1 残差学习( Residual Learning)

\quad \quad 残差块的构成及原理如前面所讲,我们通过将几个堆叠层期望拟合的基础映射 H ( x ) H(x) H(x)分成两个支路— F ( x ) F(x) F(x)(残差支路)和 x x x(进行恒等映射的快捷连接路)。尽管两种形式应该都能渐近地近似要求的函数(如假设),但学习的难易程度可能是不同的。如果添加的层可以被构建为恒等映射,更深模型的训练误差应该不大于它对应的更浅版本。退化问题表明求解器通过多个非线性层来近似恒等映射可能有困难。通过残差学习的重构,如果恒等映射是最优的,求解器可能简单地将多个非线性连接的权重推向零来接近恒等映射。

​ {在实际情况下,恒等映射不太可能是最优的,但是本文的重构可能有助于对问题进行预处理。如果最优函数比零映射更接近于恒等映射,则求解器应该更容易找到关于恒等映射的抖动,而不是将该函数作为新函数来学习。作者通过实验显示学习的残差函数通常有更小的响应,表明恒等映射提供了合理的预处理。}

在这里插入图片描述

2.3.2 恒等映射的快捷连接(Identity Mapping by Shortcuts)

\quad \quad 本文每隔几个堆叠层采用残差学习,构建块的定义为:

\quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad y = F ( x , { w i } ) + x y=F(x, \lbrace w_i \rbrace)+x y=F(x,{wi})+x \quad \quad \quad \quad \quad \quad (1)

\quad \quad 其中 x x x y y y考虑的是各层的输入和输出向量, F ( x , { w i } ) F(x,\lbrace w_i \rbrace) F(x,{wi})表示的是要学习的残差函数, F = W 2 σ ( W 1 X ) F=W_2\sigma(W_1X) F=W2σ(W1X) σ \sigma σ表示ReLU激活函数,为了简化写法忽略了偏置项。操作通过快捷连接和各个元素相加来执行。方程(1)中的快捷连接既没有引入外部参数又没有增加计算复杂度。这不仅在实践中有吸引力,而且在简单网络和残差网络的比较中也很重要。我们可以公平地比较同时具有相同数量的参数,相同深度,宽度和计算成本的简单/残差网络(除了不可忽略的元素加法之外)

\quad \quad 方程(1)中和的维度必须是相等的。如果维度不等(例如,当更改输入/输出通道时),我们可以通过快捷连接执行线性投影来匹配维度( w s w_s ws是1*1卷积操作),其定义如下:

\quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad y = F ( x , { w i } ) + W s x y=F(x, \lbrace w_i \rbrace)+W_sx y=F(x,{wi})+Wsx \quad \quad \quad \quad \quad \quad (2)

\quad \quad 后续实验也分别比较了简单网络、残差网络:(A)ResNet-34 A:零填充快捷连接用来增加维度,所有的快捷连接是没有参数的;(B)ResNet-34 B:投影快捷连接用来增加维度,其它的快捷连接是恒等的;(C)ResNet-34 C: 所有的快捷连接都是投影。结果显示,所有三个选项对应的残差网络都比对应的简单网络好很多。

\quad \quad 其中ResNet-34 B略好于ResNet-34 A ,作者认为这是因为A中的零填充确实没有残差学习。选项ResNet-34 C比ResNet-34 B稍好,作者将这归因于许多投影快捷连接引入了额外参数。但整体来说A/B/C之间的差异比较细微,一般利用残差学习解决退化问题就足够了,投影快捷连接对于解决退化问题不是至关重要的,只用于改变维度。所以本文的剩余部分不再使用选项C,以减少内存/时间复杂性和模型大小。

2.3.3 ResNet的网络结构

\quad \quad 从上面对残差结构的描述可以看出,残差结构既不增加计算复杂度(除了几乎可以忽略的元素相加),又不增加模型的参数量,同时这也为模型间的比较提供了方便。下图的左边是VGG-19;下图的中间是作者仿照VGG19堆叠了34层的网络,记为plain-34,虽然更深了,但FLOPs(代表计算复杂度,multiply-adds)仅为VGG-19的18%(毕竟VGG-19两层全连接层太耗时了);下图的右边是针对中间加入了跨层连接即残差结构,注意实线就是直接恒等变换和后面的feature map相加,虚线就是由于维度不匹配需要先升维后相加。

网络结构

\quad \quad 升维有两种方式:第一种是直接全补0,这样做优势是不会增加网络的参数;第二种是1 x 1卷积升维注意这里除第一个stage之外都会在stage的第一层使用步长为2的卷积来进行下采样,倒数第二层输出的feature map后面是全局平均池化(global average pooling),VGGNet预测时转化成全卷积网络的时候也用到了),也就是每个feature map求平均值,因为ImageNet输出是1000个类别,所以再连接一层1000个神经元的全连接层,最后再接上一个Softmax。

\quad \quad 上图左侧为Basic block结构,右侧为Bottle neck结构。前者有两个3x3的卷积层,通道数都是64,右侧那根跳线,也就是Shortcut Connections,将输入x加到输出。后者先是一个1x1的卷积层,然后一个3x3的卷积层,然后又是一个1x1的卷积层。注意的是这里的通道数是变化的,1x1卷积层的作用就是用于改变特征图的通数,使得可以和恒等映射x相叠加,另外这里的1x1卷积层改变维度的很重要的一点是可以降低网络参数量,作者在更深的ResNet上更关心训练的时间,所以这也是为什么更深层的网络采用BottleNeck而不是BasicBlock的原因。ResNet 50,ResNet 101等搜采用的BottleNeck结构。在分清楚Basic block结构Bottle neck结构之后,更深的ResNet就是在这两种块结构之上进行叠加,具体网络构架图如下:

\quad \quad 这五种形式的中间卷积部分虽然都有四个stage,但却各不相同,而网络的其它部分都是相同的。在ImageNet数据集上的表现(下图)来看,ResNet的层数越深,反而top-5 val error越低,甚至152层的精度都超过了浅层的vgg网络,进一步验证了ResNet对解决深度网络退化问题的效果。

三、总结

3.1 ResNet优点

∙ \bullet 相比传统的卷积神经网络如VGG复杂度降低,需要的参数下降。

∙ \bullet 可以做到更深,不会出现梯度弥散的问题。

∙ \bullet 优化简单,分类准确度加深便于于使用更深的网络。

∙ \bullet 解决深层次网络的退化问题。

3.2 网络的深度为什么重要

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

3.3 为什么不能简单地增加网络层数

\quad \quad 对于简单网络,如果简单地叠加深度,会导致梯度弥散或梯度爆炸。对于该问题的解决方法是正则化初始化和中间的正则化层(Batch Normalization),这样的话可以训练几十层的网络。虽然通过上述方法能够训练了,但是又会出现另一个问题,就是退化问题,网络层数增加,但是在训练集上的准确率却饱和甚至下降了。这个不能解释为overfitting,因为过拟合应该表现为在训练集上表现更好才对。退化问题说明了深度网络不能很简单地被很好地优化。

3.4 怎么解决退化/如何理解残差块原理

\quad \quad 即增加一个identity mapping(恒等映射),将原始所需要学的函数 H ( x ) H(x) H(x)转换成 F ( x , w ) + x F(x,w)+x F(x,w)+x,而作者认为这两种表达的效果相同,但是优化的难度却并不相同,作者假设 F ( x , w ) + x F(x,w)+x F(x,w)+x的优化 会比 H ( x ) H(x) H(x)简单的多。这一想法也是源于图像处理中的残差向量编码,通过一个reformulation,将一个问题分解成多个尺度直接的残差问题,能够很好的起到优化训练的效果。

\quad \quad 如何理解残差块的原理,我们想象一下,在引入恒等映射前(即没有右侧曲线),网络的输入为 x x x,经过红色方框内所表示的简单堆叠的网络层后得到一个输出,它是关于权重 w ′ w^{'} w和输入 x x x的函数,我们记成 F ′ ( x , w ′ ) F^{'}(x,w^{'}) F(x,w),而训练网络的 最终目的就是找到一组权重 w ′ w^{'} w,使 F ′ ( x , w ′ ) F^{'}(x,w^{'}) F(x,w)最逼近真实的函数 H ( x ) H(x) H(x),用式子可表示为 F ′ ( x , w ′ ) → H ( x ) F^{'}(x,w^{'})\to H(x) F(x,w)H(x)。但是现实生活中,真实的函数 H ( x ) H(x) H(x)往往非常复杂,想要找到一个足够逼近的函数 F ′ ( x , w ′ ) F^{'}(x,w^{'}) F(x,w)比较困难,花费的代价也比较大,所以作者才有了引入恒等映射的思路。ResNet中的恒等映射将输入直接跨层引到更深的网络层上作为输入的一部分,使得数据在网络中实现了跨层流动

在这里插入图片描述

\quad \quad 如上图所示,引入恒等映射后网络结构发生了变化,输入依然为 x x x w ′ w^{'} w变成了 w w w F ′ ( x , w ′ ) F^{'}(x,w^{'}) F(x,w)变成了 F ( x , w ) F(x,w) F(x,w),训练网络的目的也变成了寻找一组权重 w w w使得 F ( x , w ) + x → H ( x ) F(x,w)+x\to H(x) F(x,w)+xH(x),即 F ( x , w ) → H ( x ) − x F(x,w)\to H(x)-x F(x,w)H(x)x,如果残差函数 F ( x ) F(x) F(x)所对应的权重 w w w全为0,则网络就是恒等映射。因此,作者提出利用残差来重构网络的映射,说白了就是把输入 x x x再次引入到输出输出结果,这样堆叠层的权重会趋向于0,用表达式表示就是: F ( x , w ) + x → H ( x ) → x F(x,w)+x\to H(x) \to x F(x,w)+xH(x)x推出 F ( x , w ) → 0 F(x,w)\to 0 F(x,w)0

3.5 引入残差为何可以更好的训练

\quad \quad 残差的思想都是去掉相同的主体部分,从而突出微小的变化,引入残差后的映射 F ( x , w ) F(x,w) F(x,w)对输出的变化更敏感。举个简单标量的例子:

\quad \quad 假设:
\quad \quad 在引入残差之前,输入 x = 6 x=6 x=6,要拟合的函数 H ( x ) = 6.1 H ( x ) = 6.1 H(x)=6.1,也就是说网络找到了一组权重 w ′ w^{'} w使得 F ′ ( x , w ′ ) → H ( x ) = 6.1 F^{'}(x,w^{'}) \to H(x)=6.1 F(x,w)H(x)=6.1;

\quad \quad 引入残差后,输入不变还是 x = 6 x=6 x=6,要拟合的函数 H ( x ) = 6.1 H ( x ) = 6.1 H(x)=6.1,变化的是 F ( x , w ) + x → H ( x ) = 6.1 F(x,w)+x \to H(x)=6.1 F(x,w)+xH(x)=6.1,可得 F ( x , w ) → 0.1 F(x,w) \to 0.1 F(x,w)0.1

\quad \quad 如果需拟合的函数 H ( x ) H ( x ) H(x) 增大了0.1,那么对原网络来说 F ′ ( x , w ′ ) F^{'}(x,w^{'}) F(x,w) 就是从6.1变成了6.2,增大了1.6%。而对于引入残差的ResNet来说, F ( x , w ) F(x,w) F(x,w)从0.1变成了0.2,增大了100%。很明显,在残差网络中输出的变化对权重的调整影响更大,也就是说反向传播的梯度值更大,训练就更加容易

3.6 ResNet如何解决梯度消失问题

\quad \quad 假设有一个ResNet,包含L个如前所述的残差块(residual block),每一个单元的输入和输出表示为 x l x_l xl x l + 1 x_{l+1} xl+1,那么我们可得如下公式:

在这里插入图片描述

\quad \quad 在反向传播中,令 E E E为总误差,则有下列求导过程:

\quad \quad 式子的第一个因子 ∂ E ∂ x L \frac{\partial E}{\partial x_L} xLE表示损失函数到达 L L L 的梯度,小括号中的1表明恒等映射的快捷连接可以无损地传播梯度,而另外一项残差梯度则需要经过带有权重的层,梯度不是直接传递过来的。很显然,造成梯度消失的根本原因——梯度连乘不复存在了残差梯度不会那么巧全为-1,而且就算其比较小,有1的存在也不会导致梯度消失

四、Reference

[1]ResNet(残差网络)几个关键问题的理解(https://blog.csdn.net/lairongxuan/article/details/91040698)
[2] 详解残差网络(https://zhuanlan.zhihu.com/p/42706477)
[3]ResNet-论文解读(https://blog.csdn.net/abc_138/article/details/80658278)
[4]ResNet论文笔记及代码剖析(https://zhuanlan.zhihu.com/p/56961832)
[5]ResNet网络详解及Pytorch代码实现(https://blog.csdn.net/wuzhuoxi7116/article/details/106309943 )

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bobodareng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值