残差网络(ResNet)

一直拖着没研究大名鼎鼎的残差网络,最近看YOLO系列,研究到YOLOv3时引入了残差网络的概念,逃不过去了,还是好好研究研究吧~

一,引言

   残差网络是深度学习中的一个重要概念,这篇文章将简单介绍残差网络的思想,并结合文献讨论残差网络有效性的一些可能解释。

  以下是本文的概览:

  1.   动机:深度神经网络的“两朵乌云”
  2.   残差网络的形式化定义与实现
  3.   残差网络解决了什么,为什么有效?
  4.   自然语言处理中的残差结构
  5.   总结与扩展

二,动机:深度神经网络的“两朵乌云”

  神经网络具有非常强的表达能力,并且免去了繁重的特征工程,在BP算法提出以及算例逐渐提升的背景下,逐渐受到了研究人员和开发者的青睐。

  在展开文章前,首先以前馈神经网络为例,定义以下神经网络。一个前馈神经网络$f(x; \theta)$,由若干层神经元组成,为了方便讨论,我们以非线性单元(若干层神经元组成的函数单元)为单位讨论神经网络,即神经网络$f(x; \theta)$由L个非线性单元堆叠而成(后面将每个单元称为一层),令$a^{(0)} = x$,则神经网络第$l$层(1≤l≤L)的净输入$z^{(l)}$与输出$a^{(l)}$的计算由下式给出:

$a^{(l)}=H(a^{l-1})$          (1)

   $a^{(l)}=g(z^{(l)})$           (2)

  其中,$H(·)$是该层的内部运算,依照网络类型有所不同;$g(·)$是第$l$层的输出激活函数。

  一般认为,经过训练的深度神经网络能够将数据特征逐层抽象,最终提取出完成任务所需要的特征/表示,最终使用一个简单的分类器(或其他学习器),就可以完成最终任务——因此深度学习也被叫做表示/特征学习。

  在“层层抽象”的直觉下,很自然的想法就是,训练一个很深的前馈神经网路,来完成任务。直观上看,更深的神经网络,在非线性激活函数的加持下,拥有更大的假设空间,因此当然“更有可能”包含了一个最优解。但是在实际使用时,训练又成了一个难题。除了过拟合问题以外,更深的神经网络会遇到如下两个难题,我姑且按照物理史的比喻将其称为深度神经网络的“两朵乌云”:

2.1 梯度弥散/爆炸

  现代神经网络一般是通过基于梯度的BP算法来优化,对前馈神经网络而言,一般需要前向传播输入信号,然后反向传播误差并使用梯度方法更新参数。第 [公式] 层的某参数更新需要计算损失 [公式] 对其的梯度,该梯度依赖于该层的误差项 [公式],根据链式法则,[公式]又依赖于后一层的误差项[公式]:

 

[公式]

  假设网络单元输入输出维度一致,定义 [公式] ,则有

[公式]

  当 [公式] 时,第 [公式] 层的误差项较后一层减小,如果很多层的情况都是如此,就会导致反向传播中,梯度逐渐消失,底层的参数不能有效更新,这也就是梯度弥散(或梯度消失);当 [公式] 时,则会使得梯度以指数级速度增大,造成系统不稳定,也就是梯度爆炸问题。

  在很深层的网络中,由于不能保证 [公式] 的大小,也很容易出现梯度弥散/爆炸。这是两朵乌云中的第一朵。

2.2 网络退化问题

  在前面的讨论中,梯度弥散/爆炸问题导致模型训练难以收敛,但是这个问题很大程度上已经被标准初始化和中间层正规化方法有效控制了,这些方法使得深度神经网络可以收敛。深度神经网络面临的另一朵乌云是网络退化问题:

    在神经网络可以收敛的前提下,随着网络深度增加,网络的表现先是逐渐增加至饱和,然后迅速下降[1]

  需要注意,网络退化问题不是过拟合导致的,即便在模型训练过程中,同样的训练轮次下,退化的网络也比稍浅层的网络的训练错误更高,如下图[1]所示。

