AI Infra学习之旅-残差、LayerNorm与Encoder-Decoder全貌

这是“Transformer 原理深讲系列”的第 4 篇。
前三篇我们已经依次讲清楚了:为什么需要 Transformer,文本如何进入模型,位置编码和 Attention 的核心计算机制,以及多头、Mask、FFN 为什么是 Transformer 不可缺少的组成部分。
到了这一篇,我们要完成两件更“总装”的事情:
第一,把这些零件真正拼成一层完整的 Transformer block;第二,把 Encoder、Decoder、Encoder-only、Decoder-only、Encoder-Decoder 这几种结构放到同一张图里讲清楚。


一、为什么“理解一层 Transformer Block”比记一堆模块更重要

很多人学 Transformer 时,会变成下面这种状态:

  • 知道什么是 Q/K/V
  • 知道什么是 Attention
  • 知道有 Multi-Head
  • 知道有 FFN
  • 知道有 LayerNorm 和残差

但真正问一句:

一层 Transformer block 从输入到输出,到底完整经历了什么?

往往就开始糊了。

这是因为前面那些模块虽然都懂一点,但还没有真正被组织成一个动态系统。

而 Transformer 真正的力量,恰恰不在于某一个单点模块,而在于:

这些模块被怎样稳定地组合起来,并且能够一层一层不断堆叠。

所以这一篇的目标,是把前面那些“零部件”真正安装到一台能工作的机器里。


二、先回顾:一层 Transformer Block 里至少有哪两个核心功能模块

如果先不管残差和归一化,一层 Transformer block 至少包含两个核心子层:

1. Attention 子层

作用:

  • 让每个位置和上下文中其他位置建立关系
  • 完成跨位置的信息交换
  • 生成上下文化表示

2. FFN 子层

作用:

  • 对每个位置的表示单独做进一步非线性加工
  • 强化和重组该位置内部的特征模式

也就是说,block 的本体骨架是:

跨位置交互 + 逐位置加工

这是你必须记住的一条主线。

但如果只有这两样,还不够。
因为深层网络会遇到训练稳定性问题。

于是我们就需要另外两个支撑件:

  • 残差连接(Residual)
  • LayerNorm

三、为什么深层网络会难训练

要理解残差和 LayerNorm,必须先理解一个背景事实:

网络一深,训练就容易变难。

这不是 Transformer 特有的问题,而是深层神经网络的共性问题。
常见困难包括:

1. 信息容易被层层覆盖

如果每一层都强行把输入改写成全新的表示,那么前面层的重要信息可能会被逐渐冲掉。

2. 梯度传播容易变差

反向传播时,梯度要穿过很多层。
如果每一层都让梯度缩小或扭曲一点,前面层拿到的有效训练信号就会越来越弱。

3. 数值分布容易漂移

随着层数增加,隐藏表示的均值、方差和尺度都会不断变化。
这会让训练:

  • 更难稳定
  • 更难调学习率
  • 更容易发散或收敛很慢

所以深层 Transformer 要真正好用,必须解决两个问题:

  1. 信息和梯度怎么顺畅穿过去
  2. 每层输入输出的数值分布怎么维持稳定

这就对应:

  • 残差连接
  • LayerNorm

四、残差连接到底是什么

残差连接的核心形式很简单:

y=x+F(x)y = x + F(x)

其中:

  • (x) 是输入
  • (F(x)) 是某个子层的输出(比如 attention 或 FFN)
  • (y) 是最终输出

这意味着,子层不是直接把输入变成:

y=F(x)y = F(x)

而是变成:

y=x+F(x)y = x + F(x)

也就是:

原表示 + 本层修正量

这就是 residual connection,也叫 skip connection。


五、为什么叫“残差”

因为它不是让网络直接学习一个完整映射:

y=G(x)y = G(x)

而是让网络学习:

y=x+F(x)y = x + F(x)

于是:

F(x)=G(x)xF(x)=G(x)-x

这说明子层真正学到的,是相对输入的修正量,也就是“残差”。

从这个角度看,Transformer 的每一层不是在“推翻输入重来”,而是在:

已有表示的基础上,做一步增量式修正。


六、残差连接为什么如此重要

1. 给原始信息保留一条直通路径

如果没有残差,输出就是 (F(x))。
那一旦 (F) 学得不好,原信息可能被严重破坏。

有了残差:

y=x+F(x)y=x+F(x)

即使 (F(x)) 暂时不理想,原输入 (x) 至少还能保留。
所以模型不会轻易“把前面学到的东西洗掉”。

2. 让网络更容易学“接近恒等映射”

并不是每一层都需要大改输入。
很多时候,最优行为只是做一点小修正。

