FightingCV

V1

2022/09/12阅读:9主题:默认主题

为什么残差连接的网络结构更容易学习?

为什么残差连接的网络结构更容易学习?

【写在前面】

不仅仅在resnet中,在各种网络结构中大家都喜欢使用残差连接的设计,并声称这有利于网络的优化,这是为什么呢?能给出一个有说服力的答案吗?

Why the residual connection makes the network easier to optimize?

来源:https://www.zhihu.com/question/306135761/answer/2491142607[1]

作者:人间白头

这几天读了何凯明的残差网络,不得不佩服他对神经网络的深入理解,从他灵感的来源,让我感觉他就是个数学大佬,结果一查还真是,本科是清华基础科学班的(研究物理数学的)(拿烟的手微微颤抖)。

好了,废话不多说,让我们一起来理解什么是残差网络。
我们先来看一个现象,假设我们有如下的一个网络,它可以在训练集和测试集上可以得到很好的性能。

接着我们构造如下的网络,前面4层的参数复制于上面的网络,训练时这几层的参数保持不变。换言之,我们只是在上面的网络新增加了几个紫颜色表示的层。

相信大家预想的结果是一样的,理论上,这个新的网络在训练集或者测试集上的性能要比第一个网络的性能好,毕竟多了几个新增加的层提取特征。然后,实际上这个新的网络却比原先的网络的性能要差。

这是何凯明论文的原图,可以看到,56层的网络无论是在训练集还是测试集上,误差率都比20层的要高。出现这种现象的原因并非是由于层数加深引发的梯度消失/梯度爆炸,因为已经通过归一化[2]的方法解决了这个问题,对于出现这种现象的原因将在下面讨论,我们将这种反常的现象称之为“退化现象“。

那么为什么会出现这样的原因呢,何凯明在文章中给出的解释是“难以对网络进行优化”。怎么理解呢,回顾上面的例子,我们假设第一个网络在训练集和测试集上可以得到很好的性能(甚至可以理解为接近100%)。

那么在这个新的网络,由于我们copy了前四层的参数,理论上前四层已经足够满足我们的性能要求,那么新增加的层便显得有些多余,如果这个新的网络也要达到性能100%,则新增加的层要做的事情就是“恒等映射”,也即后面几个紫色的层要实现的效果为 。这样一来,网络的性能一样能达到100%。

而退化现象也表明了,实际上新增加的几个紫色的层,很难做到恒等映射。又或者能做到,但在有限的时间内很难完成(即网络要用指数级别的时间才能达到收敛)。

这时候,巧妙的通过添加”桥梁“,使得难以优化的问题瞬间迎刃而解。

可以看到通过添加这个桥梁,把数据原封不动得送到FC层的前面,而对于中间的紫色层,可以很容易的通过把这些层的参数逼近于0,进而实现 的功能。

实际上,网络性能通常未能达到100%,可以假设最初的网络(只有前四层)的性能到了98%等等,如果不添加跳连接,增加三个紫色层之后的新网络同样难以进行优化(由上面极端情况的推广,也即前面四层的性能达到100%)。

而通过跳连接,可以把前四层的输出先送到FC层前面,也就相当于告诉紫色层:”兄弟你放心,我已经做完98%的工作了,你看看能不能在剩下的2%中发点力,你要是找不出提升性能的效果也没事的,我们可以把你的参数逼近于0,所以放心大胆的找吧。"

我们知道,神经网络无非是拟合一个复杂的函数映射关系,而通过跳链接,可以很好的“切割”这种映射关系,实现“分步”完成。

我们把整个映射看成100%,则前面四层网络实现了98%的映射关系,而残余的映射由紫色层完成,Residual 另一个翻译就是"残余,残留“的意思,也就是让每一个残差块,只关注残余映射的一小部分,真的是恰到好处。

当然了,实际上网络运行的时候,我们并不会知道哪几层就能达到很好的效果,然后在它们的后面接一个跳连接,于是一开始便在两个层或者三个层之间添加跳连接,形成残差块,每个残差块只关注当前的残余映射,而不会关注前面已经实现的底层映射。大概形状如下图,

这是何凯明残差论文的原图,这里是部分截图,相信到这里大家对残差网络已经有了一定的理解,并且相信大家在读完这篇短文后,将在阅读何凯明的文章时给予很大的帮助!

作者:心似风往

推荐一篇文章:Visualizing the Loss Landscape of Neural Nets

上面这篇文章其实并没有专门讲Residual Network.不过里面一张图似乎给这个问题一个有意思的解释,请看从该文章中截取的下图:

