Residual Networks (ResNet)
残差网络 (ResNet) 通过跳跃连接将每个模块的输入加到其输出上,从而训练非常深的网络。涵盖模块、变体和代码。
残差网络(ResNet)是一种深层卷积神经网络(CNN),由残差块构成;每个残差块都通过快捷连接将块的输入与输出相加。因此,每个块只需学习对输入的修正,使包含 50 层、152 层甚至 1,000 多层的网络也能可靠地完成训练。Microsoft Research 的 Kaiming He、Xiangyu Zhang、Shaoqing Ren 和 Jian Sun 在 2015 年的论文《用于图像识别的深度残差学习》中提出了 ResNet;由残差网络组成的集成在 ILSVRC 2015 分类任务中获胜,在 ImageNet上取得了 3.57% 的 top-5 错误率。此后,残差连接已成为大多数深层架构的标准组成部分,包括 Transformer和实时目标检测器。
退化问题#
在 ResNet 出现之前,不断向普通卷积堆栈中添加层,最终会导致结果变差。ResNet 作者证明,56 层普通网络的训练误差高于 20 层网络,因此无法用过拟合来解释性能下降。理论上,只要将新增层设为恒等映射,深层网络就能达到浅层网络的表现,但梯度下降并未找到这一解法。作者将此称为退化问题。梯度消失问题此前已通过权重归一化初始化和批归一化基本解决,因此深层普通网络确实能够收敛,只是收敛到了更差的解。
残差块的工作原理#
残差块计算 y = F(x) + x,其中 x 是块的输入,F 是由少数几层构成的堆栈,通常包含两到三个带批归一化和 ReLU的卷积。如果该块的最佳映射接近恒等映射,这些层只需推动 F 趋近于零,这远比从头学习恒等映射容易。快捷连接还为梯度提供了一条穿过每个块向后传播的直接路径。恒等快捷连接无需增加参数,计算量也几乎不会增加。当块改变通道数或通过步长为 2 的卷积进行下采样时,x 的形状将不再与 F(x) 匹配,此时需要用 1×1 卷积将快捷连接投影到新的形状。
ResNet-18 和 ResNet-34 由这种基本的双卷积块堆叠而成。ResNet-50、ResNet-101 和 ResNet-152 则使用由三个卷积组成的瓶颈块:第一个 1×1 卷积减少通道数,3×3 卷积处理这些通道,第二个 1×1 卷积再恢复通道数,从而让深层模型的计算成本保持在可承受范围内。ResNet-50 约有 2,560 万个参数。原始论文还在 CIFAR-10上训练了一个 1,202 层网络,使训练误差低于 0.1%;但其 7.93% 的测试误差仍高于 110 层网络的 6.43%,作者认为差距源于在小型数据集上的过拟合。
ResNet 的变体#
- 预激活 ResNet: 同一批作者在 2016 年的后续研究中,将批归一化和 ReLU 移至每个卷积之前,使快捷路径保持纯粹的恒等映射,并在 CIFAR-10 上训练了一个 1,001 层网络。
- ResNeXt: 将每个瓶颈块拆分为许多并行的低宽度路径,这种路径数量称为基数,能够以相同的计算成本提高准确率。
- 宽 ResNet: 使用数量更少、宽度更大的块,表明宽度可以替代一部分深度。
- 现代化 ResNet: ConvNeXt(2022)通过更大的卷积核、层归一化和 GELU激活函数更新了 ResNet 设计,使其能够与视觉 Transformer 竞争。
使用预训练的 ResNet#
预训练的 ResNet 仍是常见的基准模型和骨干网络,也常用于迁移学习。torchvision ResNet 模型附带 ImageNet权重和对应的预处理,因此只需几行代码就能对图像分类:
import urllib.request
import torch
from torchvision.io import decode_image
from torchvision.models import ResNet50_Weights, resnet50
# Load ResNet-50 with ImageNet weights and its matching preprocessing
weights = ResNet50_Weights.DEFAULT
model = resnet50(weights=weights).eval()
preprocess = weights.transforms()
# Download and decode a sample image
data = urllib.request.urlopen("https://ultralytics.com/images/bus.jpg").read()
image = decode_image(torch.frombuffer(bytearray(data), dtype=torch.uint8))
# Classify the image and report the most likely ImageNet class
with torch.no_grad():
probs = model(preprocess(image).unsqueeze(0)).softmax(dim=1)
score, index = probs.max(dim=1)
print(f"{weights.meta['categories'][index.item()]}: {score.item():.2f}")它会输出 minibus: 0.25,这是照片中城市公交车对应的 ImageNet 1,000 个类别中最接近的类别。对于自定义任务,替换最后一个全连接层,并用新标签进行微调,即可复用残差阶段在 ImageNet 上学到的特征。
ResNet 与相关架构#
- VGG 等普通网络: VGG 堆叠 3×3 卷积,不使用快捷连接,最多有 19 个权重层。ResNet-152 的深度是 VGG-19 的 8 倍,复杂度却更低。
- Highway 网络: 与 ResNet 同期开发,通过学习得到的门来关闭快捷连接。ResNet 的恒等快捷连接永远不会关闭,也不会增加参数。
- DenseNet: 将块中所有先前层的输出拼接起来,而不是添加一条快捷连接;这种方式能够复用特征,但会增加通道数。
- U-Net: 它的跳跃连接将编码器特征图传递到解码器并在那里进行拼接,从而连接相距较远的阶段,而不是围绕单个块构建连接。
- 视觉 Transformer(ViT): 用自注意力替代卷积,但仍在每个注意力子层和前馈子层周围保留残差连接,就像所有 Transformer 一样。
现代模型中的残差连接#
残差思想的生命力超越了 ResNet 这一特定架构。大型语言模型(LLM)的每一层都会将注意力和前馈输出加回持续更新的残差流中,大多数 CNN 检测器也会用残差块构建骨干网络。在 YOLO26中,只要输入和输出通道匹配,C3k2 块就由返回 x + F(x) 的瓶颈模块构成;Ultralytics 软件包还包含百度 RT-DETR 的多种配置,使用 ResNet-50 和 ResNet-101 作为骨干网络。ResNet 论文获得了 CVPR 2016 最佳论文奖,而 2025 年的一项《自然》分析将其评为 21 世纪被引用次数最多的论文。










