Skip to content

Perplexity 困惑度

五层读懂一个词。这次拆的是:Perplexity(PPL)--语言模型的「体温计」。衡量模型对一段文本的「惊讶程度」:PPL 越低,模型越不困惑,预测得越准。数学上是交叉熵的指数:$PPL = e^{H(P,Q)}$。但 PPL ≠ 好用——它测的是语言建模能力,不是对话能力、推理能力或事实准确度。


L1 · 一句话点破

Perplexity = 指数化的平均交叉熵,衡量语言模型预测下一个 token 的「不确定度」。PPL=10 意味着模型在每一步预测时平均有 10 个等可能的选项——像抛 10 面骰子。PPL 越低模型越自信。但它只测「语言建模」这一项能力,不测推理、事实、对齐——所以 LLaMA PPL 好 ≠ 对话体验好。


L2 · 通俗类比

让语言模型读一本书,每读一个词,猜下一个词是什么。模型需要给出所有候选词的概率分布。

PPL 衡量模型「猜得对不对」

  • 如果模型每次都很确定(例如 90% 概率猜对下一个词)→ PPL 低(≈1.1)
  • 如果模型每次都很纠结(例如 10 个候选词各 10%)→ PPL 高(≈10)
  • 如果模型每次都完全蒙圈(例如每个词概率相等,共 50000 个)→ PPL 极高(≈50000)

直觉

PPL = 对每个 token 平均有多少个「等可能选项」

PPL = 5   → 模型很自信,平均 5 选 1(高质量语言模型)
PPL = 10  → 有点纠结,平均 10 选 1
PPL = 50  → 比较纠结
PPL = 100+ → 很差,基本在瞎猜

PPL 像「体温计」

  • 告诉你模型健不健康(语言建模能力好不好)
  • 但不能告诉你它能做什么(推理?对话?翻译?)
  • PPL 从 10 降到 5 很厉害,但从 5 降到 4.9 可能下游任务无差别

为什么 PPL 不等于用户体验

能力PPL 能测?为什么
语言流畅度✅ 能流畅文本 PPL 低
事实准确性❌ 不能一句错话也可以 PPL 低
推理能力❌ 不能推理链流畅 ≠ 推理正确
对话质量❌ 不能流畅的废话 PPL 也低
安全性❌ 不能和语言建模无关

PPL 是必要的基准,但不是评估 LLM 的充分标准。


L3 · 正经定义

Perplexity(PPL,困惑度):语言模型的固有评估指标,衡量模型对测试文本的预测能力。数学定义:

$$ PPL = \exp\left(-\frac{1}{N}\sum_{i=1}^{N} \log P(x_i \mid x_{<i})\right) = \exp\left(H(P, Q)\right) $$

其中 $H(P,Q) = -\frac{1}{N}\sum \log P(x_i|x_{<i})$ 是交叉熵(真实分布 $P$ 和模型分布 $Q$ 之间)。

关键性质

  • $PPL \ge 1$,1 是最优(模型完美预测每个 token,即确定性序列)
  • PPL 越低模型越好
  • 等价于:$PPL = 2^{H_2}$(信息论)或 $PPL = e^{H}$(自然对数)
  • 模型在测试集上的 PPL 衡量的是泛化能力

计算过程

输入: "The cat sat on the mat"
模型逐步预测:
  P("cat" | "The")           = 0.01
  P("sat" | "The cat")       = 0.001
  P("on" | "The cat sat")    = 0.1
  P("the" | "...")           = 0.2
  P("mat" | "...")           = 0.001

Per-token log prob:  log(0.01) + log(0.001) + log(0.1) + log(0.2) + log(0.001) = -16.1
Avg log prob: -16.1 / 5 = -3.22
PPL = e^(-(-3.22)) = e^(3.22) ≈ 25.0

参考资料

  • 📄 Jelinek et al., Perplexity—a measure of the difficulty of speech recognition tasks, 1977
  • 📄 Brown et al., Language Models are Few-Shot Learners, NeurIPS 2020 (GPT-3 的 PPL 评估体系)
  • 📄 Kaplan et al., Scaling Laws for Neural Language Models, 2020 (PPL 与模型/数据规模的关系)
  • 🔧 HuggingFace evaluate:evaluate.load("perplexity")

L4 · 原理深挖

4.1 从信息论推导 PPL

自信息(Self-information)

$$ I(x) = -\log P(x) $$

  • 事件 $x$ 的信息量,单位 bit(log2)或 nat(ln)
  • $P(x)=1$ → $I(x)=0$(确定事件无信息量)
  • $P(x)=0.5$ → $I(x)=1$ bit(抛硬币)

熵(Entropy):随机变量的平均信息量

$$ H(X) = E[-\log P(X)] = -\sum_{x} P(x) \log P(x) $$

交叉熵(Cross-entropy):用模型分布 $Q$ 编码真实分布 $P$

$$ H(P, Q) = -E_{x\sim P}[\log Q(x)] $$

当 $Q=P$ 时交叉熵最小(= 熵 $H(P)$)。

对于语言模型:真实分布 $P$ = 语料库的实际分布,模型分布 $Q$ = LM 的预测分布。

