广哥在硅谷 · 用思考抵达清晰,用行动靠近自由
CVPR 2016 · MSRA

ResNet
让深度真正深起来的那篇论文

Deep Residual Learning for Image Recognition · Curated Chinese Edition
Kaiming He et al. · Microsoft 中文精校版 8 章 · 约 25 分钟阅读
📋 内容摘要

2015 年,Kaiming He 团队用一个看似平淡的想法——「让网络学残差而不是学函数」——彻底打破了深度学习中"网络越深越难训"的天花板。ResNet 一举把 ImageNet 的网络深度从 30 层推到了 152 层,把 top-5 错误率压到 3.57%,赢下 ILSVRC 2015 五个任务的冠军。更深远的是,这根"快捷连接"成为了之后所有大模型的标配——Transformer 里有它,扩散模型 UNet 里有它,AlphaFold 里也有它。本文是这篇 CVPR 2016 最佳论文的中文精校版。

章节目录
  1. 引言 · 退化问题
    The Degradation Problem
  2. 残差学习的核心思想
    Residual Learning
  3. 恒等映射的快捷连接
    Identity Shortcut
  4. ResNet 架构家族
    ResNet Family: 18 to 152
  5. Bottleneck 设计
    Bottleneck Building Block
  6. ImageNet 实验
    ImageNet Experiments
  7. CIFAR-10 与上千层验证
    CIFAR-10 & 1000+ Layers
  8. 总结:快捷连接的统治
    The Reign of Skip Connections
CHAPTER 01 · MOTIVATION

引言:退化问题

When deeper means worse
📌 本节核心要点

VGG 时代的共识是"深度是关键",但实际操作中遇到了一个怪现象——把网络从 20 层加到 56 层,训练误差反而变大了。这不是过拟合(测试误差也变大),不是梯度消失(已经被批归一化解决),而是一个新问题:退化(degradation)。深度学习的天花板,卡在了"我们的优化器找不到那个深网络的好解"上。

Degradation Problem Vanishing Gradient Batch Normalization VGG

在 ResNet 出现之前,深度学习圈对"深度"已经达成了一个共识:网络越深,特征越好。从 AlexNet 的 8 层到 VGG 的 19 层,再到 GoogLeNet 的 22 层,每一次刷新 ImageNet SOTA,背后都是"加深"。

但有一个问题挡在路上——更深的网络很难训练。最初的障碍是梯度消失或爆炸,这个问题在 2015 年前已经被两个技术基本解决——规范化初始化(如 Xavier、Kaiming)和批归一化(Batch Normalization)。有了它们,几十层的网络也能开始收敛。

然而,当大家把网络加得更深之后,一个新的、出人意料的现象出现了——网络深度增加时,准确率先达到饱和,然后开始迅速下降

关键的细节是:这不是过拟合——训练误差自己就变大了。论文给出了一个最直观的对比:在 CIFAR-10 上,一个 56 层的"普通"网络比 20 层的训练误差还高,测试误差自然也更高。

作者把这个现象命名为退化问题(degradation problem)。它告诉我们一件事——并不是所有的优化系统都同等容易求解

更深的网络不应该比更浅的差,
因为我们至少可以构造一个解——
多出来的层全是恒等映射
但实际中,我们的优化器找不到这个解。

— THE CONSTRUCTED SOLUTION ARGUMENT

作者提出了一个让人无法反驳的逻辑:考虑一个浅层网络 $\mathcal{N}_s$,再考虑它的深层版本 $\mathcal{N}_d$(在 $\mathcal{N}_s$ 基础上加几层)。我们总可以"构造"一个 $\mathcal{N}_d$ 的解——把新加的层全部设成恒等映射,前面的层从 $\mathcal{N}_s$ 拷贝过来。这个构造出的深层网络训练误差至少不应该比浅层网络更差

但实验显示——SGD 找不到这种解。这意味着:让一堆非线性层逼近一个恒等映射,对优化器来说出人意料地难。

广哥在硅谷◆ ◆ ◆
CHAPTER 02 · IDEA

残差学习的核心思想

Learn the residual, not the function
📌 本节核心要点

论文的核心想法极其简洁——与其让几层堆叠去拟合 $H(x)$,不如让它们去拟合残差 $F(x) = H(x) - x$。原映射变成 $F(x) + x$。如果恒等映射是最优解,把 $F(x)$ 压成零,比让一堆非线性层精确逼近恒等,容易得多

Residual Function Identity Mapping Preconditioning

