大语言模型每次生成一个词,本质上是在做一道"概率分布题":给定前文,模型会为词表中的每一个词打分,经过 softmax 转换后得到一个概率分布,然后从中抽一个词出来。
问题在于:直接从全部词里抽,低质量的词也有机会被选中;只选概率最高的词,输出又过于死板。Top-p 就是为了解决这个平衡问题而生的。
什么是 Top-p?
Top-p(又叫 Nucleus Sampling,核采样)的思路是:
把候选词按概率从高到低排列,依次累加,直到累积概率刚好达到 p,把这些词圈成一个"候选池",只在这个池子里随机抽取。
p 是一个介于 0 到 1 之间的参数,由使用者设置。
完整执行流程
1. 模型输出所有词的 logits(原始分数)
2. 除以 temperature → 调整分布尖锐度
3. softmax → 转换为概率分布
4. 按概率从高到低排序
5. 从最高概率词开始累加,直到累积概率 ≥ p → 截断,得到候选池
6. 对候选池内概率重新归一化(使其加和为 1)
7. 在候选池内随机采样
具体示例
假设模型生成下一个词时,概率分布如下:
| 排名 | 候选词 | 概率 | 累积概率 |
|---|---|---|---|
| 1 | 猫 | 40% | 40% |
| 2 | 狗 | 25% | 65% |
| 3 | 鸟 | 15% | 80% |
| 4 | 鱼 | 10% | 90% |
| 5 | 蛇 | 5% | 95% |
| 6 | 蜥蜴 | 3% | 98% |
| 7 | 蚂蚁 | 1.5% | 99.5% |
| 8 | 恐龙 | 0.5% | 100% |
top-p = 0.8
累加过程:40% → 65% → 80%,到达 p,停止。
候选池 = {猫, 狗, 鸟},其余词全部排除,从这三个里随机抽取一个。
top-p = 0.95
累加:40% → 65% → 80% → 90% → 95%,停止。
候选池 = {猫, 狗, 鸟, 鱼, 蛇},选择范围扩大,输出更多样。
top-p = 0.4
累加:40%,第一个词"猫"就已到达 p。
候选池 = {猫},输出确定为"猫",无随机性。
Top-p 与 Temperature 的关系
两者都影响输出的随机性,但作用阶段不同、机制不同:
| Temperature | Top-p | |
|---|---|---|
| 作用阶段 | softmax 之前,修改 logits | softmax 之后,过滤候选词 |
| 改变什么 | 整体分布的尖锐程度 | 候选词的数量范围 |
| 值越小 | 输出越确定(分布更尖) | 候选池越小(更保守) |
| 值越大 | 输出越随机(分布更平) | 候选池越大(更多样) |
两者经常同时使用,互为补充:temperature 调整"各词相对可能性",top-p 决定"从哪个范围里选"。
"最小集合"是什么意思?
学术论文中 top-p 的定义表述为:
从满足累积概率 ≥ p 的最小 token 集合中采样。
"最小"的含义:因为我们是从概率最高的词开始累加的,所以用尽量少的词就能凑够 p。换一个方向(从低概率词开始加)需要更多词才能达到同样的 p——那就不叫最小集合了。
本质上,"最小集合"强调的是:只取刚好够的高概率词,不多拿。
直觉总结
| top-p 大小 | 候选池 | 输出风格 |
|---|---|---|
| 接近 1.0 | 几乎全部词 | 高度随机,创意十足 |
| 0.9 左右 | 较多词 | 多样但基本合理 |
| 0.7 ~ 0.8 | 少量词 | 保守,质量稳定 |
| 接近 0 | 极少词甚至只有 1 个 | 接近确定性输出 |
总结:top-p 就是划一条线——把最可能的那些词圈起来,要求它们的概率加起来恰好达到 p,然后只在这个圈子里抽签,圈外的词一律不考虑。