三种 Transformer 架构详解:Encoder、Decoder、Encoder-Decoder
三种 Transformer 架构详解:Encoder、Decoder、Encoder-Decoder
本文详细剖析三种 Transformer 架构的设计动机、内部结构、数据流和协同机制,重点讲解 Encoder-Decoder 中两种架构如何协同工作。
1. 为什么会演化出三种架构?
原始 Transformer(Vaswani et al., 2017)是 Encoder-Decoder 结构,为机器翻译设计。后续研究发现,不同任务对信息流向的需求不同,于是拆分出三种变体:
| 架构 | 注意力方向 | 信息流 | 核心任务 | 代表模型 |
|---|---|---|---|---|
| Encoder-only | 双向(Bidirectional) | 每个 token 看到所有 token | 理解、分类、匹配 | BERT, RoBERTa |
| Decoder-only | 单向(Causal) | 每个 token 只看到左侧 token | 生成、续写 | GPT, LLaMA |
| Encoder-Decoder | Enc 双向 + Dec 单向 + 交叉 | 理解→生成的桥接 | 翻译、摘要、问答 | T5, BART |
2. Encoder-only(BERT 类)详解
结构: 层堆叠,每层 = Self-Attention + FFN + 残差 + LayerNorm
注意力矩阵:无掩码, 的完整矩阵
关键特性:位置 的表示融合了整个序列的信息,包括”未来”位置。
为什么适合理解任务? 考虑情感分析句子 “The movie was not bad at all”:
- 理解 “not bad” 需要同时看到 “not” 和 “bad”
- 双向注意力让 “bad” 能关注左边的 “not”,也能关注右边的 “at all”
- 最终
[CLS]token 聚合了全局信息,用于分类
局限:无法直接用于生成——因为训练时每个位置都能看到答案,推理时生成位置 时无法提供位置 及之后的真实 token。
3. Decoder-only(GPT 类)详解
结构: 层堆叠,每层 = Masked Self-Attention + FFN + 残差 + LayerNorm
注意力矩阵:下三角因果掩码
经过 softmax 后变为 0,确保位置 只能关注 。
为什么需要因果掩码? 自回归生成的核心约束:
如果位置 能看到 ,那模型在训练时直接”抄答案”,推理时(没有答案可抄)就完全失效。因果掩码在训练时模拟推理时的信息约束。
KV Cache 优化:推理时生成 token ,位置 到 的 Key/Value 已经计算过且不会改变(因为因果掩码保证它们不依赖未来 token),因此可以缓存复用,将每步复杂度从 降为 。
4. Encoder-Decoder(T5 类)详解——两种架构如何协同
这是三种架构中最复杂也最精巧的设计。
4.1 设计动机:理解与生成是两个不同的计算过程
以机器翻译为例——将 “我爱自然语言处理” 翻译为 “I love NLP”:
-
理解阶段(Encoder 的任务):充分理解源句的每个词和整体语义。“我” 指代谁?“爱” 的对象是什么?“自然语言处理” 是一个专有名词还是三个独立词?这需要双向注意力——“处理” 要知道前面是 “自然语言”,“自然” 要知道后面是 “语言处理”。
-
生成阶段(Decoder 的任务):逐词生成目标语言。生成 “I” 后才能生成 “love”,生成 “love” 后才能生成 “NLP”。这需要因果掩码——保证自回归生成的正确性。
-
桥接阶段(Cross-Attention 的任务):生成每个目标词时,需要”回头看”源句。生成 “NLP” 时要知道它对应的是源句中的 “自然语言处理” 而不是 “我” 或 “爱”。这需要 Cross-Attention。
4.2 数据流的完整路径
设源序列 ,目标序列 。
第 1 步:Encoder 处理源序列
经过 层 Encoder Block:
每层内部:
最终输出 ——源序列的上下文感知表示。
第 2 步:Decoder 逐层处理目标序列
经过 层 Decoder Block,每层包含三个子层:
子层 1:Masked Self-Attention(目标序列内部的因果注意力)
子层 2:Cross-Attention(从 Encoder 输出获取源序列信息)
子层 3:FFN
4.3 Cross-Attention:连接理解与生成的桥梁
Cross-Attention 的数学形式:
关键区别:
- Self-Attention:Q, K, V 全部来自同一个序列
- Cross-Attention:Q 来自 Decoder(“我想找什么”),K 和 V 来自 Encoder(“源序列有什么”)
注意力矩阵维度:(目标长度 × 源长度),无掩码——生成每个目标 token 时可以关注源序列的任意位置。
直觉:Cross-Attention 就像一个可学习的对齐模型。当 Decoder 在生成 “NLP” 时:
- Query 编码了 “在当前生成上下文中,我需要什么样的源信息”
- Key 编码了 “源序列每个位置提供什么样的信息”
- 注意力权重 告诉我们:“NLP” 应该主要关注源句中的 “自然”、“语言”、“处理” 三个 token
- Value 加权求和后,Decoder 获得了精确的源端信息
4.4 为什么不能只用 Decoder?
GPT 类模型证明了 Decoder-only 也能做翻译(把源句和目标句拼接成一个序列)。但 Encoder-Decoder 有结构性优势:
-
信息利用效率:Encoder 用双向注意力理解源句,信息提取更充分。Decoder-only 模型中源句部分也受因果掩码约束,源句末尾的词看不到开头的词(除非加前缀注意力等技巧)
-
计算效率:Encoder 对源句的计算只做一次,生成每个目标 token 时复用。Decoder-only 模型在 KV Cache 下也能做到类似效果,但 Encoder 的双向注意力质量更高
-
对齐的显式建模:Cross-Attention 的 矩阵可以直接可视化为源→目标的对齐矩阵,具有很好的可解释性
5. 数值示例:Encoder-Decoder 数据流
设定:翻译 “猫 坐 了” → “cat sat”,
| 符号 | 含义 | 维度 |
|---|---|---|
| 源序列 “猫 坐 了” | ||
| Encoder 输出 | ||
| 目标序列 “cat sat” | ||
| Decoder 隐状态 |
Encoder 阶段(双向注意力, 矩阵):
Self-Attention 矩阵(softmax 后):
| 猫 | 坐 | 了 | |
|---|---|---|---|
| 猫 | 0.40 | 0.35 | 0.25 |
| 坐 | 0.30 | 0.45 | 0.25 |
| 了 | 0.20 | 0.30 | 0.50 |
每行之和 = 1。“坐” 对 “猫” 的注意力为 0.30(知道谁在坐),对 “了” 为 0.25(知道已完成)。
Decoder 阶段——生成 “sat” 时:
子层 1 — Masked Self-Attention(,因果掩码):
| cat | sat | |
|---|---|---|
| cat | 1.00 | 0 |
| sat | 0.45 | 0.55 |
“sat” 只能看到 “cat” 和自己,看不到更后面的 token。
子层 2 — Cross-Attention(,无掩码):
| 猫 | 坐 | 了 | |
|---|---|---|---|
| cat | 0.70 | 0.15 | 0.15 |
| sat | 0.10 | 0.65 | 0.25 |
观察:
- “cat” 强烈关注 “猫”(权重 0.70)——正确的词汇对齐
- “sat” 强烈关注 “坐”(权重 0.65),同时关注 “了”(0.25,因为 “了” 表示完成态,对应英语过去时 “sat”)
- Cross-Attention 自动学会了词汇对齐和语法特征对齐
6. 直觉类比
类比 1:同声传译
- Encoder = 听完整句话并充分理解(双向,因为已经听完了整句)
- Decoder = 一个词一个词地翻译出来(因果,因为翻译是顺序进行的)
- Cross-Attention = 翻译每个词时回忆原文的哪个部分(对齐/查询)
类比 2:开卷考试
- Encoder = 仔细阅读参考材料,标注重点(理解 + 编码)
- Decoder = 写答案(必须按顺序写,不能先写结论再补论据)
- Cross-Attention = 写每一句时翻阅参考材料的相关段落
类比 3:乐队指挥
- Encoder = 分析总谱(看到所有声部的关系)
- Decoder = 指挥演奏(按时间顺序,一拍一拍地进行)
- Cross-Attention = 每一拍看总谱对应的位置,决定哪些乐器该强调
7. 常见误区
-
误区:Encoder-Decoder 的 Decoder 和 Decoder-only 模型的 Decoder 完全一样 → 正确:Encoder-Decoder 的 Decoder 多了一个 Cross-Attention 子层。每层结构是 Masked Self-Attn → Cross-Attn → FFN(三个子层),而 Decoder-only 是 Masked Self-Attn → FFN(两个子层)
-
误区:Cross-Attention 也有因果掩码 → 正确:Cross-Attention 没有掩码。生成目标 token 时,可以关注源序列的所有位置 。因果约束只在 Decoder 的 Self-Attention 中
-
误区:Encoder 和 Decoder 共享参数 → 正确:标准设计中 Encoder 和 Decoder 的参数是独立的(虽然 T5 的词嵌入层可以共享)
-
误区:现代 LLM 都用 Decoder-only,所以 Encoder-Decoder 过时了 → 正确:GPT-4、LLaMA 等确实是 Decoder-only,但 Encoder-Decoder 在特定任务(翻译、摘要、语音识别如 Whisper)上仍有优势
-
误区:Encoder 的输出直接作为 Decoder 第一层的输入 → 正确:Encoder 的输出通过 Cross-Attention 的 K 和 V 注入到 Decoder 的每一层,不是作为 Decoder 的初始输入
8. 历史脉络
Encoder-Decoder(2017)→ Encoder-only BERT(2018)→ Decoder-only GPT-2(2019)→ 统一框架 T5(2020)→ 大规模 Decoder-only LLM 浪潮(2022-至今)