Top-k 采样:截断候选后需要重新归一化
把低概率词排除能限制采样空间,但 top-k 是按候选数量截断,与按累计概率截断的 top-p 不同。理解这一点有助于解释生成变化。
▶ 本文含视频讲解▶ 教学视频手动播放 · 英语讲解
Let's build GPT: from scratch, in code
结合模型讲解理解本文实验的背景;正文提供可独立运行的简化示例。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。
播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。
问题从哪里出现
把低概率词排除能限制采样空间,但 top-k 是按候选数量截断,与按累计概率截断的 top-p 不同。理解这一点有助于解释生成变化。
理解核心机制
先按 logits 选最高的 k 项,再对保留项计算概率。下面用固定随机种子演示一次采样;概率和候选集合比一次抽样结果更有解释价值。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。数字与样本均为教学演示,不代表真实模型或服务器的测量结果。
import math
import random
logits = {"red": 3.0, "blue": 2.0, "green": 1.0, "gray": -1.0}
k = 2
top = sorted(logits, key=logits.get, reverse=True)[:k]
peak = max(logits[word] for word in top)
weights = [math.exp(logits[word] - peak) for word in top]
sample = random.Random(7).choices(top, weights=weights, k=1)[0]
assert sample in {"red", "blue"}
print(top, sample)适用边界与常见误区
示例只处理合法且小于候选数的 k,真实函数应验证边界和非有限数值。截断顺序、温度及其他惩罚项会共同影响结果。
继续练习
构造一个几乎均匀和一个极度集中的分布,比较同一个 k 保留的概率质量,再实现 top-p 进行对照。