ResNet论文学习与理解


ResNet出自论文《Deep Residual Learning for Image Recognition》,该论文可以在IEEE中检索到。

核心思想

引入残差的原因——网络退化

作者在文中提出了一种残差学习,目的是为了简化对deeper network的优化和训练。事实上,网络的深度非常重要,这是因为不同深度的网络提取到的特征是不同的,而我们希望获得更深的语义信息。那么从理论上讲,当网络层数加深时,网络达到的效果应当是更好的,但实践表明,单纯的增加网络深度会引起梯度消失/梯度爆炸,但这一问题可以通过Xavier初始化和中间层归一化来解决,从而即便深层的网络也可以收敛。但,一般收敛的网络当达到一定深度后,再增加网络层数反而会使得网络误差增大,也就是会出现网络退化问题。如下图所示。
1这张图分别展示了20-层普通网络(plain network)和56-层普通网络的训练误差与测试误差。可以看到,在整个训练过程中更深的56-层网络反而具有更高的两种误差。文中提到,这种退化并非是由过拟合导致的,为了解决这棘手的问题,作者提出了残差学习,即residual leaning。

残差网络——解决退化问题

作者在文中提出了一种深层网络的构建方法,“There exists a solution by construction to the deeper model: the added layers are identity mapping, and the other layers are copied from the learned shallower model. ” 即在一个普通网络的后面增加恒等映射层,那么无论该网络有多深,都相当于是一个较浅的网络了,进而可以至少达到浅层网络的精度,从而避免网络退化问题。但是,让网络直接去拟合恒等映射 H ( x ) = x H(x)=x H(x)=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,此时只要 F ( x ) F(x) F(x)收敛于0,我们就有 H ( x ) = x H(x)=x H(x)=x。下图所示为残差块
2

  • 通过在一层或几层之间添加shortcut connection就能实现 H ( x ) = F ( x ) + x H(x)=F(x)+x H(x)=F(x)+x的形式,其中shortcut connection通过恒等映射来实现,这种方法既不会给网络引入新的参数,也不会增加复杂度!这使得我们可以直接比较相同深度、宽度、计算量和参数量的普通网络和残差网络的性能。整个网络依然可以通过端到端的反向传播SGD来训练。
  • 为了验证残差思想的正确性,作者在ImageNet/CIFAR-10上进行了实践,ImageNet的实验结果表明deep残差网络更容易进行优化,通过CIFAR-10的实践进一步表明网络优化的困难性与残差学习的可用性不是限定于某一数据集上的,说明残差学习是一个通用的学习方法。
残差表示
  • 假设网络的某几层可以近似拟合一个复杂函数 H ( x ) H(x) H(x),那么便可等价的拟合函数 H ( x ) − x = F ( x ) H(x)-x=F(x) H(x)x=F(x)(假设输入与输出的维度相同),进而 H ( x ) = F ( x ) + x H(x)=F(x)+x H(x)=F(x)+x。尽管两种方式都可以拟合我们想要的函数,但学习的难易程度是不一样的。实验证明,这种加入了恒等映射的重构可以简化学习。
  • VALD/Fisher Vector等重构方法与多重网格法/分层基础预处理等预处理方法都表明,良好的重构或预处理可以在一定程度上简化优化过程,从而文章中的残差表示作为一种重构自然也可以简化对网络的优化。
shortcut连接

这里采用的shortcut思想与Highway network中有些类似。

  • H-n中是以门函数(gating functions)的形式表示shortcut connections,这些门函数依赖于数据且含有参数,而R-n中以恒等映射的方式是不含有参数的。
  • H-n中shortcut是可以关闭的,此时这些层所表现的就不再是残差函数。相反在R-n中,shortcut可以一直学习残差函数,原因就在于采用了恒等映射,因此R-n中的shortcut永远不会关闭。
  • 对形如下图的残差块,可以定义为 y = F ( x , { W i } ) + x y=F(x,\{W_i\})+x y=F(x,{Wi})+x,其中 x , y x,y x,y分别为该结构的输入和输出, F ( x , { W i } ) F(x,\{W_i\}) F(x,{Wi})表示需要学习的残差函数。若忽略偏置,以 σ \sigma σ表示ReLU激活函数,那么下图中, F = W 2 σ ( W 1 x ) F=W_2\sigma(W_1x) F=W2σ(W1x),通过恒等映射shortcut和逐元素相加(element-wise addition)就可以实现 F + x F+x F+x,最后再对输出进行非线性化得到 σ ( y ) \sigma(y) σ(y)
    3
    如上所说,对于这种定义要求残差 F F F x x x的维度相同,当不满足该条件时,需要采取一些措施来匹配维度,文中给出了三种增加维度的方法:
  • A:0-填充的shortcuts;
  • B:添加线性投影 W s W_s Ws的shortcuts(其余保持恒等映射), y = F ( x , { W i } ) + W s x y=F(x,\{W_i\})+W_sx y=F(x,{Wi})+Wsx
  • C:所有shortcuts均添加线性投影 W s W_s Ws
    作者在文中的实验包括了2或3层的残差块,但只含1层的残差块并不会带来任何改进,除此之外也可尝试更多的层。