面对退化问题,作者提出了一个反直觉的方案——不要让网络直接拟合想要的映射,让它拟合「残差」

设我们希望几层堆叠拟合的"底层映射"叫做 $\mathcal{H}(x)$,其中 $x$ 是输入。作者的提议是:让这几层去拟合另一个映射 $\mathcal{F}(x) := \mathcal{H}(x) - x$,然后把原始映射改写成 $\mathcal{F}(x) + x$

看上去只是数学等价变形——两种形式都能渐近逼近同样的函数。但"学习的难易程度可能完全不同"

这个想法的动机正是来自前面讲的退化问题。如果新增层的最优解是恒等映射——那么:

· 原始形式需要让 $\mathcal{H}(x) = x$,也就是让一堆非线性层精确"打平"成恒等。难。
· 残差形式只需要让 $\mathcal{F}(x) = 0$。容易。把权重压向零就行。

论文里有句话点出了核心:如果最优函数比起"零映射"更接近"恒等映射",那么以恒等为参考点去找扰动,比把整个函数从零学起,容易得多

不要让网络从零学一个未知函数,
让它从"什么都不做"出发,
学一个小修正

— THE PHILOSOPHY OF RESIDUAL LEARNING

作者还提了一个旁证——他们后续实验里测量了学到的残差函数 $\mathcal{F}(x)$ 的响应幅度,发现它们普遍很小。这印证了"恒等映射是个好的预条件"的猜想:实际中大多数层只需要做一些小的扰动,不需要做剧烈变换。

广哥在硅谷◆ ◆ ◆
CHAPTER 03 · BLOCK

恒等映射的快捷连接

Identity Shortcut Connection
📌 本节核心要点

残差形式 $\mathcal{F}(x) + x$ 在实现上变成一个简单的跨层"快捷连接"——把输入 $x$ 跳过几层、直接加到输出上。这种恒等快捷连接不带任何额外参数,也不增加任何计算量。可以原样套进任何标准 SGD + 反向传播流程,不用改优化器。

Shortcut Connection Skip Connection Element-wise Add

$\mathcal{F}(x) + x$ 这种形式,在实现上可以用前馈神经网络里的"快捷连接"实现——一条跨过一层或几层的连接,把输入直接加到输出上。

论文给出的基本构建块(building block)公式是:

$$y = \mathcal{F}(x, \{W_i\}) + x$$

这里 $x$ 是输入向量、$y$ 是输出向量。$\mathcal{F}(x, \{W_i\})$ 是要学习的残差函数。对于论文图 2 里那个两层例子,$\mathcal{F} = W_2 \sigma(W_1 x)$,其中 $\sigma$ 是 ReLU,偏置省略。

$\mathcal{F} + x$ 这个加法操作通过快捷连接和逐元素相加完成。论文在加法之后再套一次非线性激活(也就是 $\sigma(y)$)。

🎯 为什么这个设计这么"贵气"

恒等快捷连接不引入任何额外参数,也不增加任何计算复杂度。这意味着我们可以公平地比较"普通网络"和"残差网络"——同样的参数量、同样的深度、同样的宽度、同样的算力——除了那个忽略不计的逐元素加法之外,残差网络的计算和参数都和普通网络一样。

这对工程上极其重要——不用换优化器、不用调框架,残差连接可以无缝接到任何现有 CNN 上。

当然,有时候输入 $x$ 和残差 $\mathcal{F}$ 的维度不匹配——比如卷积层把通道数翻了倍,或者步长 2 把空间分辨率减半了。这时候快捷连接需要做一个线性投影 $W_s$ 来匹配维度:

$$y = \mathcal{F}(x, \{W_i\}) + W_s x$$

论文用实验证明:恒等快捷连接已经足够好——只在需要匹配维度时才使用线性投影,更经济,效果也不输。这也是 ResNet 论文里反复强调的一个工程原则——能用恒等的地方就用恒等,不要画蛇添足

广哥在硅谷◆ ◆ ◆
CHAPTER 04 · ARCHITECTURE

ResNet 架构家族

ResNet-18 / 34 / 50 / 101 / 152
📌 本节核心要点

论文沿用 VGG 哲学(3×3 卷积、深度同构)构造了 "普通网络" 基线,再把它升级成残差版本。从这个模板出发,扩展出了 ResNet-18 / 34 / 50 / 101 / 152 五档模型。34 层 ResNet 计算量只有 VGG-19 的 18%,但精度更高。

VGG-Style 3×3 Conv FLOPs

