【CNN】ResNet——开启的深度学习从1到无限可能的新时代

前言

深度残差网络(Deep residual network, ResNet)的提出是CNN图像史上的一件里程碑事件,ResNet在2015年发表当年取得了图像分类,检测等等5项大赛第一,并又一次刷新了CNN模型在ImageNet上的历史记录。直到今天,各种最先进的模型中依然处处可见残差连接的身影,其paper引用量是CV领域第一名。ResNet的作者何恺明也因此摘得CVPR2016最佳论文奖。

ResNet论文下载链接:
ResNeXt论文下载链接:
ResNeSt论文下载链接:

一、深度学习网络退化问题

从经验来看,网络的深度对模型的性能至关重要,当增加网络层数后,网络可以进行更加复杂的特征提取,所以当模型更深时理论上可以取得更好的结果,从VGG网络可以看出网络越深而效果越好。但是更深的网络其性能一定会更好吗?

实验发现深度网络出现了退化问题(Degradation problem):网络深度增加时,网络准确度出现饱和,甚至出现下降。下图节选自ResNet原论文,不管是训练阶段还是验证阶段,56层的网络比20层网络错误率还高,效果还要差。究竟是什么原因导致的这一问题?
在这里插入图片描述
首先印入脑海的就是神经网络的常见问题:过拟合问题
但是,过拟合的一般表现为训练阶段效果很好,测试阶段效果差。这与上图情况是不相符的。

除此之外,最受人认可的原因就是梯度爆炸/梯度弥散了。为了理解梯度的不稳定性原因,首先回顾一下反向传播的知识。

反向传播结果的数值大小不止取决于求导的式子,很大程度上也取决于输入的模值。因为神经网络的计算本质其实是矩阵的连乘,当计算图每次输入的模值都大于1,那么经过很多层回传,梯度将不可避免地呈几何倍数增长,直到Nan。这就是梯度爆炸现象。当然反过来,如果我们每个阶段输入的模恒小于1,那么梯度也将不可避免地呈几何倍数下降,直到0。这就是梯度消失现象。由于至今神经网络都以反向传播为参数更新的基础,所以梯度不稳定性原因听起来很有道理。

然而,事实也并非如此,至少不止如此。我们现在无论用Pytorch还是Tensorflow,都会自然而然地加上Bacth Normalization(简称BN,在GoogLeNetV2中被提出),而BN的作用本质上也是控制每层输入的模值,因此梯度的爆炸/消失现象理应在很早就被解决了(至少解决了大半)。

不是过拟合,也不是梯度不稳定原因引起的,这就很尴尬了……CNN没有遇到我们熟知的两个老大难问题,却还是随着模型的加深而导致效果退化。无需任何数学论证,我们都会觉得这不符合常理。

为什么说模型退化不符合常理?按理说,当我们堆叠一个模型时,理所当然的会认为效果会越堆越好。因为,假设一个比较浅的网络已经可以达到不错的效果,那么即使之后堆上去的网络什么也不做,模型的效果也不会变差。然而事实上,这却是问题所在。什么都不做”恰好是当前神经网络最难做到的东西之一。MobileNet V2的论文也提到过类似的现象,由于非线性激活函数Relu的存在,每次输入到输出的过程都几乎是不可逆的(信息损失)。我们很难从输出反推回完整的输入。

也许赋予神经网络无限可能性的“非线性”让神经网络模型走得太远,使得特征随着层层前向传播得到完整保留(什么也不做)的可能性都微乎其微。用学术点的话说,这种“不忘初心”的品质在神经网络领域被叫做恒等映射(identity mapping)。因此,可以认为Residual Learning的初衷,其实是让模型的内部结构至少有恒等映射的能力。以保证在堆叠网络的过程中,网络至少不会因为继续堆叠而产生退化!
在这里插入图片描述
前面分析得出,如果深层网络后面的层都是是恒等映射,那么模型就可以等价转化为一个浅层网络。那现在的问题就是如何得到恒等映射了。事实上,已有的神经网络很难拟合潜在的恒等映射函数H(x) = x。但如果把网络设计为H(x) = F(x) + x,即直接把恒等映射作为网络要学习并输出的一部分。就可以把问题转化为学习一个残差函数F(x) = H(x) - x.

所谓残差连接指的就是将浅层的输出和深层的输出求和作为下一阶段的输入,这样做的结果就是本来这一层权重需要学习的是一个对 x 到 H(x) 的映射,那使用残差链接以后,权重需要学习的映射变成了从x -> H(x) - x 。这样在反向传播的过程中,小损失的梯度更容易抵达浅层的神经元。其实这个和循环神经网络LSTM中控制门的原理也是一样的。

图中右侧的曲线叫做残差链接(residual connection),通过跳接在激活函数前,将上一层(或几层)之前的输出与本层计算的输出相加,将求和的结果输入到激活函数中做为本层的输出

这里一个Block中必须至少含有两个层,否则几乎没用。

三、ResNet的网络结构

ResNet网络是参考了VGG19网络,在其基础上进行了修改,并通过短路机制加入了上图所示的残差链接。除此之外,变化主要体现在ResNet直接使用stride=2的卷积做下采样(取代了VGG中的池化),并且用global average pool层替换了全连接层(这样可以接收不同尺寸的输入图像),另外模型层次明显变深。相似之处是两者都是通过堆叠3X3的卷积进行特征提取。

ResNet的一个重要设计原则是:当feature map大小降低一半时,feature map的数量增加一倍,这一定程度上减轻了因减少特征图尺寸而带来的信息损失(换句话说,将输入信息的特征从空间维度提取到通道维度上)