个人理解

  • 在浅层网络后添加恒等映射层可以在保持原浅层网络已有精度的前提下,通过加深层数来获取更高的精度(至少是浅层网络的精度,就算精度没得到提高,也避免了退化问题(●’◡’●))。
  • 网络退化并非是由过拟合引起的,这一点作者在原文中也有提到。过拟合现象通常是指模型在训练集上表现优秀,但在测试集上表现很差,然而通过第一张图以及文中表述,对于一般网络加深层数时,较深的网络不仅在测试误差上较高,在训练误差上也要比浅网络的高。因此深层网络的退化问题来源不是过拟合。
  • 残差函数 F ( x ) F(x) F(x)相比原映射 H ( x ) H(x) H(x)对输出更为敏感,从而对权重的调整作用更好。比如, H ( 5 ) = 5.1 = F ( 5 ) + 5 H(5)=5.1=F(5)+5 H(5)=5.1=F(5)+5,即 F ( 5 ) = 0.1 F(5)=0.1 F(5)=0.1,当输出从 5.1 5.1 5.1变为 5.2 5.2 5.2时, H ′ = 0.1 / 5.1 ≈ 0.2 H'=0.1/5.1\approx0.2 H=0.1/5.10.2,而 F ′ = 0.1 / 0.1 = 1 F'=0.1/0.1=1 F=0.1/0.1=1
    此处参考残差网络ResNet笔记
    (评论中有说这种想法不正确,我也还没有弄太懂,过几天空一点再好好思考思考😐)

网络结构

文章中对比VGG-19给出了两种网络:Plain Network和对应的Residual Network,下图所示中间为普通网络,右侧为残差网络。

4

组成

普通网络的基本结构:

  • 网络中的大多数卷积核均为 3 × 3 3\times3 3×3
  • 对于输出相同特征图尺寸的层,卷积核的数目保持相同;
  • 对与输出特征图尺寸减半的层,卷积核数目加倍以保持每层的时间复杂度;
  • 每个卷积层后有步长为2的下采样操作;
  • 网络最后为全局平均池化层核1000-way的全连接层;
  • 网络总层数为34(中间32层+开头 7 × 7 c o n v 7\times7conv 7×7conv+结尾 f c 1000 fc1000 fc1000)。

下面是残差网络中新增结构:

  • 加入了恒等shortcuts,实线表示相同维度下的shortcuts,虚线表示需要增加维度使得shortcuts。

实现操作

  • 对输入图片resize以进行尺度增强;
  • 采用了标准色彩增强;
  • 在每层卷积操作后、激活函数之前进行BN(批归一化);
  • 采用Xavier初始化方法初始化权重并从头训练两种网络;
  • 采用mini-batch大小为256的SGD训练,学习率从0.1开始

Deeper Bottleneck Architecture

文中给出了两种残差结构:
5
上图中左边为普通的两层残差块,右边为三层的bottleneck残差块。其中包括两个 1 × 1 c o n v 1\times1conv 1×1conv,作用是减小/提高输入/输出的维度,和一个 3 × 3 c o n v 3\times3conv 3×3conv
在这两种结构的基础上,文中给出了几种常用的不同深度的网络:
6
针对几种不同的网络,作者进行了基于不同数据集的大量的实验,文中也给出了详细的评估结果。
7
很明显的,ResNet的效果好到爆😐。

小结

加深网络带来的问题?

(1)梯度消失或爆炸
为什么网络加深会出现梯度消失或者梯度爆炸呢?目前对于神经网络的优化大多都是基于反向传播的思想,即根据损失函数计算的误差利用梯度反向传播的方式来指导深度网络权值的更新优化。因为整个深度网络可以看作一个复合的非线性函数 : F ( x ) = f n ( . . . f 3 ( f 2 ( f 1 ( x ) ∗ w 1 + b ) ∗ w 2 + b ) . . . ) F(x)=f_n(...f_3(f_2(f_1(x)*w_1+b)*w_2+b)...) F(x)=fn(...f3(f2(f1(x)w1+b)w2+b)...),所以这种优化方式是合理的。但是由于在反向传播过程中需要对激活函数进行求导:

  • 如果导数大于1,那么随着网络层数的增加,梯度更新将会朝着指数爆炸的方式增加这就是梯度爆炸
  • 同样如果导数小于1,那么随着网络层数的增加梯度更新信息会朝着指数衰减的方式减少这就是梯度消失
    因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。
    (这里仅考虑了反向传播问题,引发梯度爆炸的原因除此之外还有权重初始化过大等)。
    此处参考梯度消失,梯度爆炸产生的原因及解决办法

(2)网络退化

忘记在哪里看到过了,大概意思好像是这样的,随着网络层数的加深,需要拟合的非线性函数也越来越复杂,但是求解器的能力有限,所以当网络层数增加到一定程度后,求解器无法拟合这些复杂的函数,就导致后面增加的这些层不会再起到提升作用,也就是网络发生了退化。所以在本文中作者提出对加深的层用恒等映射来拟合,优秀。

为什么残差学习可以解决网络退化?

对于一个神经网络模型,如果该模型是最优的,那么训练就很容易将残差函数 F ( x ) = H ( x ) − x F(x)=H(x)-x F(x)=H(x)x优化到0,此时就有 H ( x ) = x H(x)=x H(x)=x。那么无论怎么增加深度,理论上网络会一直处于最优状态,因为后面都是恒等映射了,就相当于后面所有增加的网络都会沿着恒等映射 I : x — > x I:x—>x I:x>x进行信息传输,说的直白点就是这个最优网络后面的层数无异于废层,因为它们已经不具备特征提取的能力了,自然就不会导致训练误差or测试误差的增加。那么,网络的性能也就不会随着深度的增加而降低了,over。

大概捋了一遍论文,感受到的只有表面内容,等啥时候有时间再来捋一遍吧,仙女哭泣,太疲惫了┭┮﹏┭┮

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值