作者怎么设计 ResNet 的具体架构?他们沿用了 VGG 的设计哲学,但更精简

普通基线(plain baseline)的两条设计规则非常清爽:

第一条规则:对于相同的输出特征图大小,所有层的滤波器数量相同。

第二条规则:如果特征图空间大小减半,滤波器数量加倍——这样每层的时间复杂度保持恒定。

降采样不用池化,直接用步长为 2 的卷积完成。整个网络以一个全局平均池化加一个 1000 路全连接层结尾。

就这两条规则,构造出了 34 层的普通网络基线。然后把它套上残差快捷连接,就变成了 ResNet-34。

有意思的是计算量对比——这个 34 层 ResNet 只有 36 亿次浮点运算(FLOPs),仅为 VGG-19 的 18%。但精度反而更高。这是 VGG 派"更深、更窄"哲学的胜利。

模型层数FLOPs典型用途
ResNet-18181.8 B移动端 / 教学
ResNet-34343.6 B轻量产品
ResNet-50503.8 B最常用 backbone
ResNet-1011017.6 B检测 / 分割
ResNet-15215211.3 B极限性能

50/101/152 之所以能堆这么深,靠的是下一节要讲的 bottleneck 设计

广哥在硅谷◆ ◆ ◆
CHAPTER 05 · BOTTLENECK

Bottleneck 设计

1×1 → 3×3 → 1×1 sandwich
📌 本节核心要点

50 层以上的 ResNet 用 bottleneck 三明治替代两层 3×3——1×1(降维)→ 3×3(卷积)→ 1×1(升维)。$1 \times 1$ 卷积把通道数压下来再放上去,把昂贵的 3×3 卷积塞在中间瘦腰位置。这让 ResNet-152 的计算量竟然比 VGG-19 还少。

Bottleneck 1×1 Conv Channel Reduction

34 层及更浅的 ResNet 用的是基本块(basic block)——两个 3×3 卷积堆起来。但当深度增加到 50 层以上时,作者用了一种更经济的设计——bottleneck 块

一个 bottleneck 块由三层卷积组成:

· 第一层 1×1 卷积:把通道数压缩到 1/4(比如从 256 压到 64)
· 第二层 3×3 卷积:在低通道数上做真正的空间运算
· 第三层 1×1 卷积:把通道数升回原来的 4 倍(64 升回 256)

整个块的形状像一个"两头粗中间细"的三明治——这就是"bottleneck"(瓶颈)名字的由来。

为什么这样设计?3×3 卷积的计算量正比于「输入通道数 × 输出通道数」——通道翻倍,计算量四倍。如果直接堆 256 通道的 3×3 卷积,会非常贵。但把通道先压到 64 再做 3×3,最后再升回来——总计算量比直接做两层 3×3 还低,但表达能力差不多。

📐 为什么 152 层比 VGG-19 还便宜

ResNet-152 用 bottleneck 块堆 50 个,总计算量约 11.3 G FLOPs。对比 VGG-19 的 19.6 G FLOPs——深 8 倍、参数也多,但计算量只有 VGG-19 的 60%。Kaiming 团队同时把"更深"和"更便宜"两件事做到了。

广哥在硅谷◆ ◆ ◆
CHAPTER 06 · IMAGENET

ImageNet 实验

From 34 to 152 layers, all win
📌 本节核心要点

论文做了 plain vs ResNet 全对比——plain 网络越深越差,ResNet 越深越好。152 层 ResNet 单模型 top-5 错误率 4.49%,集成 6 个模型达到 3.57%,赢下 ILSVRC 2015 分类冠军;同期还拿下 ImageNet 检测、定位、COCO 检测、COCO 分割五项第一。

ILSVRC 2015 3.57% Top-5 5 Tasks First Place

论文最有说服力的实验是 plain vs ResNet 的对照组对比——同样的架构、同样的参数量,只是有没有快捷连接。

在 ImageNet 上的结果非常清晰:

plain 网络的表现:18 层 → 27.94% top-1;34 层 → 28.54% top-1。深的反而更差——退化问题被复现。

ResNet 的表现:18 层 → 27.88%;34 层 → 25.03%。深的明显更好,绝对提升 3.5%。

更壮观的是 50/101/152 层的 ResNet——它们一路把 top-5 错误率压到了:

· ResNet-50:单模型 5.25%
· ResNet-101:单模型 4.60%
· ResNet-152:单模型 4.49%
· 集成 6 个模型:3.57%,赢下 ILSVRC 2015 分类冠军

