编码器-解码器(Encoder-Decoder)
3 秒看懂
编码器-解码器是一种将输入序列”压缩”为中间表示,再”展开”生成输出序列的两阶段神经网络架构范式。编码器负责理解输入,解码器负责生成输出,两者通过一个语义向量(context vector)或注意力机制连接。这是机器翻译、文本摘要、语音识别等”序列到序列”任务的基石架构。
输入序列 → [编码器] → 中间表示 → [解码器] → 输出序列
"我爱你" 压缩理解 语义向量 展开生成 "I love you"
3 分钟产业解释
为什么它重要?
编码器-解码器是现代生成式AI的底层架构范式之一。理解它,才能理解:
- T5、BART、mT5 等主流开源大模型为何如此设计
- Whisper(OpenAI语音模型)、MarianMT(翻译)为何采用此结构
- Transformer为何能同时支持”编码器-解码器”、“仅编码器”(BERT)、“仅解码器”(GPT)三种变体
产业位置
| 角色 | 代表模型/产品 | 架构选择 |
|---|---|---|
| 机器翻译 | Google Translate、DeepL、MarianMT | 编码器-解码器 |
| 文本摘要 | BART、PEGASUS | 编码器-解码器 |
| 语音识别 | Whisper(OpenAI)、Wav2Vec2+CTC | Whisper:编码器-解码器;Wav2Vec2+CTC:编码器+CTC头部(解码器可选) |
| 多模态生成 | Flamingo | 编码器-解码器变体 |
| 通用大模型 | GPT系列、Claude、Llama | 仅解码器(主流趋势) |
| 理解型任务 | BERT、RoBERTa | 仅编码器(主流趋势) |
核心洞察
当前大模型产业的主流是仅解码器(Decoder-Only)架构(GPT、Llama、Claude等),但这并不意味着编码器-解码器过时。在输入输出结构不对称的场景(如翻译、摘要、语音),编码器-解码器仍是主流选择。T5论文(Google,2019年)证明了”万物皆可Seq2Seq”的范式力量。
15 分钟专家深入
1. 架构本质:非对称的”理解-生成”范式
编码器-解码器的核心思想是将”理解”和”生成”解耦为两个独立模块,通过一个中间表示桥接:
┌─────────────────────────────────────────────────────────┐
│ 编码器-解码器架构 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 输入序列 │ ──→ │ 编码器 │ ──→ │ 中间表示 │ │
│ │ x₁,x₂,...│ │ Encoder │ │ c │ │
│ └──────────┘ └──────────┘ └────┬─────┘ │
│ │ │
│ ↓ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 输出序列 │ ←── │ 解码器 │ ←── │ c │ │
│ │ y₁,y₂,...│ │ Decoder │ │ 中间表示 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
为什么需要非对称设计?
- 翻译任务:源语言和目标语言长度通常不同
- 摘要任务:输入长文档,输出短摘要
- 语音识别:输入连续音频帧,输出离散文本
- 对称架构(如BERT)无法自然处理这种长度变化
2. 三种经典实现范式
范式A:RNN-based Seq2Seq(2014-2017主导)
编码器: 多层LSTM/GRU,逐步处理输入,最终隐藏状态 h_T 作为上下文
解码器: 多层LSTM/GRU,以 h_T 为初始状态,自回归生成输出
h₀ → [RNN] → h₁ → [RNN] → h₂ → ... → h_T(编码器输出)
↓
c = h_T(上下文向量)
↓
s₀=c → [RNN] → s₁ → [RNN] → s₂ → ... → s_T(解码器生成)
瓶颈:信息压缩到单一向量 h_T,长序列信息丢失严重
范式B:注意力机制增强(2014-2017)
Bahdanau等人(2014年)和Luong等人(2015年)引入注意力,允许解码器动态回看编码器所有隐藏状态:
解码器时刻 t 生成时:
1. 计算当前解码状态 s_t 与编码器每个状态 h_i 的相关性(注意力权重 α)
2. 加权求和得到上下文向量 c_t = Σ α_i * h_i
3. 用 c_t + s_t 预测下一个词
注意力权重计算:
e_i = score(s_t, h_i) # 对齐分数
α_i = softmax(e_i) # 归一化权重
c_t = Σ α_i * h_i # 上下文向量
核心改进:每个解码步骤都有独立的上下文视图,不再被单一向量瓶颈限制
范式C:Transformer Encoder-Decoder(2017-至今)
Vaswani等人(2017年)提出的Transformer完全抛弃RNN,用自注意力+交叉注意力重构编码器-解码器:
┌─────────────────────────────────────────────────────────┐
│ Transformer 编码器-解码器结构 │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ 编码器堆叠(N层) │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ 自注意力(Self-Attention) │ │ │
│ │ │ → 每个token看输入序列所有其他token │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ 前馈网络(FFN) │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ │ + 残差连接 + 层归一化 │ │
│ └─────────────────────────────────────────────┘ │
│ ↓ │
│ 编码器输出 K,V │
│ ↓ │
│ ┌─────────────────────────────────────────────┐ │
│ │ 解码器堆叠(N层) │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ 掩码自注意力(Masked Self-Attention) │ │ │
│ │ │ → 每个token只能看已生成的token(因果)│ │ │
│ │ └─────────────────────────────────────┘ │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ 交叉注意力(Cross-Attention) │ │ │
│ │ │ → Q来自解码器,K,V来自编码器输出 │ │ │
│ │ │ → 解码器"查询"编码器理解的输入信息 │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ 前馈网络(FFN) │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ │ + 残差连接 + 层归一化 │ │
│ └─────────────────────────────────────────────┘ │
│ ↓ │
│ 输出logits → softmax → 生成词 │
└─────────────────────────────────────────────────────────┘
关键创新点:
- 交叉注意力(Cross-Attention) 是编码器-解码器的核心连接机制
- 编码器可并行处理所有输入token(相比RNN的顺序处理)
- 解码器虽然仍需自回归生成,但注意力机制使长程依赖建模能力显著增强
3. 与”仅解码器”架构的核心区别
| 维度 | 编码器-解码器 | 仅解码器(GPT/Llama) |
|---|---|---|
| 输入处理 | 独立编码器双向理解输入 | 输入和输出拼接,单向处理 |
| 注意力类型 | 自注意力 + 交叉注意力 | 仅因果自注意力 |
| 参数效率 | 输入输出参数可独立优化 | 输入处理与生成共享参数 |
| 预训练任务 | 去噪(T5)、span遮蔽 | 下一token预测(NTP) |
| 典型任务 | 翻译、摘要、结构化生成 | 开放式对话、代码生成 |
| 推理效率 | 编码器一次前向,解码器自回归 | 全程自回归(但可用KV缓存) |
技术原理(最深)
核心机制详解
1. 编码器的双向注意力
编码器中每个token可以同时看到输入序列的所有位置(双向注意力),这使得模型能理解完整上下文:
输入: "The cat sat on the mat"
编码器注意力矩阵(简化示意):
The cat sat on the mat
The [ ✓ ✓ ✓ ✓ ✓ ✓ ]
cat [ ✓ ✓ ✓ ✓ ✓ ✓ ]
sat [ ✓ ✓ ✓ ✓ ✓ ✓ ]
on [ ✓ ✓ ✓ ✓ ✓ ✓ ]
the [ ✓ ✓ ✓ ✓ ✓ ✓ ]
mat [ ✓ ✓ ✓ ✓ ✓ ✓ ]
每个token都能聚合所有其他token的信息 → 完整语义理解
2. 解码器的因果掩码
解码器使用因果掩码(causal mask) 确保生成时只能看到已生成的token:
生成序列: ["I", "love", "you"]
解码器自注意力掩码(1=可见,0=遮蔽):
I love you
I [ 1 0 0 ]
love [ 1 1 0 ]
you [ 1 1 1 ]
第1步只看"I",第2步看"I,love",第3步看"I,love,you"
→ 保证自回归生成的因果性
3. 交叉注意力:核心连接机制
这是编码器-解码器区别于其他架构的最关键组件:
交叉注意力计算:
Q = 解码器当前层输出 × W_Q # 查询来自解码器
K = 编码器最终输出 × W_K # 键来自编码器
V = 编码器最终输出 × W_V # 值来自编码器
注意力权重 = softmax(Q × K^T / √d_k)
输出 = 注意力权重 × V
物理含义:
解码器在生成每个词时,"查询"编码器理解的输入信息
→ 生成"I"时,可能重点关注"Ich"
→ 生成"love"时,可能重点关注"liebe"
→ 生成"you"时,可能重点关注"dich"
4. Transformer编码器-解码器的完整前向计算
┌─────────────────────────────────────────────────────────────┐
│ Transformer Encoder-Decoder 前向传播 │
│ │
│ 输入: src_tokens = ["Ich", "liebe", "dich"] │
│ tgt_tokens = ["", "I", "love"](训练时用teacher forcing)│
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 步骤1: 输入嵌入 │ │
│ │ src_emb = Embedding(src_tokens) + PositionalEncoding│ │
│ │ tgt_emb = Embedding(tgt_tokens) + PositionalEncoding│ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 步骤2: 编码器处理(N层) │ │
│ │ for i in 1..N: │ │
│ │ src_emb = MultiHeadSelfAttention(src_emb) │ │
│ │ src_emb = LayerNorm(src_emb + residual) │ │
│ │ src_emb = FFN(src_emb) │ │
│ │ src_emb = LayerNorm(src_emb + residual) │ │
│ │ encoder_output = src_emb │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 步骤3: 解码器处理(N层) │ │
│ │ for i in 1..N: │ │
│ │ # 3a. 掩码自注意力(只看已生成token) │ │
│ │ tgt_emb = MaskedMultiHeadSelfAttn(tgt_emb) │ │
│ │ tgt_emb = LayerNorm(tgt_emb + residual) │ │
│ │ │ │
│ │ # 3b. 交叉注意力(查询编码器输出)← 核心! │ │
│ │ Q = tgt_emb × W_Q │ │
│ │ K = encoder_output × W_K │ │
│ │ V = encoder_output × W_V │ │
│ │ cross_out = MultiHeadAttention(Q, K, V) │ │
│ │ tgt_emb = LayerNorm(tgt_emb + cross_out) │ │
│ │ │ │
│ │ # 3c. 前馈网络 │ │
│ │ tgt_emb = FFN(tgt_emb) │ │
│ │ tgt_emb = LayerNorm(tgt_emb + residual) │ │
│ │ decoder_output = tgt_emb │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 步骤4: 输出投影 │ │
│ │ logits = decoder_output × W_vocab + b │ │
│ │ next_token = argmax(softmax(logits)) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 输出: "you"(然后拼接到tgt_tokens,重复直到生成) │
└─────────────────────────────────────────────────────────────┘
关键参数量分析(以T5-Base为例估算)
T5-Base 配置估算:
- 编码器层数: 12层
- 解码器层数: 12层
- 隐藏维度: 768
- 注意力头数: 12
- FFN中间维度: 3072 (4×隐藏维度)
参数量分布估算:
- 词嵌入: V × d = 32128 × 768 ≈ 25M
- 每层编码器:
自注意力 Q/K/V/O: 4 × 768 × 768 ≈ 2.4M
FFN: 2 × 768 × 3072 ≈ 4.7M
层归一化等: ≈ 0.003M
小计: ≈ 7.1M/层
- 每层解码器:
掩码自注意力: ≈ 2.4M
交叉注意力: ≈ 2.4M ← 额外参数
FFN: ≈ 4.7M
层归一化等: ≈ 0.003M
小计: ≈ 9.5M/层(比编码器多~2.4M)
- 编码器总计: 12 × 7.1M + 25M ≈ 110M
- 解码器总计: 12 × 9.5M + 25M ≈ 139M
- 总参数量: ≈ 249M(官方标称220M,含共享嵌入等因素)
注: 解码器每层比编码器多一个交叉注意力模块
推理时的KV缓存优化
┌─────────────────────────────────────────────────────────────┐
│ KV缓存优化示意 │
│ │
│ 问题: 解码器每生成一个token,都要重新计算所有token的K,V │
│ → 计算量随生成长度平方增长 │
│ │
│ 解决: KV缓存(Key-Value Cache) │
│ │
│ 第1步生成 "I": │
│ 计算 , "I" 的 K,V,存入缓存 │
│ │
│ 第2步生成 "love": │
│ 只计算 "love" 的 Q(新token) │
│ 从缓存读取 , "I" 的 K,V(不重新计算) │
│ 注意力计算: Q_love × [K_, K_I]^T │
│ 更新缓存: 添加 K_love, V_love │
│ │
│ 第3步生成 "you": │
│ 只计算 "you" 的 Q │
│ 从缓存读取 , "I", "love" 的 K,V │
│ 更新缓存... │
│ │
│ 效果: 每步计算量从O(t)降到O(1),推理速度显著提升 │
│ │
│ 注意: 编码器侧的KV只需计算一次,全程复用 │
└─────────────────────────────────────────────────────────────┘
技术演进史
时间线
2014.09 Sutskever等: Seq2Seq(LSTM编码器+LSTM解码器)
→ 首次证明端到端神经机器翻译可行性
→ 瓶颈: 单一向量信息压缩
2014.09 Bahdanau等: 注意力机制(Attention)
→ 解码器动态回看编码器所有状态
→ 解决长序列信息丢失问题
2015.06 Luong等: 简化注意力变体(Global/Local Attention)
→ 工程化优化,更易实现
2017.06 Vaswani等: Transformer ("Attention is All You Need")
→ 完全抛弃RNN,纯注意力架构
→ 引入多头注意力、交叉注意力
→ 成为现代NLP基石
2018.10 BERT(仅编码器)、GPT-1(仅解码器)
→ 架构分裂:编码器-解码器 vs 仅解码器 vs 仅编码器
→ 预训练范式兴起
2019.10 T5(Google): "Text-to-Text Transfer Transformer"
→ 万物皆可Seq2Seq,统一为文本到文本
→ 编码器-解码器的巅峰代表
2019.10 BART(Facebook): 去噪自编码器
→ 结合BERT的双向编码和GPT的自回归解码
2020.05 GPT-3: 仅解码器架构在大规模下展现涌现能力
→ 产业重心开始转向仅解码器
2022.09 Whisper(OpenAI): 编码器-解码器用于语音识别
→ 证明该架构在多模态领域仍有生命力
2022.11 ChatGPT: 仅解码器成为大模型主流
→ 编码器-解码器退居特定任务
2023-24 混合架构探索(如Jamba: Mamba+Transformer混合)
→ 编码器-解码器与新架构的融合仍在演进
演进主线
RNN Seq2Seq → +注意力 → Transformer Encoder-Decoder → 分化为三大范式
│
┌─────────────────────────────┼─────────────────┐
↓ ↓ ↓
仅编码器 编码器-解码器 仅解码器
(BERT) (T5/BART) (GPT)
↓ ↓ ↓
理解型任务 翻译/摘要等 大模型主流
分类/NER/问答 不对称任务 对话/生成
技术路线对比
三大架构范式量化对比
| 维度 | 仅编码器 (BERT) | 编码器-解码器 (T5) | 仅解码器 (GPT/Llama) |
|---|---|---|---|
| 注意力类型 | 双向自注意力 | 双向(编码)+因果(解码)+交叉 | 因果自注意力 |
| 输入处理 | 双向理解 | 双向理解(编码器) | 单向(与输出拼接) |
| 生成能力 | ❌ 无 | ✅ 自回归生成 | ✅ 自回归生成 |
| 预训练目标 | MLM(遮蔽语言模型) | 去噪/span预测 | NTP(下一token预测) |
| 参数效率 | 仅编码器参数 | 编码+解码参数(约2倍) | 单组参数 |
| 推理效率 | 一次前向(无生成) | 编码一次+解码自回归 | 全程自回归 |