04-卷积神经网络 核心 预计 30 分钟 ★ 最小路径

残差连接与 ResNet 的胜利

残差连接(Residual/Skip Connection)把每层的输出改写为 y = F(x) + x——主干只学「相对输入的修正量」,输入本身经捷径直达输出;这一改写让百层网络可训练,是 ResNet 统治视觉任务五年的核心机制。

一句话定义

残差连接(Residual/Skip Connection)把每层的输出改写为 y = F(x) + x——主干只学「相对输入的修正量」,输入本身经捷径直达输出;这一改写让百层网络可训练,是 ResNet 统治视觉任务五年的核心机制。

直觉

普通深层网络像「层层转述的传话游戏」:每传一层丢一点信息,百层之后面目全非;残差连接像「每人发言时都把原话贴在旁边」——听者只需学习「改了哪里」,原话永远完整可达。

为什么重要

kp-019 留下的悬念在此揭晓:退化问题的根因是深层网络连「恒等映射」都难以用多层非线性拟合,而残差形式把恒等变成「什么都不学」的默认状态。它同时是 kp-023 LSTM 门控与 kp-026 注意力的结构亲缘——「让信息与梯度都有一条无损高速公路」是深度网络设计的第一公理。手推其梯度回传式,是本库第二硬核的推导检查点。

前置知识

  • kp-019(残差要解决的退化问题)、kp-007(梯度逐层回传机制)。

核心概念

  • 恒等映射(identity mapping):输出等于输入的函数;残差块默认即恒等。
  • 残差函数 F(x):主干学习的目标 F(x) = H(x) − x,即「需要的修正量」。
  • 捷径(shortcut):x 直通输出的旁路;维度不匹配时用 1×1 卷积投影对齐。
  • 残差块(residual block):y = x + F(x) 的最小单元,F 常为 Conv-BN-ReLU×2。
  • 退化(degradation):普通网络加深时训练误差反升的现象(非过拟合)。
  • post-activation vs pre-activation:ReLU/BN 放在残差相加之后还是之前,影响梯度纯净度。

原理与机制

残差形式与梯度回传。设块输出 y = x + F(x),损失对输入的梯度为 ∂L/∂x = ∂L/∂y·(1 + ∂F/∂x) = ∂L/∂y + ∂L/∂y·∂F/∂x。解读这个「1 +」:无论主干 F 的梯度多小,∂L/∂y 都以系数 1 原封不动传给 x——梯度有了不衰减的直达通道;整条链上 L 层残差块相乘,乘积为 Π(1 + ∂F/∂x),只要每块额外项不发散,梯度就被「1 的地基」托底。对比 kp-007 的普通回传 δ⁽ˡ⁾ = (W)ᵀδ·φ':每层都要过权重与激活导数两道衰减闸门,深至 30 层即困难重重。前向视角同样受益:恒等映射 F=0 时 y=x 零成本实现——「加深度」从「必须学会不做事」变成「默认不做事、有增益才学」。实践细节四条:其一,维度对齐用 1×1 卷积捷径(stride 同步下采样);其二,He 等 2016 的 pre-activation 排布(BN-ReLU-Conv-BN-ReLU-Conv 再相加)让捷径完全无阻,百层以上更稳;其三,残差主干末层常将初始化方差再缩放(kp-012 的 Kaiming 除以额外因子),防止开局 F(x) 过大破坏恒等起点;其四,BatchNorm(kp-014)与残差是共生关系——BN 稳住每个分支的分布,残差提供回传保险,组合才有 152 层。历史亲缘:LSTM 的细胞状态 c_t = f⊙c_{t-1} + i⊙g 正是「门控版残差」(kp-023), Highway Network 是两者的中间形态,Transformer 的每子层 x + Attention(x) 则把同一公理带向序列建模(kp-026 一句指路)。

公式或模型

残差块前向与梯度回传核心式:

前向:   y = x + F(x)                       (维度不符时 x 经 1×1 投影)
反向:   ∂L/∂x = ∂L/∂y · ( 1 + ∂F/∂x )
深链:   ∂L/∂x_0 = ∂L/∂x_L · Π_{l=1..L} ( 1 + ∂F_l/∂x_l )

