残差连接与 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 +」的机制含义。
答案要点:∂L/∂x=∂L/∂y(1+∂F/∂x);恒等项使梯度有系数 1 的直达通路,不随深度连乘衰减。
- 为什么说恒等映射在普通网络中「难以学习」、在残差网络中「零成本」?
答案要点:普通网络需多层权重协同逼近恒等;残差形式下 F=0(如权重趋零)即恒等,是默认状态。
- 残差捷径在什么情况下需要 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(「隐式集成」解释)。
学习状态
状态保存在浏览器本地,用于首页与路径页的进度统计。