想象你是一栋百层快递大楼的主管。一楼收到山一样多的包裹,每一层都有工人打开包装、记录信息、重新封装,再传往上一层。你的目标是让顶层最终输出的包裹尽量标准。很快你发现两个难题:第一,包裹经过一百次重装后,和一楼收到的原件几乎毫无关系;第二,顶层出了错,要往一楼传话纠正——可话传一层就弱一分,传到底层时,连你自己都听不清说了什么。深度学习里的“深层网络”,正是这样一栋越修越高的大楼:楼层越多,表达力越强,但“传话会失真、楼高反而不中用”的顽疾随之而来。残差连接的解法朴素而巧妙——每一层旁边,修一条“直通滑梯”:原件复制一份直接滑向顶部,每层工人只学“小修小补”;你的纠正指令也能顺着滑梯一滑到底,字字清晰。这一条滑梯,成就了百层的 ResNet,也成为 Transformer 与 GPT 系列大模型的栋梁。这篇教程,就带你亲手搭一遍这条滑梯。

岗位关联

对 AI 从业者来说,残差连接是排查“深层模型训不动”的第一把扳手:读懂它,你既能看懂 ResNet 与 Transformer 的每个模块,也能在实际训练中快速定位不收敛的根源,是深度学习工程师的必修课。

目录
  1. 可视化演示
  2. 问题起源:大楼为何“越高越差”
  3. 核心思想:学“修补”,不学“重装”
  4. 数学形式:残差块的工作台
  5. 梯度传播:反馈如何“一滑到底”
  6. 网络设计:ResNet 的工程蓝图
  7. Transformer 应用:编码器里的“加与规”
  8. 实践价值:工程师的“稳训三件套”
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示残差块结构H(x)=F(x)+x,跳跃连接恒等映射如何保障梯度传播,对比有无残差连接的深层网络训练效果差异。

本节配有交互动效(进入视口后自动加载,约 3KB)。

无跳跃连接:梯度消失问题 深层网络逐层反向传播时梯度连乘趋近于零 浅层参数无法有效更新导致退化问题 残差连接通过恒等映射解决退化问题

问题起源:大楼为何“越高越差”

你在办公楼里不断加装楼层——从 10 层加到 100 层,理论上工人多了,包裹应该处理得更好。可实测结果令人沮丧:100 层大楼产出的包裹质量,反而不如 10 层大楼。既不是设备老旧,也不是工人偷懒,而是顶层主管的纠错指令根本传不到底层:话传一层弱一分,传到底层时已经无声无息,底层工人只能盲干。

深度学习里有完全相同的怪事:把网络从 10 层加深到 100 层,参数量更大、表达力更强,训练误差却不降反升,这叫“退化问题”(degradation)。它和过拟合完全不同——过拟合是“训练好、测试差”,退化是“训练误差本身就下不去”,说明深层模型压根没学好。根源藏在反向传播里:损失对每一层参数的偏导,要沿着网络一层层“传回去”。每传一层,梯度就要乘以该层变换的导数(雅可比矩阵)。大多数激活函数(如 sigmoid)的导数都小于 1,多层连乘之下,浅层收到的梯度呈指数级缩小,这就是“梯度消失”。

更麻烦的是,即便什么都不改、只想让信息原样穿过深层网络(恒等映射),对若干非线性层来说也极其困难——每层工人“原封不动转交包裹”,转交十次也难免走样。把这三件事写成一个公式:

所以,大楼越高,“底层失聪”越严重。要修好这栋楼,不能只靠加楼层,得先解决“传话”问题——这正是残差连接登场的理由。

