Page 35 · SimLabs LLM Visual

自回归生成与采样:模型怎么决定下一个字

上一页我们把 Mini-GPT 训练好了。现在它已经能给出“下一个字是什么”的概率分布。但知道分布不等于会说话——你还得决定怎么从这个分布里挑出下一个字。这就是采样策略要做的事。同一份分布,用不同策略采样,出来的文字可能天差地别:有的死板重复,有的天马行空,有的恰到好处。

看懂贪心与采样 理解温度如何调节随机性 掌握 Top-K 与 Top-p 亲手采样一串文字

为什么不能直接选概率最高的字

最直观的想法是:每一步都选概率最高的那个字,不就行了吗?这个策略叫贪心解码(Greedy Decoding)。听起来很合理,但它有两个致命问题。

① 容易复读

贪心在每一步都选“最安全”的字,很容易陷入循环,比如一直重复“的的的的”或“非常非常非常”。因为一旦进入某个模式,最高概率永远是同一个。

② 缺乏多样性

同一个 prompt,贪心永远给出完全一样的输出。对于写作、对话、创意生成来说,这种确定性反而是一种缺陷——用户希望每次都能看到不一样的内容。

③ 错过更好的全局解

每一步局部最优,不等于整句话全局最优。有时候稍微降低当前步的概率,反而能换来后面更高概率的组合。这就是 Beam Search 想解决的问题。

模型输出 logits → softmax 变概率 → 采样策略 → 选出下一个 token → 拼回输入继续预测
先抓住一句话: 采样策略是在“多样性”和“连贯性”之间做权衡。温度、Top-K、Top-p 就是三个控制这个权衡的旋钮。理解它们,你就理解了 ChatGPT 的“创造力”到底来自哪里。

实验台:亲手从分布里采一个 token

下面展示了一个模型在某个位置的输出分布。16 个候选字符,每个都有一根条形表示它被选中的概率。你可以调整温度、Top-K 和 Top-p,观察分布怎么变化,然后点击“采样”看随机数落在哪个字符上。

1当前分布:16 个候选字符

累积概率轴(随机数落在哪一段,就选哪个字符)
已生成序列(0 个字符):
// 点击「采样一个字符」开始
// 等待采样...

控采样参数

0.80
关
1.00
// 温度缩放
pi = softmax(logiti / T)

// Top-K:只保留概率最高的 K 个
topk(p, K)

// Top-p:保留累积概率达到 p 的最小集合
topp(p, P)
有效候选数
16
最高概率
—
熵(多样性)
—
采样次数
0
试试看: 把温度调到 0.2,分布会变得非常尖锐,几乎总是选最高概率的那个字;调到 1.8,分布变得平坦,低概率字也有机会被选中。

四种策略,四种性格

同一份分布,用不同策略采样 10 次,结果会非常不一样。下面是四种典型策略的实时对比。

贪心

🏆 贪心解码

每步都选概率最高的字符。确定性输出,但容易复读、缺乏多样性。
温度

🌡️ 温度采样 (T=1.5)

按概率随机抽取,温度越高越随机。输出多样,但可能跑题。
Top-K

🎯 Top-K 采样 (K=3)

只在概率最高的 K 个字符中采样。既有多样性,又不会选到离谱的字。
Top-p

🌊 Top-p 采样 (p=0.9)

在累积概率达到 p 的最小集合中采样。候选数量自适应,是当前 LLM 最常用的策略。
观察重点: 贪心每次输出完全一样,而且可能 10 个字符全是同一个字;温度采样五花八门;Top-K 集中在前几个高概率字;Top-p 的候选集大小会随分布形状自动变化。这就是为什么 ChatGPT 默认用 Top-p + 温度,而不是贪心。

自回归生成:为什么叫“自回归”

语言模型的生成是逐字进行的。每生成一个字,就把它拼到输入后面,再送进模型预测下一个字。这个“把自己的输出作为下一步输入”的过程,就叫自回归(Autoregressive)。

输入 "今" → 预测下一个 → "天" → 输入 "今天" → 预测下一个 → "天" → 输入 "今天天" → ...

① 逐字生成

每次只生成一个 token,然后把它拼接到输入末尾。这就是为什么你在 ChatGPT 里看到文字是一个一个蹦出来的。

② KV Cache 加速

朴素实现每一步都要重新计算整个序列的注意力,非常慢。KV Cache 缓存之前算过的 K 和 V,让每一步只需要计算新 token 的部分,速度提升几十倍。

③ 停止条件

生成什么时候停?通常有三个条件:生成了 <eos> 结束符、达到最大长度限制、或触发了停止词(如“用户:”)。

知识点完整总结

下面用六张卡片,把自回归生成与采样相关的每一个概念完整讲清楚。

📖 标准介绍

自回归生成(Autoregressive Generation)是语言模型逐 token 生成文本的过程:每一步将已生成的序列作为输入,预测下一个 token 的概率分布,从中采样一个 token,追加到序列末尾,重复直到满足停止条件。

