发现网络上流传的关于困惑度(perplexity)大多数都是利用了
N-gram
或者
主题模型
的例子来阐述的。但是现在这个年代来学习这个指标的人多半都是想研究
神经网络
的,而两者的对困惑度的计算方法又很不同,这就不能不让人对“困惑度”感到“困惑”了。本人虽然才疏学浅,还是斗胆在这里尝试写一篇文章,试图用简洁的方式来梳理清楚其中的困惑。
困惑度的基本定义
首先,困惑度是用来评价
语言模型
好坏的指标。语言模型是衡量句子好坏的模型,本质上是计算句子的概率:
对于句子s(词语w的序列):
它的概率为:【公式1】
困惑度与测试集上的句子概率相关,其基本思想是:
给测试集的句子赋予较高概率值的语言模型较好,当语言模型训练完之后,测试集中的句子都是正常的句子,那么训练好的模型就是在测试集上的概率越高越好
[1],公式如下:
这里想补充一下参考资料里没有强调的一些点
-
根号内是句子概率的倒数,所以显然
句子越好(概率大),困惑度越小,也就是模型对句子越不困惑。
这样我们也就理解了这个指标的名字。
-
开N次根号(N为句子长度)意味着
几何平均数
(把句子概率拆成词语概率的连乘)
-
需要
平均
的原因是,因为每个字符的概率必然小于1,所以越长的句子的概率在连乘的情况下必然越小,所以为了对长短句公平,需要平均一下
-
是
几何平均
的原因,是因为
几何平均数
的特点是,如果有其中的一个概率是很小的,那么最终的结果就不可能很大,从而要求好的句子的每个字符都要有基本让人满意的概率 [2]
-
机器翻译常用指标
BLEU
也使用了
几何平均
,还有机器学习常用的
F score
使用的
调和平均数
,也有类似的效果
在不同具体模型下的计算
不同模型的困惑度计算的差别,实际上都是来源于对
句子概率
的计算方式的不同,所以主要围绕句子概率展开:
N-gram(uni-gram, bi-gram, tri-gram)
网络上常见的例子:
对uni-gram语言模型(一元语言模型),其采用了
单个词语概率独立
的简化假设。
用
词袋模型
(Bag Of Words)这个名字来解释它可能更形象。把一个词语看做一种颜色的小球,句子的产生就是从一个装有所有词语的袋子里面有放回地抽出小球的过程。每类小球(词语)的概率互相独立。
故句子的概率不使用【公式1】,而是用每个词语(uni-gram)的概率相乘:【公式2】
对于bi-gram语言模型(二元语言模型),其采用
马尔科夫假设
:一个词的出现仅依赖于它前面出现的一个词。
故句子的概率就是每个词语(bi-gram)的概率相乘:
tri-gram类似:
实际上,都是把句子概率拆分成了N-gram的小单元概率计算。
注意,马上我们就要迎来第一个困惑点:
这些小单元的概率如何计算
第一类、统计语言模型,采用的是从数据集中的N-gram出现
频率
直接统计得到
概率
的方法。如uni-gram就是单个词语的出现频率(词频/语料库中所有的词语数量),而例如tri-gram则是
主题模型
第二类使用主题模型(LDA等)来作为语言模型。
实际上,这种模型也采用了
词袋模型
的假设,所以句子概率的计算同【公式2】。
只是,对于其中的uni-gram的概率计算,并不再来自于频率统计,采用了融合主题的更复杂的建模,提升了模型的泛化性能,是一种进步,想了解具体原理的我推荐 [3]。
神经网络
神经网络(这里我主要指RNN/LSTM/GRU)在主题模型的基础上又跨出了一大步。计算句子概率不再需要做出简化假设,分解为N-gram计算,而是可以使用最上面写的最根本的【公式1】来计算:
LSTM示意图
LSTM的具体原理我推荐看[4]来了解。这里我只简单说一下,由于LSTM的序列性,其每一步预测的词语概率自然而然就是
以前面所有的上下文为条件的条件概率
,即:
p(wn∣wn−1,wn−2,...,w1)=Softmax(ht)p(w_n|w_{n-1}, w_{n-2}, ..., w_{1}) = Softmax(h_ t)p(wn∣wn−1,wn−2,...,w1)=Softmax(ht)
这点与前面提到的两类模型都有根本不同。从而让我们可以利用【公式1】来计算句子概率,取得更好的效果。
另外,神经网络中的困惑度常常不是直接使用句子概率来计算的,而是使用了
cross entropy
(或者
negative log likelihood
,二者实际上是等价的)
(图源[5])
这是因为现在的深度学习框架对它们有现成的计算函数,用起来很方便。并且把上面的公式展开推导一下,可以得到与【公式1】实际上等价的结果(上图中还对语料库所有句子求了个算数平均)。
因为perplexity可以从cross entropy中得到,而cross entropy又是除了语言模型以外的
文本生成任务(如机器翻译,摘要生成等)也常用的loss
,所以我们也可以把perplexity拓展到语言模型外,用cross entropy来计算文本生成里的困惑度。
机器翻译的框架OpenNMT就使用了困惑度作为一个指标。[6]
基本概念到此为止,下面还有一些新方向的延伸。
GPT/BERT/XLnet
顺便提一下近年来流行的GPT/BERT/XLnet,它们又代表了语言模型的新方向,对上述方法又做出了改动,因而在此一并梳理。
这里主要引用XLNet的论述
GPT是Auto-regressive模型,其句子概率计算方法同【公式1】
BERT自称为(Masked Language Model, MLM),在XLNet中被称为denoising auto-encoding。一般只是用来预测MASK位置的词语概率,而不是句子概率,所以也有说它不算是一种语言模型的。它的概率计算方法:
即,以被MASK处理后的整句话的上下文为条件,计算所有被mask位置的词语的概率之和。
XLnet用的则是Permutation Language Modeling,说来话长,具体详见论文吧。
本文涉及概念较多,也许难免还会有些小问题,如果发现问题,欢迎指正。
本文参考资料,并且都是继续深入理解的很好资料:
[1] 忆臻的知乎专栏
https://zhuanlan.zhihu.com/p/44107044, https://zhuanlan.zhihu.com/p/28080127
[2] https://blog.csdn.net/qixinlei/article/details/98184316
[3] https://www.cnblogs.com/pinard/p/6831308.html