9.8 序列模型评价指标#
在「第7.6节 CharRNN教程:基于字符级序列的生成模型」内容中我们首次接触了序列生成模型,并以准确率来作为序列生成的评价指标。虽然准确率在一定程度上能够评估模型的优劣,但是对于语言模型来说它并不是一个好的选择。例如对于翻译模型来说,生成的序列并不需要完全与目标序列一样对应,只需要在$N$-gram角度满足一定的重合度即可。在本节内容中,我们将会学习语言模型中两种较为常见的模型评价指标:困惑度(Perplexity)和双语评估辅助(BLEU)。
9.8.1 困惑度#
1. 信息熵
关于如何定量地来描述信息,几千年来都没有人给出很好的解答。直到1948年,香农在他著名的论文《通信的数学原理》中提出了信息熵(Information Entropy)的概念,这才解决了信息的度量问题并且还量化出了信息的作用[1]。
对于任意离散型随机变量$X\in\mathcal{X}$,且服从概率分布$\mathcal{X}\sim p(x)$,则随机变量$X$的信息熵定义为
$$ H(X)=-\sum_{x\in\mathcal{X}}p(x)\log{p(x)}=\mathbb{E}[-\log p(X)]=\mathbb{E}\left[\log {\frac{1}{p(X)}} \right] \tag{9-27} $$其中当$\log$取2为底时$H(X)$的单位为比特(Bit),取$e$为底的时候称之为纳特(Nat),此时$H(X)$表示的含义便是随机变量$X$所携带信息量的多少,也即编码该信息所需比特(纳特)数的期望。
现在假设有8只球队进行比赛,每只球队获胜的概率都是$\frac{1}{8}$,那么对于“哪只球队能够获胜”这句描述来说,其信息量为
$$ H(X)=-8\times(\frac{1}{8}\log{\frac{1}{8}})=3\text{ (Bit)}\tag{9-28} $$根据式(9-28)的计算结果可知,“哪只球队能够获胜”这句描述包含有3比特的信息,也就是说如果我们想要将哪只球队获得了冠军这一消息传递出去需要使用3个比特进行编码,即000、001一直到111这8种情况。
进一步,我们将式(9-27)的表达形式重写为
$$ H(X)=\sum_{x\in\mathcal{X}}p(x)\log{\frac{1}{p(x)}} \tag{9-29} $$由式(9-29)可知,$p(x)$表示的是随机事件$x$发生的概率,而$\log{\frac{1}{p(x)}}$ 表示的正是编码事件$x$所包含信息需要的比特数,因此$H(X)$则表示编码整个随机事件所有信息需要比特数的期望。
例如假定明天下雨的概率是$\frac{1}{4}$,不下雨的概率是$\frac{3}{4}$,那么对于“明天可能下雨”这句描述来说,编码该信息所需比特数的期望为
$$ H(X)=(\frac{1}{4}\log{\frac{4}{1}}+\frac{3}{4}\log{\frac{4}{3}})\approx0.8113 \text{ (Bit)}\tag{9-30} $$2. 困惑度
困惑度(Perplexity)是一种用于衡量语言模型性能的指标。具体来说,它衡量了模型对未知文本的困惑程度或不确定性,困惑度越低表示模型对测试集的预测越准确,即模型能够更好地对未知文本进行预测。在比较不同的语言模型时,较低的困惑度通常意味着更好的性能。
具体地,对于离散型随机变量$X\in\mathcal{X}$且服从概率分布$\mathcal{X}\sim p(x)$来说,则其困惑度定义为[4] [5]
$$ PP(X)=2^{H(X)}=2^{-\sum_{x}p(x)\log_2p(x)}\tag{9-31} $$根据式(9-31)可以看出,困惑度实际上计算的是随机变量$X$所有可能情况信息的总量,越低也就表示信息的确定性越高。
进一步,在语言模型中式(9-31)可以改写为
$$ PP(X)=\exp\left(H(X)\right)=\exp\left(-\frac{1}{N}\sum_{t=1}^N\ln p(x_t)\right)\tag{9-32} $$其中$p(x_t)$表示第$t$个时刻对应的条件概率,幂次$-\frac{1}{N}\sum_{t=1}^N\ln p(x_t)$可以看做是编码序列 $x_1,...x_N$ 所有信息需要纳特数的均值,同时在形式上也可以理解为交叉熵损失函数。
根据式(9-32)可知,当模型在测试集上预测值和真实值越接近,那么此时模型的困惑度也将会越趋近于1;而在最坏的情况下,模型的困惑度将达到无穷大。
9.8.2 双语评估辅助#
1. 计算原理
双语评估辅助(Bilingual Evaluation Understudy, BLEU)是一种用于评估机器翻译质量的指标,它是由帕皮内尼(Papineni)等人于2002年所提出。BLEU通过比较机器翻译输出与参考翻译之间的$N$-gram匹配度来评估翻译质量,较高的BLEU分数则表示机器翻译系统的输出与参考译文之间有更多的重叠[6]。具体地,BLEU的计算方式定义如下[2] [6]
$$ \text{BLEU}=\exp\left(\min\left(0,1-\frac{\text{len}_\text{label}}{\text{len}_\text{pred}}\right)\right)\prod_{n=1}^Np_n^{\frac{1}{N}}\tag{9-33} $$其中$\text{len}_\text{label}$和$\text{len}_\text{pred}$分别表示目标序列和预测序列的长度,$N$表示使用$N$-gram中的$N$值,$p_n$表示每个$N$-gram中预测序列里正确$N$-gram片段的数量除以整个$N$-gram片段的数量。
根据式(9-33)可知,当目标序列与预测序列完全相同时BLEU的取值为1,即此时$p_n=1$;当目标序列与预测序列差异越大时BLEU将越接近于0。可以看出,BLEU不仅可以用于对机器翻译的结果进行评估,任何序列生成任务都可以将其作为评价指标。
为了理解式(9-33)中的含义我们可以进一步对等式两边取对数,此时有
$$ \log \text{BLEU}=\min\left(0,1-\frac{\text{len}_\text{label}}{\text{len}_\text{pred}}\right)+\sum_{n=1}^Nw_n\log p_n;\;\;w_n=\frac{1}{N} \tag{9-34} $$其中$w_n$为每个$n$-gram中$\log p_n$对应的加权值,在原始论文中$w_n=\frac{1}{N}$,而在文献[2]中作者取值为$\frac{1}{2^n}$。这是因为随着$n$的增大则重叠片段的匹配难度就越大,所以可以给更大的$n$赋予更高的权重。同时,由于预测越短越容易获得较大的$p_n$,所以式(9-34)中的第1项可以作为惩罚项来对整个结果进行惩罚。例如当$N=2$时,对于目标序列A、B、C、D、E、F和预测序列A、B来说,尽管$p_1=p_2=1$,但是此时惩罚项$\exp(1-6/2)\approx0.14$会降低整个BLEU值。
2. 计算示例
例如当$N=2$时,对于预测序列“我 是 一位 老师”和目标序列“我 是 一个 学生”来说,此时的计算过程为
$$ \begin{aligned} \text{BLUE}&=\exp\left(\min\left(0,1-\frac{1}{1}\right)\right)\prod_{n=1}^2p_n^{\frac{1}{2}}\\[3ex] &=1\cdot\left(\frac{2}{4}\right)^{\frac{1}{2}}\cdot\left(\frac{1}{3}\right)^{\frac{1}{2}}\approx0.4082 \end{aligned}\tag{9-35} $$其中$\frac{2}{4}$表示当$n=1$时预测序列中$1$-gram的数量为4,且与目标序列中$1$-gram的重合度为2,即"我"和“是”;同理,$\frac{1}{3}$表示当$n=2$时预测序列中$2$-gram的数量为3,且与目标序列中$2$-gram的重合度为1,即"我 是"。
3. 使用示例
对于BLEU值的计算我们可以借助torchtext中的bleu_score函数来完成,示例代码如下所示:
1 from torchtext.data.metrics import bleu_score
2 def example():
3 pred_seq = [['我', '是', '一位', '老师']]
4 label_seq = [[['我', '是', '一个', '学生']]]
5 max_n = 2
6 bleu = bleu_score(pred_seq, label_seq, max_n, weights=[1 / max_n] * max_n)
7 return bleu # 0.4082在上述代码中,第1行是导入bleu_score函数;第3行是预测序列,它是一个二维列表,每个元素表示一个预测序列。第4行是目标序列,它是一个三维列表,每个列表表示一组参考值,即可以给出多个结果以此来计算BLEU值。第5行max_n表示$N$的取值。第6行weights表示式(9-34)中的权重$w_n$,这里取$\frac{1}{N}$。
进一步,如果目标序列的参考值为
1 label_seq = [[['我', '是', '一个', '学生'],['我', '是', '一位', '学生','。']]]则此时的BLEU值为
$$ \begin{aligned} \text{BLUE}&=1\cdot\left(\frac{3}{4}\right)^{\frac{1}{2}}\cdot\left(\frac{2}{3}\right)^{\frac{1}{2}}\approx0.7071 \end{aligned}\tag{9-36} $$对于多个样本结果BLEU值的计算
1 pred_seq = [['我', '是', '一位', '老师'], ['跟我', '学', '深度学习']]
2 label_seq = [[['我', '是', '一个', '学生'], ['我', '是', '一位', '学生', '。']],
3 [['跟我', '一起', '学', '机器学习']]]则此时的BLEU值为0.4633。
这里需要注意的是此时并不是计算每个样本的BLEU值再取平均,而是计算所有情况下的$N$-gram重合度整体进行计算,以上完整示例代码可参见Code/Chapter09/C06_Seq2Seq/bleu_usage.py文件。
9.8.3 小结#
在本节内容中,我们首先详细介绍了信息熵的基本原理以及对信息熵的直观解释;然后基于此介绍了困惑度的基本原理和计算过程,本质上困惑度计算的是任意随机变量所有可能情况信息的总量;最后详细介绍了双语评估辅助的原理和计算过程,并同时介绍了如何使用torchtext中的bleu函数来完成BLEU评价指标的计算。
引用#
[1] https://en.wikipedia.org/wiki/Entropy_(information_theory)
[2] 阿斯顿·张、李沐、扎卡里 C. 立顿等,动手学深度学习[M],2版. 北京:人民邮电出版社, 2019.
[3] 邱锡鹏. 神经网络与深度学习 [M]. 北京: 机械工业出版社, 2020.
[4] Natural Language Processing with Deep Learning, Stanford CS224n, Winter 2022.
[5] https://en.wikipedia.org/wiki/Perplexity
[6] Papineni K, Roukos S, Ward T, et al. Bleu: a method for automatic evaluation of machine translation[C] Proceedings of the 40th annual meeting of the Association for Computational Linguistics. 2002, 311-318.