跳至内容

ResNet 架构:残差网络与跳跃连接

深入解读 ResNet 架构,阐释残差学习与跳跃连接如何解决训练超深神经网络时的梯度消失与退化问题。
更新 2026年5月4日  · 12分钟

更深的神经网络理应表现更好。但在实践中,并非总是如此。

在达到某个深度后,准确率实际上可能开始下降。并不是因为模型过拟合——而是因为训练本身崩溃了。梯度在抵达早期层之前往往会消失,这些层就不再学习。您可能会认为增加更多层会解决问题,但它往往只会让情况更糟。

ResNet 用“跳跃连接”的核心思想解决了这个问题。它不再强迫每一层从零开始学习,而是让网络跨过若干层,将输入直接与输出相加。

本文将介绍 ResNet 的工作机制、其架构长什么样,以及为何它至今仍是现代深度学习中的常用算法。

想看看 ResNet 的实际应用?在我们的 使用 ResNet 进行图像分类练习中亲自试试,该练习属于 使用 PyTorch 进行图像深度学习 课程的一部分。

什么是 ResNet 架构?

ResNet(Residual Network 的缩写,残差网络)是一种为让深层网络训练可行而设计的神经网络架构。

这一思想由微软研究院在 2015 年提出。该算法通过残差连接绕过当时限制深层网络训练的难题。理念很简单,但自此之后,人们首次可以稳定地训练 50、101,甚至 152 层的网络——而无需眼看性能下滑。

在 ResNet 之前,做到那么深几乎不可行。

为何深层网络难以训练

更多的层理应意味着网络有更多学习空间。可在实践中,一旦超过某个深度,事情就开始出问题。

这里有两个问题在作祟。

第一个是梯度消失问题。神经网络通过将误差信号反向传播穿过网络来学习——这一过程称为反向传播。每一层都会基于该信号调整其权重。但当信号经过许多层向后传播时,会一次又一次地被小数相乘而缩小。等它到达早期层时,几乎所剩无几。这些层不再更新,也就不再学习。

第二个是退化问题。这有些反直觉。您会期望 56 层的网络至少不弱于 20 层的——毕竟容量更大。但研究者发现事实相反。更深的网络表现更差,甚至在训练集上也是如此。这就排除了过拟合作为原因。模型并不是记得太多,而是难以优化。

关键区别在此:这些并非能靠 dropout 或正则化解决的泛化问题,而是优化问题——网络一开始就找不到好的权重。

ResNet 被设计用来解决这两个问题。下面我来展示如何实现。

核心思想:残差学习

传统神经网络试图学习从输入到输出的直接映射。每一层查看输入并尝试推断应该输出什么。这对浅层网络效果不错。但当网络变深,就会遇到上面提到的两个问题。

在 ResNet 中,每个模块不再被要求学习完整映射,而是被问一个更简单的问题:为得到正确输出,我需要在输入上加上什么?

这个差值就称为残差

因此,网络不再学习:

Residual learning (1)

残差学习(1)

而是学习:

Residual learning (2)

残差学习(2)

其中 F(input) 是残差——网络需要做出的微小校正。如果该层无需改变任何内容,它可以将 F(input) 推向 0,并让输入原样通过。

这听起来或许只是小修小改,但它改变了网络的学习任务。学习一个小校正比从头学习一个完整变换要容易得多,这正是让更深的网络可训练的关键。

ResNet 中的跳跃连接是什么?

跳跃连接(skip connection)顾名思义——一条绕过一个或多个层的直接通路,将输入送到网络更靠后的位置。

在传统网络中,数据按顺序流经每一层。每层对输入进行变换,并将结果传给下一层。跳跃连接则将原始输入直接与模块更下游某层的输出相加。

可以这样来想象:

Skip connection graph example

跳跃连接示意图

输入 x 同时走两条路径。一条路径通过卷积层,学习残差 F(x)。另一条路径跳过这些层,直达相加步骤。最终输出为 F(x) + x

这个捷径对训练意义重大。在反向传播中,梯度可以通过跳跃连接回传,而无需经过中间层。这样早期层就能获得更干净、更强的学习信号——这正是 ResNet 之前的深层网络所缺失的。

ResNet 模块的结构

残差块是构成 ResNet 的重复单元。理解一个块,也就理解了整个网络。

单个块内部发生了什么:

  1. 输入 x 进入该块并分成两条路径

  2. 一条路径通过两个卷积层,每个卷积层后接批量归一化和 ReLU 激活

  3. 另一条路径跳过这些层——这就是跳跃连接

  4. 两条路径在相加步骤汇合,将原始输入与卷积层的输出相加

  5. 对结果再施加一次 ReLU 激活

流程图如下:

ResNet block diagram

ResNet 模块示意图

这里的跳跃连接称为恒等映射——输入不做任何改变,直接与学习得到的输出相加。这是最简单的捷径,无需任何变换,也不引入额外参数。