有残差时,如果本层暂时没什么要改的,只要让:

F(x)0F(x)\approx 0

就行了。
这让深层网络更容易收敛。

3. 让梯度更容易传播

从反向传播角度看:

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

这里 (I) 是恒等映射。
这意味着,即使 (F) 的梯度路径不够理想,梯度仍然有一条较为稳定的直通通路。

所以残差连接本质上是在做两件事:

  • 稳住前向信息流
  • 稳住反向梯度流

七、从“状态演化”角度看残差

如果你喜欢更统一的理解方式,可以把:

y=x+F(x)y = x + F(x)

看成一种离散状态更新:

  • (x):当前状态
  • (F(x)):本层施加的增量修正
  • (y):更新后的状态

这很像很多动力系统里的形式:

xt+1=xt+Δxtx_{t+1}=x_t+\Delta x_t

所以 Transformer 的深层堆叠,也可以看成:

表示状态在层与层之间不断被小步修正。

这种理解对后面看待“深层 Transformer 是怎样逐步形成更高语义抽象”的问题很有帮助。


八、LayerNorm 到底是什么

残差负责信息和梯度通路,
LayerNorm 负责数值稳定。

它的定义如下。

设某个位置上的隐藏向量是:

x=(x1,x2,,xd)Rdx=(x_1,x_2,\dots,x_d)\in \mathbb{R}^d

先计算它在特征维度上的均值:

μ=1di=1dxi\mu = \frac{1}{d}\sum_{i=1}^{d}x_i

再计算方差:

σ2=1di=1d(xiμ)2\sigma^2 = \frac{1}{d}\sum_{i=1}^{d}(x_i-\mu)^2

然后归一化:

x^i=xiμσ2+ϵ\hat{x}_i = \frac{x_i-\mu}{\sqrt{\sigma^2+\epsilon}}

最后再加上可学习缩放和平移参数:

yi=γix^i+βiy_i = \gamma_i \hat{x}_i + \beta_i

写成向量形式就是:

LN(x)=γxμσ2+ϵ+β\text{LN}(x)=\gamma \odot \frac{x-\mu}{\sqrt{\sigma^2+\epsilon}} + \beta

其中:

  • (\gamma,\beta \in \mathbb{R}^{d})
  • (\epsilon) 是防止除零的小常数

九、LayerNorm 到底在归一化什么

这个问题特别容易混淆。

LayerNorm 不是:

  • 对整个 batch 做归一化
  • 也不是对整个序列所有 token 一起归一化

它通常是:

对单个 token 的特征向量,在特征维度上做归一化。

也就是说,如果某个 token 当前表示是一个 4096 维向量,那么 LayerNorm 会:

  • 只看这 4096 个数
  • 计算它们自己的均值和方差
  • 把这个向量拉回到更规范的数值尺度

所以 LayerNorm 的作用对象是:

每个位置自己的隐藏状态。


十、为什么 LayerNorm 很重要

1. 控制数值尺度

深层网络里,如果某层输出整体尺度突然过大,就会导致:

  • attention score 爆掉
  • softmax 过于尖锐
  • FFN 激活失衡

LayerNorm 能把输入重新拉回一个更稳定的数值区间。

2. 减少层间分布漂移

每层看到的输入分布如果不断飘移,网络就会很难训练。
LayerNorm 帮助不同层看到更可控的输入尺度和分布。

3. 优化更稳定

尺度被规范后,学习率更容易设,深层训练也更稳定。

所以 LayerNorm 本质上是在做:

每层的数值环境稳定器。


十一、Pre-LN 和 Post-LN 到底有什么区别

Transformer 里 LayerNorm 位置有两种经典写法。

1. Post-LN(原始论文常见)

写作:

h=LN(x+Sublayer(x))h = \text{LN}(x + \text{Sublayer}(x))

意思是:

  • 先经过子层
  • 再加残差
  • 最后做 LayerNorm

2. Pre-LN(现代大模型更常见)

写作:

h=x+Sublayer(LN(x))h = x + \text{Sublayer}(\text{LN}(x))

意思是:

  • 先做 LayerNorm
  • 再进入子层
  • 再和原输入做残差相加

现代很多 GPT / LLaMA 类模型更偏 Pre-LN,因为它通常在深层堆叠时训练更稳定。
直觉上,Pre-LN 让每个子层都能先看到一个已经被归一化好的输入。

所以你可以这样记:

  • Post-LN 更接近原始 Transformer
  • Pre-LN 更接近现代大模型工程实践

十二、一层 Transformer block 到底完整长什么样

现在终于可以把 attention、FFN、残差、LayerNorm 拼起来了。

我们先讲现代大模型里更常见的 Pre-LN block

