本内容主要介绍统计语言模型——N-gram(n 元)模型。
语言模型(Language model,LM)就是用来计算一个句子的概率的模型,也就是判断一句话是否合理的概率。语言模型常用于语音识别、手写识别、机器翻译、输入法、搜索引擎的自动补全等领域。
本节将介绍 n-gram 模型(n 元模型)。N-gram 是一种基于统计的语言模型。
一个 n-gram 是 n 个词的序列:一个 2-gram(bigram 或二元)是两个词的序列,例如 “I love”;一个 3-gram(trigram 或三元)是三个词的序列,例如“I love you”。后面将介绍:当给定 n-gram 的上文后,如何利用 n-gram 模型估计最后一个词的概率;以及估计整个序列的概率值。
需要注意的是,通常 n-gram 即表示词序列,也表示预测这个词序列概率的模型。
假设给定一个词序列 ( w 1 , w 2 , ⋯ , w m ) (w_1,w_2,\cdots,w_m) (w1,w2,⋯,wm),我们应该如何求这个序列的概率呢?根据概率的链式法则,可得:
P ( w 1 , w 2 , ⋯ , w m ) = P ( w 1 ) ∗ P ( w 2 ∣ w 1 ) ⋯ P ( w m ∣ w 1 , ⋯ , w m − 1 ) = ∏ i = 1 m P ( w i ∣ w 1 , ⋯ , w i − 1 ) (1.1) P(w_1,w_2,\cdots,w_m)= P(w_1) * P(w_2|w_1) \cdots P(w_m|w_1,\cdots,w_{m-1}) \\ =\prod_{i=1}^{m} P(w_i|w_1,\cdots,w_{i-1}) \tag{1.1} P(w1,w2,⋯,wm)=P(w1)∗P(w2∣w1)⋯P(wm∣w1,⋯,wm−1)=i=1∏mP(wi∣w1,⋯,wi−1)(1.1)
在实践中,如果文本的长度较长时,公式(1.1)右边的 P ( w i ∣ w 1 , ⋯ , w i − 1 ) P(w_i|w_1,\cdots,w_{i-1}) P(wi∣w1,⋯,wi−1) 的估算会非常困难。那我们应该怎么处理呢?在这里我们需要引入马尔科夫假设。
马尔科夫假设是指,每个词出现的概率只跟它前面的少数几个词有关。比如,二阶马尔科夫假设只考虑前面两个词,相应的语言模型是三元(trigram)模型。引入马尔科夫假设的语言模型,也叫做马尔科夫模型。
也就是说,应用了这个假设表明当前这个词仅仅跟前面几个有限的词有关,因此也就不必追溯到最开始的那个词,这样便可以大幅缩减上述算式的长度。
基于马尔科夫假设,可得
P ( w i ∣ w 1 , ⋯ , w i − 1 ) ≈ P ( w i ∣ w i − n + 1 , ⋯ , w i − 1 ) (1.2) P(w_i|w_1,\cdots,w_{i-1}) \approx P(w_i|w_{i-n+1},\cdots,w_{i-1}) \tag{1.2} P(wi∣w1,⋯,wi−1)≈P(wi∣wi−n+1,⋯,wi−1)(1.2)
当 n = 1 n=1 n=1 时称为一元模型(unigram model),公式(1.2)右边会退化成 P ( w i ) P(w_i) P(wi),此时,整个句子的概率为:
P ( w 1 , w 2 , ⋯ , w m ) = P ( w 1 ) ∗ P ( w 2 ) ⋯ P ( w m ) = ∏ i = 1 m P ( w i ) P(w_1,w_2,\cdots,w_m)= P(w_1) * P(w_2) \cdots P(w_m) \\ =\prod_{i=1}^{m} P(w_i) P(w1,w2,⋯,wm)=P(w1)∗P(w2)⋯P(wm)=i=1∏mP(wi)
当 n = 2 n=2 n=2 时称为二元模型(bigram model),公式(1.2)右边会退化成 P ( w i ∣ w i − 1 ) P(w_i|w_{i-1}) P(wi∣wi−1),此时,整个句子的概率为:
P ( w 1 , w 2 , ⋯ , w m ) = P ( w 1 ) ∗ P ( w 2 ∣ w 1 ) ⋯ P ( w m ∣ w m − 1 ) = ∏ i = 1 m P ( w i ∣ w i − 1 ) P(w_1,w_2,\cdots,w_m)= P(w_1) * P(w_2|w_1) \cdots P(w_m|w_{m-1}) \\ =\prod_{i=1}^{m} P(w_i|w_{i-1}) P(w1,w2,⋯,wm)=P(w1)∗P(w2∣w1)⋯P(wm∣wm−1)=i=1∏mP(wi∣wi−1)
当 n = 3 n=3 n=3 时称为三元模型(trigram model),公式(1.2)右边会退化成 P ( w i ∣ w i − 2 , w i − 1 ) P(w_i|w_{i-2},w_{i-1}) P(wi∣wi−2,wi−1),此时,整个句子的概率为:
P ( w 1 , w 2 , ⋯ , w m ) = P ( w 1 ) ∗ P ( w 2 ∣ w 1 ) ⋯ P ( w m ∣ w m − 2 , w m − 1 ) = ∏ i = 1 m P ( w i ∣ w i − 2 , w i − 1 ) P(w_1,w_2,\cdots,w_m)= P(w_1) * P(w_2|w_1) \cdots P(w_m|w_{m-2},w_{m-1}) \\ =\prod_{i=1}^{m} P(w_i|w_{i-2},w_{i-1}) P(w1,w2,⋯,wm)=P(w1)∗P(w2∣w1)⋯P(wm∣wm−2,wm−1)=i=1∏mP(wi∣wi−2,wi−1)
那我们应该如何估计 n-gram 的概率呢?我们可以采用极大似然估计(maximum likelihood estimation,MLE)。即通过从语料库中获取计数,并将计数归一化到(0,1),从而得到 n-gram 模型参数的极大似然估计。即:
P ( w i ∣ w i − n + 1 , ⋯ , w i − 1 ) = c o u n t ( w i − n + 1 , ⋯ , w i ) ∑ w i c o u n t ( w i − n + 1 , ⋯ , w i − 1 , w i ) = c o u n t ( w i − n + 1 , ⋯ , w i ) c o u n t ( w i − n + 1 , ⋯ , w i − 1 ) (1.3) \begin{aligned} P(w_i|w_{i-n+1},\cdots,w_{i-1}) &= \frac {\mathbb{count}(w_{i-n+1},\cdots,w_{i})} {\sum_{w_{i}}\mathbb{count}(w_{i-n+1},\cdots,w_{i-1},w_{i})} \\ &=\frac {\mathbb{count}(w_{i-n+1},\cdots,w_{i})} {\mathbb{count}(w_{i-n+1},\cdots,w_{i-1})} \end{aligned} \tag{1.3} P(wi∣wi−n+1,⋯,wi−1)=∑wicount(wi−n+1,⋯,wi−1,wi)count(wi−n+1,⋯,wi)=count(wi−n+1,⋯,wi−1)count(wi−n+1,⋯,wi)(1.3)
其中, c o u n t ( w i − n + 1 , ⋯ , w i ) \mathbb{count}(w_{i-n+1},\cdots,w_{i}) count(wi−n+1,⋯,wi) 表示文本序列 ( w i − n + 1 , ⋯ , w i ) (w_{i-n+1},\cdots,w_{i}) (wi−n+1,⋯,wi) 在语料库中出现的次数。
下面我们看看来自 《Speech and Language Processing》(3rd ed. draft) 中的两个例子。
首先,我们看一下由 3 个句子组成的小语料库的例子。首先,我们需要对每个句子进行增强,在句首添加
,在句末添加 。
在句首添加
是为了给第一个词添加 bigram 上下文,如果是 trigram 概率,则需要在句首添加
。
在句末添加
是为了使 bigram 称为真正的概率分布。如果没有添加结束符,给定长度的所有句子的概率总和为 1。这个模型将定义一组无限的概率分布,每个长度的句子一个分布。
下面列出这个语料库中的一些 bigram 概率:
下面我们继续看一个伯克利酒店项目的例子。其中一些词出现的数量如下:
图 1.1 显示了部分词的 bigram 统计数。例如,第二行第三列,表示句子中在“want”后面出现“to”的次数为 608。图 1.2 显示归一化后的 bigram 概率。
我们来看看图 1.2 中的概率是如何计算出来的。比如我们需要计算概率值 p(to|want)。根据式(1.3)可知,p(to|want) = count(want, to) / count(want) = 608 / 927 ≈ 0.66。
下面是一些有用的概率值:
现在我们可以计算 I want English food
的二元概率:
P ( < s > i w a n t e n g l i s h f o o d ) = P ( i ∣ < s > ) P ( w a n t ∣ i ) P ( e n g l i s h ∣ w a n t ) P ( f o o d ∣ e n g l i s h ) P ( < / s > ∣ f o o d ) = 0.25 × 0.33 × 0.0011 × 0.5 × 0.68 = 0.000031 \begin{aligned} P( \ &\mathbb{i \quad want \quad english \quad food}) \\\\ &= P(\mathbb{i|P(<s> iwantenglishfood)=P(i∣<s>)P(want∣i)P(english∣want)P(food∣english)P(</s>∣food)=0.25×0.33×0.0011×0.5×0.68=0.000031}) P(\mathbb{want|i}) P(\mathbb{english|want}) \\ &\qquad \qquad \qquad P(food|english) P(|food)\\\\ &= 0.25 \times 0.33 \times 0.0011 \times 0.5 \times 0.68 \\\\ &= 0.000031 \end{aligned}
为了更好地保留词序信息,构建更有效的语言模型,我们希望在 n n n 元模型中选用更大的 n n n。但是,当 n n n 较大时,长度为 n n n 的序列出现的次数就会非常少,在按照公式(1.3)估计 n n n 元条件概率时,就会遇到数据稀疏问题,导致估算结果不准确。因此,一般在百万词级别的语料中,三元模型是比较常用的选择,同时也需要配合响应的平滑算法,进一步降低数据稀疏带来的影响。
由于概率值小于或等于 1,当我们将越多的概率值进行相乘时,得到的乘积将越小。将足够多的 n-gram 概率值进行相乘将可能导致数值下溢。所以通常可以使用对数概率(log probabilities)替代原始概率,这样我们得到的结果将不会太小。
log ( p 1 × p 2 × p 3 × p 4 ) = log p 1 + log p 2 + log p 3 + log p 4 \log(p_1 \times p_2 \times p_3 \times p_4) = \log p_1 + \log p_2 + \log p_3 + \log p_4 log(p1×p2×p3×p4)=logp1+logp2+logp3+logp4
评估语言模型最好的方式是将其嵌入到应用中,然后评估应用的改善程度。这种端到端的评估被称为外部评估(Extrinsic Evaluation)。外部评估是评估某个组件的改善是否真正对整个任务有帮助的唯一方法。比如,对于语音识别,可以运行语音识别器两次,每次使用其中一个语音模型,看看哪个语言模型获取更高的识别准确率。
由于端到端运行大型 NLP 系统的代价是昂贵的,所以我们需要一种能够快速评估语言模型的潜在改善效果的方法。内部评估(Intrinsic evaluation) 可以不依赖任何应用而独立评估语言模型的效果。
如果我们有一个语料库,并且想比较两个 n-gram 模型。首先,我们可以将语料库分为训练集和测试集,并使用训练集训练两个模型;然后,在测试集上比较哪个模型与测试集更符合。
如何判断与测试集更符号呢?答案就是:哪个模型给测试集更高的概率值,哪个模型就更好,因为意味着模型对测试集有更高的预测准确率。
在实际操作中,我们不使用概率值来评估语言模型,而是使用 困惑度(Perplexity,PP)。对于测试集 W = w 1 w 2 ⋯ w m W=w_1 w_2 \cdots w_m W=w1w2⋯wm,困惑度的定义如下:
P P ( W ) = P ( w 1 w 2 ⋯ w m ) − 1 m = 1 P ( w 1 w 2 ⋯ w m ) m = ∏ i = 1 N 1 P ( w i ∣ w 1 ⋯ w i − 1 ) m \begin{aligned} PP(W) &= P(w_1 w_2 \cdots w_m)^{-\frac{1}{m}} \\ &= \sqrt[m]{\frac{1}{P(w_1 w_2 \cdots w_m)}} \\ &= \sqrt[m]{\prod_{i=1}^{N} \frac{1}{P(w_i|w_1\cdots w_{i-1})}} \end{aligned} PP(W)=P(w1w2⋯wm)−m1=mP(w1w2⋯wm)1=mi=1∏NP(wi∣w1⋯wi−1)1
通过 P P ( W ) PP(W) PP(W) 的定义可知,词序列的条件概率越大,困惑度越小。因此,最小化困惑度等价于最大化词序列的概率。
困惑度的改善不能保证会提升语言处理任务(如语音识别、机器翻译)的性能。尽管如此,因为困惑度常常与这些改善有关,所以通常用它对算法进行快速检查。但是,最终需要对实际任务进行端到端评估,以确定模型的改善。
[1] 《Speech and Language Processing》(3rd ed. draft)
[2] 来斯惟——《基于神经网络的词和文档语义向量表示方法研究》
[3] 自然语言处理中N-Gram模型介绍