但要实现相加,两条路径产生的张量形状必须一致。如果卷积层改变了空间尺寸或通道数,输入 x 就无法直接相加。这种情况下,ResNet 会在跳跃路径上应用投影捷径——用 1×1 卷积将 x 重塑为匹配形状。

ResNet 中大多数模块使用恒等捷径。只有在维度发生变化时才会使用投影捷径,通常出现在网络的阶段切换处。

ResNet 架构的类型

ResNet 有几个标准变体,名称对应其总层数。选择哪一种取决于您的优化目标——速度、准确率,或两者兼顾。

ResNet architecture comparison

ResNet 架构对比

ResNet-18 和 ResNet-34 使用标准的基础模块——两个 3×3 卷积层加一条跳跃连接。它们运行快速、成本低,适合原型阶段或硬件受限的场景。

ResNet-50 及以上切换为称为“瓶颈模块”的不同设计,使用三层而非两层。这一变化让更深的网络在计算成本不成比例上涨的情况下更易训练。下一节将详细介绍其原理。

ResNet-101 和 ResNet-152 更进一步,但代价是更长的训练时间和更高的内存占用。它们常见于研究和对准确率要求高于速度的生产系统中。

在大多数实际工作中,ResNet-50 是默认起点。它在深度与成本之间取得了良好平衡,并在各大深度学习框架中都有良好支持。

ResNet 的瓶颈架构

更深的 ResNet 不再使用浅层网络的相同模块设计。从 ResNet-50 开始,架构切换为瓶颈模块,这是一种三层设计,能在加深网络的同时控制计算量。

该模块依次使用三种卷积:

  • 1×1 卷积——减少通道数,缩小输入规模
  • 3×3 卷积——在更小的表示上进行特征学习
  • 1×1 卷积——将通道数扩展回原始大小

首尾两个 1×1 卷积起到瓶颈作用——名称由此而来。它们在较昂贵的 3×3 卷积之前压缩数据,之后再恢复。

对高通道输入执行 3×3 卷积的计算量很大。通过先减少通道数,瓶颈模块让 3×3 卷积在更小的输入上工作。结果是在计算成本不同比例上升的情况下实现更深的模块。

跳跃连接的工作方式与基础模块相同——在最终激活之前将输入与输出相加。唯一不同是,这里通道维度在模块内发生变化,几乎总需要使用投影捷径。

ResNet 如何解决梯度消失问题

梯度消失问题归根结底是距离问题。梯度在网络中回传得越远,就缩小得越多——等到达早期层时,已不足以支撑学习。

跳跃连接通过为梯度提供更短路径来规避该问题。

在反向传播中,梯度不必按顺序穿过每一层。它们可以直接沿跳跃连接回传,完全绕过卷积层。这个捷径让梯度足够大,能够实际更新早期层。

这也改变了每个模块需要学习的内容。网络不再从零寻找完整变换,而只需在输入之上学习一个小校正。这是更易求解的优化问题,也意味着网络可以更深而训练仍然稳定。

总之,过去难以稳定训练的超深网络,变得可训练了。

ResNet 与传统 CNN 架构对比

传统 CNN 与 ResNet 都是从图像中学习特征,但方式不同。

在传统 CNN 中,数据沿直线流过各层。每一层接收上一层的输出,施加变换,再向前传递。此方式在一定深度内运行良好。超过某个深度后,这种串行结构在反向传播中变得不可靠——梯度收缩、早期层停止学习,准确率开始下降。

ResNet 不再走直线。跳跃连接允许输入绕过一个或多个层,并在模块更后面直接与输出相加。网络仍会学习变换,但同时也为数据与梯度提供了一条直达通路。

两种方法的对比如下:

ResNet versus traditional CNN

ResNet 与传统 CNN 对比

跳跃连接既有助于梯度流动,又能平滑优化过程,这意味着网络能更快、更稳定地找到合适的权重。

ResNet 架构的应用

ResNet 架构广泛应用于各种真实世界任务。

图像分类是 ResNet 的起点。它在 2015 年赢得了 ImageNet 大规模视觉识别挑战赛,如今仍是将图像归类到各类别(医疗影像、卫星图像、产品照片等)的常用选择。

目标检测流程常采用 ResNet。像 Faster R-CNN 和 Mask R-CNN 这样的框架,将 ResNet 与一个检测头结合,用于识别并定位图像中的目标。ResNet 负责特征提取,检测头完成其余部分。

迁移学习让 ResNet 对大多数数据科学家真正有用。您无需从头训练(这要耗费数天且需要大量数据),而是加载在 ImageNet 上预训练好的 ResNet,并在自己的数据集上微调。预训练权重已编码了诸如边缘、纹理、形状等有用的低层特征,因此您起点更好。

特征提取采取类似思路。您将图像输入预训练的 ResNet,并从较后层取出输出。这些输出是对图像的稠密且有意义的表示,可进一步输入更简单的分类器或聚类算法。

在上述用例中,ResNet 多作为预训练起点。多数深度学习框架都自带 ResNet 预训练权重,因此它也是最容易上手的架构之一。

