自回归模型:从 GPT 到现代语言模型的生成范式
自回归模型(Autoregressive Model)是当今最成功的语言模型范式。GPT、LLaMA、Claude 等主流大语言模型都基于自回归生成——通过逐个预测下一个 token 来产生连贯的文本。
什么是自回归生成?
自回归生成的核心思想极其简单:每次只预测下一个 token,然后将已生成的 token 作为输入继续预测。
自回归生成过程:
输入: "今天天气"
预测: "今天天气" → "真" (下一个 token)
输入: "今天天气真"
预测: "今天天气真" → "好" (下一个 token)
输入: "今天天气真好"
预测: "今天天气真好" → "啊" (下一个 token)
...
最终输出: "今天天气真好啊!"
数学表示:
P(x_1, x_2, ..., x_n) = P(x_1) × P(x_2|x_1) × P(x_3|x_1,x_2) × ... × P(x_n|x_1,...,x_{n-1})
= ∏ P(x_t | x_1, ..., x_{t-1})
这种"一个接一个"的生成方式看似低效,但它正是大语言模型成功的关键。
训练目标:下一个 token 预测
自回归模型的训练目标就是最大化给定前文时下一个 token 的条件概率。
# 训练数据示例
# 输入: "人工智能正在改变世界"
# 标签: "工智能正在改变世界" (右移一位)
# 前向传播
logits = model("人", "工", "智", "能", "正", "在", "改", "变")
# logits 形状: [seq_len, vocab_size]
# 损失计算(交叉熵)
loss = CrossEntropyLoss(logits[0], target="工") # 预测 "工"
loss += CrossEntropyLoss(logits[1], target="智") # 预测 "智"
loss += CrossEntropyLoss(logits[2], target="能") # 预测 "能"
...
# 等价于:每个位置独立预测下一个 token
Teacher Forcing:训练的核心技巧
Teacher Forcing 是自回归模型训练的关键技巧:训练时使用真实标签作为下一步的输入,而不是模型的预测。
训练过程(Teacher Forcing):
步骤 1: 输入 "人" → 预测 "工" ✓(真实标签是 "工")
步骤 2: 输入 "工" → 预测 "智" ✓(使用真实标签 "工")
步骤 3: 输入 "智" → 预测 "能" ✓(使用真实标签 "智")
注意:步骤 2 用的是真实的 "工",不是模型预测的可能错误的结果
对比(不使用 Teacher Forcing):
步骤 1: 输入 "人" → 预测 "工"(可能预测错误)
步骤 2: 输入 "工"(模型预测) → 可能输入已经错了
步骤 3: 错误累积,训练不稳定
Teacher Forcing 的利与弊
| 方面 | 使用 Teacher Forcing | 不使用 Teacher Forcing |
|---|---|---|
| 训练速度 | 快(并行计算所有位置) | 慢(需要串行生成) |
| 训练稳定性 | 稳定(每步输入正确) | 不稳定(错误累积) |
| 曝光偏差 | 存在(训练用真实,推理用预测) | 不存在 |
解码策略:从概率到文本
训练完成后,模型输出的是每个位置的概率分布。如何从概率分布中选择 token?这就是解码策略。
1. 贪婪搜索(Greedy Search)
每次都选概率最高的 token。
# 贪婪搜索
def greedy_decode(model, start_tokens, max_len):
tokens = start_tokens
for _ in range(max_len):
logits = model(tokens)
next_token = logits[-1].argmax() # 选概率最高的
tokens = torch.cat([tokens, next_token.unsqueeze(0)])
return tokens
# 优点:简单、快速
# 缺点:可能错过全局最优解
2. 束搜索(Beam Search)
同时维护 k 个最优候选序列,每步扩展每个候选。
束搜索(Beam Size = 2):
初始: [""](分数 = 0)
步骤 1: 扩展每个候选
"" → " 你" (0.8)
"" → " 我" (0.6)
"" → " 他" (0.3) ← 淘汰(只保留 top-2)
步骤 2: 继续扩展
" 你" → " 你 好" (0.8×0.9=0.72)
" 你" → " 你 是" (0.8×0.7=0.56)
" 我" → " 我 们" (0.6×0.85=0.51)
" 我" → " 我 的" (0.6×0.6=0.36) ← 淘汰
步骤 3: 继续... 直到生成 EOS 或达到最大长度
最终选择得分最高的完整序列
3. 采样方法
从概率分布中随机采样,增加生成多样性。
# 温度采样
def temperature_sample(logits, temperature=1.0):
# temperature < 1: 分布更尖锐(更确定)
# temperature > 1: 分布更平坦(更随机)
probs = softmax(logits / temperature)
return torch.multinomial(probs, 1)
# Top-k 采样
def top_k_sample(logits, k=50):
# 只从概率最高的 k 个 token 中采样
top_k_vals, top_k_idx = logits.topk(k)
probs = softmax(top_k_vals)
selected = torch.multinomial(probs, 1)
return top_k_idx[selected]
# Top-p (Nucleus) 采样
def top_p_sample(logits, p=0.9):
# 从累积概率达到 p 的最小 token 集合中采样
sorted_probs, sorted_idx = sort(softmax(logits), descending=True)
cumsum = cumsum(sorted_probs)
mask = cumsum <= p
mask[0] = True # 至少保留一个
filtered_probs = sorted_probs * mask
filtered_probs = filtered_probs / filtered_probs.sum()
selected = torch.multinomial(filtered_probs, 1)
return sorted_idx[selected]
解码策略对比
| 策略 | 特点 | 适用场景 |
|---|---|---|
| 贪婪搜索 | 最快,但重复、无趣 | 翻译、摘要等确定性任务 |
| 束搜索 | 质量较高,但仍偏保守 | 机器翻译、语音识别 |
| 温度采样 | 控制多样性与确定性的平衡 | 对话生成、创意写作 |
| Top-k 采样 | 排除低概率 token,减少噪声 | 通用文本生成 |
| Top-p 采样 | 自适应候选集大小,效果最好 | 当前主流 LLM 的默认选择 |
自回归模型的优势与局限
优势
- 建模能力强:能捕捉复杂的条件依赖关系
- 训练简单:标准的交叉熵损失,成熟的优化方法
- 可扩展:从 GPT-1 到 GPT-4,规模扩大持续带来性能提升
- 零样本能力:预训练后可泛化到各种任务
局限
- 生成速度慢:必须逐 token 生成,无法并行
- 曝光偏差:训练用真实数据,推理用自己的预测,分布不匹配
- 错误累积:早期的错误选择会影响后续所有生成
- 单向注意力:只能看到左侧上下文,无法双向理解
自回归模型的发展脉络
自回归语言模型的发展:
2018: GPT-1(1.17 亿参数)
- 首次证明生成式预训练的有效性
2019: GPT-2(15 亿参数)
- 展示了零样本学习能力
- "语言模型是无监督多任务学习者"
2020: GPT-3(1750 亿参数)
- 发现了 in-context learning 能力
- 少样本学习的突破
2022: InstructGPT / ChatGPT
- 引入 RLHF 对齐训练
- 从"能力强"到"听话好用"
2023-2024: GPT-4, Claude 3, LLaMA 3
- 多模态、长上下文、推理能力
- 自回归范式的全面开花
总结
自回归模型通过"下一个 token 预测"这个看似简单的目标,构建出了当今最强大的语言模型。从训练时的 Teacher Forcing 到推理时的多种解码策略,自回归范式在效率和质量之间找到了精妙的平衡。理解自回归模型的原理和解码策略,是理解现代大语言模型工作方式的基础。