模型退化:深层模型反而取得更高的训练和测试误差

  这一点并不符合常理:如果存在某个 [公式] 层的网络 [公式] 是当前最优的网络,那么可以构造一个更深的网络,其最后几层仅是该网络[公式] 第[公式] 层输出的恒等映射(Identity Mapping),就可以取得与[公式] 一致的结果;也许[公式] 还不是所谓“最佳层数”,那么更深的网络就可以取得更好的结果。总而言之,与浅层网络相比,更深的网络的表现不应该更差。因此,一个合理的猜测就是,对神经网络来说,恒等映射并不容易拟合(在MobileNet V2的论文中提到,由于非线性激活函数Relu的存在,每次输入到输出的过程都几乎是不可逆的,这也造成了许多不可逆的信息损失。我们试想一下,一个特征的一些有用的信息损失了,那他的表现还能做到持平吗?答案是显然的)。举个例子,假设已经有了一个最优化的网络结构,是18层。当我们设计网络结构的时候,我们并不知道具体多少层次的网络时最优化的网络结构,假设设计了34层网络结构。那么多出来的16层其实是冗余的,我们希望训练网络的过程中,模型能够自己训练这五层为恒等映射,也就是经过这层时的输入与输出完全一样。但是往往模型很难将这16层恒等映射的参数学习正确,那么就一定会不比最优化的18层网络结构性能好,这就是随着网络深度增加,模型会产生退化现象。它不是由过拟合产生的,而是由冗余的网络层学习了不是恒等映射的参数造成的。

  我们要区分:degenerate(退化)问题和gradient vanish(梯度消失)是两个层面的问题:

  • gradient vanish说的是只要层数高了,gradient就会vanish,而不是说随着迭代数变多会越来越vanish(当然也可能有这个问题,但是本来不是指这个)。所以gradient vanish随层数增多而变严重的,还没迭代什么事呢。
  • degenerate问题是随着迭代而变严重的。也就是fix住network层数,越迭代就会越degenerate。

  这是两个层面的问题,当然都会导致Deep network训练困难。 以下是对退化问题的阐述:

  • 准确率下降问题(degradation problem):层级大到一定程度时准确率就会饱和,然后迅速下降,这种下降即不是梯度消失引起的也不是overfit造成的,而是由于网络过于复杂,以至于光靠不加约束的放养式的训练很难达到理想的错误率。degradation problem不是网络结构本身的问题,而是现有的训练方式不够理想造成的。
  • 另一种解释:神经网络越来越深的时候,反传回来的梯度之间的相关性会越来越差,最后接近白噪声。因为我们知道图像是具备局部相关性的,那其实可以认为梯度也应该具备类似的相关性,这样更新的梯度才有意义,如果梯度接近白噪声,那梯度更新可能根本就是在做随机扰动。
  • 还有种解释:网络退化的原因是非线性激活函数造成的不可逆信息损失,因此深层网络比浅层网络错误率更高,更难以被优化。 作者:PULSE_ https://www.bilibili.com/read/cv11180330 出处:bilibili

  也许我们可以对网络单元进行一定的改造,来改善退化问题?这也就引出了残差网络的基本思路...

三,残差网络的形式化定义与实现

  既然神经网络不容易拟合一个恒等映射,那么一种思路就是构造天然的恒等映射。假设神经网络非线性单元的输入和输出维度一致,可以将神经网络单元内要拟合的函数 [公式] 拆分成两个部分,即:

