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 会更安全。

图示

image

  • 上述仅作示意,累计概率一旦“严格大于” top_p,该位置就会被标记为 True(即“要被屏蔽掉”)。

边界情况

  • 在 Hugging Face 的实现中,累计概率第一个超过 top_p 阈值的 token 是会被丢弃的。
  • 当 top-k 限定的候选 token 的累计概率总和都小于 top-p(即不足 p)时,应该怎么处理?
    最终仍只在 top-k 限定的 token 中采样。不会再去补足 top-p。
posted @ 2025-07-15 11:39  zae  阅读(53)  评论(0)    收藏  举报