更好的数字,可能藏着不同的单位
我们要选择一个读取维修报告的语言模型。两个候选模型在同一文本上评估,困惑度分别为 2 和约 3.17。通常认为越低越好,于是可能选择第一个。但分母究竟在数什么?若一个模型把词分成三个片段,另一个把它当作一个元素,预测次数便不同。直接比较可能奖励的是文本切分方式,而不是对文本本身赋予的概率。
摘要。本文从 token 概率推导困惑度,用三个合成概率模型展示排名逆转,再用同一文本的字节数归一化总惊讶量,并说明这不等于通用能力评估。还分析文档汇总、Unicode、上下文,以及分词序列概率与字符串概率的区别。没有训练或运行神经网络;条件概率是明确给出的教学数据,所有数值均由 Python 重算。
Token 与概率:预测的究竟是什么
分词器把文本转换成 token 序列。Token 可以是词、片段、空格或其他词表单位。自回归模型根据之前的 token,为下一个 token 分配概率。评估已知文本时,考察的是模型给实际观察到的 token 的概率,而不是它会选择的最可能答案。本文只讨论这种因果语言模型评估。
Token 路径的概率是条件概率的乘积。“条件”意味着每个数值可依赖前缀,并未假设 token 独立。为避免极小乘积,使用负对数求和。以 2 为底时单位是比特,常解释为惊讶量:概率 1/2 的事件贡献一比特,概率 1/4 则贡献两比特。
N 是实际计分 token 数,L_bits 是总惊讶量。困惑度 PPL 对每 token 平均惊讶量做指数变换。若一致使用自然对数与自然指数,结果相同。PPL 不是答对比例。若观察到的 token 概率为零,惊讶量无穷大;数值近似必须声明,不能悄悄修补。
贯穿示例:“motore caldo”
各语言版本保留同一句意大利语,因为翻译它就会改变实验。“motore caldo”共十二个 UTF-8 字节:六个字母、一个空格、五个字母。合成模型 A 将其切为 [mo, to, re, 空格, cal, do] 六个 token,给每个观察到的 token 在其前缀条件下的概率均为 1/2。路径概率为 (1/2)⁶=1/64,总惊讶量六比特,PPL=2^(6/6)=2。
模型 B 使用三个 token:[motore, 空格, caldo],各概率 1/4。因此 (1/4)³=1/64,总量仍六比特,但平均每 token 两比特,PPL=2^(6/3)=4。对应句子的路径概率未变,困惑度却翻倍。并未证明 A 更懂领域,只是改变了平均时使用的单位数量。
模型 C 使用 B 的三个 token,但概率为 [1/2, 1/4, 1/4],乘积 1/32,是 A 序列概率的两倍,总惊讶量降至五比特。然而 PPL=2^(5/3)≈3.1748,仍大于 2。简单排名会选择 A,尽管 C 给该句 token 路径更高概率。这就是开头的情况。其他词表项的概率未仿真,可由剩余概率质量补足各条件分布。
| 模型 | Token数 | 路径概率 | 总比特 | PPL | 比特/字节 |
|---|---|---|---|---|---|
| A | 6 | 1/64 | 6 | 2 | 0.5 |
| B | 3 | 1/64 | 6 | 4 | 0.5 |
| C | 3 | 1/32 | 5 | 3.1748 | 0.4167 |
使用共同分母:文本字节
为消除这一特定单位差异,把总惊讶量除以实际计分文本的 UTF-8 字节数 B,称为 BPB,即每字节比特数。这里 B 是计数,不是表中模型名。分母必须对应恰好参与分子计算的内容:
A、B 都得到 6/12=0.5 比特/字节,C 得到 5/12≈0.4167。比较与路径概率一致:对这句话 A、B 相同,C 赋予更高概率。公式第二种形式说明仅看 PPL 不够,还需 N、B。改变归一化不产生新证据,只是明确已计算量的单位。