∂L∂x1=∂L∂xL⋅∏i=1L−1∂xi+1∂xi\displaystyle \frac{\partial L}{\partial \mathbf{x}_1} = \frac{\partial L}{\partial \mathbf{x}_L} \cdot \prod_{i=1}^{L-1} \frac{\partial \mathbf{x}_{i+1}}{\partial \mathbf{x}_i}
这个公式说:浅层收到的反馈 = 顶层反馈 × 每一层传话损耗系数的连乘。只要每个系数都小于 1,层数一大,连乘结果就趋近于零。
  1. 顶层反馈强度 ∂L/∂x_L损失函数 L 对顶层输出 x_L 求偏导,相当于顶层主管最初发出的“纠错口令”的完整音量,这是所有反馈的起点。
    ∂L∂xL\displaystyle \frac{\partial L}{\partial \mathbf{x}_L}
  2. 逐层传话算子 ∂x_{i+1}/∂x_i第 i 层把反馈从上层传回下层时的变化率,像每一层工人对“口令”的改写程度——改写越多,信息损耗越大。
    ∂xi+1∂xi\displaystyle \frac{\partial \mathbf{x}_{i+1}}{\partial \mathbf{x}_i}
  3. 连乘累积 ∏把 L−1 个传话算子连乘,表示“口令传了 L−1 手”,每一手都打一次折扣,损耗逐层叠加。
    ∏i=1L−1\displaystyle \prod_{i=1}^{L-1}
  4. 指数级衰减每个因子都小于 1 时,乘积随层数指数级奔向 0,浅层最终“什么也听不见”,训练自然失败。
    ∂L∂x1≈0\displaystyle \frac{\partial L}{\partial \mathbf{x}_1} \approx 0

核心思想:学“修补”,不学“重装”

聪明的主管想出一个办法:在每一层旁边安装一条“直通滑梯”。包裹的原件复制一份,从楼层入口直接滑到上一层的出口;每层工人不再负责“打开、拆散、重装”,而是只写一张“改单”——告诉上层包裹哪里需要调整,调整幅度往往很小。

数学上,原来一层网络要直接学习目标映射 H(x);引入残差后,让这一层去学“还差多少”,即 F(x) = H(x) − x,最终输出就是:

为什么要绕这个弯?因为“什么都不改”(恒等映射)是最应该免费获得的能力:如果最优映射就是恒等,网络只需把 F 里的权重推向 0。而让一堆非线性层把权重全部压到 0,比让它们精确复刻恒等映射容易得多——普通网络要从重重非线性变换里硬挤出“原封不动”,优化地形崎岖,找解如大海捞针。

一条滑梯,把工人的工作从“重装大师”降级为“改单文员”。楼想盖多高,都不怕底层失聪了——这正是 ResNet 能从 34 层一路加到 152 层的底气。

y=F(x,{Wi})+x\displaystyle \mathbf{y} = \mathcal{F}(\mathbf{x}, \{W_i\}) + \mathbf{x}
公式右边第一项是工人写的“改单”(残差映射),第二项是直通滑梯送来的原件。两者相加,既保留了原始信息,又叠加了需要的调整。
  1. 原样副本 x本层网络的输入,也是滑梯上“原封不动”的那份包裹,不经过任何加工。
    x\displaystyle \mathbf{x}
  2. 残差映射 F(x, {W_i})由带权重 W_i 的若干层组成的“补丁工坊”,负责算出还需要改多少。
    F(x,{Wi})\displaystyle \mathcal{F}(\mathbf{x}, \{W_i\})
  3. 加性合并 +把补丁与原货相加——因为补丁的幅度通常远小于全量,参数更新更平稳,就像贴着改单而不是重新装箱。
    y=F(x,{Wi})+x\displaystyle \mathbf{y} = \mathcal{F}(\mathbf{x}, \{W_i\}) + \mathbf{x}
  4. 输出 y既是本层的结果,也会作为下一层滑梯上的“原件副本”继续往上递,一路保持完整。
    y\displaystyle \mathbf{y}

数学形式:残差块的工作台

我们走进改单文员的工位看看。一个标准残差块内部其实是两层“工序”:输入 x 先进第一道线性变换,再过激活函数(如 ReLU),再进第二道线性变换,最后把结果与滑梯上的原件相加,送到下一层。

以两层全连接为例,残差映射 F 的具体形态是:

一个容易被忽略的工程细节是“维度匹配”:相加要求 F 的输出与 x 形状相同。若某层改变了通道数或分辨率(比如步长为 2 下采样、通道翻倍),就要给 x 也配一条“变径接头”,用投影矩阵 W_s 对齐:

有了“变径接头”,滑梯在楼里任何户型都能安装。残差块的制造规范就此定下:两工序 + 一滑梯 + 必要时一个接头。

