困惑度的正确用法

文摘   2024-08-04 12:41   新加坡  

本文涉及到的详细测试代码和测试步骤放置于:

https://github.com/davidsajare/david-share.git

下的:LLM/Perplexity-test

欢迎给repo点亮Star,您的点赞是作者持续创作的动力。

困惑度(Perplexity)是评估大型语言模型(LLMs)的主要指标之一。它衡量的是模型对给定序列的预测能力。从数学上讲,困惑度是对数似然的负值的指数化平均值。在训练过程中,LLM的目标是最小化这个负对数似然,因此困惑度成为评估LLM性能的一个直观选择。需要注意的是,困惑度越低越好。

  1. 预测一个词的概率

  • 模型会根据前面看到的所有词来预测下一个词出现的概率。比如,你已经有了“猫在睡觉”,模型现在要预测下一个词是“。”,还是其他的词。

  • 这个概率用 ( p_{\theta}(x_i | x_{<i}) ) 表示,就是在给定前面所有词的情况下,预测当前词的概率。

  • 取对数((\log))

    • 直接用概率来做计算有点不方便,所以我们先把这个概率取对数(log)。对数的好处是可以把乘法变成加法,计算起来更简单。

  • 求平均值

    • 我们有很多个词,所以对所有词的对数概率求和,再除以词的总数 ( t )。这样我们就得到了一个平均值。

  • 取负值

    • 因为对数通常是负数,我们取它的负值,这样结果是正数。

  • 指数化((\exp))

    • 最后一步,我们用指数函数((\exp))把这个负对数平均值变成困惑度。这样做的原因是把对数值转换回原始的概率尺度,这样更直观。

      总结一下,这个公式的意思是:

    • 先看看模型在每个位置上预测下一个词的能力(用概率来表示)。

    • 把这些概率取对数后求平均值,然后取负值,再用指数函数转换回来。

      最终得到的数字就是困惑度。这个数字越小,说明模型预测得越好,越不“困惑”。如果困惑度很高,说明模型对这段文字的预测很差,经常猜错。

    我们可以测试同一个模型在微调前后,或者量化前后的困惑度。以此在衡量微调的效果以及量化带来的精度损失。

    能否用困惑度来比较不同的LLMs?

    不能

    1. 不同的分词方式:不同模型的分词器会产生不同数量的词元(tokens)。如果一个模型的分词器生成了更多的词元,那么N会更高,从而导致困惑度更低。

    2. 不同的词汇表大小:困惑度是基于整个词汇表计算的。词汇表越大,找到最可能的词的任务就越困难。例如,一个词汇表只有两个词的模型和一个有100,000个词的模型相比,后者的预测任务显然更难,但这并不意味着它的表现更差。

    3. 不同的最大上下文长度:不同模型的最大上下文长度不同,这也会影响困惑度的计算。例如,如果一个模型的上下文长度是8192个词元,而另一个模型只有4096个词元,那么前者可以在更长的序列上计算困惑度,而后者则需要通过滑动窗口等方法来近似计算。

    测试代码见repo,此处不再赘述。

    大魏分享
    https://github.com/davidsajare/david-share.git
     最新文章