Courses
更深的神经网络理应表现更好。但在实践中,并非总是如此。
在达到某个深度后,准确率实际上可能开始下降。并不是因为模型过拟合——而是因为训练本身崩溃了。梯度在抵达早期层之前往往会消失,这些层就不再学习。您可能会认为增加更多层会解决问题,但它往往只会让情况更糟。
ResNet 用“跳跃连接”的核心思想解决了这个问题。它不再强迫每一层从零开始学习,而是让网络跨过若干层,将输入直接与输出相加。
本文将介绍 ResNet 的工作机制、其架构长什么样,以及为何它至今仍是现代深度学习中的常用算法。
想看看 ResNet 的实际应用?在我们的 使用 ResNet 进行图像分类练习中亲自试试,该练习属于 使用 PyTorch 进行图像深度学习 课程的一部分。
什么是 ResNet 架构?
ResNet(Residual Network 的缩写,残差网络)是一种为让深层网络训练可行而设计的神经网络架构。
这一思想由微软研究院在 2015 年提出。该算法通过残差连接绕过当时限制深层网络训练的难题。理念很简单,但自此之后,人们首次可以稳定地训练 50、101,甚至 152 层的网络——而无需眼看性能下滑。
在 ResNet 之前,做到那么深几乎不可行。
为何深层网络难以训练
更多的层理应意味着网络有更多学习空间。可在实践中,一旦超过某个深度,事情就开始出问题。
这里有两个问题在作祟。
第一个是梯度消失问题。神经网络通过将误差信号反向传播穿过网络来学习——这一过程称为反向传播。每一层都会基于该信号调整其权重。但当信号经过许多层向后传播时,会一次又一次地被小数相乘而缩小。等它到达早期层时,几乎所剩无几。这些层不再更新,也就不再学习。
第二个是退化问题。这有些反直觉。您会期望 56 层的网络至少不弱于 20 层的——毕竟容量更大。但研究者发现事实相反。更深的网络表现更差,甚至在训练集上也是如此。这就排除了过拟合作为原因。模型并不是记得太多,而是难以优化。
关键区别在此:这些并非能靠 dropout 或正则化解决的泛化问题,而是优化问题——网络一开始就找不到好的权重。
ResNet 被设计用来解决这两个问题。下面我来展示如何实现。
核心思想:残差学习
传统神经网络试图学习从输入到输出的直接映射。每一层查看输入并尝试推断应该输出什么。这对浅层网络效果不错。但当网络变深,就会遇到上面提到的两个问题。
在 ResNet 中,每个模块不再被要求学习完整映射,而是被问一个更简单的问题:为得到正确输出,我需要在输入上加上什么?
这个差值就称为残差。
因此,网络不再学习:

残差学习(1)
而是学习:

残差学习(2)
其中 F(input) 是残差——网络需要做出的微小校正。如果该层无需改变任何内容,它可以将 F(input) 推向 0,并让输入原样通过。
这听起来或许只是小修小改,但它改变了网络的学习任务。学习一个小校正比从头学习一个完整变换要容易得多,这正是让更深的网络可训练的关键。
ResNet 中的跳跃连接是什么?
跳跃连接(skip connection)顾名思义——一条绕过一个或多个层的直接通路,将输入送到网络更靠后的位置。
在传统网络中,数据按顺序流经每一层。每层对输入进行变换,并将结果传给下一层。跳跃连接则将原始输入直接与模块更下游某层的输出相加。
可以这样来想象:

跳跃连接示意图
输入 x 同时走两条路径。一条路径通过卷积层,学习残差 F(x)。另一条路径跳过这些层,直达相加步骤。最终输出为 F(x) + x。
这个捷径对训练意义重大。在反向传播中,梯度可以通过跳跃连接回传,而无需经过中间层。这样早期层就能获得更干净、更强的学习信号——这正是 ResNet 之前的深层网络所缺失的。
ResNet 模块的结构
残差块是构成 ResNet 的重复单元。理解一个块,也就理解了整个网络。
单个块内部发生了什么:
-
输入
x进入该块并分成两条路径 -
一条路径通过两个卷积层,每个卷积层后接批量归一化和 ReLU 激活
-
另一条路径跳过这些层——这就是跳跃连接
-
两条路径在相加步骤汇合,将原始输入与卷积层的输出相加
-
对结果再施加一次 ReLU 激活
流程图如下:

ResNet 模块示意图
这里的跳跃连接称为恒等映射——输入不做任何改变,直接与学习得到的输出相加。这是最简单的捷径,无需任何变换,也不引入额外参数。
但要实现相加,两条路径产生的张量形状必须一致。如果卷积层改变了空间尺寸或通道数,输入 x 就无法直接相加。这种情况下,ResNet 会在跳跃路径上应用投影捷径——用 1×1 卷积将 x 重塑为匹配形状。
ResNet 中大多数模块使用恒等捷径。只有在维度发生变化时才会使用投影捷径,通常出现在网络的阶段切换处。
ResNet 架构的类型
ResNet 有几个标准变体,名称对应其总层数。选择哪一种取决于您的优化目标——速度、准确率,或两者兼顾。

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 与传统 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。