F(x,{Wi})=W2 σ(W1x+b1)+b2\displaystyle \mathcal{F}(\mathbf{x}, \{W_i\}) = W_2\,\sigma(W_1 \mathbf{x} + b_1) + b_2
W_s 相当于给滑梯加了一个“变径接头”:尺寸不同时用它把原件变换成能相加的形状;尺寸相同时它可以忽略。
  1. 投影矩阵 W_s当输入 x 与 F 输出的形状不一致时,用 1×1 卷积(或线性投影)把 x 变换到目标形状。
    Wsx\displaystyle W_s \mathbf{x}
  2. 形状一致时退化为单位阵维度相同时 W_s = I,加法就是纯粹的原样直通,不引入任何额外参数与计算。
    Ws=I\displaystyle W_s = I

梯度传播:反馈如何“一滑到底”

滑梯最大的功劳,是让顶层主管的“口令”能字字清晰地传到底层。想象主管对着滑梯喊一句,声音沿着管道往下滑,每经过一层楼,管道都会分岔出一股声音送进该层——即使楼梯间里声音被吸音棉吸掉了大半,管道里的原声依然完整。

用数学看一眼这个“分岔传声”。对于一个残差块 y = F(x) + x,损失 L 对输入 x 的偏导,根据链式法则可以写成:

最后这个求和形式说明:堆叠多个残差块时,浅层梯度是“1 + 一串残差导数”之和,而不是一堆小于 1 的因子连乘。只要每块残差导数不是大幅为负,梯度就能持续、稳定地流向浅层,梯度消失被结构性化解。

滑梯不止运货,还能传话。大楼每一层都听到了主管的明确指令,工人改起单来也有的放矢——这就是残差连接能稳住深层训练的根本机制。

∂L∂x=∂L∂y⋅(1+∂F(x)∂x)\displaystyle \frac{\partial L}{\partial \mathbf{x}} = \frac{\partial L}{\partial \mathbf{y}} \cdot \left(1 + \frac{\partial \mathcal{F}(\mathbf{x})}{\partial \mathbf{x}}\right)
反馈被分成两路相加:滑梯贡献恒定的"1",楼梯贡献 ∂F/∂x。只要滑梯在,就算补丁学得再小,梯度也能原样穿过这一层。
  1. 上层反馈 ∂L/∂y从更顶层传来的梯度向量,相当于主管的原声,此刻尚未受本层影响。
    ∂L∂y\displaystyle \frac{\partial L}{\partial \mathbf{y}}
  2. 残差路径导数 ∂F/∂x补丁工坊对输入的敏感度,也就是楼梯传话的“损耗与改写系数”。
    ∂F(x)∂x\displaystyle \frac{\partial \mathcal{F}(\mathbf{x})}{\partial \mathbf{x}}
  3. 恒等项 1来自“y 对 x 求导时,x 那一路的导数为 1”;这是滑梯对梯度的直接贡献,和 F 学得好不好无关。
    1+∂F(x)∂x\displaystyle 1 + \frac{\partial \mathcal{F}(\mathbf{x})}{\partial \mathbf{x}}
  4. 整体传递每一层都这样传,深层堆叠时梯度至少存在一条“全程系数为 1”的滑梯路径,不再随层数指数衰减,而是变成累加形式:
    ∂L∂xl=∂L∂xL(1+∑i=lL−1∂Fi(xi)∂xi)\displaystyle \frac{\partial L}{\partial \mathbf{x}_l} = \frac{\partial L}{\partial \mathbf{x}_L}\left(1 + \sum_{i=l}^{L-1} \frac{\partial \mathcal{F}_i(\mathbf{x}_i)}{\partial \mathbf{x}_i}\right)

网络设计:ResNet 的工程蓝图

把滑梯装进真实的大楼,还要考虑“层型”问题:不同楼层户型不同,有的宽敞(通道多),有的窄小(通道少)。ResNet 的工程师给出了标准设计图。

最基础的是 BasicBlock:两个 3×3 卷积,每个卷积后接 BatchNorm 和 ReLU,最后把输入 x 加到第二个卷积的输出上。当需要把特征图分辨率减半、通道数翻倍时,主路径用步长为 2 的卷积降采样,快捷路径则用 1×1 卷积做投影(即上一节讲的 W_s),保证相加形状一致。这对应着“恒等快捷连接”与“投影降维对齐”两种设计:形状一致时用恒等捷径,零参数零计算;只有形状变化处才加投影。