图中展示了对于ResNet-56, 有和没有skip connection之间,其loss surface的区别。可以看出来,增加了 skip connection之后,loss surface明显平滑很多,自然有利于网络优化了。

作者:龙鹏-笔名言有三

关于残差网络为什么有效,研究众多,这里我们就集中讲述几个主流的思路。

1、简化了学习过程,增强了梯度传播

相比于学习原始的信号,残差网络学习的是信号的差值,这在许多的研究中被验证是更加有效的,它简化了学习的过程。

根据我们前面的内容可知,在一定程度上,网络越深表达能力越强,性能越好。

然而随着网络深度的增加,带来了许多优化相关的问题,比如梯度消散,梯度爆炸。

在残差结构被广泛使用之前,研究人员通过研究更好的优化方法,更好的初始化策略,添加Batch Normalization,提出Relu等激活函数的方法来对深层网络梯度传播面临的问题进行缓解,但是仍然不能解决根本问题。

假如我们有这样一个网络:

其中f为卷积操作,g为非线性变换函数,k为分类器,依靠误差的链式反向传播法则,损失loss对f的导数为:

如果其中某一个导数很小,多次连乘后梯度可能越来越小,这就是常说的梯度消散,对于深层网络,从靠近输出的深层传到靠近输入的浅层时梯度值非常小,使得浅层无法有效地更新。

如果使用了残差结构,因为导数包含了恒等项,仍然能够有效的反向传播。

举一个非常直观的例子方便理解,假如有一个网络,输入x=1,非残差网络为G,残差网络为H,其中H(x)=F(x)+x,假如有这样的输入关系:

因为两者各自是对G的参数和F的参数进行更新,可以看出变化对F的影响远远大于G,说明引入残差后的映射对输出的变化更敏感,这样是有利于网络进行传播的。

2、打破了网络的不对称性[5]

虽然残差网络可以通过跳层连接,增强了梯度的流动,从而使得上千层网络的训练成为可能,不过相关的研究表面残差网络的有效性,更加体现在减轻了**神经网络**[3]的退化

如果在网络中每个层只有少量的隐藏单元对不同的输入改变它们的激活值,而大部分隐藏单元对不同的输入都是相同的反应,此时整个权重矩阵的秩不高。并且随着网络层数的增加,连乘后使得整个秩变的更低,这就是我们常说的网络退化问题。

虽然权重矩阵是一个很高维的矩阵,但是大部分维度却没有信息,使得网络的表达能力没有看起来那么强大。这样的情况一定程度上来自于网络的对称性,而残差连接打破了网络的对称性。

下面展示了三种跳层连接恢复网络表达能力的案例,分别是消除输入和权重零奇点,打破对称性,线性依赖性

3、增强了网络的泛化能力[6]

有一些研究表明,深层的残差网络可以看做是不同深度的浅层神经网络的ensemble,训练完一个深层网络后,在测试的时候随机去除某个网络层,并不会使得网络的性能有很大的退化,而对于VGG网络来说,删减任何一层都会造成模型的性能奔溃,如下图。

甚至去除和打乱一些网络层[4],性能的下降也是一个很平滑的过程。

以上都证明了残差结构其实是多个更浅的网络的集成,所以它的有效深度看起来表面的那么深,因此优化自然也没有那么难了。

【项目推荐】

面向小白的顶会论文核心代码库:https://github.com/xmu-xiaoma666/External-Attention-pytorch[5]

面向小白的YOLO目标检测库:https://github.com/iscyy/yoloair[6]

面向小白的顶刊顶会的论文解析:https://github.com/xmu-xiaoma666/FightingCV-Paper-Reading[7]

参考资料

[1]

https://www.zhihu.com/question/306135761/answer/2491142607: https://www.zhihu.com/question/306135761/answer/2491142607

[2]

归一化: https://www.zhihu.com/search?q=归一化&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType":"answer","sourceId":2491142607}

[3]

神经网络: https://www.zhihu.com/search?q=神经网络&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType":"answer","sourceId":683325207}

[4]

网络层: https://www.zhihu.com/search?q=网络层&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType":"answer","sourceId":683325207}

[5]

https://github.com/xmu-xiaoma666/External-Attention-pytorch: https://github.com/xmu-xiaoma666/External-Attention-pytorch

[6]

https://github.com/iscyy/yoloair: https://github.com/iscyy/yoloair

[7]

https://github.com/xmu-xiaoma666/FightingCV-Paper-Reading: https://github.com/xmu-xiaoma666/FightingCV-Paper-Reading

分类:

人工智能

标签:

人工智能

作者介绍

FightingCV
V1

公众号 FightingCV