Perplexity
困惑度是模型在文本上的交叉熵取指数后的结果。了解如何计算困惑度、公平比较模型,以及该指标除评分外的用途。
困惑度是一项用于衡量概率模型预测序列能力的指标,计算方式是:模型对实际下一个token所赋负对数似然的平均值取指数。数值越低越好。困惑度为 10,表示模型平均而言的不确定性相当于每一步都从 10 个选项中均匀选择,因此这个数值常被理解为有效分支因子。Frederick Jelinek、Robert Mercer、Lalit Bahl 和 James Baker 于 1977 年在 IBM 提出该指标,用于衡量语音识别任务的难度;它至今仍是语言建模的标准内在指标。例如,OpenAI 的 15 亿参数 GPT-2 在 2019 年的 WikiText-103 基准上达到了 17.48 的困惑度,且未在该基准上训练。
这个词还指另外两个不相关的概念。Perplexity AI 是一家 AI 搜索引擎公司;而 t-SNE 的超参数“perplexity”大致设置每个点在 t-SNE 构建高维数据二维映射时考虑多少个邻居。
计算困惑度#
对于由 N 个 token 构成的序列,困惑度 = exp(-(1/N) x 所有 log p(token_i | 前面所有 token) 的总和)。指数内部的量是文本与模型预测之间的交叉熵,也是训练大型语言模型(LLM)时使用的同一损失函数。使用自然对数时底数为 e;使用以 2 为底的对数时底数为 2,两种算法得出的困惑度相同。PyTorch 的交叉熵损失使用自然对数,并默认对 token 求平均,因此语言模型的困惑度就是 exp(loss)。
import math
# Probability the model assigned to each correct next token
token_probs = [0.50, 0.25, 0.80, 0.40]
# Cross-entropy is the average negative log-likelihood, in nats
cross_entropy = -sum(math.log(p) for p in token_probs) / len(token_probs)
print(f"Cross-entropy: {cross_entropy:.3f}, perplexity: {math.exp(cross_entropy):.2f}")
# A model that spreads probability evenly over 10 tokens has perplexity 10
uniform = -sum(math.log(0.1) for _ in token_probs) / len(token_probs)
print(f"Uniform perplexity: {math.exp(uniform):.2f}")这四个概率得出的交叉熵为 0.805 纳特,困惑度为 2.24,因此该模型的表现相当于每一步都在大约两个概率相同的 token 之间进行选择。均匀分布的情况也印证了分支因子的解释:每个正确 token 的概率为 0.1 时,困惑度恰好为 10。
处理长文档时需要谨慎。上下文窗口固定的模型会将文本分块评分;在不重叠的块中,开头 token 几乎看不到上下文,因此困惑度会被抬高。滑动窗口评估会让文本块彼此重叠,使每个 token 都能获得模型允许范围内尽可能多的前文上下文,代价是更多计算。上下文窗口
公平比较模型#
只有在使用相同文本和相同tokenization的情况下,困惑度才具有可比性。词表较大的模型会将文本拆分成较少但更难预测的 token,因此它的每 token 困惑度不能直接与使用更小 token 的模型进行比较。将总对数似然按字节数或字符数归一化,并报告每字节比特数或每字符比特数,就能消除这种依赖。
测试数据也必须与训练数据隔离。模型如果以前见过某段文本,就会为其分配异常高的概率;这种数据泄漏会让困惑度看起来优于实际表现。成员推断攻击也利用了同一现象:它们会将困惑度异常低的文本标记为可能属于训练数据。
困惑度衡量模型在固定文本上的下一个 token 预测能力。聊天模型经过指令微调和基于人类反馈的强化学习(RLHF),以便遵循请求并符合人类偏好,因此通常会通过任务基准和人类偏好评分进行比较。
模型比较以外的用途#
数据整理是困惑度的一项重要用途。Facebook AI 研究人员于 2019 年发布的 CCNet 流水线,使用在 Wikipedia 上训练的语言模型为 Common Crawl 网页评分,并按困惑度将网页分为高、中、低三组,其中困惑度低的高质量文本组被视为质量最高。许多预训练流水线会以类似方式筛选网页数据,这是大规模数据清洗的一环。GPTZero 等 AI 文本检测器也会计算困惑度,因为从语言模型采样的文本通常比人类写作更容易预测。
该公式适用于任何使用交叉熵训练的模型。Ultralytics YOLO26分类模型使用平均交叉熵损失进行训练,因此 exp(验证损失)就是针对真实类别标签计算的困惑度。验证损失为 0.35 时,困惑度约为 1.42,这意味着对于平均图像,模型的置信度分布相当于在大约 1.4 个类别之间犹豫。