为了堆到 50/101/152 层,ResNet 还设计了瓶颈块(Bottleneck):先用 1×1 卷积把 256 通道压到 64,经过 3×3 卷积后,再用 1×1 卷积把通道升回 256。这样既保住了残差结构,又把计算量压到可接受范围——两扇窄门夹一个大房间,性价比最高。论文还比较过三种快捷连接:恒等直通、补零填充、1×1 投影,实验证明恒等直通效果最好且最省,投影只用在维度变化处。

设计原则一句话:主路径负责学新知识,捷径负责传旧信息,两者形状必须对齐。蓝图定稿后,AI 的“大楼”从 19 层(VGG)一口气盖到 152 层(ResNet),盖得高又住得稳。

Transformer 应用:编码器里的“加与规”

Transformer 这栋大楼更讲究:它不仅每层装滑梯,还在滑梯汇合处放了一把“标准尺”。每个子层处理完数据后,先走滑梯把原件加回来,再用这把尺子(层归一化 LayerNorm)量一遍,保证数据分布不跑偏。

编码器中一个完整的子层计算如下:

编码器里每个注意力子层和每个前馈子层都套用这个模式,解码器同样如此。正是因为残差提供了恒等路径,Transformer 才能放心堆 6 层、12 层甚至几十上百层;现代大语言模型把 LayerNorm 挪到子层之前(Pre-Norm)以进一步提升稳定性,但“先残差、后归一”的骨架从未改变。

在 AI 大楼最顶层的 GPT 车间里,每一层都严格遵守同一条施工规范:先滑梯,再量尺。这条规范,撑起了大模型参数量与层数的双重增长。

Output=LayerNorm(x+Sublayer(x))\displaystyle \text{Output} = \text{LayerNorm}\left(\mathbf{x} + \text{Sublayer}(\mathbf{x})\right)
这个公式堪称 Transformer 的“黄金公式”:Sublayer 是注意力或前馈网络,x + Sublayer(x) 是残差相加,LayerNorm 把结果拉回稳定量级。三者缺一不可。
  1. 子层计算 Sublayer(x)多头自注意力或多层前馈网络对输入 x 的计算结果——相当于工人写的改单。
    Sublayer(x)\displaystyle \text{Sublayer}(\mathbf{x})
  2. 残差相加 x + Sublayer(x)滑梯上的原件与改单合并,信息既能被加工,又不会被加工过程“带跑偏”。
    x+Sublayer(x)\displaystyle \mathbf{x} + \text{Sublayer}(\mathbf{x})
  3. 层归一化 LayerNorm(·)对每个样本的特征维做归一化,把合并后的信号调到统一“音量”,防止深层堆叠时方差漂移。
    LayerNorm(x+Sublayer(x))\displaystyle \text{LayerNorm}\left(\mathbf{x} + \text{Sublayer}(\mathbf{x})\right)

实践价值:工程师的“稳训三件套”

如果你是大楼工程部的维修师傅,接到“深层模型训不动”的工单,第一反应应是掏出施工手册看三处:楼层有没有装滑梯(残差连接)、信号通道是否装了音量表(归一化)、滑梯与主路的接口是否对齐(维度匹配)。

残差连接在实践中有四个直接收益:

  • 训练更深:ResNet-152 比 VGG-19 错误率低一半以上,纯靠深度优势;没有残差,这个深度根本训不动。
  • 解决退化:加深后训练误差不再走高,而是持续下降,模型容量真正转化为精度。
  • 加速收敛:训练早期浅层就能收到强梯度,模型快速进入“听懂指令”的状态,省下大量调参时间。
  • 工业通用:目标检测(YOLO、Faster R-CNN 骨干)、语义分割、Transformer/LLM、推荐系统(DCN 深度交叉网络)全线内置残差。

自建小模型时的实用建议:全连接或卷积网络每 2~3 层加一次残差;在“输入与输出形状相同”的连接处加恒等捷径;若形状不同,用 1×1 卷积对齐再相加。调试时打印第一层梯度范数(可用下文 Python 演示代码),若它远小于最后一层,优先检查残差路径是否被激活函数或归一化阻断。

楼越高,越要信滑梯。作为“AI 大楼”的工程师,你的工具箱里可以没有花哨的优化器,但不能没有这条朴素而强大的直通滑梯——它用最简单的方式,让深度本身成为可用的力量。

AI 应用场景

大语言模型的深层堆叠

阶段:模型预训练 / 训练稳定性调优

