直接回答:困惑度(Perplexity,PPL)是自回归语言模型在一组测试 token 上的平均负对数似然取指数。数值越低,表示模型在这份测试语料、这个分词器和这套计算口径下,给真实下一个 token 分配的概率平均更高。它适合监控训练、比较同口径 checkpoint 和发现量化退化,但不能单独证明模型更聪明、事实更准确或更会推理。
“Perplexity”也可能指同名 AI 搜索公司。本文讲的是语言模型评估指标;如果你在找产品,请看本站的 Perplexity 答案引擎指南和 Perplexity 公司档案。两者除了英文拼写相同,没有定义上的从属关系。

困惑度的公式是什么,直觉上表示什么
设测试序列为 x₁…xₙ,自回归模型在前文 x<i 条件下给真实 token xᵢ 的概率为 p(xᵢ|x<i)。以自然对数计算时:
NLL = −(1/N) × Σ log p(xᵢ | x<i)
PPL = exp(NLL)
Hugging Face 困惑度文档将其表述为序列平均负对数似然的指数,也说明它等价于数据分布与模型预测之间的交叉熵取指数。若交叉熵使用以 2 为底的对数,写作 2ᴴ;若框架损失使用自然对数,则写作 eᴴ。只要对数底与指数底对应,含义一致。
直觉上,PPL=10 可以理解为模型平均不确定性相当于在 10 个等概率候选中选择,但这不是说模型每一步真的只看到 10 个词。模型的词表可能有数万 token,概率分布也极不均匀;“等概率候选数”只是把熵转换成便于理解的有效分支数。Google 的机器学习术语表也采用类似的“需要多少次猜测”直觉。
| 概念 | 计算对象 | 数值方向 | 能说明什么 |
|---|---|---|---|
| 负对数似然 NLL | 真实 token 的条件概率 | 越低越好 | 该语料上的平均概率损失 |
| 交叉熵 | 真实分布与模型分布 | 越低越好 | 常与平均 NLL 在实现中对应 |
| 困惑度 PPL | 平均 NLL 的指数 | 越低越好 | 同口径下的预测不确定性 |
| 准确率 | 最高概率类别是否命中 | 越高越好 | 忽略其余概率分配,信息更粗 |
一个可手算的例子:为什么概率降低会快速拉高 PPL
假设一个极简序列有三个需要计分的 token,模型给真实 token 的概率依次为 0.5、0.25、0.5。三者概率几何平均为 (0.5×0.25×0.5)^(1/3)≈0.397,困惑度就是其倒数,约 2.52。若第二步概率从 0.25 降到 0.01,PPL 会明显升高,因为负对数会对“把真实 token 判得极低”给予很大惩罚。
训练日志里的 loss 若正好是对有效 token 求平均的自然对数交叉熵,可以用 exp(loss) 得到 PPL。但工程里最容易错的不是指数运算,而是分母:padding、只作为上下文的重叠 token、被截断位置和 batch 内每条序列的有效长度必须正确屏蔽。PyTorch 的 CrossEntropyLoss 文档说明了 ignore_index 和 reduction 行为;不能不看标签移位与掩码就对任意 loss 直接取指数。
为什么不同模型的 PPL 经常不能直接比较
分词器决定同一段文字被拆成多少 token,也决定每个预测事件的词表。一个模型把“人工智能”拆成一个 token,另一个拆成四个 token,两者的 per-token PPL 分母和事件空间都不同。Hugging Face 明确提醒,tokenization 会直接影响 PPL;《Speech and Language Processing》也要求只在相同测试集与词汇条件下解释语言模型的困惑度比较。
| 必须记录 | 常见差异 | 会造成什么偏差 | 建议写法 |
|---|---|---|---|
| 测试语料 | 版本、split、清洗、去重、训练污染 | 文本本身难度不同 | 给数据集版本与哈希 |
| tokenizer | 词表、归一化、特殊 token | token 数与预测空间变化 | 给模型与 tokenizer revision |
| 上下文 | max length、stride、重叠 | 可见前文越多通常越容易 | 报告窗口与 stride |
| 计分位置 | BOS/EOS、padding、重叠区 | 重复或无效 token 进入分母 | 报告有效 token 总数 |
| 模型状态 | checkpoint、精度、量化、eval | dropout 与数值误差改变结果 | 固定种子、版本和精度 |
| 单位 | per-token PPL、BPC、BPB | 归一化单位不同 | 同时给 NLL 与单位 |
跨 tokenizer 时,可以增加 bits per character(BPC)或 bits per byte(BPB)等按字符/字节归一化的指标,但它们也不是万能换算。语言、Unicode 归一化、空格处理和数据清洗仍会影响结果。The Gradient 的语言模型评估指标说明用词表、预处理与上下文长度解释了为什么孤立的 PPL 数字信息量很低。
长文本为什么要用滑动窗口,stride 会怎样改变结果
理想计算会让每个 token 看到此前全部文本,但 Transformer 有有限上下文窗口。如果把长文本硬切成互不重叠的块,每块开头的 token 只能看到很短前文,模型会被额外惩罚。Hugging Face 推荐带重叠的滑动窗口:前一段为后一段提供上下文,但重叠区只作为条件,不重复计入 loss。
stride 越小,通常每个目标 token 能看到的前文越多,结果也可能更低,但前向计算次数更高。官方 GPT-2 示例中,同一模型与 WikiText-2 数据,仅把 stride 从不重叠改为 512,报告 PPL 就从约 19.44 降到 16.44。这不是模型突然变强,而是评估近似更充分。发布排行榜时若不写 stride,读者无法复现。
- 把完整测试语料按固定方式 token 化,不在测试时再次训练 tokenizer。
- 按最大上下文窗口和固定 stride 移动;记录每个窗口的起止位置。
- 把只用于上下文的重叠标签设为忽略值,padding 也不计分。
- 累加所有有效目标 token 的 NLL 总和,而不是简单平均每个 batch 的 loss。
- 用 NLL 总和除以有效 token 总数,再取指数;同时报告二者。
BERT 能直接算同一个困惑度吗
不能直接套用因果语言模型公式。BERT 是 masked language model,训练时根据左右两侧上下文预测被遮盖 token,并没有按从左到右定义完整序列概率。Hugging Face 文档明确说经典 PPL 对 BERT 这类 masked LM 并非良好定义。
研究中会使用 pseudo-log-likelihood / pseudo-perplexity:逐个遮盖 token,再计算它在其余上下文条件下的概率。Salazar 等人的 ACL 2020 论文Masked Language Model Scoring系统讨论了这种做法。它计算成本高,语义也与自回归 PPL 不同,报告时必须写“伪困惑度”及具体遮盖算法,不能与 GPT 式 PPL 混排。
| 模型类型 | 典型目标 | PPL 状态 | 报告要求 |
|---|---|---|---|
| 自回归/因果 LM | 预测下一个 token | 经典 PPL 有定义 | 语料、tokenizer、窗口和 stride |
| Masked LM | 预测被遮盖 token | 经典 PPL 不直接适用 | 标明 pseudo-PPL 与遮盖方法 |
| Seq2Seq | 在输入条件下预测输出 | 可算条件生成 token NLL | 源/目标处理、解码与归一化 |
| 闭源聊天 API | 生成对话答案 | 若无完整 token logprob 难复现 | 不要用采样文本反推官方 PPL |
PPL 越低,是否代表模型越聪明、越少幻觉
不代表。PPL 衡量模型对测试文本的概率拟合,并不检查生成答案是否符合指令、引用是否支持主张、算术推理是否正确、内容是否安全。模型可以对常见但错误的说法分配很高概率,也可以在专业事实题上自信出错;低 PPL 与低幻觉之间没有可直接套用的等号。
| 你要回答的问题 | PPL 是否合适 | 至少再加什么 |
|---|---|---|
| 训练是否过拟合或收敛 | 合适:对比 train/validation 曲线 | 数据泄漏检查、下游任务集 |
| 量化是否损伤基础分布 | 合适:同模型同数据回归 | 任务准确率、延迟、内存与吞吐 |
| 哪个聊天模型更好用 | 不能单独回答 | 指令遵循、事实性、人类偏好与成本 |
| RAG 是否减少幻觉 | 不能直接回答 | 检索召回、证据忠实度、答案完整性 |
| 中文能力是否更强 | 仅同中文语料/口径有参考 | 中文任务集、长文本、领域与安全测试 |
做综合模型选型时,可把 PPL 放在“基础概率建模”一栏,再结合本站的 Arena 排名与任务评估指南检查人类偏好偏差;涉及本地部署时,用 Windows 本地模型部署指南记录量化、显存和速度;涉及企业数据,则按 本地与云端隐私决策补齐数据边界。
一份可复现的 PPL 报告应该包含什么
- 模型仓库、checkpoint、revision、dtype、量化方法与 eval 模式。
- tokenizer 仓库与 revision、特殊 token、文本归一化方式。
- 测试集名称、版本、split、语言、预处理、样本数与内容哈希。
- 最大上下文长度、stride、BOS/EOS、padding 和重叠区屏蔽逻辑。
- 有效 token 总数、NLL 总和、平均 NLL、PPL 和归一化单位。
- 硬件、框架、Transformers/PyTorch 版本、批大小和计算脚本。
- 训练数据污染检查,以及 PPL 之外的任务、事实、安全、延迟和成本指标。
公开基准也应保留这种可追溯性。WikiText 数据集论文Pointer Sentinel Mixture Models说明了 WikiText 的构建与基准用途;Paloma 论文Paloma: A Benchmark for Language Model Fit则强调跨域语言模型拟合评测。使用名称相同但版本、切分或清洗不同的数据,结果仍可能不可比。
复现实验时还可对照 Hugging Face 的因果语言模型任务文档检查标签移位与训练流程,并用 EleutherAI LM Evaluation Harness的固定任务配置补足下游能力,而不是把所有结论压在一个 PPL 上。历史报告如 OpenAI 的 GPT-2 技术报告与 Kaplan 等人的神经语言模型 Scaling Laws会同时给训练/验证损失、数据与模型规模;引用其中数字时仍要保留原始实验口径。
常见问题
困惑度最低的模型就是最好的吗
不是。只有在相同语料、tokenizer 和计算方法下,较低 PPL 才表示该测试集上的平均预测损失更小;产品价值还取决于任务正确率、事实、安全、延迟和成本。
PPL 可以是小于 1 吗
在标准离散 token 概率和正确归一化下,平均 NLL 不小于 0,因此 PPL 不小于 1。出现小于 1 通常意味着符号、归一化、概率或 loss 口径计算有误。
为什么同一个模型网上有不同 PPL
常见原因是测试集版本、tokenizer、上下文长度、stride、BOS/EOS、是否重复计分、精度与 checkpoint 不同。先比较实验配置,不要先比较最终数字。
能用生成出来的回答估算闭源模型 PPL 吗
通常不能得到可比的标准 PPL。标准计算需要模型对测试集中每个真实 token 的条件 log probability;只拿采样文本、总置信度或第三方打分不能替代这些概率。
编辑复核与纠错记录
本文由兰塞 AI 编辑流程于 2026 年 7 月 17 日重建。旧稿残留 Markdown 表格和公式,并把困惑度写成智能、RAG、事实性与幻觉的通用指标;新版依据 Hugging Face、PyTorch、Stanford 教材、ACL 论文与公开基准,重新定义适用范围、计算步骤、滑动窗口、跨 tokenizer 可比性和 masked LM 边界,并新增三张原创解释图。后续如评测库实现发生变化,将更新版本与口径,不只改日期。本站的来源与纠错原则见关于本站与编辑规范。
