三种 Transformer 架构详解:Encoder、Decoder、Encoder-Decoder

分类: 注意力与Transformer · 难度: 中级 · 关联讲座: L05

三种 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-DecoderEnc 双向 + Dec 单向 + 交叉理解→生成的桥接翻译、摘要、问答T5, BART

2. Encoder-only(BERT 类)详解

结构LL 层堆叠,每层 = Self-Attention + FFN + 残差 + LayerNorm

注意力矩阵无掩码n×nn \times n 的完整矩阵

Aij=(xiWQ)(xjWK)Tdk,i,j{1,,n}A_{ij} = \frac{(x_i W_Q)(x_j W_K)^T}{\sqrt{d_k}}, \quad \forall\, i, j \in \{1, \ldots, n\}

关键特性:位置 ii 的表示融合了整个序列的信息,包括”未来”位置。

为什么适合理解任务? 考虑情感分析句子 “The movie was not bad at all”

  • 理解 “not bad” 需要同时看到 “not” 和 “bad”
  • 双向注意力让 “bad” 能关注左边的 “not”,也能关注右边的 “at all”
  • 最终 [CLS] token 聚合了全局信息,用于分类

局限:无法直接用于生成——因为训练时每个位置都能看到答案,推理时生成位置 t+1t+1 时无法提供位置 t+1t+1 及之后的真实 token。


3. Decoder-only(GPT 类)详解

结构LL 层堆叠,每层 = Masked Self-Attention + FFN + 残差 + LayerNorm

注意力矩阵下三角因果掩码

Aij={(xiWQ)(xjWK)Tdkif jiif j>iA_{ij} = \begin{cases} \frac{(x_i W_Q)(x_j W_K)^T}{\sqrt{d_k}} & \text{if } j \leq i \\ -\infty & \text{if } j > i \end{cases}

-\infty 经过 softmax 后变为 0,确保位置 ii 只能关注 {1,2,,i}\{1, 2, \ldots, i\}

为什么需要因果掩码? 自回归生成的核心约束:

P(x1,x2,,xn)=t=1nP(xtx1,,xt1)P(x_1, x_2, \ldots, x_n) = \prod_{t=1}^{n} P(x_t \mid x_1, \ldots, x_{t-1})

如果位置 tt 能看到 xt+1x_{t+1},那模型在训练时直接”抄答案”,推理时(没有答案可抄)就完全失效。因果掩码在训练时模拟推理时的信息约束

KV Cache 优化:推理时生成 token tt,位置 11t1t-1 的 Key/Value 已经计算过且不会改变(因为因果掩码保证它们不依赖未来 token),因此可以缓存复用,将每步复杂度从 O(td)O(t \cdot d) 降为 O(d)O(d)


4. Encoder-Decoder(T5 类)详解——两种架构如何协同

这是三种架构中最复杂也最精巧的设计。

4.1 设计动机:理解与生成是两个不同的计算过程

以机器翻译为例——将 “我爱自然语言处理” 翻译为 “I love NLP”:

  • 理解阶段(Encoder 的任务):充分理解源句的每个词和整体语义。“我” 指代谁?“爱” 的对象是什么?“自然语言处理” 是一个专有名词还是三个独立词?这需要双向注意力——“处理” 要知道前面是 “自然语言”,“自然” 要知道后面是 “语言处理”。

  • 生成阶段(Decoder 的任务):逐词生成目标语言。生成 “I” 后才能生成 “love”,生成 “love” 后才能生成 “NLP”。这需要因果掩码——保证自回归生成的正确性。

  • 桥接阶段(Cross-Attention 的任务):生成每个目标词时,需要”回头看”源句。生成 “NLP” 时要知道它对应的是源句中的 “自然语言处理” 而不是 “我” 或 “爱”。这需要 Cross-Attention

4.2 数据流的完整路径

设源序列 X=(x1,,xn)X = (x_1, \ldots, x_n),目标序列 Y=(y1,,ym)Y = (y_1, \ldots, y_m)

第 1 步:Encoder 处理源序列

H(0)=Embed(X)+PERn×dH^{(0)} = \text{Embed}(X) + PE \in \mathbb{R}^{n \times d}

经过 LencL_{\text{enc}} 层 Encoder Block:

H(l)=EncoderBlock(l)(H(l1)),l=1,,LencH^{(l)} = \text{EncoderBlock}^{(l)}(H^{(l-1)}), \quad l = 1, \ldots, L_{\text{enc}}

每层内部: H~=LayerNorm(H(l1)+SelfAttn(H(l1)))\tilde{H} = \text{LayerNorm}(H^{(l-1)} + \text{SelfAttn}(H^{(l-1)})) H(l)=LayerNorm(H~+FFN(H~))H^{(l)} = \text{LayerNorm}(\tilde{H} + \text{FFN}(\tilde{H}))

最终输出 H(Lenc)Rn×dH^{(L_{\text{enc}})} \in \mathbb{R}^{n \times d}——源序列的上下文感知表示

第 2 步:Decoder 逐层处理目标序列

Z(0)=Embed(Y)+PERm×dZ^{(0)} = \text{Embed}(Y) + PE \in \mathbb{R}^{m \times d}

经过 LdecL_{\text{dec}} 层 Decoder Block,每层包含三个子层

子层 1:Masked Self-Attention(目标序列内部的因果注意力) Z=LayerNorm(Z(l1)+MaskedSelfAttn(Z(l1)))Z' = \text{LayerNorm}(Z^{(l-1)} + \text{MaskedSelfAttn}(Z^{(l-1)}))

子层 2:Cross-Attention(从 Encoder 输出获取源序列信息) Z=LayerNorm(Z+CrossAttn(Q=Z,  K=H(Lenc),  V=H(Lenc)))Z'' = \text{LayerNorm}(Z' + \text{CrossAttn}(Q=Z',\; K=H^{(L_{\text{enc}})},\; V=H^{(L_{\text{enc}})}))