但这只是开始。靠着这套"极深表征",Kaiming 团队同时拿下了 ILSVRC 2015 的五项第一——ImageNet 分类、ImageNet 检测、ImageNet 定位、COCO 检测、COCO 分割。仅靠把 backbone 从 VGG 换成 ResNet,COCO 检测的相对提升就是 28%——一个单一架构改进带来这么大跨任务收益,史上罕见。

同一根快捷连接,
同时改写了图像分类、检测、定位、分割五个领域。
这就是"通用基础架构"的力量。

— THE FIVE WINS OF ILSVRC 2015
广哥在硅谷◆ ◆ ◆
CHAPTER 07 · EXTREME

CIFAR-10 与上千层验证

Pushing to 1000+ layers
📌 本节核心要点

为了证明残差学习不是 ImageNet 的偶然,作者在 CIFAR-10 上把网络推到了过去想都不敢想的深度——110 层、甚至 1202 层。结论:100+ 层的 ResNet 能稳定训练,1202 层依然能收敛(但开始过拟合)。这证明残差学习的好处是普遍的,不是数据集 specific 的

CIFAR-10 1000+ Layers Generalization

有人可能会怀疑——ResNet 的好处会不会只在 ImageNet 这种大数据集上成立?作者用 CIFAR-10 做了对照——这是个 6 万张 32×32 小图的简单数据集。

在 CIFAR-10 上,他们训练了从 20 层到 1202 层的各种深度的 plain 和 ResNet。结果完全印证了 ImageNet 的观察:

· plain 网络 56 层比 20 层更差
· ResNet 一路加深到 110 层都能稳定改善
· ResNet-110 训练误差 0.06%,测试误差 6.43%——SOTA

更激进的——他们试了 1202 层的 ResNet。这个网络依然能训练收敛——这在当时是不可想象的。它的测试误差是 7.93%,比 110 层稍差——但不是因为优化失败,而是因为开始过拟合(CIFAR-10 太小了,模型容量过剩)。

这一段实验的真正意义不在于 1202 层有多牛——而在于证明了一件事:残差学习真正打破了"网络不能太深"的天花板。优化问题被解决了,剩下的只是数据和算力的问题

广哥在硅谷◆ ◆ ◆
CHAPTER 08 · LEGACY

总结:快捷连接的统治

The reign of skip connections
📌 本节核心要点

ResNet 的真正影响不在于赢了 ILSVRC 2015,而在于"快捷连接"成为了之后十年所有深度模型的标配——Transformer 里每个 block 都用它,扩散模型 UNet 里用它,AlphaFold 用它,GPT 也用它。残差连接已经从一篇论文里的创新,变成了深度学习的基础设施。

2015 年 12 月,这篇论文挂上 arxiv。半年后拿下 CVPR 2016 最佳论文。但它真正的影响远不止于此。

如果你今天看任何一个现代深度学习模型——Transformer、扩散模型 UNet、AlphaFold 的 EvoFormer、GPT、Claude——你都能在里面找到这根"$y = F(x) + x$"的影子。残差连接已经从 ResNet 里的一个设计选择,变成了深度学习的默认元素——任何深度超过几层的网络,几乎都用它。

为什么?因为它解决的是一个普遍问题——优化器在面对"深度叠加"时的脆弱性。无论是 CNN、RNN、Transformer、UNet——任何想堆很多层的架构,都会撞上同样的退化问题。而残差连接给出的解药是通用的

ResNet 真正的贡献,
不是发明了一根"快捷连接",
而是教会了整个领域——
当优化变难时,
不要更聪明地优化,
要让问题变得更容易优化。

— THE TRUE LEGACY OF RESNET

这种思路在工程上有深远启示。我们经常陷入"用更强大的工具去强攻一个困难问题"的思维。但 ResNet 给的回答是另一种——重新表述问题,让原本困难的事情变得简单。把"学一个函数"重述为"学一个残差",看似只是数学变形,实际上重新组织了整个优化地形。

下一集,我们会讲 ResNet 同一团队(Kaiming He et al.)的另一篇 2015 论文——《Delving Deep into Rectifiers》。看 ResNet 还没问世前,他们就已经做出了两件事:PReLU 激活函数Kaiming 初始化。后者是今天每个用 PyTorch 的人都用的 nn.init.kaiming_normal_。是这对师徒级的工程组合——更好的初始化加上残差连接——共同把深度学习推向了真正的"深度"时代。