字节不是字母,一种语言也不是另一种
ASCII 很方便,因为每个字符占一个字节,但 UTF-8 对所有文本并非如此。程序验证预组合“é”占两字节,视觉相近的“e”加组合重音占三字节,中文“热”也占三字节。Unicode NFC 规范化可使前两种表示相同,但是否应用它属于评估前必须固定、且对所有候选一致的预处理选择。
在逐字节相同的语料上比较模型,可消除分母歧义,却不能使意大利语语料与其中文翻译等价:字节、语言结构及内容分布都会改变。一种语言 BPB 更低,本身不能证明对该语言能力更强。本文四个版本翻译论证,但有意保留完全相同的实验字符串。
如何汇总文档而不改变问题
假设一个文档 12 字节、惊讶量 6 比特,另一个 120 字节、12 比特,各自 BPB 为 0.5、0.1。简单平均为 0.3,但全语料共有 132 字节、18 比特,BPB 为 18/132≈0.13636。简单平均让每篇文档权重相同,先求和再相除让每个字节权重相同。两者都可定义,但回答不同问题,不能把前者当作后者。
PPL 同样需要谨慎:语料困惑度不是各文档困惑度的算术平均。应累加实际计分 token 的损失,除以它们的数量,再取指数。如果业务目标有意让每个案例同权,可按案例汇总,但应声明并同时提供语料指标。分母是评估选择,不是报表细节。
上下文、掩码与边界也是测量的一部分
模型是在上下文条件下计分,而非孤立地给 token 概率。每个文本块都重置历史,会改变预测问题。Hugging Face 困惑度指南讨论不重叠与滑动窗口,并给出避免重复计分的代码。已阅读定义、方法和代码;没有运行其中的 GPT-2 基准,也不把它的数值当作本文结果。
本例从约定初始上下文开始,计入路径上的全部概率。不包含序列结束 token,因此衡量文本续写,而不是恰在此处结束的决定。真实比较必须协调起止、提示、模板、文档分隔符与被排除 token。若只对回答计分,就不能用提示加回答的全部字节作分母,否则会人为压低结果。
给两个分词器同样的 1,000-token 窗口,也不保证相同文本上下文,因为它们可能覆盖报告中不同长度的内容。必须说明各模型获得什么信息。合成案例没有这一问题,句子短,每项概率基于完整前缀定义。真实语料中仍需记录这一实验选择,BPB 不会自动解决它。
更细的区别:路径概率未必等于字符串概率
前面有意使用“路径概率”。若不同 token 序列解码为同一文本,该文本总概率应按一致的边界与终止约定,对允许序列的贡献求和。确定性分词器可以选出规范路径,但生成模型也可能为产生同样字符的其他路径赋予概率。只评估规范路径,并没有执行这种求和。
一个抽象例子即可说明:两条完整且互斥的路径都解码为“ab”,概率分别为 0.02、0.08,字符串概率为 0.10,而只选第一条的评估器记录 0.02。本文未实现真实分词器所有路径的边缘化。因此实验 BPB 是所选路径损失的归一化,不是保证获得精确、完全不依赖分词的文本似然。
领域模型应如何评估
在未参与训练的维修报告上,语言损失可以衡量模型认为领域文本有多可预测。但它不自动衡量故障识别、单位保留、程序遵循或是否虚构原因。模型可能给常见却对决策无用的句子很高概率。因此选型需结合语言指标与独立协议下的任务测试,关注实际重要错误。本文不报告未执行的应用结果。
结论:排名前先明确单位
不同困惑度不一定表示语言质量不同,可能只是对不同单位求平均。本例 A 为 2、C 约 3.17,但 C 为同一句话的序列赋予更高概率。字节归一化揭示了这一点,却不能单独解决上下文、预处理、其他路径或任务价值。应先问测量了何种损失、哪些内容、什么条件,再比较数值。
代码重现三个分数。压缩包包含明确 token、概率、句子重建检查、汇总、Unicode 示例与绘图数据。全部确定性,无需种子。评分遍历 N 个概率一次,成本 O(N),不包含真实模型推理成本。图来自已保存 JSON 数值。以下文档支持定义与方法注意事项,数值例子是独立教学分析。
来源与代码
Hugging Face Transformers — Perplexity of fixed-length models.
from math import log2
text = "motore caldo"
for name, probs in [("A", [.5]*6), ("B", [.25]*3), ("C", [.5,.25,.25])]:
bits = -sum(log2(p) for p in probs)
ppl = 2**(bits/len(probs))
bpb = bits/len(text.encode("utf8"))
print(name, bits, ppl, bpb)
代码、数据与说明 · JSON. 教学计算使用 Python 3.14.0,图使用 Matplotlib 3.11.2。分析由 AI 辅助,不声称经过同行评审或人工审核。原创 ImageGen 封面仅作示意,不记录 EL-AI 人员、场所或实际安装。来源查阅于 2026 年 10 月 3 日。

