第 9 天 · 让网络只学“差多少”,152 层也能训
一句话
ResNet 让每个模块学习残差 F(x) = H(x) − x,再用恒等捷径把输入 x 加回去。这个改动解决了深网络的退化问题,152 层网络的集成在 ImageNet 上取得 3.57% 的 top-5 错误率,赢得 ILSVRC 2015 分类第一。
论文讲了什么
结论先行:给每 2 到 3 层加一条把输入直接加到输出的捷径,网络就能从 20 层加深到 152 层,而且越深越准。
问题:退化(degradation)。作者在 CIFAR-10 上发现,56 层普通网络的训练误差比 20 层还高。训练误差也高,说明不是过拟合。ImageNet 上也一样:34 层普通网络比 18 层差。按理说深网络不该更差:把浅网络复制过来,多出的层设成恒等映射,误差至少一样低。所以问题出在优化:求解器找不到这个解。作者还指出这不是梯度消失,因为每层都用了批归一化,前向信号和反向梯度的范数都正常。
方法。
- 残差块:
y = F(x) + x。F 通常是 2 个 3×3 卷积。如果最优映射接近恒等,把 F 推向 0 比让一叠非线性层拟合恒等容易得多。 - 维度变化时的捷径:A 方案补零扩通道;B 方案在维度变化处用 1×1 卷积投影;C 方案所有捷径都投影。三者结果差距很小,说明恒等捷径本身就够用。
- 瓶颈块(bottleneck):1×1 卷积降维,3×3 卷积计算,1×1 卷积升维。50、101、152 层的版本都用它控制计算量。
- 训练:每个卷积后接批归一化,不用 dropout。SGD,batch 256,学习率 0.1,误差停滞时除以 10,权重衰减 0.0001,动量 0.9。
关键结果。
- ImageNet:加上捷径后,34 层比 18 层好,退化消失。152 层单模型验证集 top-5 错误率 4.49%;集成在测试集上达到 3.57%。
- 计算量:152 层网络约 113 亿次浮点运算,低于 19 层 VGG 的 196 亿次。
- CIFAR-10:110 层网络测试误差 6.43%。1202 层网络也能训练,训练误差很低,但测试误差升到 7.93%,作者归因于过拟合。
- 迁移:换上 ResNet 特征后,COCO 目标检测取得 28% 的相对提升。同年还拿下 ImageNet 检测、定位,以及 COCO 检测、分割 4 项第一。
关键概念
- 退化问题(degradation problem)
- 网络加深后训练误差反而上升。它不是过拟合,因为训练集上就更差;它是优化困难,求解器找不到深网络本该能表示的好解。
- 残差学习(residual learning)
- 不让层直接拟合目标映射 H(x),而是拟合差值 F(x) = H(x) − x。目标接近恒等时,只需把 F 的权重推向 0。
- 恒等捷径(identity shortcut)
- 把模块输入原样加到输出上,不增加参数和计算量。前向时信号可以跳过模块,反向时梯度也能沿捷径直接回传。
- 瓶颈块(bottleneck block)
- 1×1 降维、3×3 计算、1×1 升维三层结构。它让 3×3 卷积在少通道上运算,深网络的计算量因此可控。
- 批归一化(Batch Normalization, BN)
- 把每层输出按 mini-batch 的均值和方差标准化,再学习缩放和平移。ResNet 每个卷积后都接 BN,它是深网络能起步训练的前提。
历史位置:为什么值得读
它解决了“深度到底有没有用”的困惑。2014 年 VGG 做到 19 层,GoogLeNet 做到 22 层,再往深加,效果就变差。ResNet 用一个几乎零成本的改动,把可训练深度推高了一个数量级。论文获得 CVPR 2016 最佳论文,后来成为被引用最多的机器学习论文之一。
它有前辈。2015 年 5 月的 Highway Networks 已经用带门控的捷径训练了上百层网络。门控思想来自 LSTM(第 2 天)。ResNet 的区别是捷径不带门、不带参数,永远畅通。事实证明,简单的版本更好用。
它的后续工作覆盖了整个领域。第 10 天的 ResNet v2 分析了捷径为什么有效,并改进了块内顺序。DenseNet、ResNeXt 在它的基础上继续改进。更重要的是,2017 年的 Transformer(第 13、14 天)每个子层都套了残差连接。今天几乎所有深网络都带残差连接。
学前准备
- 先看第 8 天,熟悉卷积网络的基本结构
- 理解批归一化的计算过程和训练、推理两种模式
- 知道链式法则下梯度如何逐层相乘
- 会用 PyTorch 写自定义模块并处理张量形状
在原仓库怎么学
- 读 README.md 的目录,它依次讲退化问题、残差块、ResNet-50 和瓶颈块、实现和训练技巧。对照论文第 3、4 节读。
- 读 implementation.py。重点看基础块和瓶颈块里捷径怎样处理步长和通道变化。
- 运行 train_minimal.py,它演示普通网络的退化和捷径带来的改善。数据说明见 data/README.md,CIFAR-10 和 CIFAR-100 会自动下载。
- 用 visualization.py 画捷径结构图、梯度流和退化对比图。notebook.ipynb 按“退化问题、捷径、完整结构”的顺序把这些串起来。
- 做 exercises/ 的 5 个练习:01 搭 ResNet-18;02 去掉捷径看退化;03 分析梯度流;04 比较不同深度;05 迁移学习。答案在 exercises/solutions/。
- 进阶题在 assessments/exercises.md,包括梯度消失实验、残差与恒等学习对比、超深网络、捷径变体,答案在 assessments/solutions.md。
今天再看
残差连接是今天所有大语言模型的骨架。Transformer 的每一层都是 x = x + Attention(x),再 x = x + MLP(x)。可解释性研究把这条一路相加的通道叫“残差流(residual stream)”:每层从里面读信息,再把结果写回去。这个视角直接来自 ResNet 的加法结构。
ResNet 本身仍是视觉基线。ResNet-50 至今是很多论文对比的标准模型。2022 年的 ConvNeXt 把 ResNet 按 Transformer 的设计逐步改造,证明卷积网络仍有竞争力。
“为什么有效”至今有多种解释。作者的说法是残差更容易优化。后来有研究把残差网络看成许多浅网络的集成,也有研究发现捷径让损失曲面更平滑。几种解释并不互斥。
容易卡住的地方
- 退化、过拟合、梯度消失是三件事。退化看训练误差,过拟合看训练和测试的差距,作者认为 BN 已经解决了梯度消失。先分清这三者再读第 4 节。
- 下采样时捷径也要变形:主路步长为 2 或通道数变化时,捷径必须用 1×1 投影或补零,否则两路张量无法相加。
- 原版残差块的顺序是“卷积、BN、ReLU、卷积、BN,加上捷径,再 ReLU”。最后一个 ReLU 在加法之后,第 10 天会讨论改动它的效果。
- CIFAR 版和 ImageNet 版结构不同。CIFAR 版有 6n+2 层,3 个阶段,通道数 16/32/64;ImageNet 版有 7×7 的起始卷积和 4 个阶段。复现时别套错。
延伸阅读
- 原论文:Deep Residual Learning for Image Recognition
- 原仓库第 9 天目录:09_resnet/ —— 代码、笔记本、练习与答案(英文)
- Highway Networks —— 带门控的捷径,ResNet 的前辈
- Residual Networks Behave Like Ensembles of Relatively Shallow Networks —— 把残差网络看成浅网络集成
- Visualizing the Loss Landscape of Neural Nets —— 捷径让损失曲面更平滑
- A ConvNet for the 2020s(ConvNeXt) —— 按现代设计改造 ResNet