← 返回题目列表

ResNet 的残差连接是什么?为什么它能训练很深的网络?

高频 困难 第 15 / 25 题 更新于 2026/07/28
卷积神经网络ResNet残差连接退化问题

简化版

ResNet 要解决的是退化问题:网络越深,效果反而变差(不是过拟合,而是深层网络连训练误差都更高、难以优化)。残差连接(Residual/Skip Connection) 的做法是给网络加一条「捷径」:输出 = F(x) + x——让这一块网络不去直接学目标映射 H(x),而是学残差 F(x) = H(x) - x,再把输入 x 通过捷径直接加回来。好处:① 如果最优是「什么都不做」,网络只需让 F(x)=0(学恒等映射变容易了),从表示能力上让复现浅层映射更容易,但优化结果并无无条件保证;② 反向传播时梯度获得包含恒等项的较短路径,缓解梯度消失。靠残差连接,网络能稳定训练百层,并在特定数据集实验中探索千层级,是深度学习的里程碑。

详细版

退化问题(残差要解决的):

现象:网络加深到一定程度,训练误差和测试误差都上升
      ——不是过拟合(训练误差也高),而是深层网络「难优化」

残差块结构:

       x ───────────────┐(跳跃连接/捷径)
       │                │
    [卷积→ReLU→卷积]      │
       │ F(x)            │
       └──── + ──────────┘

        输出 = F(x) + x → ReLU
  • 网络学的是残差 F(x) = H(x) - x,而非直接学 H(x)。

为什么有效:

好处说明
恒等映射易学最优为恒等时只需 F(x)→0,比让一堆层学恒等容易
梯度直通梯度经捷径直接回传(+x 的导数为 1),缓解梯度消失
保底不退化深层至少能表现得和浅层一样好

完整版教学

一、问题背景:退化问题——越深越差

直觉上「网络越深、表达能力越强、效果越好」。但实践发现:网络加深到一定程度后,效果反而变差——而且关键是,训练误差也升高了

这排除了过拟合(过拟合是训练误差低、测试误差高)。真正的原因是退化问题(degradation)深层网络太难优化了。理论上,一个更深的网络至少可以让多出来的层学成恒等映射(什么都不改变),从而不比浅层差。但实际上,用普通的堆叠方式,网络很难学到这种恒等映射,加上深层的梯度消失,导致深层网络连训练都训不好。

ResNet 的目标就是:让深层网络至少不比浅层差,从而能真正从「更深」中获益。

二、残差连接的核心思想:学「残差」而非「原映射」

假设某几层网络理想中要学的映射是 H(x)。普通网络直接让这几层去拟合 H(x)。ResNet 换了个思路:

  • 加一条跳跃连接(skip connection / 捷径),把输入 x 直接加到这几层的输出上
  • 于是这几层实际只需要学 残差 F(x) = H(x) - x,最终输出是 F(x) + x
普通块:  x → [几层] → H(x)          (直接学 H(x))
残差块:  x → [几层] → F(x) ──+── F(x)+x   (学残差 F(x),再加回 x)
          └──────────────────┘ 捷径

「残差」这个名字就来自——网络学的是目标和输入之间的差(残差),而不是目标本身。

三、为什么有效——关键洞察一:恒等映射变容易了

这是残差连接最核心的道理。回到退化问题:深层网络难学「恒等映射」。

  • 普通网络要让几层拟合出恒等映射 H(x)=x,需要这些非线性层精确地学出一个恒等变换——这对一堆带激活的卷积层来说其实很难
  • 残差网络只需要让 F(x) = 0(残差为 0),输出就自动是 F(x)+x = x(恒等)。而让一层的输出趋近于 0,比让它精确学出恒等映射容易得多(把权重推向 0 即可)。

所以:如果某些层的最优选择就是「什么都不做(恒等)」,残差结构让网络轻松做到(F→0)。 这说明更深模型在表示能力上可以容纳近似浅层解,并让优化器更容易找到恒等附近的映射;但有限训练中的结果仍不受保证。残差参数化显著缓解了退化问题,使百层网络更可训练。

四、为什么有效——关键洞察二:梯度直接回传

残差连接还极大缓解了梯度消失。看反向传播:输出 y = F(x) + x,对 x 求导:

∂y/∂x = ∂F(x)/∂x + 1
                    └─ 来自捷径的「+1」

那个 「+1」 至关重要——它意味着梯度可以通过包含恒等项的跳跃路径回传到前面的层,不会因为经过很多层的连乘而衰减到 0。当 ∂F/∂x 较小时恒等项有助于维持梯度,但两项仍可能抵消或放大。

所以残差连接给梯度开了一条「高速公路」,让梯度能顺畅地传到很浅的层,使几百上千层的网络也能有效训练(详见梯度消失专题)。

五、残差块的具体结构

一个基本残差块(ResNet-34):

x → [3×3 卷积 → BN → ReLU → 3×3 卷积 → BN] → (+x) → ReLU → 输出
    └───────────── F(x) ──────────────┘   ↑
    x ──────────────────────────────────┘ 跳跃连接
  • 更深的 ResNet(50/101/152 层)用瓶颈块(bottleneck)1×1 降维 → 3×3 → 1×1 升维,用 1×1 卷积控制计算量(详见 1×1 卷积专题)。
  • 当 F(x) 和 x 的维度不一致时(如通道数变了),捷径上用 1×1 卷积做维度匹配。

六、影响与意义

  • 深度突破:ResNet 把网络深度从几十层推到 152 层甚至 1000 层,但更深是否更好仍取决于数据和训练配置,一举夺得 2015 年 ImageNet 冠军。
  • 成为标配:残差连接(跳跃连接)此后被几乎所有主流架构采用——DenseNet、Transformer(每个子层都有残差连接)、现代几乎所有深层网络。它是深度学习能「做深」的关键基础设施。
  • 是深度学习的分水岭:解决了「深度」这个核心瓶颈。

七、从雅可比看残差连接的帮助与边界

残差块 y=x+F(x) 的局部雅可比为 I+J_F,因此反向传播多了一条恒等项路径。标量化理解:若 F′(x)=-0.2,梯度因子是 0.8;若 F′(x)=0.5,因子是 1.5;若 F′(x)=-1,两项正好抵消为 0。可见残差连接通常改善梯度路径,但并不数学保证“无损”。

情况连接方式维度处理
同形状y=x+F(x)直接相加
通道或步长变化y=W_s x+F(x)1×1 投影或其他下采样
DenseNety=concat(x,F(x))通道拼接,不是相加
Pre-activation ResNetBN/ReLU 在卷积前让恒等分支更直接

原始 ResNet 常采用卷积后归一化与激活的 post-activation,后续 pre-activation 版本调整了顺序。残差思想降低了学习恒等映射的难度,但训练效果仍受归一化、初始化、优化器和数据影响。

残差连接提供的是更有利的参数化和梯度路径,不是对深度、收敛或精度的无条件保证。

八、常见误区与追问

  • 误区:残差连接保证梯度原样传到最前层。 I+J_F 仍可能在某些方向放大、收缩甚至抵消。
  • 误区:DenseNet 与 ResNet 都是逐元素相加。 DenseNet 主要使用通道拼接,特征复用方式和成本不同。
  • 追问:输入输出维度不同时怎么相加? 常用 stride 1×1 投影匹配通道与空间尺寸,也可使用特定零填充方案。
  • 追问:残差块为什么更容易表示恒等映射? 只需把残差分支学到接近零,而非让多层非线性整体拟合恒等函数。
  • 追问:pre-activation 有什么作用? 把归一化和激活移到卷积前,可让恒等分支传播更直接并改善超深网络优化。

九、加强记忆

ResNet 解决退化问题(网络越深训练误差反而越高,不是过拟合,是深层难优化)。残差连接:加跳跃捷径,输出 = F(x) + x,让网络学残差 F(x)=H(x)-x 而非直接学 H(x)。有效两大原因:① 恒等映射变容易——最优为「什么都不做」时只需 F(x)→0(把权重推向 0,比精确学恒等容易得多),使深层更容易表示浅层解,但不保证训练结果不差② 梯度直通——∂(F+x)/∂x = ∂F/∂x + 1,那个 +1 提供包含恒等项的较短梯度路径、缓解梯度消失。靠它网络能训到 100~1000 层,是深度学习分水岭,此后残差连接影响了许多深层架构,包括 Transformer。深层用瓶颈块(1×1→3×3→1×1)