[公式]

  其中 [公式] 是残差函数。在网络高层,学习一个恒等映射 [公式] 即等价于令残差部分趋近于0,即 [公式] 。

  残差单元可以以跳层连接的形式实现,即将单元的输入直接与单元输出加在一起,然后再激活。因此残差网络可以轻松地用主流的自动微分深度学习框架实现,直接使用BP算法更新参数[1]

  通过对深度网络退化问题的认识我们已经明白,要让之不退化,根本原因就是如何做到恒等映射。事实上,已有的神经网络很难拟合潜在的恒等映射函数H(x)=x。但如果把网络设计为H(x)=F(x)+x,即直接把恒等映射作为网络的一部分,就可以把问题转化为学习一个残差函数F(x)=H(x)-x。只要F(x)=0,就构成了一个恒等映射H(x)=x。 而且,拟合残差至少比拟合恒等映射容易得多(后面第三部分会解释)。我们看一下残差结构与正常结构对比图:

  

    • 我们可以看到,残差结构比正常的结构多了右侧的曲线,这个曲线也叫作shortcut connection,通过跳接在激活函数前,将上一层(或几层)的输出与本层输出相加,将求和的结果输入到激活函数作为本层的输出。
    • 我们从数学的角度来看残差结构,假设残差结构的输入为x,则输出H(x)等于:
      H(x)=F(x,W_{i})+x
    • 其中F(x,W_{i})就是我们要学习的残差,我们把x移到等式的左侧,残差就等于H(x)-x,以上图为例,残差就是中间有一个Relu激活的双层权重,即:
      F=W_{2}\sigma (W_{1}(x))
    • 其中\sigma是Relu激活函数,而W_{1}, W_{2}是指两个weight layer。

 

  实验表明,残差网络很好地解决了深度神经网络的退化问题,并在ImageNet和CIFAR-10等图像任务上取得了非常好的结果,同等层数的前提下残差网络也收敛得更快[1]。这使得前馈神经网络可以采用更深的设计。除此之外,去除个别神经网络层,残差网络的表现不会受到显著影响[2],这与传统的前馈神经网络大相径庭。

四, 残差网络解决了什么,为什么有效?

  残差网络在图像领域已然成为了一种主流模型,虽然这种网络范式的提出是为了解决网络退化问题,但是关于其作用的机制,还是多有争议。目前存在几种可能的解释,下面分别列举2016年的两篇文献和2018年的一篇文献中的内容。

4.1 从前后向信息传播的角度来看

  何恺明等人从前后向信息传播的角度给出了残差网路的一种解释[3]

  考虑式 [公式] 这样的残差块组成的前馈神经网络,为了讨论简便,暂且假设残差块不使用任何激活函数,即

[公式]

  考虑任意两个层数 [公式] ,递归地展开 [公式] ,

[公式]

  可以得到

[公式]

  根据式 [公式] ,在前向传播时,输入信号可以从任意低层直接传播到高层。由于包含了一个天然的恒等映射,一定程度上可以解决网络退化问题。

这样,最终的损失 [公式] 对某低层输出的梯度可以展开为

[公式]

  或展开写为

[公式]

  根据式 [公式] ,损失对某低层输出的梯度,被分解为了两项,前一项 [公式] 表明,反向传播时,错误信号可以不经过任何中间权重矩阵变换直接传播到低层,一定程度上可以缓解梯度弥散问题(即便中间层矩阵权重很小,梯度也基本不会消失)。

  综上,可以认为残差连接使得信息前后向传播更加顺畅。

  * 加入了激活函数的情况的讨论(实验论证)请参见[3]

4.2 集成学习的角度

  Andreas Veit等人提出了一种不同的视角[2]。他们将残差网络展开,以一个三层的ResNet为例,将得到下面的树形结构:

  残差网络的展开形式使用图来表示就是

残差网络的展开形式

  这样,残差网络就可以被看作是一系列路径集合组装而成的一个集成模型,其中不同的路径包含了不同的网络层子集。Andreas Veit等人展开了几组实验(Lesion study),在测试时,删去残差网络的部分网络层(即丢弃一部分路径)、或交换某些网络模块的顺序(改变网络的结构,丢弃一部分路径的同时引入新路径)。实验结果表明,网络的表现与正确网络路径数平滑相关(在路径变化时,网络表现没有剧烈变化),这表明残差网络展开后的路径具有一定的独立性和冗余性,使得残差网络表现得像一个集成模型(ensemble)。

  作者还通过实验表明,残差网络中主要在训练中贡献了梯度的是那些相对较短的路径,从这个意味上来说,残差网络并不是通过保留整个网络深度上的梯度流动来抑制梯度弥散问题,一定程度上反驳了何恺明等[3]中的观点。但是,我觉得这个实验结果与何凯明等的结论并不矛盾,因为这些较短的梯度路径正是由残差结构引入的。

  * 可以类比集成学习的网络架构方法不仅有残差网络,Dropout机制也可以被认为是隐式地训练了一个组合的模型。