解决的问题:数十层 decoder 堆叠后,早期训练极易出现 loss 震荡甚至不收敛。传统做法只能靠降低学习率“硬磨”,训练周期成倍拉长。残差恒等路径保证梯度直达浅层,配合 Pre-Norm 让数万亿 token 的训练稳步推进。

具体案例:GPT 系列与 LLaMA 的每个 decoder block 内部都是“注意力残差 + 前馈残差”。训练 70B 参数模型时,Residual + LayerNorm 是缺一不可的稳定器,否则深层参数几乎无法更新,模型只会停留在“复读机”水平。

计算机视觉的骨干网络

阶段:特征提取 / 模型设计

解决的问题:早期 VGG 难以加深、退化严重,模型表达能力被“楼高”卡住。ResNet 作为骨干让检测、分割模型能加载百层特征提取器,迁移学习时微调更稳更快。

具体案例:工业质检中常用 ResNet-50 预训练权重做缺陷分类微调;目标检测 YOLO 系列的骨干沿用残差捷径,在安防、自动驾驶场景中稳定输出多尺度特征图。

推荐系统的深度交叉网络

阶段:特征交叉 / CTR 预估

解决的问题:稀疏高维特征下深层 DNN 容易不收敛,且高阶特征组合难以学习。残差交叉层让“高阶组合”可以按需增量学习,同时保留低阶特征直通。

具体案例:广告点击率预估模型 DCN-V2 在 embedding 之后堆叠残差交叉层,线上 AUC 提升且训练波动明显减小,是工业推荐系统内置残差连接的典型范例。

Python 演示

python43 行
# -*- coding: utf-8 -*-"""残差连接 vs 普通深层网络:对比第一层梯度范数"""import numpy as np  def train(with_res, layers=8, steps=300, lr=0.1):    np.random.seed(7)    n = 4    Ws = [np.random.randn(n, n) * 0.4 for _ in range(layers)]    bs = [np.zeros(n) for _ in range(layers)]    x = np.random.randn(n)    target = np.random.randn(n)    first_norm = []    for _ in range(steps):        acts = [x]        for W, b in zip(Ws, bs):            z = W.dot(acts[-1]) + b            h = np.tanh(z)            if with_res and len(acts) > 1:                h = h + acts[-1]            acts.append(h)        delta = 2 * (acts[-1] - target)        for i in range(layers - 1, -1, -1):            raw = acts[i + 1]            if with_res and i > 0:                raw = acts[i + 1] - acts[i]            g = delta * (1.0 - raw * raw)            dprev = Ws[i].T.dot(g)            if with_res and i > 0:                dprev = dprev + delta            Ws[i] -= lr * np.outer(g, acts[i])            bs[i] -= lr * g            delta = dprev            if i == 0:                first_norm.append(np.linalg.norm(g))    return np.array(first_norm)  plain = train(with_res=False)res = train(with_res=True)print("no-res: 浅层梯度范数 %.5f -> %.5f" % (plain[0], plain[-1]))print("residual: 浅层梯度范数 %.5f -> %.5f" % (res[0], res[-1]))print("ratio (res/no-res): %.1fx" % (res[-1] / max(plain[-1], 1e-9)))
目的:用 numpy 从零训练一个 8 层全连接网络,分别开启/关闭残差连接,对比第一层梯度范数,直观验证“残差让梯度不消失”。
  1. h = h + acts[-1]前向传播的“滑梯”:把本层输入原样加回输出;只有开启残差且不是第一层时才加。
  2. if with_res and i > 0: raw = acts[i + 1] - acts[i]有残差时,tanh(z) = 本层输出 − 本层输入,用减法还原“补丁”。
  3. g = delta * (1.0 - raw * raw)tanh 的导数,即反馈在本层“楼梯”上的损耗系数。
  4. if with_res and i > 0: dprev = dprev + delta反传时把上层反馈沿恒等捷径“加性”传回浅层,这是残差缓解梯度消失的核心一行。
  5. if i == 0: first_norm.append(np.linalg.norm(g))记录第一层(最浅层)收到的反馈幅度。
  6. print("residual: 浅层梯度范数 %.5f -> %.5f" % (res[0], res[-1]))打印对比结果:有残差时浅层梯度始终健康。

常见误区

误区看到 y = F(x) + x,以为只要在任意位置把输入塞回去就万事大吉,于是在激活函数之前、卷积层中间乱加“捷径”。

