副标题 / 摘要
GPT 采用 decoder-only 结构是为了极致匹配自回归生成任务:因果注意力保证顺序一致性,结构简化降低训练与推理成本。本文对比 encoder-only 与 encoder-decoder,并给出最小 PyTorch 示例。
- 预计阅读时长:14~18 分钟
- 标签:
gpt、decoder-only、autoregressive - SEO 关键词:GPT, Decoder-Only, 自回归, Causal Attention
- 元描述:从任务目标到工程成本,解释 GPT 为什么选择 decoder-only 结构。
目标读者
- 想理解 GPT 架构选择的入门读者
- 需要做生成模型选型的工程实践者
- 想对比不同 Transformer 结构的开发者
背景 / 动机
在文本生成任务中,模型必须严格遵循“从左到右”的因果顺序。
GPT 的 decoder-only 结构天然满足这一目标,同时简化了模型设计。
但它与 encoder-only、encoder-decoder 的差异常被混淆,需要系统梳理。
核心概念
- Decoder-only:仅使用解码器堆叠 + 因果自注意力。
- Encoder-only:双向自注意力,擅长理解任务。
- Encoder-decoder:编码输入再解码输出,擅长序列到序列任务。
- Causal Mask:确保 token 只能看见左侧历史。
A — Algorithm(题目与算法)
用通俗语言说明主题内容
- GPT 的任务是“预测下一个词”,所以只需要解码器并遵守因果顺序。
- Encoder-only(如 BERT)不适合生成,因为它能看到未来词。
- Encoder-decoder(如 T5)适合翻译/摘要,但结构更复杂。
基础示例(1)
- 输入:“今天是” → 模型预测“周五”。
- 这要求模型只能看到“今天是”,不能看到未来词。
基础示例(2)
- 机器翻译需要“源序列 → 目标序列”,更适合 encoder-decoder。
实践指南 / 步骤
- 任务为生成/续写 → 优先 decoder-only。
- 任务为理解/分类 → 优先 encoder-only。
- 任务为序列到序列 → 优先 encoder-decoder。
可运行示例(最小因果注意力)
import torch
import torch.nn.functional as F
def causal_attention(x):
# x: (batch, seq, dim)
scores = x @ x.transpose(-2, -1)
seq = x.size(1)
mask = torch.tril(torch.ones(seq, seq)).bool()
scores = scores.masked_fill(~mask, float("-inf"))
weights = F.softmax(scores, dim=-1)
return weights @ x
x = torch.randn(1, 4, 8)
out = causal_attention(x)
print(out.shape)
解释与原理
- 因果 mask 保证 token 只依赖左侧历史。
- 这与自回归目标完全一致,避免信息泄露。
- Decoder-only 结构也更容易并行化与扩展模型规模。
C — Concepts(核心思想)
方法类型
GPT 属于自回归生成模型,采用 decoder-only 结构 + 因果自注意力。
关键公式
自回归目标:
$ L = -\sum_{t} \log p(x_t | x_{<t}) $
因果注意力:
$ \text{Attention}(Q, K, V) = \text{softmax}(\frac{QK^\top}{\sqrt{d}} + M) V $
其中 M 为上三角 -inf 掩码,确保只看历史。
与其他结构对比
| 结构 | 注意力类型 | 典型任务 | 优势 | 代价 |
|---|---|---|---|---|
| Encoder-only | 双向 self-attn | 理解/分类 | 表征强 | 不适合生成 |
| Decoder-only | 因果 self-attn | 生成/续写 | 简洁高效 | 对齐任务弱 |
| Encoder-decoder | self + cross | 翻译/摘要 | 对齐强 | 结构复杂 |
E — Engineering(工程应用)
场景 1:文本续写/对话生成
- 背景:需要顺序生成自然语言。
- 为什么适用:decoder-only 完全匹配自回归目标。
- 代码示例(Python):
import torch
prompt = torch.tensor([[1, 2, 3]])
next_token = torch.randint(0, 100, (1, 1))
print(next_token.item())
场景 2:RAG 生成
- 背景:模型需要读取检索到的上下文再生成答案。
- 为什么适用:decoder-only 仍可通过拼接上下文完成生成。
- 代码示例(Python):
import torch
context = torch.tensor([[10, 11, 12]])
question = torch.tensor([[20, 21]])
inputs = torch.cat([context, question], dim=1)
print(inputs.shape)
场景 3:代码生成
- 背景:自动补全与生成代码。
- 为什么适用:因果建模与文本续写一致。
- 代码示例(Python):
import torch
tokens = torch.tensor([[5, 6, 7]])
next_token = torch.randint(0, 100, (1, 1))
print(next_token.item())
R — Reflection(反思与深入)
- 时间复杂度:decoder-only 仍是
O(n^2)注意力。 - 空间复杂度:与序列长度平方相关。
- 替代方案:
- Encoder-decoder 适合对齐任务(翻译、摘要)。
- Prefix-LM 结合理解与生成,但结构更复杂。
- 工程可行性:decoder-only 更易扩展到大模型规模。
常见问题与注意事项
- Decoder-only 不是“万能”,在对齐任务上不如 encoder-decoder。
- 需要正确设置因果 mask,否则会信息泄露。
- 长上下文推理成本高,需做缓存/分块。
最佳实践与建议
- 生成任务优先 decoder-only;对齐任务优先 encoder-decoder。
- 调试时先验证 mask 是否正确。
- 长序列任务考虑 KV cache 或稀疏注意力。
S — Summary(总结)
核心收获
- GPT 采用 decoder-only 是为了匹配自回归生成目标。
- 因果注意力保证生成顺序一致性。
- Encoder-only 与 encoder-decoder 在任务适配上各有优势。
- 结构简化带来更好的扩展性与工程效率。
推荐延伸阅读
- GPT 论文:Improving Language Understanding by Generative Pre-Training
- Attention Is All You Need
- PrefixLM 相关研究
参考与延伸阅读
- https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf
- https://arxiv.org/abs/1706.03762
- https://arxiv.org/abs/2101.00190
小结 / 结论
GPT 选择 decoder-only,并不是妥协,而是针对生成任务的最简洁表达。
理解这一点,就能在模型选型中更快做出正确判断。
行动号召(CTA)
把你的任务写成“理解/生成/对齐”,再选择合适的 Transformer 结构。