4.3 梯度破碎问题

  2018年的一篇论文,The Shattered Gradients Problem: If resnets are the answer, then what is the question?[4],指出了一个新的观点,尽管残差网络提出是为了解决梯度弥散和网络退化的问题,它解决的实际上是梯度破碎问题(the shattering gradient problem):

在标准前馈神经网络中,随着深度增加,梯度逐渐呈现为白噪声(white noise)。

  作者通过可视化的小型实验(构建和训练一个神经网络 [公式] )发现,在浅层神经网络中,梯度呈现为棕色噪声(brown noise),深层神经网络的梯度呈现为白噪声。在标准前馈神经网络中,随着深度增加,神经元梯度的相关性(corelation)按指数级减少 ( [公式] );同时,梯度的空间结构也随着深度增加被逐渐消除。这也就是梯度破碎现象。

  神经网络梯度及其协方差矩阵的可视化,可以看到标准的前馈网络的梯度在较深时(b)与白噪声(e)类似。

  梯度破碎为什么是一个问题呢?这是因为许多优化方法假设梯度在相邻点上是相似的,破碎的梯度会大大减小这类优化方法的有效性。另外,如果梯度表现得像白噪声,那么某个神经元对网络输出的影响将会很不稳定。

  相较标准前馈网络,残差网络中梯度相关性减少的速度从指数级下降到亚线性级(sublinearly, [公式] ),深度残差网络中,神经元梯度介于棕色噪声与白噪声之间(参见上图中的c,d,e);残差连接可以极大地保留梯度的空间结构。残差结构缓解了梯度破碎问题。

  * 更细致的实验与讨论请参见[4]

五. 自然语言处理中的残差结构

  与图像领域不同的是,自然语言处理中的网络往往“宽而浅”,在这些网络中残差结构很难有用武之地。但是在谷歌提出了基于自注意力的Transformer架构[5],特别是BERT[6]出现以后,自然语言处理也拥有了“窄而深”的网络结构,因此当然也可以充分利用残差连接,来达到优化网络的目的。事实上,Transformer本身就包含了残差连接,其中编码器和解码器中的每一个子模块都包含了残差连接,并使用了Layer Normalization。

Transformer架构

  可以预见的是,基于深度学习的自然语言处理的网络结构很可能朝着更“深”的方向发展,那么残差结构就是一个几乎不可缺少的选项了。

六. 总结与扩展

  残差网络真可谓是深度学习的一把利器,它的出现使得更深的网络训练成为可能。类似残差网络的结构还有Highway Network[7],与残差网络的差别在于加入了门控机制(注意它和ResNet是同时期的工作),文献[4]中也对Highway Network进行了讨论,值得一读;现在广泛使用的门控RNN,我认为与Highway Network有异曲同工之妙,可以认为是在时间维上引入了门控的残差连接;在残差网络中使用的跳层连接,在自然语言处理中也有相当多的应用,比如Bengio的神经语言模型[8]、文本匹配模型ESIM[9]等,区别在于这些工作中跳层连接仅仅将不同层次的特征拼接在一起(而不是相加),达到增加特征多样性、加快训练的目的。

参考

  1. ^abcdDeep Residual Learning for Image Recognition http://arxiv.org/abs/1512.03385
  2. ^abResidual Networks Behave Like Ensembles of Relatively Shallow Networks http://arxiv.org/abs/1605.06431
  3. ^abcIdentity Mappings in Deep Residual Networks https://arxiv.org/abs/1603.05027
  4. ^abcThe Shattered Gradients Problem: If resnets are the answer, then what is the question? https://arxiv.org/abs/1702.08591
  5. ^Attention Is All You Need https://arxiv.org/abs/1706.03762
  6. ^BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding https://arxiv.org/abs/1810.04805
  7. ^Highway Networks https://arxiv.org/abs/1505.00387
  8. ^A Neural Probabilistic Language Model http://www.researchgate.net/publication/2413241_A_Neural_Probabilistic_Language_Model
  9. ^Enhanced LSTM for Natural Language Inference http://arxiv.org/abs/1609.06038v3

转自:残差网络解决了什么,为什么有效?

CVPR2016:ResNet 从根本上解决深度网络退化问题

 

posted @ 2021-07-31 23:34  玻璃公主  阅读(4851)  评论(1编辑  收藏  举报