设输入是:

xRn×dmodelx \in \mathbb{R}^{n \times d_{\text{model}}}


第一步:LayerNorm + Attention + 残差

h=x+Attention(LN(x))h = x + \text{Attention}(\text{LN}(x))

这里 attention 可以是:

  • Encoder 中的双向 Self-Attention
  • Decoder 中带 causal mask 的 Self-Attention

作用是:

  • 先规范输入数值
  • 再进行跨位置上下文交互
  • 最后以残差方式把修正量加回原表示

第二步:LayerNorm + FFN + 残差

y=h+FFN(LN(h))y = h + \text{FFN}(\text{LN}(h))

作用是:

  • 先规范 attention 后的表示
  • 再对每个位置做逐位置非线性加工
  • 最后把加工结果以残差形式叠加回去

于是,一层完整 block 就是:

h=x+Attention(LN(x))h = x + \text{Attention}(\text{LN}(x))

y=h+FFN(LN(h))y = h + \text{FFN}(\text{LN}(h))

这就是一个现代 Transformer block 的最核心写法。


十三、如果是 Post-LN,写法会怎样

原始论文风格的 block 更接近:

h=LN(x+Attention(x))h = \text{LN}(x + \text{Attention}(x))

y=LN(h+FFN(h))y = \text{LN}(h + \text{FFN}(h))

你会发现,主骨架并没有变:

  • 一次 attention 子层
  • 一次 FFN 子层
  • 每个子层都包着残差和 LayerNorm

区别只是 LayerNorm 放在子层前还是子层后。


十四、为什么这样的一层可以反复堆很多层

这就是 block 设计最漂亮的地方。

它之所以能一层层堆上去,是因为它同时具备:

1. 跨位置信息交换能力

由 attention 提供。

2. 逐位置特征加工能力

由 FFN 提供。

3. 稳定的信息与梯度通路

由残差提供。

4. 稳定的数值分布环境

由 LayerNorm 提供。

这意味着:

  • 每一层都能“看全局”
  • 又都能“加工自己”
  • 还不会因为太深而轻易训练崩掉

所以 Transformer block 真正厉害的地方不只是“内部模块多”,而是:

它是一个经过精心稳定化设计的可堆叠单元。


十五、现在进入第二个大问题:Encoder 和 Decoder 到底是什么

前面我们一直在讲一个“block”,但 Transformer 并不是只包含单个 block。
真正完整的架构,必须回答:

  • 这些 block 是怎么堆起来的
  • 堆成 Encoder 时是什么
  • 堆成 Decoder 时又是什么
  • 原始 Transformer 为什么是 Encoder-Decoder
  • BERT、GPT、T5 为什么会走向不同结构

先讲原始 Transformer。


十六、原始 Transformer 为什么是 Encoder-Decoder

原始 Transformer 最早面向的典型任务是:

  • 机器翻译
  • 摘要
  • 改写

这些任务有一个共同特点:

输入是一段序列,输出是另一段序列。

例如:

  • 输入英文
  • 输出德文

所以最自然的结构就是:

  1. 先有一个模块把输入“读懂”
  2. 再有另一个模块基于这个理解结果去“生成输出”

于是原始 Transformer 就采用了:

  • Encoder
  • Decoder

两个堆叠结构。


十七、Encoder 到底在干什么

Encoder 的任务是:

对输入序列做深层上下文化编码。

如果输入是:

x1,,xnx_1,\dots,x_n

Encoder 会输出一组表示:

Henc=(h1enc,,hnenc)H^{enc}=(h_1^{enc},\dots,h_n^{enc})

这里每个 (h_i^{enc}) 都不只是第 (i) 个 token 本身,而是:

  • 它自己
  • 它和其他 token 的关系
  • 它在整句中的语义角色

Encoder 通常使用的是:

  • 双向 Self-Attention
  • 没有 causal mask

所以它更适合“理解整句”。


十八、Decoder 到底在干什么

Decoder 的任务是:

一步一步生成输出序列。

如果输出序列是:

y1,,ymy_1,\dots,y_m

那么 Decoder 在生成第 (t) 个 token 时,需要建模:

P(yty1,,yt1,Henc)P(y_t \mid y_1,\dots,y_{t-1}, H^{enc})

也就是说,它既要看:

  • 自己已经生成了什么(输出前缀)
  • 输入句子被 Encoder 理解后的表示(Encoder 输出)

因此原始 Decoder layer 里通常有两种 attention:

1. masked Self-Attention

让 Decoder 看自己前面的已生成 token。

2. cross-attention

让 Decoder 去查看 Encoder 的输出表示。

所以 Decoder 不只是“会生成”,而是:

基于输入理解结果做条件生成。