ResNet 的优势与局限

ResNet 是深度学习的一次真正飞跃——但与任何架构一样,它也有取舍。下面简单谈谈优缺点。

优势

最明显的是深度。跳跃连接让数据科学家能够训练 50、100,甚至 150+ 层的网络,而不再遭遇退化问题。这在 ResNet 之前并不可靠。

训练也更稳定。捷径路径为梯度提供了干净的回传通道,这意味着更少的调参、更少的崩溃,以及在不同任务和数据集上的更可预期结果。

此外,性能也是优势。ResNet 变体在图像基准上长期表现优异,且预训练的 ResNet 在迁移到新领域时效果良好,这也是它们仍然是众多计算机视觉项目默认起点的原因。

局限

ResNet 计算开销较大。ResNet-101 和 ResNet-152 等更深变体需要大量内存和算力,这在硬件受限或需要快速推理时会成为瓶颈。

它也并非每个任务的最佳选择。对于小数据集或更简单的问题,更轻量的架构往往能以更小代价取得相当效果。默认选用 ResNet-50 并不总是正确决定。

而且在某些领域,ResNet 已被替代。例如 EfficientNet 在图像任务上能以更少参数获得更高准确率,其他领域则由 Transformer 占据主导。ResNet 仍被广泛使用,但已不再是唯一的严肃选项。

ResNet 在现代深度学习中的地位

在提出十一年后,ResNet 架构仍然稳健长青。这在深度学习领域并不常见。

大多数实践者在需要可靠的计算机视觉基线时,仍会优先选择 ResNet。它被充分理解、在各大框架中均有良好支持,且主要库都提供预训练权重。因此,当您需要一种无需大量试验即可奏效的方案时,ResNet 往往是首选。

但它的影响力早已超越自身变体。

ResNet 的核心思想——通过在层之间添加捷径来促进信息与梯度流动——被证明具有广泛适用性。DenseNet 将其推进一步,不仅跨过一两层,而是将每一层与所有其他层相连。尽管 Transformer 的架构不同,但每个 Transformer 块中的残差连接也遵循了 ResNet 引入的相同原理。

EfficientNet、ConvNeXt 和视觉 Transformer 等新架构在特定领域进一步提升了性能。但它们并非取代了 ResNet,而是在其奠定的基础上构建起来的。

结语

ResNet 架构的核心只有一件事:跳跃连接。正是这一思想解决了长期束缚深层网络的两个问题——梯度消失与退化问题——让以往难以实现的网络深度变得可训练、可实践。

在现代深度学习中,在层之间添加捷径的思路已成为标准构件,出现在 DenseNet、Transformer,以及 2015 年之后构建的大多数架构中。

如果您今天在做计算机视觉问题,ResNet 依然是一个稳妥的起点。它不是最新的,但却是最可靠的之一。把它当作基线——到了 2026 年,您仍会惊讶于它的竞争力。

如果您是深度学习新手,但已掌握 Python 基础,不妨看看我们的 Python 中的 TensorFlow 入门 课程——周末即可上手诸如 ResNet 等主题。

FAQs

什么是 ResNet?它为何重要?

ResNet(Residual Network 的缩写,残差网络)是微软研究院于 2015 年提出的深度学习架构。它解决了使深层网络训练困难的两个问题:梯度消失与退化问题。通过跳跃连接机制,人们首次可以稳定地训练 50、100,甚至 150+ 层的网络。

神经网络中的跳跃连接是什么?

跳跃连接是一条绕过一个或多个层的直接通路,将输入直接与更后面一层的输出相加。它为数据与梯度都提供了网络中的捷径,使梯度信号足够强大,能在训练中更新早期层。

什么是梯度消失问题?

梯度消失问题出现在梯度在深层网络中向后传播时不断缩小的情形。等信号到达早期层时,已小到不足以更新它们——这些层因此停止学习。ResNet 通过让梯度沿跳跃连接回传、绕过中间层来应对这一问题。

ResNet 的基础模块与瓶颈模块有何区别?

基础模块使用两个 3×3 卷积层,出现在 ResNet-18 和 ResNet-34 等浅层变体中。瓶颈模块用于 ResNet-50 及更深网络,采用 1×1 - 3×3 - 1×1 的卷积序列,在昂贵的 3×3 卷积之前压缩通道,从而降低计算量。

我该如何为项目选择合适的 ResNet 变体?

在多数实际场景中,ResNet-50 是不错的默认选择——在深度、准确率与计算成本上取得良好平衡。硬件受限时可选择更快的 ResNet-18 或 ResNet-34;当准确率优先且算力不是瓶颈时,可考虑 ResNet-101 或 ResNet-152。

主题

与 DataCamp 一起学习

Courses

Introduction to Deep Learning in Python

4小时
263K
Learn the fundamentals of neural networks and how to build deep learning models using Keras 2.0 in Python.
查看详情Right Arrow
开始课程
查看更多Right Arrow