困惑度PPL怎么算

黎 浩然/ 12 10 月, 2026/ 大语言模型/LARGELANGUAGEMODEL/LLM, 机器学习/MACHINELEARNING, 研究生/POSTGRADUATE, 计算机/COMPUTER/ 0 comments

同一个模型,评测口径变了,困惑度也可能变。PPL不是回答正确率:它衡量的是模型给实际出现的token分配了怎样的条件概率。先把分母、概率和上下文说清楚,这个数字才有比较价值。

文章目录
  1. 从三个概率算出PPL
  2. 为什么不是概率的算术平均
  3. 合并文本要按实际token数计权
  4. 分词与上下文也是评测条件
  5. PPL能回答什么
  6. 资料来源

从三个概率算出PPL

设本次实际计分的token共N个,对应条件概率为p₁到pₙ。采用自然对数,平均负对数似然为L=−Σln(pᵢ)/N,困惑度为PPL=exp(L)。这里统计的是目标token自身的概率,不是所有候选token中最大的概率。

取一个虚构例子,三个实际目标的概率依次为1/2、1/4、1/8。它们的乘积为1/64,几何平均概率为1/4,所以PPL=4。若改用log₂,负对数分别为1、2、3 bit,平均2 bit,再算2²仍是4。不能把以2为底的平均损失直接代入exp。

Token 1
p=1/2

1 bit

Token 2
p=1/4

2 bits

Token 3
p=1/8

3 bits

原创教学图:三个目标token的惊讶量分别为1、2、3 bit,平均2 bit,对应PPL=4。柱高仅表示这个虚构例子的惊讶量。

为什么不是概率的算术平均

这三个概率的算术平均为7/24,其倒数约3.428571,与PPL=4不同。PPL取决于平均对数概率;一个概率很低的实际目标,会增加负对数似然。把概率先做算术平均,得到的是另一个统计量。

如果每个目标token都得到1/4的概率,PPL也是4。因此相同PPL可以来自不同的概率分布;它不能告诉你哪一处回答错了,也不等同于“每一步恰好有4个候选”。

合并文本要按实际token数计权

再取两个虚构文本:短文本只有一个计分token,概率为1/2,PPL=2;长文本有三个计分token,概率均为1/8,PPL=8。两个PPL直接平均得到5,但合并语料的PPL为√32≈5.656854。

合并时应先累计负对数似然总和,再除以实际计分token总数,最后取指数。若你有意报告“每篇文本PPL的平均值”,可以作为另一个指标,但要明确命名,不能当成整个语料的PPL。

import math

def ppl(probs):
    if not probs or any(not 0 < p <= 1 for p in probs):
        raise ValueError("Expected nonempty probabilities in (0, 1]")
    return math.exp(-sum(math.log(p) for p in probs)/len(probs))

assert math.isclose(ppl([0.5,0.25,0.125]),4.0)
assert math.isclose(ppl([1.0,1.0]),1.0)
assert math.isclose(ppl([0.25]*3),4.0)
short, long = [0.5], [0.125]*3
pooled = ppl(short+long)
assert math.isclose(pooled, math.sqrt(32))
assert not math.isclose(pooled,(ppl(short)+ppl(long))/2)
for bad in [[],[0.0],[1.1],[-0.1]]:
    try:
        ppl(bad)
    except ValueError:
        pass
    else:
        raise AssertionError("Invalid input accepted")
print(round(pooled,6))

这段原创Python代码已执行:检查三个概率例子、PPL=1的边界、长度不同的合并以及非法输入。没有运行语言模型,也没有得出任何真实模型的PPL成绩。概率为0时理论损失无限;示例选择拒绝该输入,实际评测通常直接使用模型的log概率以避免先转概率造成下溢。

分词与上下文也是评测条件

Hugging Face固定版本文档提醒,分词和上下文窗口影响PPL口径。比较前记录tokenizer、数据集、计分token、上下文策略与模型版本;不同分词方案下的“每token”并非相同单位。

把长文本切成互不重叠的块,会让块开头丢失前文。滑动窗口可以保留更多上下文,但重叠部分作为上下文时,不应再次计入目标损失。第一个位置、padding以及不计分的提示部分也要明确处理。本文不提供某个框架的标签移位实现,分母应以实际参与损失的目标为准。

PPL能回答什么

在统一口径下,它适合衡量目标文本的概率建模表现。它不直接检查事实、引用、遵循指令或代码通过率。比较代码生成能力可参阅pass@k,检索问答的错误定位可参阅RAG评测。

使用模型的原始条件概率进行似然评测,与在生成阶段调整温度、top-p后随机采样,是不同操作。报告PPL时别把采样参数当成模型原始似然的定义。

English version

资料来源

Hugging Face Transformers v4.50.0: Perplexity of fixed-length models

支持

如果这篇文章对你有帮助,欢迎支持本站。

微信支持二维码,点击查看大图
微信
支付宝支持二维码,点击查看大图
支付宝
Buy Me a Coffee,点击支持本站
Buy Me a Coffee

二维码可点击放大。更多支持方式见支持页面。

Share this Post

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注

*
*