从零看懂困惑度:模型怎样预测下一个词元

为什么一篇讨论提示词压缩的论文,会用到“困惑度”?

给大模型的材料可能包含指令、示例、检索到的文档和先前对话。材料越长,处理它所需的计算和费用通常越高;但随手删去一段,又可能删掉回答问题所需的信息。LLMLingua1提出的就是这个问题:怎样缩短输入,同时尽量保留有用内容?

作者借用了一个更早的想法:一段文字有多容易根据前文预测? 要看懂它与压缩有什么关系,我们先从这个想法的来历讲起。

从“下一个字母”到“下一个词元”

1948 年,香农在《通信的数学理论》2中研究信息来源产生符号时的不确定性,以及语言中的统计规律如何带来冗余。比如,知道前面已经出现哪些字母,会改变我们对后续字母的预期。1951 年,他又在《印刷英语的预测与熵》3中研究:给定前面的文字,人能在多大程度上预测下一个字母?他用这种预测性来研究英语的熵和冗余。

这里说的是思想脉络,不是说香农提出了今天语言模型使用的词元困惑度公式。 两者相通的地方是:如果某个后续内容很容易由前文推知,它带来的新信息通常较少;如果它出乎预料,我们就需要更多信息才能确定它是什么。

今天的语言模型不只看字母。我们用一句具体的话:“我爱茶”。

模型会先用自己的分词器把文字拆成处理单位,称为词元。词元可能是一个字、几个字、词的一部分或标点。为了让接下来的计算可以手算,本文约定采用逐字分词:

我 → 爱 → 茶

这是真实的句子,但逐字拆分是本文的教学设定;某个真实模型未必恰好这样拆。计算真实模型的困惑度时,必须使用它自己的分词结果。

模型到底从哪里选“下一个”?

模型有一张预先确定的词元表。读到“我爱”后,它会给词元表中的候选分配下一位出现的概率。候选不限于当前句子里已经出现的字,也不是从这句话中挑出一组“清洗过的词”。Selective Context4正是用语言模型给实际词元的这种条件概率,计算它有多出乎预料。

假设模型读到“我爱”后给出以下概率:

下一个词元 概率
你 0.30
吃 0.20
茶 0.125
词元表中其余候选合计 0.375

整张表的数字都是教学假设,不是论文或真实模型的实测输出。 “其余候选合计”也不是一个单独的词元。

现在有两种不同任务:

  • 让模型续写:它可以选概率最高的你,也可以按概率抽样,得到其他词元。
  • 评价已经写好的“我爱茶”:原句实际接在“我爱”后面的是茶,因此我们只取模型给茶的概率 0.125。模型是否会主动选中茶,不影响这一步的计算。

后面计算困惑度,做的始终是第二件事:用模型给原句实际内容的概率,为这句话打分。

把“我爱茶”完整算一遍

模型需要依次预测三个位置。假设它给各位置实际出现的词元以下概率:

已读到的内容 实际下一个词元 给这个词元的概率
句子开始 我 0.5
我 爱 0.25
我爱 茶 0.125

先把三个概率相乘:

\[0.5\times0.25\times0.125=\frac1{64}\]

但句子越长,相乘的次数越多,结果往往越小。我们希望得到的是每一步平均有多难预测,于是对三个概率取几何平均,也就是把乘积开三次方:

\[\sqrt[3]{\frac1{64}}=\frac14\]

这表示:三个位置合在一起,相当于模型每一步都给实际词元 (1/4) 的概率。把它求倒数,得到这句话的困惑度:

\[\mathrm{PPL}=\frac{1}{1/4}=\boxed{4}\]

困惑度为 4,不表示词元表里只有四个候选。它表示这段文本在这个教学模型下的平均预测难度。给实际词元的概率越低,困惑度越高。

论文里的公式为什么长得不一样?

困惑度通常写作:

\[\mathrm{PPL} =\exp\left( -\frac1N\sum_{i=1}^{N}\ln P(x_i\mid x_{<i}) \right)\]

先只看式子里面:\(x_i\) 是当前位置实际出现的词元,\(x_{<i}\) 是它前面的词元,\(P(x_i\mid x_{<i})\) 就是表格最后一列的概率。这里共有三个词元,所以 \(N=3\)。

把“我爱茶”的三个概率代进去:

\[\begin{aligned} \mathrm{PPL} &=\exp\left( -\frac{\ln(0.5)+\ln(0.25)+\ln(0.125)}{3} \right)\\ &=\exp\left( -\frac{-0.6931-1.3863-2.0794}{3} \right)\\ &=\exp(1.3863)\approx\boxed{4} \end{aligned}\]

\(\ln\) 把连续的乘法改写成加法;除以 \(N\) 求每个词元的平均值;最外面的 \(\exp\) 再把结果转换回来。因此,这个公式与刚才的“概率相乘 → 按词元数开方 → 求倒数”完全等价。

每个位置的 \(-\ln p\) 也可以理解为该实际词元带来的“意外程度”。不过要留意一个区别:香农研究的熵是关于信息来源平均不确定性的概念;这里的困惑度则是拿某个模型给一段实际文本的概率计算出的分数。两者有数学联系,不能直接当作同一个量。

为什么“预测难度”会成为压缩依据?

Selective Context5用实际词元的 \(-\log p\) 衡量它的自信息量,并尝试保留分数较高的词元、短语或句子。LLMLingua6沿着类似思路,使用较小的语言模型估计内容的困惑度:作者认为较容易预测的部分可能更冗余,较难预测的部分可能更值得保留。

这是论文采用的筛选思路,不是困惑度公式本身给出的保证。 LLMLingua7 也没有只按一张词元分数表机械删词。它会给指令、示例和问题分配不同的压缩预算,先筛选较大的内容单位,再逐段进行词元级压缩,以考虑保留内容之间的关系。

后续论文进一步说明了单看预测难度的局限:LongLLMLingua8强调压缩长文档时要考虑当前问题,因为一段内容本身难预测,未必能回答用户的问题;LLMLingua-29则指出,依据因果语言模型得到的预测难度,未必与压缩目标一致,因此改为训练模型判断哪些词元应保留。

可以这样记住全文的界限:困惑度回答“这个模型有多难预测这段文字”,不直接回答“这段文字对当前任务有多重要”。 它可以成为压缩的线索;是否该删除,还要看问题、上下文和删除后的实际效果。

论文阅读顺序

  1. Shannon,1948:《通信的数学理论》:信息、概率与语言冗余的理论背景。
  2. Shannon,1951:《印刷英语的预测与熵》:根据前文预测下一个字母。
  3. Selective Context,2023:用自信息量筛选上下文。
  4. LLMLingua,2023:将预测难度用于分层提示词压缩。
  5. LongLLMLingua,2024:在长上下文压缩中加入问题相关性。
  6. LLMLingua-2,2024:用学习得到的词元保留判断替代原先的困惑度筛选。

注释

  1. LLMLingua 的引言 ↩

  2. 1948 年论文第 2 节 ↩

  3. 1951 年论文摘要与第 1 节 ↩

  4. Selective Context 论文第 2—3 节 ↩

  5. Selective Context 第 2—3 节 ↩

  6. LLMLingua 的引言与第 4.1—4.2 节 ↩

  7. LLMLingua 第 4.1—4.3 节 ↩

  8. LongLLMLingua 的引言及第 4 节 ↩

  9. LLMLingua-2 的摘要及第 3—4 节 ↩