正解残差对“接口”有严格约定:x 一般是这一小段网络(若干层)的原始输入,加法发生在变换之后。加在激活前,梯度路径会被非线性卡住,短路效果大打折扣。比喻:滑梯必须从楼层门口直连到楼上门口,中途穿墙打洞反而把滑梯弄堵。它还与维度匹配、归一化协同,不是“随意拉一根线”。

为何常见:公式太简洁,让人忽视了结构约束;很多教程只画一条跳跃箭头,给人“哪里都能跳”的错觉。

误区认为残差只是“加速器”或“稳定器”,跟模型最终效果没关系,精度靠的是数据和算力。

正解残差改变了优化地形,让深层网络真正训得动,从而释放深度带来的表达力。ResNet-152 比 VGG-19 错误率低一大截——精度提升正是“能训练更深、更好的模型”的结果。比喻:装滑梯的大楼才能盖 152 层,152 层能容纳的处理工序远多于 19 层,产出自然更精细。

为何常见:把“优化手段”与“模型容量”割裂看待,忽略了深度本身是容量的一部分。

误区认为加了残差就一劳永逸,训练不稳、不收敛都跟残差无关,甚至不再需要归一化和梯度裁剪。

正解残差把梯度消失的“指数衰减主路径”换成了恒等路径 + 可学习的残差路径,但残差路径本身仍可能爆炸或稀疏。深层训练还要配合 LayerNorm/BatchNorm、合理初始化、学习率调度。比喻:滑梯保证“传话不衰减”,但如果楼上还有个扩音器把声音放大到震耳(梯度爆炸),依然会把人喊聋——需要音量调节(归一化)。

为何常见:大纲式理解“残差 = 防消失”,忽略了训练是系统工程,多因素协同才能稳定。

误区把任何带跨层连接的模型都叫“用了残差”,比如 DenseNet、U-Net、HRNet 里的特征拼接。

正解跳跃连接(skip connection)是个大家族:残差是“加法型恒等捷径”(y = F + x),DenseNet 是拼接型(concat),U-Net 是特征图拼接。各有用处。残差特指“相加”且刻意保留恒等路径。比喻:滑梯是“直达通道”的一种;还有人用“传送带”把原货和加工货并排捆在一起(拼接),那是另一种设计。

为何常见:概念边界不清,大家见“跨层箭头”就说是残差,忽略了相加与拼接的本质区别。

面试题

Q1. 残差连接的核心公式是 y = F(x) + x,其中 x 表示什么?

单选题 · easy

  • A.该层网络的可学习权重
  • B.本层网络的输入原样副本← 正确答案
  • C.前一层输出的激活函数值
  • D.损失函数对输出的梯度值

答案:B。x 是残差块的输入,也就是“直通滑梯”上原封不动的副本。A 选项说的是权重参数 W,C 是上一层的输出激活,D 是反向传播中的梯度信号,它们都不是公式里那个与 F 直接相加的 x。公式的核心语义是“原件 + 补丁”。

Q2. 深层网络“退化问题”的表现是什么?

单选题 · mid

  • A.训练集准确率高但测试集准确率低
  • B.增加层数后训练误差反而升高← 正确答案
  • C.训练损失震荡且出现梯度爆炸
  • D.模型参数量过大导致内存溢出

答案:B。退化问题的标志是“加深之后训练误差不降反升”,本质是优化器在超高维空间找不到好解,属于优化问题而非过拟合。A 描述的是过拟合(训练好、测试差);C 是训练不稳定;D 是资源限制。若你训练的深层网络训练误差高于浅层,优先怀疑退化,残差连接正是对症解药。

Q3. 关于梯度公式 ∂L/∂x = ∂L/∂y × (1 + ∂F/∂x),说法正确的是?

单选题 · mid

  • A.梯度仅通过残差路径向后传播
  • B.恒等路径贡献了常数因子 1← 正确答案
  • C.补丁路径越大梯度反而越小
  • D.该公式只在二维标量时成立

答案:B。公式中的“1“来自恒等路径 x 对 y 的导数,无论 F 学成什么样,这条路径都恒定贡献单位梯度,因此 B 正确。A 错在”仅通过”——梯度分两路:恒等路径与残差路径;C 颠倒了关系,补丁路径是额外梯度的来源;D 错在公式对向量同样逐元素成立。

Q4. 残差连接为什么能让学习“恒等映射”变得容易?

