困惑度PPL怎么算
同一个模型,评测口径变了,困惑度也可能变。PPL不是回答正确率:它衡量的是模型给实际出现的token分配了怎样的条件概率。先把分母、概率和上下文说清楚,这个数字才有比较价值。
从三个概率算出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。
p=1/2
1 bit
p=1/4
2 bits
p=1/8
3 bits
为什么不是概率的算术平均
这三个概率的算术平均为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时别把采样参数当成模型原始似然的定义。
资料来源
Hugging Face Transformers v4.50.0: Perplexity of fixed-length models
支持
如果这篇文章对你有帮助,欢迎支持本站。
二维码可点击放大。更多支持方式见支持页面。


