Top-k 采样
解码策略:每步只从概率最高的 k 个 token 中采样,忽略其余所有候选。k 越小越保守(k=1 等价于贪心解码),k 越大越多样。
Top-k 采样
一句话理解
Top-k 采样就是"只看前 k 名"——不管词表有多大,每一步只在概率最高的 k 个 token 里挑。
工作原理
- 模型输出整个词表的概率分布
- 按概率从高到低排序,只保留前 k 个
- 将保留的 k 个概率重新归一化(使其和为 1)
- 在这 k 个 token 中按概率采样
python
def top_k_sample(probs, k):
top_indices = np.argsort(probs)[-k:] # 取概率最大的 k 个
top_probs = probs[top_indices]
top_probs = top_probs / top_probs.sum() # 重新归一化
chosen = np.random.choice(top_indices, p=top_probs)
return chosen
数值示例
词表 5 个 token,概率分布 [0.40, 0.25, 0.20, 0.10, 0.05]:
| k | 候选 token | 归一化后分布 |
|---|---|---|
| 1 | 只有第 1 个 | [1.0](贪心) |
| 3 | 前 3 个 | [0.47, 0.29, 0.24] |
| 5 | 全部 | [0.40, 0.25, 0.20, 0.10, 0.05](无截断) |
Top-k 的局限
Top-k 的 k 是固定的,不自适应:
- 当概率分布很集中时(一个 token 占 95%),k=50 仍然包含大量几乎不可能的 token
- 当概率分布很分散时(前 100 个 token 概率差不多),k=50 可能截掉有意义的候选
这正是 Top-p 采样要解决的问题——根据分布的"形状"动态调整候选数量。