单选题 · mid

  • A.因为恒等映射本身不需要任何参数
  • B.因为浅层权重被直接复制到深层
  • C.因为只需学残差趋于零即可← 正确答案
  • D.因为激活函数被替换为线性函数

答案:C。加残差后,若最优映射是恒等,网络只需让 F(x)→0,即权重趋向 0,这个最优解非常“平坦好找”;而普通网络必须靠多层非线性变换精确逼近恒等,优化极其困难。A 不准确,恒等映射在普通网络里依然需要参数配合才能实现;B、D 属于无中生有的机制。

Q5. 在 ResNet 中,当残差分支输出与输入的维度不一致时,常用什么方法对齐?

单选题 · easy

  • A.使用 1×1 卷积投影变换输入← 正确答案
  • B.将输入直接丢弃一部分通道
  • C.在输出后补零到相同维度
  • D.把残差分支改为可分离卷积

答案:A。ResNet 在通道数翻倍、尺寸减半时,用 1×1 卷积对输入 x 做投影(即 W_s·x),把形状对齐后再相加。B 丢弃通道会丢失信息;C 补零虽有变体但实践少用;D 换卷积核类型与维度对齐无关。

Q6. 相比普通深层网络,残差网络在反向传播时梯度路径最主要的区别是什么?

单选题 · hard

  • A.梯度可以沿恒等捷径直接累加回浅层← 正确答案
  • B.每一层梯度都经过归一化处理
  • C.梯度只存在于卷积核的中心位置
  • D.梯度由损失函数直接解析给出

答案:A。残差网络最本质的区别是:反向传播时梯度多了一条“恒等捷径”,可以逐层加性累加回浅层,而不是全部能量都经层层矩阵相乘(易指数衰减)。B 说的是归一化的作用;C 说法无依据;D 说解析梯度更是错误的——梯度永远靠反向传播计算。

Q7. 在 Transformer 编码器中,残差连接被封装在什么结构里?

单选题 · easy

  • A.Self-Attention 的 QKV 投影
  • B.Add & Norm(残差加层归一化)← 正确答案
  • C.位置编码的正弦与余弦叠加运算
  • D.FFN 中的 ReLU 激活函数

答案:B。Transformer 每个子层都套用 LayerNorm(x + Sublayer(x)),也就是"Add & Norm":先残差相加,再层归一化。A 只是注意力内部的线性投影;C 是输入阶段的编码;D 是前馈网络的激活函数。记住口诀:先滑梯(Add),再量尺(Norm)。

Q8. 残差连接带来的主要好处有哪些?

多选题 · mid

  • A.缓解深层网络的梯度消失← 正确答案
  • B.消除训练中的梯度爆炸
  • C.减轻深层网络的退化问题← 正确答案
  • D.让网络可以堆得更深← 正确答案

答案:ACD。A、C、D 均正确:残差通过恒等路径缓解梯度消失,让深层网络可训练,从而减轻退化,网络于是能堆得更深。B 错误——残差不保证消除梯度爆炸,爆炸仍需通过归一化与梯度裁剪来控制。残差管“消失”,不管“爆炸”。

Q9. 关于残差连接的正确说法有哪些?

多选题 · hard

  • A.相加要求残差分支与输入维度一致← 正确答案
  • B.加在激活函数之前效果更好
  • C.残差是跳跃连接的加法特例← 正确答案
  • D.加入后无需再关注权重初始化

答案:AC。A 正确:加法要求形状一致,否则需投影对齐;C 正确:残差是跳跃连接中“加法型恒等捷径”这一特例。B 错误:残差一般加在非线性变换之后,加在激活前会被非线性堵住捷径;D 错误:残差不能替代合理的初始化和归一化,训练是系统工程。

Q10. Transformer 每个子层内部通常包含哪些操作?

多选题 · mid

  • A.多头注意力或前馈网络计算← 正确答案
  • B.残差相加保持信息直通← 正确答案
  • C.层归一化稳定数据分布← 正确答案
  • D.卷积核对局部特征提取

答案:ABC。子层先做注意力或前馈计算,再残差相加,最后层归一化,即“计算 → 相加 → 归一”三段式。D 错误:Transformer 子层不含卷积运算(位置编码叠加在输入上,不属于子层内部操作)。这个三段式就是编码器可深不可塌的秘密。