副标题 / 摘要
GPT 采用 decoder-only 结构是为了极致匹配自回归生成任务:因果注意力保证顺序一致性,结构简化降低训练与推理成本。本文对比 encoder-only 与 encoder-decoder,并给出最小 PyTorch 示例。

  • 预计阅读时长:14~18 分钟
  • 标签gptdecoder-onlyautoregressive
  • 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。

实践指南 / 步骤

  1. 任务为生成/续写 → 优先 decoder-only。
  2. 任务为理解/分类 → 优先 encoder-only。
  3. 任务为序列到序列 → 优先 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-decoderself + 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 相关研究

参考与延伸阅读

小结 / 结论

GPT 选择 decoder-only,并不是妥协,而是针对生成任务的最简洁表达。
理解这一点,就能在模型选型中更快做出正确判断。

行动号召(CTA)

把你的任务写成“理解/生成/对齐”,再选择合适的 Transformer 结构。