十九、Encoder-only、Decoder-only、Encoder-Decoder 到底怎么区分

现在把整个家族整理一下。

1. Encoder-only

代表:

  • BERT
  • RoBERTa
  • DeBERTa

特点:

  • 只保留 Encoder 堆栈
  • 输入是完整序列
  • 每个位置可双向看全局
  • 更适合理解任务

适用任务:

  • 文本分类
  • 句子匹配
  • 命名实体识别
  • 检索编码

2. Encoder-Decoder

代表:

  • 原始 Transformer
  • T5
  • BART

特点:

  • Encoder 先理解输入
  • Decoder 再基于 Encoder 输出生成新序列
  • 更适合 seq2seq 映射

适用任务:

  • 翻译
  • 摘要
  • 改写
  • 文本到文本转换

3. Decoder-only

代表:

  • GPT
  • LLaMA
  • Qwen
  • DeepSeek
  • Mistral

特点:

  • 只有 Decoder 的自回归部分
  • 不再单独有 Encoder
  • 不再有 cross-attention
  • 使用 causal mask 逐 token 生成

适用任务:

  • 通用文本生成
  • 对话
  • 写作
  • 代码补全
  • 通用大模型预训练

二十、为什么今天的大语言模型几乎都偏 Decoder-only

这是当前大模型时代最重要的结构取舍之一。

原因主要有三点。

1. 预训练目标最统一

Decoder-only 的核心目标是:

P(xtx1,,xt1)P(x_t \mid x_1,\dots,x_{t-1})

也就是 Next-Token Prediction。
这让海量文本都能直接用于预训练,不需要特地构造输入输出配对。

2. 生成能力天然强

大语言模型最重要的任务之一就是生成。
而 Decoder-only 结构天生就是为自回归生成设计的。

3. 推理路径更统一

现代推理系统里的很多核心技术:

  • Prefill
  • Decode
  • KV Cache
  • speculative decoding
  • paged attention

本质上都围绕 Decoder-only Transformer 展开。

所以今天主流大模型几乎都偏向:

Decoder-only Transformer 的现代化变体。


二十一、GPT / LLaMA / Qwen 到底还是不是 Transformer

答案是:

当然是。

更准确地说:

  • 它们不是“脱离 Transformer 的新东西”
  • 而是“Transformer 的 Decoder-only 大模型版本”

它们仍然保留了 Transformer 的核心骨架:

  • token embedding
  • 位置处理
  • Self-Attention
  • multi-head 或其变体
  • FFN / MLP
  • 残差
  • LayerNorm 或 RMSNorm
  • 多层 Transformer Block 堆叠
  • 最终预测下一个 token

只是它们通常在工程上做了很多改造,例如:

  • 改用 RoPE
  • 改用 RMSNorm
  • 改用 SwiGLU
  • 引入 MQA / GQA
  • 引入 MoE
  • 做长上下文和推理友好性优化

所以最准确的说法应该是:

现代大语言模型不是“不是 Transformer”,而是“Transformer 在大模型时代的演化版本”。


二十二、本篇真正要记住的两条主线

第一条:一层 Transformer Block 是怎么拼起来的

  • attention 负责跨位置交互
  • FFN 负责逐位置加工
  • 残差负责稳住信息与梯度通路
  • LayerNorm 负责稳住数值分布
  • 现代常见 block 写法是:

h=x+Attention(LN(x))h = x + \text{Attention}(\text{LN}(x))

y=h+FFN(LN(h))y = h + \text{FFN}(\text{LN}(h))

第二条:Transformer 家族的结构分化

  • Encoder-only 更适合理解
  • Encoder-Decoder 更适合 seq2seq 转换
  • Decoder-only 更适合通用生成
  • 今天的大语言模型几乎都偏 Decoder-only

二十三、用一句话压缩本篇

一层 Transformer Block 的本质,是在残差连接和 LayerNorm 的支撑下,把 Attention 的跨位置交互与 FFN 的逐位置非线性加工稳定地组合起来;原始 Transformer 再把这种 Block 分别堆叠成 Encoder 和 Decoder,最终演化出 Encoder-only、Encoder-Decoder 与今天主流的 Decoder-only 大语言模型。


下一篇预告

下一篇主题是:

Transformer 在训练和推理时如何工作:从模型执行到推理系统的桥接

会重点讲清楚:

  • 训练时为什么可以并行
  • 推理时为什么必须逐 token 生成
  • 什么叫 Teacher Forcing
  • 什么叫 Prefill 和 Decode
  • 为什么 KV Cache 是推理核心
  • 为什么说现代推理系统的大部分问题,都能追溯到 Decoder-only Transformer 的执行方式