Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

3.3 评估语言模型:困惑度

前文说过,我们依据哪个语言模型为测试集分配更高概率来进行评估。更好的模型更善于预测后续词语,因此测试集中的每个词出现时,它都不会那么“惊讶”,也就是会分配更高概率。完美的语言模型能够正确猜出语料库中的每个下一词,为它分配概率 1,并为其他所有词分配概率 0。因此,给定一个测试语料库,更好的语言模型会比更差的模型为它分配更高概率。

不过,实际评估语言模型时通常不直接使用原始概率。原因是测试集(或任何序列)的概率取决于其中的词或词元数量;文本越长,测试集概率就越小。我们需要一种逐词计算、按长度归一化的指标,以便比较不同长度的文本。确实存在这种指标:它是一个称为困惑度(perplexity)的概率函数,既用于评估大语言模型,也用于评估 n 元模型。

语言模型在测试集上的困惑度(有时缩写为 PP 或 PPL),是测试集概率的倒数,再按词(或词元)数量归一化;因此,它有时称为逐词困惑度(per-word perplexity)或逐词元困惑度(per-token perplexity)。我们通过取 NN 次方根,按词数 NN 归一化。对测试集 W=w1w2wNW=w_1w_2\ldots w_N

perplexity(W)=P(w1w2wN)1N=1P(w1w2wN)N(3.14)\begin{array}{r c l} \operatorname{perplexity} (W) & = & P (w _ {1} w _ {2} \dots w _ {N}) ^ {- \frac {1}{N}} \\ & = & \sqrt [ N ]{\frac {1}{P (w _ {1} w _ {2} \dots w _ {N})}} \end{array}\tag{3.14}

也可以使用链式法则展开 WW 的概率:

perplexity(W)=i=1N1P(wiw1wi1)N(3.15)\operatorname{perplexity} (W) = \sqrt [ N ]{\prod_ {i = 1} ^ {N} \frac {1}{P (w _ {i} | w _ {1} \dots w _ {i - 1})}}\tag{3.15}

请注意,由于式 3.15 中取了倒数,词序列的概率越高,困惑度越低。因此,模型在数据上的困惑度越低,模型就越好。最小化困惑度等价于最大化语言模型为测试集分配的概率。为什么困惑度使用概率的倒数?这是因为困惑度最初由信息论中的交叉熵率定义,而倒数会自然地从该定义中产生;感兴趣的读者可以参阅进阶内容第 3.7 节。现在只需记住,困惑度与概率成反比。

测试集 WW 的具体困惑度计算方式取决于使用哪种语言模型。使用一元语言模型时,困惑度就是一元概率倒数的几何平均数:

perplexity(W)=i=1N1P(wi)N(3.16)\operatorname{perplexity} (W) = \sqrt [ N ]{\prod_ {i = 1} ^ {N} \frac {1}{P (w _ {i})}}\tag{3.16}

使用二元语言模型计算 WW 的困惑度时,仍然取几何平均数,不过改为二元概率的倒数:

perplexity(W)=i=1N1P(wiwi1)N(3.17)\operatorname{perplexity} (W) = \sqrt [ N ]{\prod_ {i = 1} ^ {N} \frac {1}{P (w _ {i} | w _ {i - 1})}}\tag{3.17}

式 3.15 或式 3.17 中的词序列通常是某个测试集中的完整词序列。它会跨越许多句子边界。如果词表包含句间词元 <EOS>,或者分别包含句首、句末标记 <s></s>,就可以把它们纳入概率计算;此时,总词元数 NN 还需要为每个句子增加一个词元。[2]

前文提到,困惑度同时是文本和语言模型的函数:给定文本 WW,不同语言模型具有不同困惑度。因此,可以用困惑度比较不同语言模型。例如,我们在《华尔街日报》(Wall Street Journal,WSJ)的 3800 万词上训练一元、二元和三元模型,再分别使用式 3.16、式 3.17 和对应的三元公式,在一个 WSJ 测试集上计算各模型的困惑度。下表给出每个语言模型在含 150 万词的测试集上的困惑度。

一元模型二元模型三元模型
困惑度962170109

如表所示,n 元语法提供的词序列信息越多,它为字符串分配的概率越高。三元模型比一元模型更不容易“惊讶”,因为它更清楚哪些词可能接着出现,从而为这些词分配更高概率。而概率越高,困惑度越低,因为式 3.15 表明,困惑度与模型分配给测试序列的概率成反比。因此,更低的困惑度说明语言模型能更好地预测测试集。

计算困惑度时,语言模型不得知道测试集的任何信息,否则困惑度会人为偏低。只有使用完全相同词表的两个语言模型,其困惑度才可以比较。

困惑度的(内在)改进并不能保证语音识别或机器翻译等语言处理任务的(外在)性能也会提高。不过,困惑度通常与任务改进相关,因此常被用作方便的评估指标。只要条件允许,模型的困惑度改进仍应当通过真实任务上的端到端评估来确认。

3.3.1 把困惑度理解为加权平均分支因子

困惑度还可以理解为一种语言的加权平均分支因子(weighted average branching factor)。语言的分支因子(branching factor)是任意词后面可能出现的下一词数量。例如,考虑一个没有概率、任意词后都可以跟任意词的微型人工语言,其词表只包含三种颜色:

L={ red , blue , green }(3.18)L = \{\text { red }, \text { blue }, \text { green } \}\tag{3.18}

这门语言的分支因子是 3。

现在创建同一个语言模型的概率版本 A,其中每个词跟随其他词的概率相等(它在三种颜色计数相同的训练集上训练),测试集为 T=T=“red red red red blue”。

首先验证:在这个测试集(或任何类似测试集)上计算人工颜色语言的困惑度,确实得到 3。依据式 3.15,A 在 T 上的困惑度是:

perplexityA(T)=PA( red red red red blue )15=((13)5)15=(13)1=3(3.19)\begin{array}{r l} \operatorname{perplexity} _ {A} (T) & = P _ {A} (\text { red red red red blue }) ^ {- \frac {1}{5}} \\ & = \left(\left(\frac {1}{3}\right) ^ {5}\right) ^ {- \frac {1}{5}} \\ & = \left(\frac {1}{3}\right) ^ {- 1} = 3 \end{array}\tag{3.19}

再假设 red 在另一个语言模型 B 的训练集中很常见,因此 B 具有如下概率:

P(red)=0.8P(green)=0.1P(blue)=0.1(3.20)P (\mathbf {red}) = 0.8 \quad P (\mathbf {green}) = 0.1 \quad P (\mathbf {blue}) = 0.1\tag{3.20}

语言模型 B 在同一个测试集 red red red red blue 上的困惑度应当更低,因为下一种颜色大多数时候都是 red,而 red 很容易预测,即概率很高。因此,测试集概率更高;又因为困惑度与概率成反比,困惑度会更低。于是,尽管分支因子仍为 3,困惑度或加权分支因子却更小:

perplexityB(T)=PB(red red red red blue)1/5=0.0409615=0.5271=1.89(3.21)\begin{array}{r l} \operatorname{perplexity} _ {B} (T) & = P _ {B} (\text {red red red red blue}) ^ {- 1 / 5} \\ & = 0.04096 ^ {- \frac {1}{5}} \\ & = 0.527 ^ {- 1} = 1.89 \end{array}\tag{3.21}
Footnotes
  1. 例如,如果同时使用句首和句末词元,那么在计算 NN 时应计入句末标记 </s>,但不计入句首标记 <s>;这是因为句末词元后面几乎总是以概率 1 紧接着句首词元,我们不希望这一虚假转移的概率影响困惑度。