子层 3:FFN Z(l)=LayerNorm(Z+FFN(Z))Z^{(l)} = \text{LayerNorm}(Z'' + \text{FFN}(Z''))

4.3 Cross-Attention:连接理解与生成的桥梁

Cross-Attention 的数学形式:

CrossAttn(Z,H)=softmax ⁣((ZWQcross)(HWKcross)Tdk)(HWVcross)\text{CrossAttn}(Z', H) = \text{softmax}\!\left(\frac{(Z' W_Q^{\text{cross}})(H W_K^{\text{cross}})^T}{\sqrt{d_k}}\right)(H W_V^{\text{cross}})

关键区别

  • Self-Attention:Q, K, V 全部来自同一个序列
  • Cross-Attention:Q 来自 Decoder(“我想找什么”),K 和 V 来自 Encoder(“源序列有什么”)

注意力矩阵维度m×nm \times n(目标长度 × 源长度),无掩码——生成每个目标 token 时可以关注源序列的任意位置

直觉:Cross-Attention 就像一个可学习的对齐模型。当 Decoder 在生成 “NLP” 时:

  • Query 编码了 “在当前生成上下文中,我需要什么样的源信息”
  • Key 编码了 “源序列每个位置提供什么样的信息”
  • 注意力权重 αij\alpha_{ij} 告诉我们:“NLP” 应该主要关注源句中的 “自然”、“语言”、“处理” 三个 token
  • Value 加权求和后,Decoder 获得了精确的源端信息

4.4 为什么不能只用 Decoder?

GPT 类模型证明了 Decoder-only 也能做翻译(把源句和目标句拼接成一个序列)。但 Encoder-Decoder 有结构性优势:

  1. 信息利用效率:Encoder 用双向注意力理解源句,信息提取更充分。Decoder-only 模型中源句部分也受因果掩码约束,源句末尾的词看不到开头的词(除非加前缀注意力等技巧)

  2. 计算效率:Encoder 对源句的计算只做一次,生成每个目标 token 时复用。Decoder-only 模型在 KV Cache 下也能做到类似效果,但 Encoder 的双向注意力质量更高

  3. 对齐的显式建模:Cross-Attention 的 m×nm \times n 矩阵可以直接可视化为源→目标的对齐矩阵,具有很好的可解释性


5. 数值示例:Encoder-Decoder 数据流

设定:翻译 “猫 坐 了” → “cat sat”,dmodel=4d_\text{model} = 4

符号含义维度
XX源序列 “猫 坐 了”(3,)(3,)
HHEncoder 输出(3,4)(3, 4)
YY目标序列 “cat sat”(2,)(2,)
ZZDecoder 隐状态(2,4)(2, 4)

Encoder 阶段(双向注意力,3×33 \times 3 矩阵):

Self-Attention 矩阵(softmax 后):

0.400.350.25
0.300.450.25
0.200.300.50

每行之和 = 1。“坐” 对 “猫” 的注意力为 0.30(知道谁在坐),对 “了” 为 0.25(知道已完成)。

Decoder 阶段——生成 “sat” 时:

子层 1 — Masked Self-Attention(2×22 \times 2,因果掩码):

catsat
cat1.000
sat0.450.55

“sat” 只能看到 “cat” 和自己,看不到更后面的 token。

子层 2 — Cross-Attention(2×32 \times 3,无掩码):

cat0.700.150.15
sat0.100.650.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. 常见误区

  1. 误区:Encoder-Decoder 的 Decoder 和 Decoder-only 模型的 Decoder 完全一样 → 正确:Encoder-Decoder 的 Decoder 多了一个 Cross-Attention 子层。每层结构是 Masked Self-Attn → Cross-Attn → FFN(三个子层),而 Decoder-only 是 Masked Self-Attn → FFN(两个子层)

  2. 误区:Cross-Attention 也有因果掩码 → 正确:Cross-Attention 没有掩码。生成目标 token yty_t 时,可以关注源序列的所有位置 {x1,,xn}\{x_1, \ldots, x_n\}。因果约束只在 Decoder 的 Self-Attention 中

  3. 误区:Encoder 和 Decoder 共享参数 → 正确:标准设计中 Encoder 和 Decoder 的参数是独立的(虽然 T5 的词嵌入层可以共享)

  4. 误区:现代 LLM 都用 Decoder-only,所以 Encoder-Decoder 过时了 → 正确:GPT-4、LLaMA 等确实是 Decoder-only,但 Encoder-Decoder 在特定任务(翻译、摘要、语音识别如 Whisper)上仍有优势

  5. 误区: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-至今)