$$ H(P, Q) \approx -\frac{1}{N}\sum_{i=1}^{N} \log Q(x_i \mid x_{<i}) $$

PPL = 指数化的交叉熵

$$ PPL = 2^{H(P,Q)} \quad \text{或} \quad PPL = e^{H(P,Q)} $$

  • 如果模型完美预测($Q=P$):$PPL = 2^{H(P)}$(语料库的固有熵,自然语言约 5-8)
  • 如果模型完全随机(均匀分布):$PPL = V$(词表大小,如 50000)

直觉再确认

  • PPL=1 → 模型每次只用 1 个选项(确定性预测)
  • PPL=V → 模型每次 V 个选项(随机猜测)
  • 自然语言 PPL 下限约 5-8(语言本身有不可预测性)

4.2 不同模型规模的 PPL 基准

Llama 系列(WikiText-2)

模型参数PPL
Llama-2-7B7B5.47
Llama-2-13B13B4.88
Llama-2-70B70B3.32
Llama-3-8B8B4.87
Llama-3-70B70B2.85

其他模型

模型PPL (WikiText-2)
GPT-2 (117M)37.5
GPT-2 (1.5B)18.3
GPT-3 (175B)20.5 (zero-shot)
Mistral-7B4.96
Qwen-2.5-7B5.21

Scaling Law(Kaplan 2020):

$$ PPL \propto N^{-\alpha} \cdot D^{-\beta} + PPL_{\infty} $$

  • $N$:模型参数量
  • $D$:训练 token 数
  • PPL 随模型和数据的幂律下降
  • 存在不可约下限 $PPL_{\infty}$(自然语言的固有不确定性)

4.3 PPL 的局限

局限 1: PPL 只测 token 预测

文本 A: "水的沸点是 100 摄氏度。" → PPL=5,事实正确
文本 B: "水的沸点是 200 摄氏度。" → PPL=5,事实错误

PPL 看不出事实错误。模型可以把"200"预测得很有信心(PPL 低),但内容是错的。

局限 2: 跨模型比较的坑

  • 不同 tokenizer(BPE vs WordPiece vs Unigram)→ 不同 token 数 → PPL 不可比
  • 不同训练数据 → 分布不同 → PPL 不可比
  • 量化模型和非量化模型 → output logit 分布微变 → PPL 轻微不同

局限 3: PPL 对输出的评价是 token 级

  • 模型输出一段话:PPL 衡量的是概率,不是质量
  • 一段啰嗦的废话可能 PPL 很低(因为高度可预测)
  • 一段精彩的论述可能 PPL 稍高(因为用词新颖)

局限 4: 不适合衡量特定能力

  • 翻译质量:BLEU/COMET
  • 摘要质量:ROUGE/BERTScore
  • 对话质量:MT-Bench/Chatbot Arena
  • 推理能力:GSM8K/MMLU
  • 安全性:红队评估

4.4 实践中怎么用 PPL

用途 1: 模型训练监控

python
# 训练时每 N 步在验证集上算 PPL
# PPL 下降 → 模型在学习
# PPL 上升 → 过拟合或学习率问题
# PPL 平台 → 收敛

用途 2: 量化质量评估

python
# 量化前后对比 PPL
# FP16 PPL=5.47, Q4 PPL=5.68, Q8 PPL=5.49
# ΔPPL < 5% → 量化质量可接受

用途 3: 数据质量检测

  • 高质量的领域数据 → 低 PPL
  • 噪声/不连贯的数据 → 高 PPL
  • PPL 突然高 → 数据有问题

用途 4: 长文本评估

  • 长文档 PPL 上升 → 长上下文能力下降
  • 在 1k/2k/4k/8k/16k/32k 各档测 PPL
  • 长上下文模型的「有效长度」参考

HuggingFace evaluate 计算 PPL

python
from transformers import AutoModelForCausalLM, AutoTokenizer
from evaluate import load

model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")

perplexity = load("perplexity", module_type="metric")
results = perplexity.compute(
    predictions=test_texts,
    model_id="gpt2",
    batch_size=16,
)
print(f"PPL: {results['mean_perplexity']:.2f}")

4.5 PPL 的变体

Token-level vs Sequence-level

  • Token-level PPL:每个 token 平均
  • Sequence-level PPL:每条序列的 PPL 再平均
  • 序列长度不均时,sequence-level 会偏向短序列

Bits-per-byte (BPB)

  • 与 tokenization 无关的衡量
  • BPB = NLL / (num_bytes * ln(2))
  • 适合跨 tokenizer 比较

Sliding Window PPL

  • 用滑动窗口计算局部 PPL
  • 找出文本中「困惑度突变」的位置
  • 用于长文本质量分析

4.6 替代 PPL 的评估

评估什么用什么
语言流畅度PPL ✓
文本生成质量BLEU / ROUGE / BERTScore / COMET
推理/知识MMLU / GSM8K / HellaSwag / ARC
对话能力MT-Bench / Chatbot Arena / AlpacaEval
事实性TruthfulQA / SimpleQA / HaluEval
安全性Red-teaming / ToxicChat / AdvBench
RAG 质量RAGAS (faithfulness, relevance)
指令遵循IFEval / MT-Bench

