跳到主要内容

残差网络 — 深度终于不再是问题

这一章讲三件事: 「退化」为什么不是过拟合;一条直通捷径为什么能把深度从理论上 解放出来;以及书里那两轮罕见的严密论证——捷径上加任何东西都不行,连激活函数的 位置都有讲究。这是全书第一篇的枢纽,第 04~08 章的每个网络都踩在它上面。

1. 这一章讲什么

第 01 章结尾留了个钩子:VGG 加到 19 层,收益趋平,偶尔更深反而更差。这一章开篇, 书里把「加深」的三个拦路石摆成一排:算力(多台机器凑起来能解决)、过拟合(海量数据+Dropout 能压)、 梯度消失爆炸(BN 能避)1貌似我们只要「无脑」地增加网络的层数,就能从中获益, 但实验数据给了我们当头一棒2——2015 年,何恺明团队的残差网络(ResNet)把 top-5 错误率打到 3.57%,人过了这条线3

这一章的全部内容,就是拆解这条捷径为什么非长成那个样子不可。

2. 顶层全景:一层只学「增量」

输入 x ──┬──────────────►(直通,什么也不做)──────────┐
│ ⊕──► 输出 x + F(x)
└─► 卷积 → 卷积(= F(x),「还要改的那部分」)──┘

图说:残差块。主路只负责「改」,捷径负责「原样送达」。堆几十上百个这样的块,
信息永远有一条不衰减的高速路可以走。

主走查是一个思想实验,书里原话给出的:假设一个 100 层的 VGG(VGG-100), 它第 98 层提取的特征和一个 16 层的 VGG 第 14 层一模一样——那 VGG-100 的效果 至少应该和 VGG-16 一样好才对。可现实里深网络做不到。那就干脆把低层特征原样 传到高层:在第 98 层和第 14 层之间架一条直接映射——不加工、不变形,原样送达4。 残差网络的每个残差块,都是这条思路的最小实现。

3. 核心原理

3.1 退化:训练集自己变差了

先把病说准。书里的定义:随着网络层数的增多,训练集损失值逐渐下降,然后趋于饱和; 再增加深度,训练集损失值反而会增大5。注意主语——是训练集损失在回升, 所以这「并不是过拟合,因为在过拟合中训练集损失值是一直减小的」6。 过拟合是背题背魔怔了;退化是连题都没背进去。病根在优化:深的普通网络里, 梯度传到浅层已近于无(第 01 章的连乘),浅层根本没被训到。

从信息论看也一样。第 02 章讲过数据处理不等式:加工步骤越多,信息只减不增。 书里把它接到结构上:如果 l+1 层被保证「一定比 l 层包含更多的图像信息」, 信息就不会在层层加工中漏光7。保证的手段,就是那条直接映射。

3.2 残差块,以及「残差」这个词到底是哪个残差

一个残差块分两部分:直通的捷径,加上两三层卷积组成的「加工路」,输出是两者 相加:x + F(x)8。相加是逐个数字对应相加(要求两张特征图通道数一致; 不一致时用 1×1 卷积调一下通道数——书里提醒,实验表明 1×1 卷积对性能提升作用有限, 只在不得不用时才上9)。

为什么叫「残差」? 书里给了一段少见的较真。统计学里,误差就是观测值与真实值的差距, 残差则是预测值与观测值的差距。网络一层本来要学的变换记作 H(x);现在把直通的 x 当作「观测值」,那么加工路实际要学的就是 H(x) − x——这一层只学「目标与现状的差」, 按统计学的叫法,这个差就是残差,所以叫残差网络10

书里还配了个水位线的例子帮记:模型预测水位 10 米,你实测 10.4 米,真实值是 10.5 米—— 10.4 不是真实值,它是观测值;预测和观测之间那 0.4 米的差,才是模型真正该去修正的东西11

回到主走查:把「VGG-100 的第 98 层直接继承第 14 层」这个愿望翻译过来—— 加工路学到的 F(x) 只要在「正确答案 minus 现状」附近小修小补就行;实在学不动, 它可以把 F(x) 学成零,网络自动退化为「原样照抄浅层」。最差也就是浅层的效果, 只赚不亏——这就是第 01 章那句「理论上扩展到无限大」的准确含义。

3.3 必要性论证:捷径上什么都不许加

「加条直通道」听起来谁都想得到。ResNet 论文真正的贡献是证明了这条道必须是最裸的直通。 书里把论证拆成两个假设:捷径是直接映射(假设 1),相加之后的激活函数处理方式得当(假设 2)。 正向看,任意深层 L 的输出等于某个浅层 l 的输出加上途中所有残差部分的累加12; 反向看,梯度表达式里恒带着「直接映射贡献的那一项」,书里的推论是这一项「不可能一直为 −1」, 所以不会出现梯度消失,而且深层的梯度可以一路直传到任何浅层13

