困惑度是衡量语言模型预测文本时有多不确定的一个数字,英文 Perplexity,常缩写为 PPL。测法是拿一段模型没见过的真实文本,让它逐个预测下一个词,再看它给每个真实下文的概率平均有多高:概率给得越高,困惑度越低,理论下限是 1;给得越低,数字越大,上不封顶。它回答的问题很窄——这个模型对这段文本接话接得准不准;至于接出来的内容有没有用、是不是事实,不在它的测量范围之内。把这一条先划清,后面很多误读就不会发生。
先算一笔账:从每个词的概率到一个数字
具体算法分两步。第一步算交叉熵:把模型给每个真实下文的概率取对数、加负号,再对整段文本取平均——概率越接近 1,这一项越接近 0;概率越小,惩罚越大,而且是指数级变大,给一个真实词只打出 0.01 的概率,惩罚约是打出 0.5 时的六倍多。第二步把交叉熵取指数,就得到困惑度。绕这道弯是为了换一个更好理解的刻度:困惑度可以读成模型每一步平均要在多少个候选里犹豫。比如困惑度是 10,相当于模型每预测一个词,不确定程度和在 10 个同样可能的选项里盲猜差不多;困惑度是 100,就是在一百个选项里发懵。成语、日期格式这类规律极强的文本,模型容易给出高概率,困惑度自然低;天马行空的闲聊下文谁也猜不准,困惑度高并不丢人。所以同一个模型在代码、新闻和对话上测出的数字可以差出几倍,这量的是文本本身有多好猜和模型有多合拍,不是单一的聪明程度。预训练阶段日复一日往下压的,正是这个数字背后的交叉熵,具体过程可以看预训练是什么意思那篇的拆解。
和交叉熵、准确率不是一回事
困惑度和交叉熵其实是同一份信息换了两种刻度:知道交叉熵,取指数就是困惑度;知道困惑度,取对数就回到交叉熵。训练时盯的是交叉熵,因为它就是损失函数,对数刻度下数值稳定、梯度好算;汇报时更爱用困惑度,因为「平均在几个候选里犹豫」比「损失 2.3」直观得多。两者别当成两个独立证据,拿它们互相印证没有意义。和准确率的区别则在测法:准确率只看模型的第一选择对不对,不看它给正确答案留了多少概率。一个模型把正确词排第二、给了 0.49 的概率,另一个也排第二、只给 0.01,在准确率账上两者一样错,在困惑度账上却差得很远——前者只是临门一脚,后者是真的没谱。反过来,困惑度也不测任务做没做成:题答对没、代码跑不跑得通,那是下游基准的事,和涌现能力那篇里讨论的任务成绩曲线不是同一个层面。
为什么换个模型,数字就不能直接比
困惑度最容易被用错的地方,就是拿两个不同模型的数字直接排座次。第一道坎是分词:模型预测的单位不一样,每一步的难度就不一样。按字符预测时每步只需猜一个字,天然容易;按词预测时每步要猜中一整个词,天然更难,同一段文本切法不同,数字可以差出几十倍,和模型实力无关。第二道坎是测试文本:领域、语言、长度都影响难度,拿英文新闻测出的数字去比拿中文对话测出的数字,毫无意义。第三道坎是评估细节,比如上下文怎么切分、步长怎么取,不同实现算出的结果也会有出入。所以可比的前提是一整套口径全部对齐:同一份测试文本、同一套分词、同一套计算方式,缺一项,比较就作废。真要粗略跨越分词差异,人们会改用按字符归一化的指标,比如每字符比特数(BPC),把总量摊回每个字符再比,但那已经是另一个指标了。厂商发布时只甩一个困惑度数字、不写测试集和口径的,基本可以直接当宣传话术看。
三个最容易踩的误读
第一个误读是把困惑度低等同于模型更好用。它只测续写真实文本时的预测概率,一个在网络文本上困惑度很低的模型,完全可能答非所问、不会拒答、算错数——这些毛病不在它的考卷里。第二个误读是看到异常低的数字就信。测试文本如果提前混进了训练数据,模型等于背过答案,数字会虚低;只在某个窄领域文本上特别低,也说明不了通用能力,换一份文本可能立刻打回原形。第三个误读是不分模型类型乱套。困惑度建立在逐词预测这个玩法上,对靠遮词填空训练的掩码模型(比如 BERT)并没有良好定义,硬算出来的数字不能和自回归模型放进同一张表。先确认模型是不是一步步往后生成的,再谈这个指标适不适用。
它真正适合用在哪儿
用对地方,困惑度仍是很好使的日常仪表。最典型的用法是纵向看自己:同一个模型在训练不同阶段测同一份留出文本,数字稳步下降说明在学进去,突然反弹往往是数据或训练出了问题,调数据配比、换清洗规则这类消融实验,也靠它快速看方向。其次是领域适配后的快速筛查:给模型补了一批行业资料,先在目标领域的文本上测一遍,数字明显降下来,才值得进入更贵的真实任务评测。它不适合的场合也很明确:给聊天助手排座次、跨厂商榜单横比、代替用户在自己的任务上实测——这些场合需要的是任务基准和真实样本,不是续写概率。下次再看到某个模型宣传困惑度多低,先问三件事:测的是哪份文本,用的什么分词,和谁比、口径齐不齐。三件都问清了,这个数字才值得你花时间看。