L5 · 沿革与坑

5.1 沿革

  • 1977:PPL 概念提出(语音识别任务难度衡量)
  • 1990s-2000s:PPL 成为统计语言模型(N-gram)的标准评估
  • 2018-2020:GPT-2/GPT-3 用 PPL 作为核心指标,展示 Scaling Law
  • 2023 后:PPL 从「核心指标」变为「基础指标」,MT-Bench/AlpacaEval 等成为 LLM 评估主流
  • 2024-2025:社区共识:PPL 是必要的但不是充分的,LLM 评估需要多维基准

5.2 常见坑

坑 1: 用 PPL 比较不同 tokenizer 的模型。BPE 的 token 比 WordPiece 少,PPL 天然不同。不可比。

坑 2: PPL 好了就说模型更好。PPL 只衡量语言建模,下游任务可能变差(alignment tax)。

坑 3: 跨数据集比 PPL。WikiText-2 PPL=5 和 C4 PPL=10 不可比——数据集本身熵不同。

坑 4: 只看 PPL 不看下游。PPL 降了 5% 但 MMLU 降了 10%?PPL 好不是一切。

坑 5: 量化模型 PPL 计算方式错。量化后 logits 分布微变,要重新算 PPL。不能直接用 FP16 的 PPL。

坑 6: 混淆 token-level 和 word-level PPL。报告时要说清楚是什么 level。token-level 通常更低。

坑 7: attention_mask 没设对。padding token 的 loss 也参与了平均,拉低 PPL。要设 attention_mask。

坑 8: 用 PPL 评估非自回归模型。PPL 定义基于 autoregressive factorization,不适合 BERT 等双向模型。

坑 9: sliding window 设太大。4096+ token 窗口时 PPL 高不一定说明模型差——远程依赖本来就是难点。

坑 10: 忽略 tokenizer 的 vocab size。大词表(256k)比小词表(32k)的 PPL 一般更低——因为每个 token 表达更多信息。

坑 11: 用 PPL 做 RLHF 前后对比。RLHF 会微调输出分布(更少 refusal),PPL 可能上升。这是正常的 alignment tax。

坑 12: 培训/报告时只说 PPL 不提限制。PPL 是学术界的语言建模指标,不代表用户体验。

5.3 面试怎么考

  1. PPL 的数学定义? 答:$PPL = e^{H(P,Q)} = \exp(-\frac{1}{N}\sum \log P(x_i|x_{<i}))$。指数化的交叉熵,衡量模型对 token 的平均不确定性。
  2. PPL=10 意味着什么? 答:模型在预测每个 token 时,平均有 10 个等可能的候选选项。越低的 PPL 表示模型越自信。
  3. PPL 的局限? 答:只测 token 预测能力(语言建模),不测事实准确、推理、对话质量。跨 tokenizer/数据集不可比。流畅的错话也是低 PPL。
  4. 什么时候用 PPL? 答:训练监控(验证模型在学习)、量化质量评估、数据质量检测、长上下文评估。是基础指标而非最终指标。
  5. PPL vs BLEU/ROUGE vs MT-Bench? 答:PPL 测语言建模(token 级概率),BLEU/ROUGE 测生成文本和参考文本的重叠(N-gram),MT-Bench 测 LLM 对话/推理(用另一个 LLM 打分)。三个不同层面。

速记卡

定义

$$ PPL = \exp\left(-\frac{1}{N}\sum_{i=1}^{N} \log P(x_i \mid x_{<i})\right) $$

直觉

PPL含义
1每次确定 1 个 token(完美)
5-10高质量语言模型
10-50中等
50-100+
词表大小(V)完全随机猜测

Llama 系列 PPL(WikiText-2)

模型PPL
Llama-2-7B5.47
Llama-2-13B4.88
Llama-2-70B3.32
Llama-3-8B4.87
Llama-3-70B2.85

PPL 能测 / 不能测

能力PPL 能测?
语言流畅度
事实准确性
推理能力
对话质量
安全性

替代指标

评估什么用什么
文本质量BLEU/ROUGE/BERTScore
知识/推理MMLU/GSM8K
对话能力MT-Bench/Chatbot Arena
事实性TruthfulQA/SimpleQA
RAG 质量RAGAS

一句话记忆:Perplexity = $e^{交叉熵}$ = 模型对每个 token 平均有多少等可能选项。PPL 越低模型越不困惑(预测越准)。是语言模型的基础健康指标——测语言建模能力,不测推理/事实/对话。PPL=5-10 是高质量;跨 tokenizer/数据集不可比;PPL 好 ≠ 用户体验好。用于训练监控、量化评估、数据质量检测。LLM 评估需要 PPL + 下游基准多维度配合。


上一篇:Ollama 与本地推理 -- 本地跑 LLM 后,怎么评估跑得好不好?从 PPL 开始。下一篇:BLEU / ROUGE 文本质量评估 -- PPL 测的是模型内部预测,BLEU/ROUGE 测的是生成结果和参考答案的重叠。

内容采用 CC BY-SA 4.0,代码采用 MIT。