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-7B | 7B | 5.47 |
| Llama-2-13B | 13B | 4.88 |
| Llama-2-70B | 70B | 3.32 |
| Llama-3-8B | 8B | 4.87 |
| Llama-3-70B | 70B | 2.85 |
其他模型:
| 模型 | PPL (WikiText-2) |
|---|---|
| GPT-2 (117M) | 37.5 |
| GPT-2 (1.5B) | 18.3 |
| GPT-3 (175B) | 20.5 (zero-shot) |
| Mistral-7B | 4.96 |
| Qwen-2.5-7B | 5.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: 模型训练监控
# 训练时每 N 步在验证集上算 PPL
# PPL 下降 → 模型在学习
# PPL 上升 → 过拟合或学习率问题
# PPL 平台 → 收敛用途 2: 量化质量评估
# 量化前后对比 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:
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 面试怎么考
- PPL 的数学定义? 答:$PPL = e^{H(P,Q)} = \exp(-\frac{1}{N}\sum \log P(x_i|x_{<i}))$。指数化的交叉熵,衡量模型对 token 的平均不确定性。
- PPL=10 意味着什么? 答:模型在预测每个 token 时,平均有 10 个等可能的候选选项。越低的 PPL 表示模型越自信。
- PPL 的局限? 答:只测 token 预测能力(语言建模),不测事实准确、推理、对话质量。跨 tokenizer/数据集不可比。流畅的错话也是低 PPL。
- 什么时候用 PPL? 答:训练监控(验证模型在学习)、量化质量评估、数据质量检测、长上下文评估。是基础指标而非最终指标。
- 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-7B | 5.47 |
| Llama-2-13B | 4.88 |
| Llama-2-70B | 3.32 |
| Llama-3-8B | 4.87 |
| Llama-3-70B | 2.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 测的是生成结果和参考答案的重叠。