自回归生成与解码:模型怎样逐个输出 token
生成式语言模型每一步通常输出一组词表分数。解码器把这些分数转成一个 token,再把它接回上下文。用户看见的整段回答,是这个循环的结果。理解循环后,就能区分模型学到了什么、解码规则选了什么,以及服务为什么在某处停止。
先了解 token 与输入表示和因果 decoder。本文讨论文本的自回归生成;扩散式生成等其他路线不遵循同一逐 token 循环。
一段文本的概率怎样分解
给定提示 ,输出 的概率可写为:
这是概率链式法则。自回归模型学习这些条件分布;最大似然训练常把乘积改写为负对数概率之和。训练时可以用真实前缀同时计算许多位置的目标,推理时前缀来自模型此前的输出,因此早期错误会改变后面的输入。
每一步用隐藏向量投影出 个 logits,softmax 后得到候选 token 分布。这是“某个片段作为下一步输出”的概率,不是“整句事实正确”的概率。模型可以非常稳定地输出一个错误名字;降低温度不会自动补充缺失知识。
贪心选择与序列搜索
贪心解码每步选概率最大的 token。它便宜、行为相对易解释,却不保证整段序列的概率最大。例如人为构造的两步分布里,第一步 A 为 0.6,B 为 0.4;走 A 后最佳结尾概率为 0.5,走 B 后最佳结尾为 0.9。贪心选中的路径概率是 ,另一条却有 。
Beam search 同时保留若干前缀,扩大序列搜索范围。它需要额外计算和缓存,而且不同长度的概率不可直接当成质量分数:多乘几项小于 1 的概率,长句的联合概率往往更低,所以实现常加入长度处理。更高似然也不等于更好的开放式写作。Holtzman 等人的研究分析了最大化似然解码在开放式文本中的重复与退化,并提出 nucleus sampling。
任务不同,选择不同。短标签或严格抽取可能偏好稳定输出;创作希望覆盖多种合理延续。不能把某一种设置宣布为所有任务的最优值。
温度、top-k 与 top-p
温度作用于 logits,而不是给文本直接加“创造力”:
温度小于 1 会让分布更集中,大于 1 会使分布更平。零温度通常是实现提供的贪心选项或极限行为,不能直接把 代入公式。温度也不是置信度校准:在一个生成分布上变得更确定,不代表真实错误率下降。
Top-k 只保留得分最高的 k 个候选,再归一化采样。Top-p 按概率排序,保留累计质量至少达到 p 的最短前缀,再归一化。若示例分布为 [0.50,0.25,0.15,0.10],top-p 为 0.8 会保留前三项,总质量 0.90;不是把第三项切成 0.05。两种过滤与温度的先后顺序会影响结果,应按实际框架定义;Transformers 的生成文档给出了对应策略。
下面只计算同一组假想 logits 的温度效果,不调用模型:
import math
def distribution(logits, temperature):
scaled = [v / temperature for v in logits]
peak = max(scaled)
weights = [math.exp(v - peak) for v in scaled]
total = sum(weights)
return [round(v / total, 4) for v in weights]
for t in (0.5, 1.0, 2.0):
print(t, distribution([2.0, 1.0, 0.0], t))
随着温度升高,第一项概率下降,其余项上升;原始排序不变。采样时仍可能选中小概率项。固定随机种子有助于复现实验,但服务实现、硬件算子、批量调度等变化仍可能影响完整结果。
保持分数不变,拖动温度滑块:候选项的概率会变化,但大小顺序不变。
这里用三个虚构候选项,分数为 [2, 1, 0]。试试把 T 调到 0.2、1 和 2。
A 始终是概率最大的候选项。升高温度会让概率分布更均匀,但不会补充知识,也不会检查 token 是否正确。此演示不调用模型。
停止是系统决定的一部分
模型可以输出 EOS,服务也可以因为最大输出长度、停止字符串或取消请求而结束。它们代表不同结果:正常终止、预算用尽和用户中断不应都被当成“回答完成”。结构化任务尤其要检查结束原因,避免把被截断的 JSON 当成成功。
停止字符串可能与正常内容重合;最大长度应按输出 token 计数,并弄清接口参数是否包含输入。模型的上下文窗口还要容纳提示、已生成内容,以及实现所需的其他序列部分。输出变长会增加计算和缓存占用。输入阶段与逐步生成阶段的成本差别见推理延迟与吞吐。
JSON 或工具调用可以在解码时屏蔽不符合语法的 token。这样的约束能提高结构合法性,却不能保证字段里的日期真实、SQL 查询合理或工具参数符合业务约束。完整链路仍要解析、做 schema 检查,并对执行前提作确定性验证。
怎样比较解码设置
固定模型、模板和输入集,分别测试贪心、少量采样设置和适合任务的搜索方法。开放式任务每题采样多次,保留随机种子与结束原因;分类与抽取则比较正确率、有效格式比例、延迟和成本。不要只挑一条“看起来聪明”的输出。
比较时把“内容是否正确”和“生成是否稳定”分开。如果某设置让同一个错误重复十次,它提高了重复性,没有提高正确性;如果采样偶然生成正确答案,还要检查出现频率。需要概率作为动作依据时,继续读校准、阈值与弃权;需要评估整套回答系统时,读检索与生成评估。