top_k + top_p 的作用
top_k + top_p 的作用
🎯 场景设置
我们设某个语言模型在某个时间步要生成下一个 token,它预测的下一个 token 的概率分布如下:
Token 概率
"Hello" 0.30
"Hi" 0.20
"Hey" 0.15
"Good" 0.10
"Yo" 0.08
"Greetings" 0.07
"Howdy" 0.05
"Welcome" 0.03
"Nice" 0.02
总共 9 个 token,按概率降序排列。
🎛 参数设定
复制
编辑
top_k = 5
top_p = 0.6
🧮 采样流程(结合 top_k 和 top_p):
第一步:按概率降序排列(已排好)
["Hello", "Hi", "Hey", "Good", "Yo", ...]
第二步:取前 top_k = 5 个 token:
- 保留候选集合:
"Hello" (0.30)
"Hi" (0.20)
"Hey" (0.15)
"Good" (0.10)
"Yo" (0.08)
- 总概率和:0.83 ✅
第三步:从这 5 个 token 中进一步筛选,使累积概率 ≥ top_p = 0.6
| Token | Softmax Probability | Cumulative Probability |
|---|---|---|
| Hello | 0.30 | 0.30 ✅(≤ 0.6) |
| Hi | 0.20 | 0.50 ✅(≤ 0.6) |
| Hey | 0.15 | 0.65 ❌(> 0.6) |
| Good | 0.10 | 0.75 ❌ |
| Yo | 0.08 | 0.83 ❌ |
所以,最终候选 token 是:
["Hello", "Hi"]
只取 top_k 前 5 个中,累计概率超过 0.6 的最小集合。
第四步:在 ["Hello", "Hi",] 中做随机采样(按归一化概率)
概率归一化后:
Token 原始概率 归一化权重(占这三者之和)
"Hello" 0.30 0.30 / 0.50 ≈ 60%
"Hi" 0.20 0.20 / 0.50 ≈ 40%
模型最终在这 2 个中采样一个作为输出。
✅ 总结:top_k + top_p 的作用
参数 控制点 用途
top_k=5 限制最多候选 token 数量,防止长尾影响 控制质量
top_p=0.6 累积概率裁剪,动态过滤 控制多样性
同时使用 先限制数量,再限制概率,两重剪枝 更保守、更高质量、更可控
如果你想让输出更具创意,可以调高 top_p 或 temperature;
如果你要保证稳定性,调小 top_p 或 top_k 会更安全。
图示

- 上述仅作示意,累计概率一旦“严格大于”
top_p,该位置就会被标记为 True(即“要被屏蔽掉”)。
边界情况
- 在 Hugging Face 的实现中,累计概率第一个超过
top_p阈值的 token 是会被丢弃的。 - 当 top-k 限定的候选 token 的累计概率总和都小于 top-p(即不足 p)时,应该怎么处理?
最终仍只在 top-k 限定的 token 中采样。不会再去补足 top-p。

浙公网安备 33010602011771号