ResNet — 深度残差学习如何打开 152 层之门¶
2015 年 12 月 10 日,Kaiming He 在 arXiv 上传 1512.03385。 这是一篇只有 12 页、零数学证明的工程论文,却用一个看起来"什么都没做"的 skip connection, 让网络从 19 层跳到 152 层、ImageNet top-5 误差从 7.3% 降到 3.57%、并最终成为 Transformer / Diffusion / NeRF 时代仍在使用的基础组件。 它是 CVPR 2016 Best Paper,至今被引 25 万次,是 21 世纪被引最多的 CS 论文之一。
一句话总结¶
ResNet 用 \(y = \mathcal{F}(x) + x\) 这个"恒等捷径"取代直接学习 \(y = \mathcal{F}(x)\),让 152 层网络的优化变成"学残差",从根本上解决了深度网络的退化问题(degradation problem)。
历史背景(History)¶
2015 年的视觉学界在卡什么¶
要理解 ResNet 的颠覆性,必须回到 2014-2015 那个"层数焦虑"的年份。
2012 年 AlexNet 8 层赢 ImageNet,2014 年 VGG 19 层、GoogLeNet 22 层各自把 top-5 误差压到 7% 左右。整个学界形成了一个朴素的共识:更深 = 更好。但这个共识在 2014 年下半年开始撞墙 —— 当时几个独立团队(包括 He 本人在 PReLU 论文里、Schmidhuber 团队的 Highway Networks)都发现:
把 VGG 从 20 层加到 30 层,训练 loss 不降反升;加到 50 层,根本训不起来。
这不是过拟合(训练 loss 都在涨),也不是梯度消失(用了 BatchNorm 和 He init 之后梯度量级是健康的)。学界把这个现象叫 degradation problem(退化问题),但没人能说清原因。
直接逼出 ResNet 的 3 篇前序¶
- He et al., 2015 (PReLU + He init) arxiv/1502.01852:He 自己上一篇文章已经把 30 层网络的初始化问题解决了,但他发现继续加深仍然变差 —— 这成了 ResNet 的直接动机。
- Ioffe & Szegedy, 2015 (BatchNorm) arxiv/1502.03167:BN 让深网梯度稳定,但不能解决退化 —— 这反过来证明退化不是数值问题。
- Srivastava, Greff, Schmidhuber, 2015 (Highway Networks) arxiv/1505.00387:早 ResNet 7 个月提出"门控 skip" \(y = T(x) \cdot \mathcal{F}(x) + (1-T(x)) \cdot x\),是 ResNet 的"思想原型"。但 Highway 用了门控权重 \(T(x)\),参数多、训练不稳定。
作者团队当时在做什么¶
Kaiming He 当时是 MSRA 的青年研究员,团队(He / Zhang / Ren / Sun)是 Faster R-CNN 的作者,正在为 ILSVRC 2015 备战。ResNet 不是孤立的炫技 paper,而是 MSRA 在 2015 年 ImageNet 全战场的弹药库:他们用 ResNet 同时拿下了 ImageNet 分类、检测、定位、COCO 检测、COCO 分割 5 项第一。
工业界 / 算力 / 数据的状态¶
- GPU:NVIDIA Maxwell K40 / Titan X,单卡 12GB 显存,跑 152 层 ResNet 需要 8 卡 mini-batch 256
- 数据:ImageNet-1k (1.28M 图)、CIFAR-10/100 是 sanity check 标配
- 框架:Caffe 还是主流,PyTorch 一年后才出。原始 ResNet 用 Caffe 实现
- 行业焦虑:Google 刚收购 DeepMind 一年,Facebook 成立 FAIR,深度学习从学术走向产品化的最后窗口期
方法详解¶
整体框架¶
ResNet 的整体 pipeline 极其简单:把 VGG 风格的 plain CNN 切成若干个 residual block,每个 block 用 skip connection 把输入直接加到输出上。整个网络分成 5 个 stage(conv1 + 4 个 residual stage + classifier),每进入新 stage 就把空间分辨率减半、通道数翻倍。
Input (224×224×3)
↓ 7×7 conv, 64, stride 2 → 112×112
↓ 3×3 maxpool, stride 2 → 56×56
↓ Stage 1: [Residual Block × N1] 64-d → 56×56
↓ Stage 2: [Residual Block × N2] 128-d → 28×28 (first block stride=2)
↓ Stage 3: [Residual Block × N3] 256-d → 14×14 (first block stride=2)
↓ Stage 4: [Residual Block × N4] 512-d → 7×7 (first block stride=2)
↓ Global Average Pool → 1×1×512
↓ FC 1000 + softmax
不同深度只是改 \((N_1, N_2, N_3, N_4)\) 和使用 BasicBlock vs Bottleneck:
| 模型 | Block 类型 | \((N_1, N_2, N_3, N_4)\) | 总层数 | 参数量 | FLOPs |
|---|---|---|---|---|---|
| ResNet-18 | BasicBlock (2 conv) | (2, 2, 2, 2) | 18 | 11.7M | 1.8B |
| ResNet-34 | BasicBlock | (3, 4, 6, 3) | 34 | 21.8M | 3.6B |
| ResNet-50 | Bottleneck (3 conv) | (3, 4, 6, 3) | 50 | 25.6M | 3.8B |
| ResNet-101 | Bottleneck | (3, 4, 23, 3) | 101 | 44.5M | 7.6B |
| ResNet-152 | Bottleneck | (3, 8, 36, 3) | 152 | 60.2M | 11.3B |
注意一个反直觉点:ResNet-50 的参数量只比 ResNet-34 多 17%,但层数多 47%、ImageNet top-5 error 直接砍掉 30%。这是 bottleneck 的功劳(详见关键设计 2)。
关键设计¶
设计 1:Identity Shortcut(恒等捷径)—— 真正的"魔法"¶
功能:把 block 的输入 \(x\) 通过一个无任何变换的"加法旁路"直接送到 block 输出 \(y\),让网络只需要学习"输入到输出的差异 \(\mathcal{F}(x) = y - x\)",而不是直接学习"输入到输出的完整映射"。
前向公式:
这里 \(\sigma\) 是 ReLU,\(W_1, W_2\) 是两个 3×3 conv 的权重(已含 BN)。整个 block 只有 \(\mathcal{F}\) 部分有可训练参数,shortcut 路径上完全没有任何参数。
前向伪代码(PyTorch 风格):
class BasicBlock(nn.Module):
def __init__(self, ch):
super().__init__()
self.conv1 = nn.Conv2d(ch, ch, 3, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(ch)
self.conv2 = nn.Conv2d(ch, ch, 3, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(ch)
def forward(self, x):
identity = x # ← 无参数 shortcut
out = F.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
out = out + identity # ← 核心一行:+ x
return F.relu(out)
整个 ResNet 的"魔法"就是高亮的那一行 out = out + identity —— 无参数、无 FLOPs(加法可以与上一步 conv 融合)、无新超参。
反向传播分析(这是论文最深刻的洞察):
设第 \(l\) 层的输入为 \(x_l\),pre-activation ResNet 中可以严格写出 \(x_L\)(任意更深层)和 \(x_l\) 的关系:
对 loss \(\mathcal{E}\) 求梯度(链式法则):
注意括号里那个 +1 —— 它意味着:无论中间所有 \(\mathcal{F}\) 项的梯度多小,shortcut 都保证了至少有一份完整梯度 \(\partial \mathcal{E}/\partial x_L\) 直接回传到 \(x_l\)。这就是 ResNet 解决梯度消失的数学本质。在 plain CNN 中,这个梯度需要连乘 \(L-l\) 个雅可比矩阵,量级会指数级衰减;而在 ResNet 里,它是"加法 + 微小修正"。
4 种 shortcut 策略对比(论文 Table 3):
| 策略 | 同维 block | 跨维 block (stride=2) | 参数开销 | top-1 error |
|---|---|---|---|---|
| (A) zero-padding | identity | zero-pad 通道 | 0 | 25.03% |
| (B) projection only on dim mismatch | identity | 1×1 conv | 极小 | 24.52% ← 论文采用 |
| (C) projection everywhere | 1×1 conv | 1×1 conv | 大 | 24.19% |
| (D) (post-2016) identity even cross-dim | identity + 切片 | 切片+pad | 0 | 接近 B |
C 性能最好但参数最多。作者反直觉地选了 B,对外宣告:"1×1 conv projection 不是 ResNet 的核心,identity shortcut 才是。能不引参数就不引。" 这个选择让 ResNet 保留了"零成本"美学,也成为后来 Pre-act / 1001 层论文能成立的前提。
设计动机 —— 为什么这个 trick 这么管用?
退化问题的本质是:让一个 conv 块学习恒等映射 \(y = x\),对 SGD 来说非常困难,因为这要求 \(W_2 \sigma(W_1 x) = x\),对 \(W_1, W_2\) 来说没有显式的 0 解(ReLU 的非线性挡在中间)。
而 residual 公式 \(y = \mathcal{F}(x) + x\) 把"学恒等映射"重新参数化成了"让 \(\mathcal{F} \to 0\)" —— 这只需要 L2 正则把 \(W_1, W_2\) 一起拉向 0,而 L2 正则本来就是默认开启的!
换句话说:ResNet 用一个免费的代数变换,把"难解的优化目标"映射到了"L2 正则的默认收缩方向"。这是工程师对优化器的一次极其精妙的"贿赂"。
设计 2:Bottleneck Block(瓶颈结构)—— 让深度变得"廉价"¶
功能:让 ResNet-50/101/152 这种超深网络的参数和 FLOPs 不会爆炸。
核心思路:把 BasicBlock 的 2 层 3×3 conv 换成一个"1×1 → 3×3 → 1×1" 的三明治:
input 256-d
↓ 1×1 conv, 64 ← 通道数压缩 4×(squeeze)
↓ 3×3 conv, 64 ← 在低维做昂贵的 spatial conv
↓ 1×1 conv, 256 ← 通道数恢复(expand)
↓ + identity (256-d shortcut)
output 256-d
详细维度追踪(以 stage 4 第一个 block 为例,输入 14×14×512):
| 层 | kernel | 输入维度 | 输出维度 | 参数量 |
|---|---|---|---|---|
| conv1 (squeeze) | 1×1, 128 | 14×14×512 | 14×14×128 | 65,536 |
| conv2 (spatial) | 3×3, 128, s=2 | 14×14×128 | 7×7×128 | 147,456 |
| conv3 (expand) | 1×1, 512 | 7×7×128 | 7×7×512 | 65,536 |
| identity shortcut (1×1, s=2 projection) | 1×1, 512, s=2 | 14×14×512 | 7×7×512 | 262,144 |
| 总计 | — | — | — | ~540k |
如果用 BasicBlock 实现同等通道数,参数会是 \(2 \cdot (3 \times 3 \times 512 \times 512) \approx 4.7M\),bottleneck 把参数压了 8.7×。
为什么不在浅网络也用 bottleneck?
ResNet-18/34 用 BasicBlock 因为参数本来就不大(11.7M / 21.8M),bottleneck 反而引入了额外的 1×1 conv overhead,得不偿失。只有当层数 ≥50、通道数 ≥256 时,bottleneck 才显示出"砍参数砍 FLOPs"的威力。这是一个非常工程化的设计选择 —— 不存在"普适最优 block",只有"针对 scale 的最优 block"。
设计动机:ResNet-152 的总 FLOPs (11.3B) 仍然 低于 VGG-19 的 19.6B —— 这是 bottleneck 把"超深网络"从"显存爆炸 + 推理超慢"的不可工程化区域拉回工程化区域的关键。如果没有 bottleneck,152 层 ResNet 大概率会跟 1202 层 ResNet 一样成为"实验室玩具",而非工业级 backbone。
设计 3:Pre-activation 顺序(2016 年 Identity Mappings 论文)—— 把 shortcut 路径"洗干净"¶
功能:原始 ResNet block 在 1000+ 层时仍然出现轻微退化;pre-activation 修复了这个问题,让 1001 层网络在 CIFAR 上稳定收敛。
核心思路 —— 调换 BN/ReLU/conv 三件套的顺序:
原始 (Post-activation): Pre-activation (2016):
x ─┐ x ─┐
│ │
conv BN
│ │
BN ReLU
│ │
ReLU conv
│ │
conv BN
│ │
BN ReLU
│ │
+───── shortcut x conv
│ │
ReLU ← 这一步污染了 shortcut 路径 +───── shortcut x ← 完全干净!
│
(下一个 block 自带 BN-ReLU)
为什么"干净的 shortcut"重要?数学分析:
如果 shortcut 路径中间夹了 ReLU 或 BN,那么从第 \(l\) 层到第 \(L\) 层就不再是简单的 \(x_L = x_l + \sum \mathcal{F}_i\),而是:
每个 \(f_i\) 是 ReLU + BN 的复合非线性,梯度无法直接"加法回传",又要变成连乘,部分退化问题回归。
而 pre-act 把所有非线性塞到 conv 之前,shortcut 路径变成:
严格的加法形式,梯度回传时 +1 项无衰减地保留,1001 层都能训。这个改进不是工程 trick,而是数学结构上的关键修正,它反过来证明了"identity shortcut 才是 ResNet 真正的魂"。
设计动机:原始 ResNet 在 110 层时已经接近性能拐点;要走到 1000+ 层就必须修复这个 shortcut "污染" 问题。pre-act 把 ResNet 从"100 层级架构"升级到"1000 层级架构",也奠定了后续 Transformer Pre-LN 设计的思想基础(GPT-2/3 用的就是 Pre-LN,Post-LN 在深 Transformer 里不稳定)。
设计 4(隐性但关键):4-stage downsampling 节奏¶
功能:决定 ResNet "深而不宽"还是"宽而不深"的几何骨架。
核心思路:把 224×224 输入按 2× 节奏下采样 5 次(含初始 maxpool),最终到 7×7 接 GAP;通道数从 64 翻倍到 512。每个 stage 内部分辨率不变,stage 之间通过"第一个 block stride=2 + projection shortcut" 完成下采样和通道翻倍。
为什么 4 个 stage、为什么 2× 下采样、为什么 64→512?
- 4 stage:覆盖低/中/高/语义四级特征。少于 4 个 stage 感受野不够;多于 4 个 stage 7×7 之后再下采样会丢空间信息。
- 2× 下采样:与通道翻倍配合,每 stage FLOPs 大致守恒(空间面积 ÷4,通道数 ×2,每个像素 conv FLOPs ×2,总 FLOPs ÷1)—— 这让 deep stages(语义层)的计算量不至于爆炸。
- 64→512:经验值。后续 ResNeXt、EfficientNet、ConvNeXt 都微调过这条节奏,但"金字塔形 backbone + 4 stage" 已成事实标准,被几乎所有 CNN/Transformer hybrid 模型继承(Swin Transformer 也是 4 stage)。
设计动机:这套 stage 设计不是 ResNet 原创(VGG/GoogLeNet 已有类似结构),但 ResNet 第一次把它和"residual block 是 stage 内基本单元"绑死,让"4-stage + residual block" 成为后续 10 年 backbone 设计的事实模板。
损失函数 / 训练策略¶
| 项 | 配置 | 说明 |
|---|---|---|
| Loss | Cross-entropy + softmax | 无任何特殊设计 |
| Optimizer | SGD | 没用 Adam |
| Momentum | 0.9 | |
| Weight decay | 0.0001 | 关键 —— 让 \(\mathcal{F} \to 0\) 的天然驱动力 |
| LR schedule | 初始 0.1,loss plateau 后 ÷10 | 手工调度,2 次 decay |
| Batch size | 256 | 8 GPU × 32 |
| Epochs | ~120 | 600k iterations on ImageNet |
| Init | He init (kaiming normal) | 对 ReLU 激活的最优初始化 |
| Normalization | BatchNorm 在每个 conv 后 | He et al. 2015 |
| Data aug | Resize 256 + RandomCrop 224 + HFlip + ColorJitter | AlexNet-PCA 风格 color jitter |
| Test aug | 10-crop + multi-scale (224/256/384/480/640) | ensemble 时使用 |
注意 1:方法本身只引入一个 +x 加法,不需要任何额外超参数、不增加可学习参数、不增加 FLOPs(identity shortcut 是 0 FLOPs,也可以与上一步 conv 融合)。这种"零成本即神器"的特性是 ResNet 能成为"基础组件"而非"竞争者"的根本原因。
注意 2:训练 recipe 看起来朴素到不可思议(10 年前的 SGD 配方),但 ResNet 之所以能在 2026 年仍然作为基础组件,正是因为它对 recipe 不敏感 —— 换 Adam、换 LayerNorm、换更大数据集,公式 \(y = \mathcal{F}(x) + x\) 都仍然 work。这种"配方鲁棒性"才是真正的护城河。
失败案例(Failed Baselines)¶
当时输给 ResNet 的对手¶
- Plain VGG-style 34 层网络:训练 error 7.5%,验证 error 28.5%;同等容量的 ResNet-34 训练 6.5%,验证 24.2%。注意:plain 34 比 plain 18 更差,这是 degradation 的直接证据。
- Highway Networks 19/32 层:在 CIFAR-10 上 8.8% / 8.6% 错误率,ResNet-110 是 6.43%。Highway 多了门控参数,训练不稳定,深度也上不去(论文里只到 32 层)。
- GoogLeNet Inception-v3:top-5 单模型 5.6%,ResNet-152 单模型 4.49%。Inception 靠精妙的 multi-branch 拓扑设计,调参代价高、不易迁移到其他任务。
作者论文里承认的失败实验¶
论文 Table 3 比较了三种 shortcut 策略: - (A) zero-padding shortcut(维度不同时填零):top-1 error 25.03% - (B) projection shortcut for dim mismatch only:24.52% - (C) projection shortcut for ALL connections:24.19%
C 最好但参数最多。作者故意选了 B,论证:"identity shortcut 才是核心,projection 不是关键,能不用就不用"。这个反直觉的选择保留了 ResNet 的"零成本"美学。
1202 层的反例¶
论文 §4.2 报告了一个有趣的"失败":在 CIFAR-10 上训练 1202 层 ResNet,收敛了(说明优化没问题),但测试 error 7.93% 比 110 层的 6.43% 高 —— 第一次证明 ResNet 也会过拟合。这成为 2016-2017 年 stochastic depth、wide ResNet、DenseNet 的研究起点。
真正的"反 baseline"教训¶
Highway Networks 比 ResNet 早 7 个月,思想几乎一致,但 Highway 至今几乎没人用。原因不是 idea 不行,而是 Highway 太"复杂"了(带门控)。ResNet 的胜利是"工程极简主义"的胜利:能不引入参数就不引入。这是 paper 没有写在论文里、但回过头看最重要的"失败案例" —— 复杂的 idea 即使早出现也会输给极简的 idea。
实验关键数据¶
主实验(ImageNet)¶
| 模型 | Top-5 error (val) | FLOPs |
|---|---|---|
| VGG-16 | 8.43% | 15.3B |
| GoogLeNet | 7.89% | 1.5B |
| PReLU-net | 7.38% | — |
| ResNet-34 (B) | 7.40% | 3.6B |
| ResNet-50 | 5.25% | 3.8B |
| ResNet-101 | 4.60% | 7.6B |
| ResNet-152 (single) | 4.49% | 11.3B |
| ResNet-152 (ensemble of 6) | 3.57% | — |
ILSVRC 2015 第一名,把人类水平 (~5%) 第一次清晰超过。
消融(CIFAR-10)¶
| 配置 | Test error | 说明 |
|---|---|---|
| Plain-20 | 8.75% | baseline |
| Plain-32 | 9.09% | 加深反而变差(degradation) |
| Plain-44 | 10.40% | 继续恶化 |
| Plain-110 | 18.06% | 完全训不起来 |
| ResNet-20 | 8.75% | 与 plain 持平(浅网络无 gain) |
| ResNet-32 | 7.51% | 加深开始 work |
| ResNet-110 | 6.43% | 110 层稳定收敛 |
| ResNet-1202 | 7.93% | 过拟合(参数 19.4M) |
关键发现¶
- degradation 不是过拟合:plain-110 训练 error 也很差,不只是验证差
- identity shortcut 是核心,projection 不是关键:Table 3 三策略差距 < 1%
- bottleneck 让 152 层 FLOPs < VGG-19:高深度的工程可行性
- 同等 FLOPs 下,更深更好:ResNet-50 < ResNet-101 < ResNet-152,没有边际递减
- 泛化能力惊人:原班人马拿 ResNet 同时打下 ImageNet 分类/检测/定位 + COCO 检测/分割 5 个 SOTA
思想史脉络(Idea Lineage)¶
graph LR
HW[Highway Networks 2015<br/>门控 skip] -.思想原型.-> RN
PReLU[PReLU + He init 2015<br/>解决初始化] -.直接动机.-> RN
BN[BatchNorm 2015<br/>稳定梯度] -.前置工具.-> RN
RN[ResNet 2015<br/>identity skip]
RN --> PreAct[Pre-act ResNet 2016<br/>1001 层稳定]
RN --> WRN[Wide ResNet 2016<br/>宽 vs 深]
RN --> DN[DenseNet 2017<br/>每层全连 skip]
RN --> RNXt[ResNeXt 2017<br/>分组卷积]
RN --> SD[Stochastic Depth 2016<br/>训练时随机丢层]
RN --> NRX[NoRm-free / Fixup 2019<br/>去掉 BN 也能深]
RN --> Tx[Transformer 2017<br/>residual + LN 复用 ResNet 公式]
Tx --> BERT[BERT 2018]
Tx --> GPT[GPT 系列]
RN --> NeRF[NeRF 2020<br/>MLP 残差]
RN --> DDPM[DDPM 2020<br/>U-Net 残差块]
RN --> SD2[Stable Diffusion 2022]
前世(被谁逼出来的)¶
- 1991 LSTM [Hochreiter, Schmidhuber]:cell state 的"加法路径"是 skip connection 的最早思想原型
- 2014 GoogLeNet auxiliary classifier:尝试用浅层监督缓解深网梯度,是另一种"绕过深度"的思路
- 2015 Highway Networks [Srivastava, Greff, Schmidhuber]:门控 skip,思想完全等价但工程复杂
- 2015 PReLU + He init:解决数值问题但仍有 degradation,反向证明问题在优化 landscape
今生(继承者)¶
- 直接派生:Pre-act ResNet (2016)、Wide ResNet (2016)、DenseNet (2017)、ResNeXt (2017)、SE-Net (2017)、Stochastic Depth (2016)、Fixup Init (2019)
- 跨架构借用:Transformer 的每个 block
y = LayerNorm(x + Attention(x))完全复用了 ResNet 公式 —— 没有 ResNet 就没有 Transformer 的可训练性 - 跨任务渗透:NeRF 的 MLP、DDPM 的 U-Net、Stable Diffusion 的去噪网络、AlphaFold 2 的 Evoformer,全部内嵌 residual 结构
- 跨学科外溢:神经常微分方程 [Chen et al., NeurIPS 2018 Best Paper] 把 ResNet 解释为欧拉离散化的 ODE,开启了"网络即动力系统"的研究流派
误读 / 简化¶
- "skip 就是好的":很多 follow-up 把 skip 加在任意位置,但 ResNet 的精髓是配对的 conv-conv-add(保持维度匹配 + identity 是默认 path)。乱加 skip 在很多任务上反而变差
- "层越深越好":1202 层实验早就证明这个简单结论是错的,但工业界 2016-2018 年盲目堆层风气依然盛行
- "residual 是为了梯度回传":流行解释,但论文 §1 明确说优化难度才是核心,梯度数值在 BN 加持下其实是健康的
当代视角(2026 年回看 2015)¶
站不住的假设¶
- "网络越深越好":今天我们知道,宽度 / 数据 / 算力的边际收益在很多场景比深度更高。Wide ResNet、ConvNeXt、Vision Transformer 都证明了这点。152 层不是"越深越好"的终点,而是"深度遇到了递减回报"的起点。
- "identity shortcut 解决一切":在 1000+ 层 + 长序列场景下,identity 仍然不够。LayerNorm 在 shortcut 内/外的位置(Pre-LN vs Post-LN)成为 Transformer 训练稳定性的关键问题;Mamba/SSM 完全用了不同的结构。
- "卷积是视觉的归纳偏置":ViT (2020) 证明纯 attention + ResNet 风格残差就能在大数据上 match CNN。卷积不是必需的,残差才是。
时代证明的关键 vs 冗余¶
- 关键:identity shortcut 本身、"零额外参数"的工程美学、bottleneck 的参数效率
- 冗余 / 误导:原始 ResNet 的 BN-ReLU 顺序(pre-act 更好)、projection shortcut(identity 足够)、最大 152 层的设定(典型 backbone 用 50/101 即可)
作者当时没想到的副作用¶
- 成为 Transformer 的隐形支柱:Vaswani 2017 的 "Attention is All You Need" 里,每个 sub-layer 都是
LayerNorm(x + Sublayer(x)),这是 ResNet 公式的完美移植。没有 ResNet 提供的"可优化性 prior",6 层 Transformer 都训不起来。 - 成为可解释性研究的金矿:Lottery Ticket Hypothesis、Loss Landscape 可视化、Neural Tangent Kernel 等理论工具都把 ResNet 作为标准研究对象
- 成为 NAS 的搜索空间基石:EfficientNet、RegNet、NAS-Bench 全部把 residual block 作为搜索单元
如果今天重写 ResNet¶
如果 He 团队 2026 年重写 ResNet,可能会: - 默认用 pre-activation 顺序 - 把 BN 换成 LayerNorm(对小 batch 更友好) - 把 ReLU 换成 GELU 或 SiLU - 用 RMSNorm 替代 BN 的复杂统计 - 加 token mixing branch(融合 attention 与 conv) - 默认深度 50,宽度变成主要 scaling 维度 - 把 152 层这个"炫技数字"砍掉,因为时代已经过了"层数军备竞赛"的阶段
但核心公式 \(y = \mathcal{F}(x) + x\) 一定不会变。这是它穿越时代的根本原因 —— 这个公式不依赖卷积、不依赖 BN、不依赖 ReLU,只依赖加法可逆性这个最朴素的性质。
局限与展望¶
作者承认的局限¶
- 1202 层过拟合,需要更强正则
- 在小数据集(CIFAR)上,过深的网络收益递减
自己发现的局限¶
- Identity shortcut 强制输入输出同维,在跨模态融合时需要 projection,破坏了"零成本"美学
- BatchNorm 依赖让小 batch / online learning 场景受限
- 152 层在推理时延对边缘设备不友好(虽然 FLOPs 低,但层数多 = launch 次数多 = GPU 调度开销大)
改进方向(已被后续工作证实)¶
- Pre-activation(已实现)
- Stochastic Depth / DropPath(已实现)
- Wide vs Deep 权衡(Wide ResNet / EfficientNet 已实现)
- Norm-free(Fixup / NF-ResNet 已实现)
- 跨模态 residual(Transformer / U-Net 已隐式实现)
相关工作与启发¶
- vs Highway Networks:思想等价,但 Highway 用门控 \(T(x)\) 引入额外参数和优化难度。教训:能 hard-code 的就不要 learn。
- vs GoogLeNet / Inception:Inception 用复杂 multi-branch 拓扑+ NAS-like 调参,迁移到检测/分割成本高。ResNet 的"简单堆叠"反而泛化更好。教训:简单 + 通用 > 复杂 + 专用。
- vs DenseNet:DenseNet 把每层都连到所有后续层,极致的"信息复用",但显存爆炸、不友好工业部署。ResNet 是 Pareto 前沿点。
- vs Transformer (跨架构):Transformer 的
LN(x + Sublayer(x))直接复用了 ResNet 公式。可以说 ResNet 是 Transformer 的"隐藏前置"。