四、语言模型

1. 啥是语言模型?

语言模型就是衡量一个句子是不是一个符合语法、符合语义的好句子的模型。举个例子,现在有一句话:“What can I ___?”语言模型要能选择最合适的单词,使得这句话非常合理。它用于:语音识别、字符识别(OCR)、手写体识别、分词、机器翻译、语言生成、问答等等领域。语言模型总体上就是一个概率模型,用 $p(s)$ 表示句子 $s$ 合理的概率。

2. N-gram 语言模型

我们从最初的形式说起。假如 $s$ 包含了词 $w_1,w_2,\cdots,w_{n-1}$,一直到最后一个词 STOP。注意这是一个序列,顺序是影响结果的。那么我们可以这样表示:

\[\begin{align*} p(s)&=P(X_1=w_1,\cdots,X_n=STOP)\\ &=P(X_1=w_1)P(X_2=w_2|X_1=w_1)\cdots P(X_n=STOP|X_1=w_1,\cdots,X_{n-1}=w_{n-1}) \end{align*}\]

只是用了一步很基础的链式法则而已。但是,当 $i$ 很大的时候,$X_i$ 这个词受到前面所有词的影响,一方面这需要的记忆量很大,另一方面也没必要,其实只有前面一些词影响它。那怎么办呢,我们简单地认为:只有这个词的前多少多少个词会影响它,这就叫马尔科夫假设(Markov assumption)。

  • 如果认为每个词是独立的,前面的词完全不影响,即 $P(X_i=w_i\vert X_1=w_1,\cdots,X_{i-1}=w_{i-1})=P(X_i=w_i)$,那就很好算,$P(X_i=w_i)$ 就是语料库中 $w_i$ 的出现次数除以总词数,本质上就是词袋模型,我们称之为 Unigram Language Model
  • 如果使用一阶马尔科夫假设(First-order Markov assumption),即 $P(X_i=w_i\vert X_1=w_1,\cdots,X_{i-1}=w_{i-1})=P(X_i=w_i\vert X_{i-1}=w_{i-1})$,也就是只受前一个词影响,就叫 Bigram LM,LM 就是语言模型。而 $P(w_i\vert w_{i-1})=\frac{count(w_{i-1},w_i)}{count(w_{i-1})}$,也就是两个词连着出现的次数,除以 $w_{i-1}$ 出现的次数。
  • 那也就还有二阶马尔科夫假设(Second-order Markov assumption),对应 Trigram LM,以及 4-gram LM 和 5-gram LM。我们最常用的是 Trigram LM,它的概率 $p(w_i\vert w_{i-2},w_{i-1})=\frac{count(w_{i-2},w_{i-1},w_i)}{w_{i-2},w_{i-1}}$。

那如何衡量在测试集上的准确度呢?

我们已经训练好了模型 $p$,现在面对一个有 $M$ 个词的测试集 $D$,其中每个句子都是通顺的,因此 $p(s)$ 应该越高越好。那么全部乘起来,$\prod\limits_{s\in D} p(s)$ 也是越大越好。取对数并取平均,并且变为损失,则交叉熵为:

\[-\frac{1}{M}\sum_{s\in D}\log p(s)\]

非常莫名其妙的是,课件中又定义了一个困惑度

\[Perplexity(D)=2^{-\frac{1}{M}\sum_{s\in D}\log p(s)}\]

就是把交叉熵损失放在指数上了,也不知道为啥专门定义一个这个,用损失不好吗。但是反正困惑度是衡量语言模型性能的指标,记住就好。困惑度也是越低越好。但是需要注意,困惑度低不代表模型一定好,还是需要结合实际应用来看。

做道例题吧!

假如有测试集 $D$,它包含词汇集 $V$,也就是测试集中的所有词都取自 $V$。同时我们的语言模型非常的智障,每一个词的预测都是随机从词汇表里面挑一个词,加上 STOP,也就是每个词抽到的概率为 $\frac{1}{\vert V\vert+1}$。此时的困惑度是多少呢?

解: 每个词抽到的概率都是 $\frac{1}{\vert V\vert+1}$,一整个句子的 $p(s)=(\frac{1}{\vert V\vert+1})^n$,代入整个数据集:

\[\sum_{s\in D}\log p(s)=\sum_{s\in D}n_s\log\frac{1}{|V|+1}=M\log\frac{1}{|V|+1}\]

再代入困惑度的公式,则 $Perplexity(D)=\vert V\vert+1$。这个例子也证明了,如果每次都瞎猜,困惑度就等于词汇总数。

再用一个例题检验你是否会训练一个 n-gram 模型。

训练集如下: I love pku. I like thu. You love pku. You do not like thu. 构建 bigram 模型后,估计:$p(thu\vert like),p(like\vert I)$,并计算下述句子的困惑度: You like pku. I hate pku.

解: bigram 模型就是当出现前一个词的时候,后一个词的占比。比如 $p(thu\vert like)$,在训练集中,出现 $like$ 的次数为两次,且每次后面接的都是 $thu$,因此 $p(thu\vert like)=1$。同理可计算出 $p(like\vert I)=0.5$。为了求 START You like pku STOP 的困惑度,注意要考虑 START 和 STOP!我们需要求 $P(you\vert START)$,$P(like\vert you)$ 等等,大家自己算吧。

3. N-gram 模型的优化

说是优化,其实是修 bug。假如测试集出现了一个从未见过的组合或词语,它的概率就是 0,这个句子的 $p(s)$ 也就变成 0 了,这不炸了嘛。因此我们需要给这种情况赋一些微小的值,具体而言有下面这些方法:

i. Back-off

如果使用 Trigram 模型,但是在训练集上没有见过 I love pku 这种三元组,可以考虑回退(Back-off)至二元组 love pku,用 $p(pku\vert love)$ 代替 $p(pku\vert I\;love)$。

ii. 线性插值

直接将零阶、一阶和二阶等进行线性插值。即:

\[p_{train}(w_i|w_{i-2},w_{i-1})=\lambda_1 p(w_i|w_{i-2},w_{i-1})+\lambda_2 p(w_i|w_{i-1})+\lambda_3 p(w_i)\]

需要保证 $\lambda_1+\lambda_2+\lambda_3=1$ 以保证归一化。

iii. Stupid Back-Off

这个其实不应该单列一小部分,因为这只是上面两种方法的简单结合。但是这是 Google 曾经用过的方法,公式很简单,如果有 Trigram。就用 Trigram,否则用 $0.4$ 倍的 Bigram。我也不知道为什么效果会这么好。注意一下这不是概率模型,因为没有 Trigram 时的概率没有归一。

iv. Add-One Smoothing

又叫拉普拉斯平滑,就是给分子加 1,给分母加总词数。拿 Bigram 举例:

\[p_{add}(w_i|w_{i-1})=\frac{count(w_{i-1},w_i)+1}{count(w_{i-1})+|V|}\]

v. Good-Turing Discounting

我暂时不理解这个算法的动机,因此先看看怎么算吧。

首先统计 $N_r$ 为出现 $r$ 次的 n-gram 数量,也就是所有 $n$ 个单词组成的组合的数量。然后,定义 $N_{all}$ 为总数量,也就是 $N_1+2N_2+\cdots$,其实就是 $count(w_{i-1})$。接着重定义 $count$ 运算,如果原来算出来是 $r$,就改成 $r^=(r+1)\frac{N_{r+1}}{N_r}$。最后,概率 $p=\frac{r^}{N_{all}}$。而对于没出现过的情况,概率 $p=\frac{N_1}{N_{all}}$。

vi. Absolute Discounting

这是根据上一种方法来的,在上一种方法中,大家发现了不管什么情况,$r^*$ 都近似于 $r-0.75$,因此大家就简单改为:

\[p_{abd}(w_i|w_{i-1})=\frac{count(w_{i-1},w_i)-d}{count(w_{i-1})}+\lambda(w_{i-1})p(w_i)\]

其中,$p(w_i)$ 是低阶 unigram,$\lambda(w_{i-1})$ 是自定义的权重,用于补全前面扣除的概率质量。

vii. Kneser-Ney Smoothing

现在常用的方法,但是课件没细讲,应该是不考吧。大家自行搜索。

Leave a comment