从下图中可以看到,ResNet相比普通卷积网络每两层间增加了残差链接,其中虚线表示feature map数量发生了改变
在这里插入图片描述
在ResNet原论文中,作者给出了五个不同层次的模型结构,分别是18层,34层,50层,101层,152层。上图所示的是34层的模型结构。下图给出所有模型的结构参数:
在这里插入图片描述
值得注意的是: 50层,101层和152层使用的残差模块与之前介绍的不同。主要原因是深层次的网络中参数量太大,为了减少参数,在3X3卷积前先通过1X1卷积对channel维度进行降维,其灵感大概来自于GoogLeNetV3中提出了网络设计准则。
在这里插入图片描述
如上图所示:左图是浅层模型用的残差结构;右图是深层模型用的残差结构。

注意:对于残差,只有当输入和输出维度一致时,才可以直接将输入加到输出上。但是当维度不一致时,不能直接相加。这时可以采用新的映射(projection shortcut),比如一般采用1x1的卷积对残差传递的信息做维度调整

四、残差的调参

其实残差链接有多种调整方式,比如激活函数的位置?BN的位置?连接跨越的卷积数量?等等都是可以调整的地方。因此有文献对这些变体残差做了研究并实验。最后根据实验结果提出了一个效果最好的残差方式如下图:改进前后一个明显的变化是采用pre-activation,BN和ReLU都提前了。
在这里插入图片描述
这篇文献中的ResNet深度都是上千层的模型。之后,研究者们觉得ResNets以及足够深了, 便开始在对模块进行加宽。

五、残差连接的渊源

其实残差连接可以看成一种特殊的跳跃连接,早在15年的时候,还有一篇Highway Networks【传送门】使用了类似的结构,在旁路中设置了可训练参数。如下所示:

传统的神经网络对输入 X 使用一个非线性变换 H 来得到输出output,公式如下:
在这里插入图片描述
Highway network基于门机制引入了transform gate T和carry gate C,输出output是由tranform input和carry input组成, ,公式如下:
在这里插入图片描述
T为转换门(输出须经H处理),C为携带门(直接输出原始信息X)。 它们分别表示通过转换输入和携带输入分别产生多少输出。为了简单起见,我们设定C=1-T,也就是C=1-T。 公式变为:
在这里插入图片描述
特别的:
在这里插入图片描述
可以看到Highway Network其实就是对输入一部分进行处理(和传统神经网络相同),一部分直接通过. 其实,ResNet可以看成Highway Network的一种特殊情况。即:
在这里插入图片描述
都等于1的情况。不过 Highway Network效果没有ResNet好,似乎就验证了保持旁路畅通无阻(恒等映射)的重要性。 高速公路网络这个名字很形象, 因为这样的结构使得特定信息可以无损地通过"高速公路"直达目的地 。

六、残差连接有效性的解释

对于残差链接的有效性,除了作者提出的学习恒等映射的思想以外。我觉得有两个更加合理的解释:

第一,把残差网络展开, 相当与集成(ensemble)了多个神经网络, 这是一种典型的集成学习的思想(ensemble learning),如下图示:
在这里插入图片描述
左边的残差网络看似是单路的网络结果,其实如果把信息前向计算的可能路径全部画出来,即右边子图所示,此时可以看作是很多单路网络集成在一起形成的多路网络结构。
另外,Deep Networks with Stochastic Depth
这篇工作表明ResNet太深了,有些层是没必要的。实验方法简单解释就是通过在训练过程中随机丢掉一些层,来优化深度残差网络的训练过程。网络变得简单一点了。

具体的实现是通过Drop path :假设残差网络表达为公式y=H(x)+x ,那么Stochastic Depth Net训练时,会加入了随机变量 b(伯努利随机变量),通过y= b*H(x)+x,对 ResBlock的残差部分做了随机丢弃。如果b = 1,则简化为原始的ResNet结构;如果b = 0,则这个ResBlock未被激活,降为恒等函数。此外,Stochastic Depth Net还使用线性衰减的生存概率原则来随机丢弃整个模型中不同深度的层级结构,如下图所示,将“线性衰减规律”应用于每层的生存概率,由于较早的层会提取低级特征,而这些低级特征会被后面的层所利用,所以这些层不应该频繁地被丢弃。最终 p 生成的规则就变成了这样:
在这里插入图片描述
实际上,Stochastic Depth Net的Drop path 与 AelxNet中提出的Dropout大同小异;只是两者的作用对象不同:Dropout是作用在神经元级别上的;而Drop path比较高级,其是作用在网络的层级结构上的。

Drop path方法在后期的模型中被广泛应用,例如VIT, swin-Transformer等等。它与DenseNet有异曲同工之妙,但是DenseNet由于需要存储中间计算结果,因而太占用内存了(即便网络参数量少),这可能也是为什么DenseNet参数少,比ResNet性能好,但是,还没有ResNet流行的原因。而Drop path就可以看成一种折中的手段,因此被后续模型不断借鉴使用。

再想一想,其实Drop path也是一种集成学习的思想,因为每次训练模型时随机失活的层级结构都不一样,等价于每次都训练了一个全新的子模型;在测试过程(推理预测)中,所有的block都将保持被激活状态,以充分利用整个长度网络的所有模型容量,这实际上是集成了训练时期的所以子模型来做推理。这个现象似乎说明,其实残差网络其实也不能说是解决了模型深度的问题,他只是因为隐含了集成神经网络的结构,所以即使在某些神经元失效时,仍然可以保证模型的整体效果。
在这里插入图片描述
第二,残差链接更有利于梯度传播
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lingchen1906

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

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

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

打赏作者

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

抵扣说明:

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

余额充值