学习了语言模型如何为词语序列分配概率后,一个很自然的问题出现了:我们如何评价一个语言模型的好坏?如果我们有两个不同的模型,比如一个二元模型和一个三元模型,怎样才能定量地确定哪个模型在预测文本方面表现更好呢?这就是一个名为困惑度的指标发挥作用的地方。评估模型的“意外程度”本质上,困惑度衡量一个概率模型预测样本的准确程度。对于语言模型来说,它衡量模型在预测序列中下一个词时的不确定性。你可以将其看作是“意外程度”的一种度量。一个表现良好的语言模型,在面对测试集中的典型句子时,会显得不那么“意外”。这种低意外程度意味着它会为该句子分配更高的概率。困惑度分数越低,表明该语言模型在预测文本方面表现越好。困惑度分数越高,则表明模型对文本感到越“困惑”,因此不适合该文本。困惑度分数的意义理解困惑度分数最直接的方式,就是将其看作模型预测下一个词时所拥有的有效选择数量。例如,如果一个语言模型在给定测试集上的困惑度为20,这意味着平均而言,模型在预测下一个词时的不确定性,就如同它必须从20个不同的词中均匀选择一样。一个更好的模型会有更低的困惑度,比如10,这意味着它的不确定性等同于只需在10个词之间进行选择。一个总是知道下一个词的完美模型,其困惑度将为1(它只有一个选择)。当然,这在自然语言的实际应用中是不可能的。以下图表展现了这一道理。低困惑度模型具有较小的有效分支因子,这意味着它比高困惑度模型能更有效地缩小可能的选项范围。digraph G { rankdir=TB; splines=true; node [shape=box, style="rounded,filled", fillcolor="#e9ecef", fontname="sans-serif"]; edge [fontname="sans-serif", color="#495057"]; subgraph cluster_0 { label = "低困惑度模型 (例如, PP=10)"; bgcolor="#b2f2bb"; style=filled; l_start [label="... the cat"]; l_w1 [label="sat"]; l_w2 [label="slept"]; l_w3 [label="jumped"]; l_etc [label="... (7个其他选择)"]; l_start -> l_w1 [penwidth=3, color="#37b24d", label=" 高概率"]; l_start -> l_w2 [penwidth=1, label=" 低概率"]; l_start -> l_w3 [penwidth=1, label=" 低概率"]; l_start -> l_etc [style=dashed]; } subgraph cluster_1 { label = "高困惑度模型 (例如, PP=100)"; bgcolor="#ffc9c9"; style=filled; h_start [label="... the cat"]; h_w1 [label="sat"]; h_w2 [label="ate"]; h_w3 [label="flew"]; h_w4 [label="coded"]; h_etc [label="... (96个其他选择)"]; h_start -> h_w1 [penwidth=1.5, color="#f03e3e", label=" 概率?"]; h_start -> h_w2 [penwidth=1.5, color="#f03e3e", label=" 概率?"]; h_start -> h_w3 [penwidth=1.5, color="#f03e3e", label=" 概率?"]; h_start -> h_w4 [penwidth=1.5, color="#f03e3e", label=" 概率?"]; h_start -> h_etc [style=dashed]; } }左边的低困惑度模型对下一个词的预测更确定,而右边的高困惑度模型则拥有更多大致等概率的选择。困惑度背后的数学原理困惑度直接来源于语言模型赋予测试集的概率。如果一个测试集 $W$ 由词序列 $w_1, w_2, \dots, w_N$ 组成,那么困惑度是序列中词语概率几何平均值的倒数。公式如下: $$ \text{困惑度}(W) = P(w_1, w_2, \dots, w_N)^{-\frac{1}{N}} $$ 我们来详细分析一下:$P(w_1, w_2, \dots, w_N)$:这是由语言模型计算出的整个测试句子的概率。对于N-gram模型,可以通过链接条件概率(例如 $P(w_1) \times P(w_2 | w_1) \times P(w_3 | w_2) \dots$)得到这个值。这个值通常非常小。指数 $(-\frac{1}{N})$:这一部分有两个主要作用。$\frac{1}{N}$ 通过测试集中的词语数量 ($N$) 来归一化概率。这使得我们能够比较不同长度测试集上的困惑度分数。负号有效地反转了概率。由于概率介于0和1之间,较高的概率将导致较低的困惑度分数,这正是我们想要的结果。更好的模型会分配更高的概率,并获得更低(更好)的分数。在实际应用中,由于将许多小概率相乘可能导致数值下溢(计算机将数字四舍五入为零),因此计算通常使用对数概率进行。使用对数运算的公式是等效的,但对计算机处理来说更稳定。一个应用场景示例假设您有两个语言模型,想为设计用于转录金融新闻的ASR系统进行比较。模型A:在一个由《华尔街日报》金融新闻文章构成的大型语料库上进行训练。模型B:在一个由儿童故事构成的大型语料库上进行训练。现在,您在一个未曾见过的金融新闻标题测试集上评估这两个模型。我们以句子“The Federal Reserve raised interest rates.”为例。模型A很可能会给这个序列分配高概率。“Federal”、“Reserve”、“interest”和“rates”这样的词语在其训练数据中很常见且经常一起出现。它在这个测试集上的困惑度分数会相对低。模型B会对此句子感到非常“意外”。其词汇和词语序列与儿童故事中出现的完全不同。它会给这个句子分配极低的概率,导致困惑度分数非常高。通过比较困惑度分数,您可以清楚地得出结论:模型A是您ASR应用程序的更好选择。这个指标提供了一种正式的方式来印证我们的直觉,使其成为开发和选择语言模型时不可或缺的工具。