残差网络(Residual Network,简称 ResNet)是深度学习发展史上最具里程碑意义的架构之一。由何恺明(Kaiming He)等人在 2015 年提出的 ResNet,通过引入跳跃连接(Skip Connection / Shortcut Connection)从根本上解决了深层神经网络难以训练的问题,使得训练上百甚至上千层的网络成为可能。
在 ResNet 提出之前,研究者们已经认识到网络深度对性能的重要性——更深的网络能够学习更复杂的特征表示。然而,简单地堆叠更多层并不总能带来性能提升。
退化问题(Degradation Problem)是指:随着网络深度增加,训练准确率出现饱和甚至下降的现象。这与过拟合不同,因为即使在训练集上,深层网络的误差也高于浅层网络。
| 网络深度 | 训练误差 | 测试误差 | 说明 |
|---|---|---|---|
| 20 层 | 较低 | 较低 | 基础性能 |
| 56 层 | 更高 | 更高 | 出现退化 |
| 110 层 | 显著更高 | 显著更高 | 退化加剧 |
以 CIFAR-10 上的实验为例:一个 56 层的 plain 网络(无残差连接),其训练误差反而高于 20 层的 plain 网络。这一现象表明,问题不在于过拟合,而在于优化困难——深层网络难以直接通过反向传播学会恒等映射。
ResNet 的核心洞察是:与其让网络直接学习一个复杂的映射 ,不如让网络学习残差映射 ,然后通过跳跃连接将输入 与残差相加:
其中 代表要学习的残差映射(通常由 2-3 个卷积层组成)。
为什么这样做有效? 如果恒等映射(Identity Mapping)是最优解,那么网络只需要将残差 逼近为零即可,这比直接学习恒等映射 要容易得多。在数学上,如果最优映射接近恒等,残差项的梯度 接近零,意味着网络可以轻松维持已有表征。
假设一个网络层想要学习将输入 映射到输出 :
当最优映射接近恒等时(深层网络中常见),残差学习的参数变化幅度小得多,优化更加容易。
ResNet 的基本构建块有两种设计,取决于网络的深度:
BasicBlock(用于 ResNet-18/34):
两个 卷积层,每个后接批归一化(Batch Normalization)和 ReLU 激活函数。
BottleneckBlock(用于 ResNet-50/101/152):
三个卷积层的结构: 降维 卷积 升维。这种 "bottleneck" 设计在保持表达力的同时大幅减少了计算量。
| 变体 | 构建块 | 层数分布 | 参数量 | Top-5 错误率 (ImageNet) |
|---|---|---|---|---|
| ResNet-18 | BasicBlock | [2,2,2,2] | 11.7M | 10.92% |
| ResNet-34 | BasicBlock | [3,4,6,3] | 21.8M | 8.87% |
| ResNet-50 | Bottleneck | [3,4,6,3] | 25.6M | 7.02% |
| ResNet-101 | Bottleneck | [3,4,23,3] | 44.5M | 6.44% |
| ResNet-152 | Bottleneck | [3,8,36,3] | 60.2M | 6.05% |
层数分布格式 [conv2_x, conv3_x, conv4_x, conv5_x],每个数字表示该阶段中构建块的数量。
当残差块的输入和输出维度不同时(例如跨阶段的 stride 下采样),需要投影捷径(Projection Shortcut)来匹配维度:
其中 是一个 卷积,用于调整 的通道数和空间尺寸。实践中,投影捷径只在维度变化时使用,其他情况使用恒等捷径。
以 ResNet-50 为例,从 conv2_x 到 conv3_x 的过渡:
输入: 56×56×256 (来自 conv2_x)
↓
1×1 conv, 128 (降维) → stride 2
3×3 conv, 128
1×1 conv, 512 (升维)
↓
1×1 conv, 512, stride 2 (投影捷径)
↓
输出: 28×28×512
从反向传播的角度来看,残差连接创建了一条梯度高速公路。考虑损失 对第 层输入的梯度:
其中关键项 1 确保了梯度可以直接传播到任意浅层,而不会在多层变换中衰减。这正是残差网络能够训练数百层的根本原因。
假设一个 56 层网络,从第 56 层到第 1 层的梯度传播:
Veit 等人的研究发现,ResNet 可以被视为多个浅层网络的集成(Ensemble)。在删除某些层后,ResNet 的性能下降是平滑的,而非 catastrophic:
| 删除层数 | Plain 网络准确率下降 | ResNet 准确率下降 |
|---|---|---|
| 0 | 0% | 0% |
| 10 | 崩溃 (>50%) | ~3% |
| 20 | 崩溃 | ~8% |
| 30 | 崩溃 | ~18% |
这表明 ResNet 的各层并非紧密耦合,而是以相对独立的方式协作。
ResNet 在 2015 年 ILSVRC 分类任务中以 3.57% 的 Top-5 错误率夺冠,首次超越人类水平(约 5%):
| 模型 | Top-1 错误率 | Top-5 错误率 | 发表年份 |
|---|---|---|---|
| AlexNet | 43.5% | 17.0% | 2012 |
| VGG-16 | 27.0% | 8.8% | 2014 |
| GoogLeNet | - | 6.7% | 2014 |
| ResNet-152 | 19.38% | 4.49% | 2015 |
| Inception-v3 | 17.9% | 3.6% | 2016 |
为了验证残差连接对极深网络的支持,何恺明团队在 CIFAR-10 上测试了 1202 层的 ResNet:
| 网络 | 参数量 | 测试误差 |
|---|---|---|
| ResNet-20 | 0.27M | 8.75% |
| ResNet-56 | 0.85M | 6.97% |
| ResNet-110 | 1.7M | 6.37% |
| ResNet-1202 | 19.4M | 7.93% |
1202 层网络的误差略高于 110 层(由于过拟合),但依然能够收敛——这在没有残差连接的网络中是不可能的。
ResNeXt 引入了分组卷积(Grouped Convolution)的概念,在保持计算量的同时增加基数(Cardinality):
ResNet: 3×3 conv, 64 filters (1 group)
ResNeXt: 3×3 conv, 4 filters × 32 groups (cardinality=32)
| 模型 | 参数量 | FLOPs | ImageNet Top-1 |
|---|---|---|---|
| ResNet-101 | 44.5M | 7.8G | 77.4% |
| ResNeXt-101 (32×4d) | 44.2M | 8.0G | 78.8% |
在参数量相近的情况下,ResNeXt 提升了约 1.4% 的准确率。
WRN 通过加宽而非加深来提升性能:
| 模型 | 深度 | 宽度因子 | 参数量 | CIFAR-10 误差 |
|---|---|---|---|---|
| ResNet-164 | 164 | 1 | 1.5M | 4.99% |
| WRN-28-10 | 28 | 10 | 36.5M | 3.89% |
WRN-28-10(28 层,宽度因子 10)在参数量更大的情况下,超越了深得多的 ResNet-164 的性能。
何恺明在 2016 年进一步改进了残差块设计,提出了预激活残差块(Pre-activation ResNet):
ResNet v1: conv → BN → ReLU → conv → BN → ReLU → add
ResNet v2: BN → ReLU → conv → BN → ReLU → conv → add
预激活的优势:
DenseNet 可以看作 ResNet 的极端形式——每一层都与之前所有层相连:
特征图的拼接(而非相加)带来了更强的特征复用,但显存占用也更高。
ResNet 最常见的用途是作为各种视觉任务的主干网络(Backbone):
| 任务 | 典型架构 | ResNet 的作用 |
|---|---|---|
| 图像分类 | ResNet + FC | 特征提取器 |
| 目标检测 | Faster R-CNN + ResNet | 区域建议与特征提取 |
| 语义分割 | FPN + ResNet | 多尺度特征金字塔 |
| 姿态估计 | SimpleBaseline + ResNet | 关键点热图生成 |
| 人脸识别 | ArcFace + ResNet | 人脸特征嵌入 |
训练 ResNet 的关键参数与技巧:
# PyTorch 风格的 ResNet-50 优化器配置
optimizer = SGD(
parameters,
lr=0.1, # 初始学习率
momentum=0.9,
weight_decay=1e-4 # 权重衰减
)
# 学习率调度
scheduler = MultiStepLR(
optimizer,
milestones=[30, 60, 80], # 衰减节点
gamma=0.1 # 衰减因子
)
将残差网络沿着深度方向展开,每个残差块可以被视为一个函数求和的项:
从动态系统的角度看,残差网络是在模拟欧拉方法(Euler Method)求解常微分方程(ODE):
这一视角启发了后续的神经 ODE(Neural ODE)工作。
ResNet 的成功与信息瓶颈(Information Bottleneck)理论也有联系。在深层网络中,每一层都在执行信息的压缩与变换,残差连接确保了在压缩过程中关键信息不会被丢失。从流形学习的角度看,残差结构使得网络能够在保持低维流形结构的同时,逐步学习更抽象的特征表示。
ResNet 的贡献远远超出了一个具体的网络架构:
截至 2024 年,原始 ResNet 论文被引用超过 20 万次(Google Scholar),是计算机视觉领域被引用最高的论文之一。