Top-k 采样

解码策略:每步只从概率最高的 k 个 token 中采样,忽略其余所有候选。k 越小越保守(k=1 等价于贪心解码),k 越大越多样。

Top-k 采样

一句话理解

Top-k 采样就是"只看前 k 名"——不管词表有多大,每一步只在概率最高的 k 个 token 里挑。

工作原理

  1. 模型输出整个词表的概率分布
  2. 按概率从高到低排序,只保留前 k 个
  3. 将保留的 k 个概率重新归一化(使其和为 1)
  4. 在这 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 采样要解决的问题——根据分布的"形状"动态调整候选数量。