ResNet 论文阅读(二):用传话游戏理解残差学习为什么有效
论文信息:
- 论文标题:Deep Residual Learning for Image Recognition
- CVPR 官方页面:CVPR 2016 Open Access Page
- arXiv 摘要页:Deep Residual Learning for Image Recognition
- 官方 PDF:CVPR 2016 PDF
上一篇文章里,我们从 VGG 的加深思路出发,讲到了 ResNet 要解决的核心问题:普通网络继续加深以后,可能出现退化问题,也就是网络更深了,训练误差反而更高。随后我们从公式角度理解了残差学习:
y = F(x) + x这篇文章换一种方式,不再一上来盯着公式,而是用一个更生活化的“传话游戏”来理解 ResNet。这个类比的目标不是替代数学推导,而是帮助我们把残差学习的直觉真正吃透:为什么保留原信息,再学习一点修正量,会比每一层都重新生成完整表示更容易。
一、先把残差块翻译成传话规则
假设有五个人参加传话游戏:
A -> B -> C -> D -> E原话是:
今天下午实验室窗外在下小雨,但屋里很安静,大家都在认真调试自己的模型。这句话里有一个核心主干:
大家都在认真调试自己的模型也有一些修饰信息:
今天下午 实验室窗外在下小雨 屋里很安静如果把这句话类比成网络里的特征表示,那么主干信息就像是需要被保留下来的重要特征,修饰信息则像是在不同层之间可以继续调整和增强的细节。
现在我们分别看普通网络和 ResNet 会怎样完成这场传话。
二、普通网络:每个人都重新组织整句话
在普通网络里,可以粗略理解为每一层都要根据上一层输入,重新生成一个完整输出。类比到传话游戏里,就是每个人听到上一版后,都要靠自己的理解重新说一遍整句话。
传话过程可能变成这样:
A: 今天下午实验室窗外在下小雨,但屋里很安静,大家都在认真调试自己的模型。 B: 今天下午实验室外面在下雨,屋里很安静,大家都在调试模型。 C: 下午外面下着雨,实验室里的人都在安静地做实验。 D: 下雨天大家都在实验室里做实验,气氛很安静。 E: 雨天实验室里很安静,大家都在工作。最后 E 说出来的句子并不是完全错误,但和原句相比,信息已经发生了明显变化:
认真调试自己的模型被压缩成了工作今天下午消失了实验室窗外在下小雨变成了笼统的雨天- 原句里“大家在调试模型”的专业语境被削弱了
这就是普通深层网络里容易出现的一个直观问题:每一层都在做完整变换,原始信息每经过一层都可能被重新解释一次。层数少时,这种偏差可能还不明显;层数一多,信息就容易在连续变换中被削弱、扭曲或丢失。
用公式来表示,普通网络更像是:
y = F(x)也就是说,输出完全依赖当前层学到的变换F(x)。如果当前层没有学好,后面的层只能基于这个已经偏掉的表示继续加工。
三、ResNet:先保留上一版,再做一点修改
ResNet 的传话规则不一样。它不是要求每个人都重新组织整句话,而是要求每个人先保留上一版,然后只决定自己要不要做一点小修改。
这时传话过程可能变成这样:
A: 今天下午实验室窗外在下小雨,但屋里很安静,大家都在认真调试自己的模型。 B: 我保留原句,只把“在下小雨”说得更自然一点。 今天下午实验室窗外下着小雨,但屋里很安静,大家都在认真调试自己的模型。 C: 我保留主干,只把“屋里很安静”改成“实验室里很安静”。 今天下午实验室窗外下着小雨,实验室里很安静,大家都在认真调试自己的模型。 D: 我觉得这句已经很好了,不改。 今天下午实验室窗外下着小雨,实验室里很安静,大家都在认真调试自己的模型。 E: 我只补一点语气,把“认真”换成“专心”。 今天下午实验室窗外下着小雨,实验室里很安静,大家都在专心调试自己的模型。这一次,最后的句子仍然保留了原句最重要的含义:
大家都在调试自己的模型它只是对局部表达做了一些调整,比如“小雨”的说法更自然,“屋里很安静”更明确为“实验室里很安静”,“认真”被换成了“专心”。
这就是残差学习最重要的直觉:
新结果 = 旧结果 + 一点修正对应到 ResNet 的公式就是:
y = F(x) + x这里:
x就像上一版原话;F(x)就像这一层给出的修改意见;F(x) + x就像“保留原话,再加上一点修订”。
所以 ResNet 并不是让每一层都推翻前面的表达,而是在前一层的基础上做增量更新。
四、为什么“不改”反而很重要
这个传话规则里,有一个看似不起眼但非常关键的能力:如果某个人觉得上一版已经很好,他可以选择不改。
在传话游戏里,D 的操作是:
我觉得这句已经很好了,不改。翻译成 ResNet 的公式,就是:
F(x) = 0于是:
y = F(x) + x y = 0 + x y = x这就表示当前残差块可以近似变成恒等映射,也就是把输入原样传下去。
这件事正好对应 ResNet 要解决的退化问题。理论上,更深的网络至少应该可以模仿浅层网络,因为新增的层只要不改变已有表示就行。但在普通网络中,让一组卷积层精确学成“什么都不改”的恒等映射并不容易。
而在 ResNet 里,这件事被改写得更简单:
如果不需要改,就让 F(x) 接近 0所以残差学习给深层网络提供了一个更容易达到的基线:新增层不一定非要学出复杂变换,它也可以先学会“少改一点”,甚至“暂时不改”。
五、反向传播:错误信息怎么传回来
传话游戏不只可以解释前向传播,也可以帮助我们理解反向传播。
假设老师最后检查 E 的结果,发现 E 说的是:
今天下午实验室窗外下着小雨,实验室里很安静,大家都在专心调试自己的模型。原话是:
今天下午实验室窗外在下小雨,但屋里很安静,大家都在认真调试自己的模型。两句话的大方向没有错,主要差别在于:
认真 -> 专心 屋里很安静 -> 实验室里很安静 在下小雨 -> 下着小雨现在老师要把“哪里错了”这个反馈从 E 往回传给 D、C、B、A,这就像神经网络里的梯度回传。
六、普通网络的回传:每个人都很难判断是谁改偏了
在普通网络式传话里,每个人都重新组织过整句话。于是最后出了偏差时,反馈很难准确定位。
E 会对 D 说:
最后这句话和原句有点不一样,你看看是不是前面传偏了。D 再对 C 说:
好像意思整体有点变化,但我也不确定是哪里开始变的。C 再对 B 说:
后面说法和原句不完全一致,可能主干和细节都有点变化。传到越前面,反馈越模糊。因为每一层都做过完整改写,前面的层很难判断:
- 是我把主干改偏了?
- 是后面的人把细节改丢了?
- 是整体表达变化太大,还是只有某个局部词语变化?
对应到普通网络的梯度公式,就是:
dL/dx = dL/dy * dF(x)/dx它表示前一层收到的梯度,完全要经过F(x)这条复杂变换路径。如果网络很深,这种变化率会一层层相乘。每层都缩小一点,就可能梯度消失;每层都放大一点,就可能梯度爆炸。
七、ResNet 的回传:主干保留,谁改了什么就检查什么
在 ResNet 式传话里,情况更清楚。
因为每个人都保留上一版,只做少量修改,所以最后回传错误时,可以更容易定位到每个人的修改。
比如老师说:
主干“大家都在调试自己的模型”是对的,只是部分修饰词发生了变化。那么 E 很容易知道:
我主要把“认真”改成了“专心”,这个变化需要检查。D 也很容易知道:
我没有改,所以我大概率没有引入新的偏差。C 会知道:
我把“屋里很安静”改成了“实验室里很安静”,这是局部表达变化。B 会知道:
我把“在下小雨”改成了“下着小雨”,这个变化也比较局部。也就是说,ResNet 的回传更像是:
主干信息先保留,重点检查每一层额外加的修改。对应到公式,就是:
y = F(x) + x所以梯度回传时可以写成:
dL/dx = dL/dy * dF(x)/dx + dL/dy这行公式可以拆成两部分理解:
dL/dy * dF(x)/dx表示错误信号经过残差分支F(x)回传,相当于检查“这一层具体改了什么”。
dL/dy表示错误信号可以沿着 shortcut 直接回传,相当于主干信息有一条更直接的反馈通路。
这就是 ResNet 反向传播更顺畅的原因。它不是只靠复杂变换路径传梯度,而是额外保留了一条恒等路径。这样即使残差分支在训练初期还不稳定,前面的层也仍然能收到更直接的误差信号。
八、这个类比对应到 ResNet 的哪些核心点
这个传话游戏可以帮助我们抓住 ResNet 的几个关键直觉。
第一,普通网络更像“每一层都重写全文”:
y = F(x)如果层数变多,每一层的改写都会影响后续表达,信息可能在不断变换中逐渐偏移。
第二,ResNet 更像“保留上一版,再做少量修订”:
y = F(x) + x这样每一层不必从零生成完整表示,而是学习相对于输入的增量。
第三,残差学习让恒等映射更容易实现:
如果 F(x) = 0,那么 y = x这意味着当某些层暂时不需要做复杂变换时,它们可以更容易接近“不改动输入”的状态。
第四,shortcut 让梯度回传多了一条直接路径:
dL/dx = dL/dy * dF(x)/dx + dL/dy多出来的dL/dy,就是残差连接带来的直接回传项。
九、这个类比也有边界
虽然传话游戏很好理解,但它毕竟只是类比,不能把它当成神经网络训练的完整解释。
真实的 ResNet 里,每一层不是人在主动判断“我要不要改”,而是通过损失函数和反向传播自动调整参数。网络也不是在处理自然语言句子,而是在处理高维特征图。shortcut 是否能直接相加,还要求两条路径的特征图尺寸和通道数能够匹配;如果不匹配,论文中会使用 projection shortcut 来调整维度。
因此,这个类比最适合帮助我们理解 ResNet 的直觉,而不是替代严格的网络结构和优化分析。
十、小结:用一句话记住 ResNet
如果用传话游戏来总结 ResNet,我会这样说:
普通网络像是每个人都重新说一遍整句话,ResNet 则像是每个人先保留上一版,再只修改自己认为需要调整的部分。
这句话背后的数学形式就是:
y = F(x) + x也正因为有了这个结构,ResNet 在前向传播时更容易保留已有信息,在反向传播时也能让梯度沿着 shortcut 更直接地传回前面。它解决退化问题的关键,不是简单地“网络变深了”,而是让深层网络的每一段都从“完整重建”变成了“增量修正”。
上一篇文章更偏严谨地解释了残差学习的数学原理,这一篇则用传话游戏把直觉补上。两篇合在一起看,ResNet 最核心的思想就比较完整了:深层网络不一定要每层都重新发明表示,很多时候,学会在已有表示上少量修正,反而是更稳定、更高效的方式。
参考文献
- He, K., Zhang, X., Ren, S., & Sun, J. (2015).Deep Residual Learning for Image Recognition. arXiv:1512.03385.