土法炼钢兴趣小组的算法知识备份

【Transformer 与注意力机制】24|残差连接:为什么深层网络必须留一条直路

文章导航

分类入口
transformer
标签入口
#transformer#residual#resnet#pre-norm#optimization

目录

如果把 Transformer block 画成结构图,残差连接往往只是一根细细的旁路线:从输入绕过 attention 或 FFN,直接和子层输出相加。很多教程讲到这里会轻描淡写地说一句:“这样可以保留原始信息。”

这句话不能说错,但太轻了。残差连接真正解决的是深层网络的优化问题:它给梯度留了一条几乎不受参数影响的直路,让每一层都只需要学一个“小修正”,而不是学一整个从零开始的大变换。没有这根直路,Transformer 很难从 6 层长到几十层、上百层。

这一篇我们就把这根线单独拎出来讲。你会看到:残差不仅是训练稳定性的关键,也是后来理解大模型内部机制时最重要的观察对象之一——所谓 residual stream,本质上就是整网持续累积和改写的那条主干表示。


一、什么叫残差:不是直接学 \(H(x)\),而是学 \(F(x)\)

ResNet 论文给出的原始动机很简单。假设我们想学一个目标映射 \(H(x)\)。普通堆叠层的写法是直接逼近它:

\[ y = H(x) \]

残差写法把它改成:

\[ y = x + F(x) \]

也就是说,不再直接学“应该输出什么”,而是学“在输入基础上还需要补多少修正”。

残差主路径和子层旁路的关系

1.1 为什么“修正”比“重来”更容易学

这背后有一个非常朴素的直觉:很多时候,理想变换离恒等映射并不远。

举个语言模型里的例子,一个 token 经过某一层 attention 后,往往不是“完全换个身份”,而是:

这些变化更像“在原向量上加一笔”,而不是“把原向量推倒重算”。残差把这种结构偏好直接写进了网络。

1.2 Transformer 里的两条残差

每个 Transformer block 至少有两次残差相加:

  1. attention 子层外面一条;
  2. FFN 子层外面一条。

pre-LN 写法下,一层可以写成:

\[ \begin{aligned} h' &= x + \operatorname{Attention}(\operatorname{LN}(x)) \\ y &= h' + \operatorname{FFN}(\operatorname{LN}(h')) \end{aligned} \]

从这个形式能直接看出残差的角色:主路径是 x -> h' -> y 这条直线,attention 和 FFN 更像两次可选的旁路修正。


二、真正关键的是梯度:残差给反向传播留了高速路

如果只从前向角度理解残差,容易把它当成“信息不丢失”的技巧;真正决定训练成败的是反向传播。

设一层输出是:

\[ y = x + F(x) \]

对输入求导:

\[ \frac{\partial y}{\partial x} = I + \frac{\partial F(x)}{\partial x} \]

注意那个 \(I\)。它意味着:哪怕 \(F\) 这一支一开始学得很差,梯度仍然至少有一条恒等路径可以往回传。

2.1 没有残差时,深层梯度是连续矩阵乘

如果一串层都没有残差,梯度要穿过很多 Jacobian 连乘:

\[ \frac{\partial \mathcal{L}}{\partial x_0} = \frac{\partial \mathcal{L}}{\partial x_L} \prod_{\ell=1}^{L} \frac{\partial x_\ell}{\partial x_{\ell-1}} \]

这些矩阵的谱范数只要稍微偏大或偏小,层数一深就会爆炸或消失。RNN、早期深层 CNN 都被这个问题折磨过。

2.2 有了残差,最坏情况更接近恒等映射

残差不能从数学上彻底消灭梯度问题,但会显著改善最坏情况:就算子层暂时没学会什么,网络整体也更接近一堆恒等映射叠起来,而不是一堆随机矩阵叠起来。

这件事的工程意义非常大。因为训练开始时,attention、FFN 的权重几乎都是随机的。没有残差,网络最开始就像一串随机变换;有残差,它更像“以恒等映射为基底,慢慢往上叠修正”。

2.3 这就是为什么残差和归一化总是成对出现

残差解决的是“有直路”;归一化解决的是“旁路修正别太野”。两者合起来,才把深层训练拉到一个稳定区间。

这也解释了为什么 24 和 25 两篇必须连着读:残差负责路径,LayerNorm 负责路径上的数值尺度。


三、把残差理解成“迭代 refinement”会更贴切

除了梯度视角,还有一个更适合直觉的解释:每一层不是重新编码,而是在前一层表示上做一次迭代修正。

每一层都在 residual stream 上做增量式 refinement

3.1 每层只负责把表示往前推一小步

设第 \(\ell\) 层输入是 \(x^{(\ell)}\),输出是:

\[ x^{(\ell+1)} = x^{(\ell)} + \Delta^{(\ell)} \]

其中 \(\Delta^{(\ell)}\) 就是这一层 attention 或 FFN 学到的修正。这样看,多层 Transformer 像是在一条主干表示上做很多次微小迭代:

如果没有残差,这种“逐层增量改写”的语义会弱很多。

3.2 这也解释了为什么中间层表示经常已经很好用

很多 probing 研究会发现,Transformer 中间层往往已经学出了可分的句法或语义结构。原因之一就是 residual 让信息持续积累,而不是层层覆盖。所以你截取第 6 层、第 12 层、第 18 层的表示,经常都能拿来做一些下游判断。

这和纯前馈深网那种“越靠前越原始、越靠后越任务化”的感觉不完全一样。Transformer 的 residual stream 让不同层更像在共享一条不断变丰富的公共表示。


四、深层 Transformer 为什么格外依赖残差

ResNet 在视觉里已经证明了残差有用,但 Transformer 对残差的依赖更强,原因有三层。

4.1 每层本身就很“激进”

Transformer 子层里的 attention 和 FFN 都是大矩阵变换:

它们不像卷积那样只改一个局部感受野,而是每一层都有能力做大改写。没有残差,这种改写太容易把表示空间搞乱。

4.2 Transformer 没有 CNN 那种天然局部平滑偏置

CNN 的卷积、池化、局部连接天然带着“别一下子改太猛”的结构约束。Transformer 的全连接 attention 没这个保护,残差就成了最重要的结构性缓冲。

4.3 大模型需要很多层来积累能力

当模型从 6 层涨到 32 层、80 层时,单层学一点点修正是合理的;让每层都独立做大幅重写几乎不可能训练稳。残差正好支持这种“很多小步叠加成一个大能力”的扩展方式。

深层 Transformer 的稳定性高度依赖残差路径

五、Pre-Norm 为什么比 Post-Norm 更容易训深

残差写法不只一种。对 Transformer 影响最大的区别,是 LayerNorm 放在加法前还是后。

5.1 Post-Norm:原论文的写法

原论文用的是:

\[ y = \operatorname{LN}(x + F(x)) \]

这时残差和旁路修正先相加,再一起归一化。问题在于:梯度沿主路径回传时,也会经过 LN 的 Jacobian。层数一深,这条“高速路”就不再那么直。

5.2 Pre-Norm:现代主流写法

现代更常见的是:

\[ y = x + F(\operatorname{LN}(x)) \]

这时主路径上的 x -> y 基本是直通,归一化只作用在旁路输入上。于是:

Post-Norm 与 Pre-Norm 的残差路径差异

5.3 这不是“谁更先进”,而是谁更适合大深度

在 6 层翻译模型里,post-norm 完全能用;在 48 层、80 层的大语言模型里,pre-norm 通常更省心。这不是品味问题,而是优化几何不同导致的现实选择。

现代还会进一步叠加:

这些都在围着同一个目标转:让 residual 主路径既稳定,又保留足够表达力。


六、Residual Stream:理解大模型内部机制的主战场

近几年做机制可解释性的人,最爱盯的对象之一就是 residual stream。原因很简单:所有 attention 头和 FFN 神经元,最终都在往这条流里写东西。

6.1 每个子层都像在往同一个共享总线上写入

如果把一个 block 抽象成:

\[ x \leftarrow x + \Delta_{\text{attn}} + \Delta_{\text{ffn}} \]

那 residual stream 就像一条共享总线:

这样看,Transformer 不像一串完全分离的层,更像很多模块在共同改写同一份活动内存。

6.2 模型编辑和可解释性常常落在这条流上

ROME、MEMIT、activation patching 之类方法,很多都在分析:

所以残差早就不只是训练技巧。到了大模型研究里,它已经成为“模型内部状态到底如何流动”的核心对象。


七、几个工程上很实际的细节

7.1 旁路并不是越大越好

残差的本意是学小修正。如果某层的 \(F(x)\) 数值幅度长期远大于 \(x\),那这层实际上就在强行覆盖主路径,训练会变得不稳。所以很多实现会:

7.2 残差让 checkpoint 之间更可平均

因为模型整体更接近“恒等映射 + 小修正”的结构,训练后期不同 checkpoint 常常落在相近盆地里。这也是参数平均、EMA 在 Transformer 里经常有效的背景之一。

7.3 残差不能单独拯救坏配方

要注意,残差不是万能药。学习率太大、归一化放错、初始化离谱、mask 写错,模型照样会崩。残差只是把可训练区域大幅扩大,不是让所有坏设置都自动没事。


八、几个常见误解

8.1 “残差就是为了保留原始信息”

这句话太弱了。更准确的说法是:残差让每层学修正而不是重算,并给梯度留一条近似恒等的回传路径。

8.2 “有残差就不会梯度消失”

也不绝对。残差显著缓解问题,但不能从数学上保证任何深度下都绝对稳定。归一化、初始化、学习率同样重要。

8.3 “残差只在很深的模型里才重要”

6 层模型里它也重要,只是问题没那么显眼。到了几十层,重要性从“有帮助”升级为“几乎不可缺”。

8.4 “残差让模型变成线性的”

不会。虽然主路径是相加,但旁路里的 attention、FFN、归一化都还是高度非线性的。残差只是改变了函数的组织方式,不是拿掉了非线性。

8.5 “把更多模块都接到 residual 上一定更好”

也不一定。模块往 residual stream 里写得太多、太猛,会带来干扰、方差累积和优化困难。为什么现代架构会反复讨论门控、缩放和 norm,本质上都是在管这件事。


九、结语

残差连接真正让 Transformer 成立的地方,不在于它“看起来优雅”,而在于它把深层网络最难的一件事——稳定优化——处理成了“在主路径上逐层叠加小修正”。一旦把这个视角建立起来,你再看 pre-norm、residual stream、模型编辑、深层扩展,就会发现它们其实都在围绕同一根主线展开。

下一篇我们继续沿着这条主线走,不过把焦点从“有没有直路”换成“每层输出的数值尺度怎么稳住”——也就是 Layer Normalization 为什么会成为 Transformer 的标准配置。


十、参考文献

  1. He, K. et al. “Deep Residual Learning for Image Recognition.” CVPR 2016. 残差学习的原始提出。
  2. Vaswani, A. et al. “Attention Is All You Need.” NeurIPS 2017. Transformer 中 attention / FFN 子层外残差的标准写法。
  3. Xiong, R. et al. “On Layer Normalization in the Transformer Architecture.” ICML 2020. 分析 pre-LN 与 post-LN 的训练稳定性差异。
  4. Wang, H. et al. “DeepNet: Scaling Transformers to 1,000 Layers.” IEEE TPAMI 2024. 深层 Transformer 中 residual scaling 的代表工作。
  5. Bachlechner, T. et al. “ReZero is All You Need: Fast Convergence at Large Depth.” UAI 2021. 通过控制残差分支初始化改善深层训练。
  6. Elhage, N. et al. “A Mathematical Framework for Transformer Circuits.” Transformer Circuits Thread, 2021. 从 residual stream 视角分析 Transformer 内部计算。

← 上一篇:23|Decoder 详解 | 下一篇:25|Layer Normalization

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-04-15 · transformer

【Transformer 与注意力机制】39|T5:把所有 NLP 任务统一成 Text-to-Text

T5 的核心不是又发明了一种 Transformer,而是把翻译、摘要、分类、问答都改写成“输入文本到输出文本”的统一格式。本文解释 T5 为什么选择 Encoder-Decoder 架构,span corruption 和 BERT/GPT 的目标有什么差异,C4 和系统化消融实验为什么让 T5 成为迁移学习路线的重要基准。


By .