书里随即追问:这两个假设是必要条件吗?——充分条件好证,必要性要靠反证14

先解释表里即将出现的零件:「门」与门控——就是给信息通道装一个 0 到 1 的开关 (第 09 章的 LSTM 会大量用到它)。

「冻结」——开关固定不动——则是门的一种变体。

先反证假设 1:假如捷径不是裸直通,而是乘了个缩放 λ(每过一层乘一次)。 λ>1,连乘下去梯度爆炸;λ<1,连乘下去梯度归零——两条死路,所以 λ 必须等于 115。 书里接着列了一张 110 层网络在 CIFAR-10 上的对照表,把所有「不像直通」的捷径变体全部枪毙16:

捷径变体错误率备注
裸直通(原始 ResNet)6.61%基准
常数缩放 0.5失败训不动
冻结门12.35%
排他门最好 8.79%,多数失败门二选一:捷径与加工路互斥
捷径门6.91%~12.86%逼近但没超过
1×1 卷积捷径12.22%有表达力,反而差
Dropout 捷径失败

(这张表数字全部来自原书表 1.1。)排他门为什么死?书里借 LSTM 的门机制解释: 训练好的门值几乎全在 0 或 1——门一关,捷径断,退化回普通网络;门全开,加工路断。 1×1 卷积捷径最有迷惑性:它表达力比直通强,错误率却更差——书里的判断是 「这更可能是优化问题而非模型容量问题」17:不是它装不下,是它训不好。 结论:在所有变异模型中,裸直通依旧是效果最好的策略18

3.4 激活函数挪个位置:ResNet v2

假设 2 管的是激活函数摆哪。原始 ResNet 的顺序是:卷积→相加→激活(书里叫后激活)。 既然捷径必须裸直通,那么相加之后就不能再接激活函数——否则捷径的输出也被弯折了。 把激活函数全部挪进加工路、相加点彻底裸露,这叫全部预激活。书里照例给了 CIFAR-10 对照(ResNet-110 / ResNet-164 两列):传统残差块 6.61 / 5.93; BN 挪到相加之后 8.17 / 6.50(最差);全部预激活 6.37 / 5.46(最好)19。 结论:将激活函数移动到残差部分可以提高模型的准确率,这个版本叫残差网络 v220

判断(我们的,不是书里的): 3.3 与 3.4 合起来,其实是同一条设计律的两次应用—— 捷径是「信息的保底通道」,任何放在它上面的变换都是对保底的征税。 λ 是税, 门控是税,相加后的激活函数也是税。后来第 02 章末尾那个 0.1~0.3 的残差缩放看似违反此律, 但它只放在极深的 Inception-ResNet 里当稳定器,且系数小到接近不征——恰恰反证了这条律的强度。 如果错,会错在: 如果某些任务里「带门的捷径」稳定优于裸直通(比如需要显式开关信息的 场景),这条律就只是经验偏好而非普适约束;书里的证据全部来自 CIFAR-10 的 110 层设置。

3.5 换个视角:残差网络是很多个浅网络的集成

书里最后转述了 Veit 等人的另一个理解角度:一个 3 层的残差网络,沿着「走捷径还是走加工路」 展开,是一棵 8 个节点的二叉树——最终输出等价于这 8 条路径的集成21。 证据很巧:随机删掉残差网络的一些节点,性能只是平缓下滑;对 VGG 这种串行网络做同样的事, 「网络的输出将完全随机」22

这也解释了第 02 章没解释的一件事:为什么 GoogLeNet 要在中间插辅助损失—— 集成的每个成员都该自己会做题,而不只是最终答案的一环。

4. 作者的判断与证据

书里给了实验证据的: 表 1.1(七种捷径变体,110 层 CIFAR-10)、表 1.2(五种激活位置, ResNet-110/164)都是论文的原始对照;「1×1 卷积捷径的失败更像优化问题」是作者对论文数据的 解读,标明了「更可能」;集成视角(删节点实验)是转述 Veit 等人的论文。

书里的坦白: 残差块的灵感推导(两假设)是论文作者的原框架,书里原样呈现; 「残差 v1 的搭建可以看成在 VGG 里插单位映射」是书里给的实用记法23

