困惑度

PPL (Perplexity)

PPL 困惑度是衡量语言模型「对一段文本预测得有多准」的经典指标:数值越低越好,PPL=10 表示模型下一步平均在 10 个等概率候选中做选择;PPL 与平均负对数似然成指数关系。

详细解释

困惑度(Perplexity,缩写 PPL) 是 NLP 领域从 n-gram 语言模型时代用到今天的经典指标。一句话概括:它衡量模型”有多困惑”——给一段真实文本,模型对这段文本的平均对数概率越高(越不惊讶),PPL 就越低,说明模型越”懂”这段话。

数学定义(离散 Token 序列):对长度为 N 的 Token 序列 W,先求每个位置 i 的真实 Token 条件概率(以 2 为底)的对数,取平均值后加负号,再做 2 的幂次。公式文字形式:PPL(W) 等于 2 的 “负的 1/N 倍 求和 log2 P(wi | 前 i-1 个词)” 次方。

其中 W 是长度 N 的 Token 序列,条件概率 P(wi 给定前面的词) 是模型给真实第 i 个词分配的概率。

直观理解:如果一个模型是”完全瞎猜”,词表大小 V=100000,那么每个词的概率是 1/V,PPL 就等于 100000(非常困惑)。如果一个模型是”神”,每次都把真实词的概率给 1.0,PPL 就等于 1(完全不困惑)。

典型数值区间(2025 年公开榜)

  • GPT-2 1.5B 在 WikiText-103 上 PPL ≈ 18
  • Llama 2 7B ≈ 12
  • Llama 3.1 70B ≈ 5–7
  • GPT-4o / Claude 3.5 ≈ 2–4(非官方泄露估计)

PPL 与实际用户体验的对应关系

PPL 范围体感描述可能表现
PPL < 5非常流畅,接近人类很少出病句、逻辑跳跃极少
PPL ≈ 5–15主流可用水平偶尔有不自然的句子,上下文偶有遗忘
PPL ≈ 15–40小模型/资源受限场景语法错误频繁,经常重复、跑题
PPL > 40不可用输出乱码、语法不通、胡言乱语

使用 PPL 时必须知道的”坑”

  1. PPL 只能在同一词表(Tokenizer)的模型之间比:因为 PPL 是 per-Token 的,BPE 词表不同(比如 Llama 2 32K 和 Qwen 152K),同一句话切成的 Token 数量不一样,PPL 没有可比性。跨模型比 PPL 之前先统一分词。
  2. PPL 低 ≠ 回答质量一定高:PPL 衡量”在标准测试集上的语言建模能力”,不是”解决用户问题能力”。很多学术榜 PPL 刷得很好的模型,因为对齐做得差,实际对话体验不如 PPL 高一点但对齐过的模型。这就是为什么要和 MMLU、HumanEval、MT-Bench 一起看。
  3. PPL 与 Temperature 无关:PPL 是对真实文本的条件概率打分,和推理时采样参数(Temperature、Top-P)没关系,Temperature 只影响生成多样性不影响”你给这段文本打的分”。
  4. Int4/AWQ 量化后 PPL 会升高:低位宽 量化 一般会带来 PPL 升高 0.5–2.0,属于正常范围。如果升了 5 以上说明量化配置有问题。
  5. 业务场景要算”自己数据集的 PPL”:公开语料的 PPL 只是参考,唯元智创 私有化部署客户经常拿自己的真实业务对话历史测一遍 PPL,再决定选哪个模型规格(选 PPL 最低又能满足延迟要求的那个)。

常见问题

PPL 是越低越好,但为什么不能刷到 1.0?
因为自然语言有内在的不确定性。下一个词在很多情况下本来就不是唯一的:“今天天气真___“后面接”好/棒/不错/热”都是合理的。即使是人类自己写,同一个前文也不会每次写完全一样的词。理论最优 PPL 不可能是 1,它有一个”人类水平下界”。
PPL 和 Cross-Entropy 是什么关系?
互为指数关系。对同一底数 b 来说,PPL = b^CE,CE = log(b, PPL)。实践中很多训练 Loss 直接用 Cross-Entropy,PPL 就是把 Loss 取指数后的”更直观数字”,两者本质是一回事。
我自己能算某个模型在我数据集上的 PPL 吗?
可以。对开源模型直接用 HuggingFace model.eval() 后跑一遍测试集拿 mean loss,然后 ppl = exp(loss);对闭源 API 模型,可以用厂商暴露的 Logprobs 字段(每次请求 top_logprobs=0,拿到每个真实 Token 的 logprob),再按定义计算即可。唯元智创 已对支持的模型全量透传 logprobs。