变量说明:x 为块输入,F 为两三层卷积主干。「1 +」保证梯度存在恒为 1 的下限通路;对比 kp-007 普通网络梯度为 Π(Wᵀ·diag(φ')),无任何托底。

图示

普通块:  x ──► [Conv-BN-ReLU ×n] ──► y        (信息与梯度走独木桥)
残差块:  x ──┬─► [Conv-BN-ReLU ×n] ──┐
              │                       + ──► y     (y = F(x) + x)
              └──────── 捷径 ─────────┘
梯度:  ∂L/∂x ← (∂L/∂y)×1  +  (∂L/∂y)×∂F/∂x
                ↑恒等直达,永不衰减

直观类比

「1 + ∂F/∂x」的托底像修书:原稿(x)永远保留,修改意见(F)另纸批注——批注再潦草也不影响原稿传递;普通网络则要求每一层都重新抄一遍全书,抄错累积。

实例或案例

CIFAR-10 上的退化复现与残差修复(kp-021 项目的对照实验):同一块配方(Conv-BN-ReLU×3 循环),20 层普通网络测试约 91%,56 层反而掉到 88%(训练误差同步更高——退化实锤);把每三层包成残差块后,56 层回升到 93%+ 且训练误差单调下降。第二实验:手写 15 行实现 basic block 并用 kp-004 的 autograd 验证梯度范数——含捷径版本第 30 层梯度范数比无捷径版本高两个数量级,公式「1 的地基」直接可视化。

class Block(nn.Module):
    def __init__(self, cin, cout, stride=1):
        super().__init__()
        self.f = nn.Sequential(
            nn.Conv2d(cin, cout, 3, stride, 1, bias=False),
            nn.BatchNorm2d(cout), nn.ReLU(),
            nn.Conv2d(cout, cout, 3, 1, 1, bias=False),
            nn.BatchNorm2d(cout))
        self.short = (nn.Identity() if cin == cout and stride == 1
                      else nn.Conv2d(cin, cout, 1, stride, bias=False))
    def forward(self, x):
        return torch.relu(self.f(x) + self.short(x))

常见误区

  • 「残差连接防过拟合」:它的直接收益是优化可行性(训练误差降得下去),正则只是批统计噪声的次要效果。
  • 「捷径上也要加非线性」:捷径必须保持近恒等,He 2016 证明捷径上的激活/卷积会阻断梯度高速路,深层性能下降。
  • 「残差块随便插在网络任意处都好」:收益集中在「加深导致退化」的场景,几层的小网络加残差改善有限。
  • 把残差与 kp-013 的正则混为一谈:二者机制完全不同层——一个救优化,一个救泛化。

与其他知识点的关系

kp-007 提供其梯度分析的框架;kp-012 的初始化缩放保护恒等起点;kp-014 是其共生组件;kp-023 的 LSTM 门控与 kp-026 的 Transformer 子层是同一公理的序列建模变体;kp-019 讲它的历史位置,本节讲它的数学心脏。

自测题

  1. 推导残差块的梯度回传式,并解释「1 +」的机制含义。

答案要点:∂L/∂x=∂L/∂y(1+∂F/∂x);恒等项使梯度有系数 1 的直达通路,不随深度连乘衰减。

  1. 为什么说恒等映射在普通网络中「难以学习」、在残差网络中「零成本」?

答案要点:普通网络需多层权重协同逼近恒等;残差形式下 F=0(如权重趋零)即恒等,是默认状态。

  1. 残差捷径在什么情况下需要 1×1 卷积?

答案要点:主分支改变了通道数或空间尺寸(下采样)时,捷径需投影对齐维度。

延伸阅读

  • He 等 CVPR 2016(ResNet 主论文)与 ECCV 2016《Identity Mappings in Deep Residual Networks》(pre-activation 与捷径消融)。
  • Veit、Wilber、Belongie «Residual Networks Behave Like Ensembles of Relatively Shallow Networks» NeurIPS 2016(「隐式集成」解释)。

学习状态

状态保存在浏览器本地,用于首页与路径页的进度统计。