5. 边界与局限

  • 残差不是免费的:参数翻倍的加工路 + 捷径,显存——显卡上放正在计算的数据的存储——占用比同深度的串行网络高; 书里第 04 章会讲 DenseNet 反过来撞上显存墙;

  • 「退化被彻底解决」要限定在合理深度内——第 02 章那个「参数全变为 0」的不稳定, 说明超深残差网络依然需要缩放、小心控制每步挪多远等护理(第 07 章的 Very Deep PolyNet 会再证一次);

  • 书里的论证全部基于图像分类(CIFAR-10/ImageNet);捷径律用在序列——按先后次序排成串的 数据,一句话就是一个序列——的模型上表现如何,要到后面才能看到;

  • 同样,Transformer(第 05、10 章专讲的一种新架构)也原样继承了这条捷径,只是把 归一化换成了第 13 章要讲的另一路。

6. 可带走的

  1. 深网络训不动有两种:过拟合(训练损失一直降、测试变差)与退化(训练损失自己回升)—— 先分清是哪种,再谈对策;
  2. 残差块=直通捷径+小加工路,加工路只学「目标与现状的差」;学不动就输出零,自动保底浅层;
  3. 捷径必须裸直通:缩放、门控、Dropout、1×1 卷积,放在捷径上都试过,全部更差或失败;
  4. 激活函数要挪到加工路里(预激活),让相加点彻底裸露——这是 ResNet v2 的全部内容;
  5. 「残差」借自统计学:预测值与观测值之差;每一层学的是修正量,不是完整答案;
  6. 换个视角:残差网络是大量浅网络的集成,所以删几个节点它照样能跑;
  7. 给捷径装 0.1~0.3 的小缩放可以稳住超深网络——但那是不得已的「征税」,能不征就不征。

7. 原文地图

主题原书节原文位置
加深的三个拦路石1.4 跳跃连接:ResNettext/03-p41-60.txt:34(搜「梯度消失或梯度爆炸」) · text/03-p41-60.txt:36(搜「可以通过 BN 避免」)
退化的定义、与过拟合的区分1.4 跳跃连接:ResNettext/03-p41-60.txt:39(搜「趋于饱和」) · text/03-p41-60.txt:40(搜「一直减小的」)
VGG-100 思想实验、直接映射1.4 跳跃连接:ResNettext/03-p41-60.txt:42(搜「至少不比浅层」) · text/03-p41-60.txt:44(搜「直接映射」)
信息论解释1.4 跳跃连接:ResNettext/03-p41-60.txt:48(搜「更多的图像信息」)
残差块构成、1×1 作用有限1.4.1 残差网络text/03-p41-60.txt:57(搜「直接映射部分和残差部分」) · text/03-p41-60.txt:66(搜「提升作用有限」)
残差之名的统计学来历、水位线1.4.1 残差网络text/03-p41-60.txt:104(搜「预测值和观测值之间的差距」) · text/03-p41-60.txt:108(搜「水位线的高度」)
两假设与正反两向的性质1.4.2 残差网络背后的原理text/03-p41-60.txt:128(搜「残差部分之和」) · text/03-p41-60.txt:139(搜「不可能一直为」) · text/03-p41-60.txt:143(搜「直接传递到任何一个」)
必要性之问、λ 反证1.4.2 残差网络背后的原理text/03-p41-60.txt:148(搜「必要条件吗」) · text/03-p41-60.txt:168(搜「梯度爆炸」) · text/03-p41-60.txt:170(搜「必须等于 1」)
表 1.1 变异模型对照1.4.2 残差网络背后的原理text/03-p41-60.txt:176(搜「变异模型」) · text/03-p41-60.txt:181(搜「冻结门」) · text/03-p41-60.txt:187(搜「1 × 1 卷积捷径」)
结论:直通最好、优化问题1.4.2 残差网络背后的原理text/03-p41-60.txt:190(搜「效果最好的策略」) · text/03-p41-60.txt:199(搜「模型容量问题」)
表 1.2 激活位置、ResNet v21.4.2 残差网络背后的原理text/03-p41-60.txt:211(搜「后激活」) · text/03-p41-60.txt:225(搜「全部预激活」) · text/03-p41-60.txt:227(搜「残差网络 v2」)
集成视角、删节点实验1.4.3 残差网络与模型集成text/03-p41-60.txt:266(搜「8 个节点的二叉树」) · text/03-p41-60.txt:268(搜「完全随机」)