采样策略(Sampling Strategy)决定了如何从概率分布中选择下一个 token。常见策略包括:

  • 贪心解码:argmax(p),确定但易复读。
  • 温度采样:用 T 缩放 logits,T 越大越随机。
  • Top-K:只在概率最高的 K 个 token 中采样。
  • Top-p(核采样):在累积概率达到 p 的最小集合中采样。
  • Beam Search:同时维护多条候选路径,选全局概率最高的。
  • 重复惩罚:降低已出现 token 的概率,缓解复读。

💡 通俗介绍

模型每生成一个字,就像在做一个“选择题”:它给每个候选字打一个分数,分数越高越可能被选中。但如果每次都选分数最高的,它会变得死板、爱重复。

温度控制“大胆程度”:温度低,模型只敢选最有把握的字;温度高,模型愿意尝试冷门选项。

Top-K是“只在前 K 名里选”,避免选到太离谱的字。Top-p是“只在前几名里选,但具体几名不固定”——如果第一名遥遥领先,就只选它;如果前几名势均力敌,就多留几个候选。

这三者组合起来,就能在“稳定”和“创意”之间找到你想要的平衡点。

🔧 解决了什么问题

它解决了“如何从概率分布中选出下一个 token,以平衡生成质量和多样性”这个问题。

  • 贪心太死板:永远选最高概率,输出重复、缺乏创意。
  • 纯随机太离谱:完全按概率随机抽,容易选到低概率的荒谬字。
  • 温度调节随机性:一个旋钮控制“保守”到“大胆”。
  • Top-K 截断长尾:把低概率的“垃圾候选”直接排除。
  • Top-p 自适应候选集:根据分布形状动态决定候选数量,比 Top-K 更灵活。
  • 重复惩罚:降低已出现 token 的概率,缓解复读。

⭐ 为什么重要

采样策略直接决定了用户体验。同一个模型,换一套采样参数,可以从“死板复读机”变成“天马行空的诗人”,也可以从“胡言乱语”变成“严谨的助手”。

它影响:

  • 输出的多样性和创造性;
  • 输出的连贯性和事实准确性;
  • 是否出现复读、跑题、胡言乱语;
  • 同一个 prompt 多次生成的一致性;
  • 模型在不同任务(写作 / 代码 / 问答)上的表现。

ChatGPT 默认使用温度 + Top-p 组合。理解采样,你就理解了“为什么同一个问题问两次,答案不一样”。

🚀 应用场景

  • 对话系统:温度 0.7 ~ 1.0,Top-p 0.9,兼顾创造性和连贯性。
  • 代码生成:温度 0.2 ~ 0.5,低温度保证正确性。
  • 创意写作:温度 1.0 ~ 1.5,鼓励多样性。
  • 翻译:温度 0.2 ~ 0.5,追求准确。
  • 数学推理:贪心或极低温度,避免随机错误。
  • 数据增强:高温度 + Top-p,生成多样化的合成数据。
  • Beam Search:机器翻译、语音识别等追求最优序列的任务。
  • 重复惩罚:长文本生成中防止复读。

⚠️ 缺陷与局限

  • 温度难以调优:太高胡言乱语,太低死板复读。不同任务需要不同的温度,没有万能值。
  • Top-K 固定候选数:分布尖锐时 K 太大,会引入垃圾候选;分布平坦时 K 太小,会限制多样性。Top-p 更灵活,但 p 也需要调。
  • 采样不可复现:随机采样导致同样输入输出不同,给调试和评估带来困难。需要固定随机种子。
  • 重复惩罚有副作用:惩罚太强会导致语句不通顺,甚至把必要的高频词(如“的”)也压掉。
  • Beam Search 不适合开放生成:它追求全局概率最高,但生成文本往往太“安全”、太模板化,缺乏创造性。
  • 采样无法保证事实正确:高概率不等于正确。模型可能自信地生成错误信息(幻觉)。
  • KV Cache 显存开销:长序列生成时 KV Cache 占用大量显存,需要 PagedAttention 等技术优化。
一句话理解采样: 模型给出概率分布,采样策略决定怎么选。贪心最保守但爱复读,温度调节大胆程度,Top-K 截断长尾,Top-p 自适应候选集。理解这三者的组合,你就掌握了控制 LLM “性格”的钥匙——同一模型,可以严谨如教科书,也可以天马行空如诗人。

学完这一页,最好记住三件事

贪心最稳定但最死板

每步选最高概率,输出确定、可复现,但容易复读、缺乏多样性。适合需要精确答案的任务。

温度控制随机性

低温让分布尖锐(保守),高温让分布平坦(大胆)。它不改变候选集,只改变概率形状。

Top-K 和 Top-p 控制候选集

Top-K 固定候选数量,Top-p 根据累积概率动态决定。两者常与温度组合使用,是 ChatGPT 的默认配置。