← Retour à la page précédente

Comprendre la perplexité depuis zéro : comment un modèle prédit le prochain token

Un exemple de prédiction du prochain token pour comprendre le calcul de la perplexité, son rôle et ses limites dans la compression des prompts.

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

给大模型的材料可能包含指令、示例、检索到的文档和先前对话。材料越长,处理它所需的计算和费用通常越高;但随手删去一段,又可能删掉回答问题所需的信息。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 节 ↩