「论文阅读」ResNet 深度残差网络为什么能训得动

ResNet 论文中的残差模块示意图
问题背景:深层网络的退化
2015 年之前,大家普遍认为网络越深效果越好,但实验发现深层网络的训练误差比浅层更高——注意这不是过拟合,训练集上也更差。这个现象叫"退化问题"(degradation problem)。
直觉上,56 层网络至少可以在前 20 层学一个有效映射,后 36 层学成恒等映射,不应该比 20 层更差。但优化器(SGD)就是做不到这件事——学恒等映射比想象中难。
残差连接的思路
何恺明他们的解法很简单:与其让网络直接学目标映射 H(x),不如让它学残差 F(x) = H(x) - x,然后加回输入:
output = F(x, W) + x
如果最优解就是恒等映射,那 F(x) 只需要学成全零,这比让网络直接学恒等映射容易得多。这个"shortcut connection"不引入额外参数,计算开销几乎为零。

ResNet-34 的完整架构(论文 Figure 3)
梯度流的角度
残差连接为什么有效,还有一个梯度流的解释。反向传播时,损失对输入 x 的梯度是:
∂L/∂x = ∂L/∂output · (∂F/∂x + 1)
多出来的那个"1"意味着梯度可以不经过 F(x) 直接传回去。即使 F 的梯度很小(梯度消失),整体梯度也不会消失。这是残差网络能训练几百层的根本原因。
ResNet 论文精读 by 李沐(B站)
Bottleneck 设计
ResNet-50/101/152 用了 Bottleneck 模块而不是普通的两层卷积:先用 1×1 卷积降维,再 3×3 卷积,最后 1×1 升回来。这样参数量和计算量比两层 3×3 更少,但可以堆更深。
消融实验里的关键结论
- 恒等 shortcut(直接相加)比投影 shortcut(乘一个可学参数矩阵)效果相当,但前者更简单,参数更少。
- BN 放在激活函数之前(pre-activation)比之后(post-activation)在极深网络(1000+层)上更稳定,这在后续的 ResNetV2 里有详细讨论。

ResNet 在 ImageNet 上的结果对比(论文 Table 4)
为什么它还重要
残差连接现在已经无处不在:Transformer 的每个子层后面都有一个 Add & Norm,本质上就是残差;EfficientNet、DenseNet、U-Net 的跳连接都有残差的影子。这篇论文发布至今引用量超过 20 万,是深度学习历史上被引次数最多的论文之一。