Footnotes

  1. 出处:「1.4 跳跃连接:ResNet」(text/03-p41-60.txt:32,搜「计算资源过度消耗」)。三个问题:计算资源过度消耗、模型容易过拟合、产生梯度消失或梯度爆炸问题。

  2. 出处:「1.4 跳跃连接:ResNet」(text/03-p41-60.txt:37,搜「当头一棒」)。

  3. 出处:「第一篇 卷积神经网络(篇首)」(text/01-p1-20.txt:439,搜「3.57%」)。

  4. 出处:「1.4 跳跃连接:ResNet」(text/03-p41-60.txt:42,搜「至少不比浅层」)与(text/03-p41-60.txt:44,搜「直接映射」)。原文的设定:VGG-100 第 98 层使用和 VGG-16 第 14 层一模一样的特征。

  5. 出处:「1.4 跳跃连接:ResNet」(text/03-p41-60.txt:39,搜「趋于饱和」)。

  6. 出处:「1.4 跳跃连接:ResNet」(text/03-p41-60.txt:40,搜「一直减小的」)。

  7. 出处:「1.4 跳跃连接:ResNet」(text/03-p41-60.txt:48,搜「更多的图像信息」)。原文:残差网络加入直接映射,「保证了 l + 1 层的网络一定比 l 层的网络包含更多的图像信息」。

  8. 出处:「1.4.1 残差网络」(text/03-p41-60.txt:56,搜「(xl,Wl)」)。残差块表达式 x_{l+1}=x_l+F(x_l,W_l) 在式(1.10);构成见(text/03-p41-60.txt:57,搜「直接映射部分和残差部分」)。

  9. 出处:「1.4.1 残差网络」(text/03-p41-60.txt:66,搜「提升作用有限」)。

  10. 出处:「1.4.1 残差网络」(text/03-p41-60.txt:104,搜「预测值和观测值之间的差距」)与(text/03-p41-60.txt:106,搜「因此叫作残差网络」)。

  11. 出处:「1.4.1 残差网络」(text/03-p41-60.txt:108,搜「水位线的高度」)。原文笔记:「模型预测为 10m,你测量的是 10.4m,但真实值为 10.5m。通常你认为 10.4m 为真实值,其实它并不是」。

  12. 出处:「1.4.2 残差网络背后的原理」(text/03-p41-60.txt:128,搜「残差部分之和」)与(text/03-p41-60.txt:130,搜「单位累加」)。

  13. 出处:「1.4.2 残差网络背后的原理」(text/03-p41-60.txt:139,搜「不可能一直为」)与(text/03-p41-60.txt:143,搜「直接传递到任何一个」)。

  14. 出处:「1.4.2 残差网络背后的原理」(text/03-p41-60.txt:148,搜「必要条件吗」)。原文:「说明这两个假设是让残差网络可以训练深度模型的充分条件。那么这两个假设是必要条件吗?」

  15. 出处:「1.4.2 残差网络背后的原理」(text/03-p41-60.txt:168,搜「梯度爆炸」)与(text/03-p41-60.txt:170,搜「必须等于 1」)。

  16. 出处:「1.4.2 残差网络背后的原理」(text/03-p41-60.txt:176,搜「变异模型」)。表 1.1:原始 6.61;常数缩放失败;0.5 冻结门 12.35;排他门 bg=−6 时 8.79、bg=−7 时 9.81 其余失败;捷径门 12.86 与 6.91;1×1 卷积捷径 12.22;Dropout 捷径失败。

  17. 出处:「1.4.2 残差网络背后的原理」(text/03-p41-60.txt:199,搜「模型容量问题」)。排他门分析见(text/03-p41-60.txt:192,搜「绝大多数门的值」)。

  18. 出处:「1.4.2 残差网络背后的原理」(text/03-p41-60.txt:190,搜「效果最好的策略」)。

  19. 出处:「1.4.2 残差网络背后的原理」(text/03-p41-60.txt:221,搜「传统残差单元」)。表 1.2 全部数字:6.61/5.93、8.17/6.50、7.84/6.14、6.71/5.91、6.37/5.46。

  20. 出处:「1.4.2 残差网络背后的原理」(text/03-p41-60.txt:227,搜「残差网络 v2」)。原文:「实验结果表明将激活函数移动到残差部分可以提高模型的精度。该网络一般叫作残差网络 v2」。

  21. 出处:「1.4.3 残差网络与模型集成」(text/03-p41-60.txt:265,搜「模型集成的角度理解」)与(text/03-p41-60.txt:266,搜「8 个节点的二叉树」)。

  22. 出处:「1.4.3 残差网络与模型集成」(text/03-p41-60.txt:268,搜「完全随机」)。

  23. 出处:「1.4.1 残差网络」(text/03-p41-60.txt:91,搜「插入单位映射」)。原文搭建两步:按 VGG 架构搭普通网络;在 CNN 之间插入单位映射。