【Stanford - Speech and Language Processing 读书笔记 】3、N-gram Language Models

1、Introduction

语言模型:为一个序列的词分配概率——从前几个词预测后面可能出现的词

语言模型应用广泛——在嘈杂环境下的语音识别、句法语法纠错……

最简单的语言模型——N-gram模型!

 

 

2、N-gram

从一个简单的任务,预测P(w|h)开始。 h是先前的词语序列,根据h我们需要预测h后面出现w的概率。

例如h是“The water is so transparent that”,w 是the。那么我们想知道:

                        

 

 一种计算方法是:

                     

 

然而这种方法并不是总是奏效,特别是语料库并不是足够大的时候。因为语言的可扩展性和复杂性,很多句子语料库是没有的,例如“The Yellow River' water is so transparent that”。

 为了解决这个问题,我们运用链式法则:

                      

 

 我们可以对这个式子做一个简化和近似——马尔科夫假设(Markov assumption),即近似为后一个单词的出现仅仅与前一个单词有关:

                    

 

 在这个例子中就是计算P(the|that)。 那么,一个序列出现的概率为:

                     

 

 这就是二元模型(bigram model)。

 

一个问题出现了,如何去计算P(wk|wk-1)呢? 这里,我们使用极大似然估计法(maximum likelihood estimation),即已知结果,反推参数,使得该参数给定模型下观测结果出现的概率最大。 例如在一个100000个词的语料库中,Chinese这个词出现的次数为400, 那么我们就可以估计Chinese出现的概率最有可能是400/100000。

于是可以计算P(wk|wk-1):

           可以简化为: 

 

实际角度的建议

1、当语料库比较充足时,trigram model、4-gram model、5-gram model的预测效果往往更好。

这些模型统称为 n-gram模型,即通过前n的词预测后一个词的概率。

2、常常使用对数概率替换概率直接相乘积:防止数值下溢

                 

 

 

 

来看一个简单的例子:

伯克利餐馆语料库统计了顾客的询问,例如:

                 

 

 截取一小部分二元统计的结果(经过规范化后):

                

 

那么可以计算“i want to eat english food”的概率:

              

 

             

 

 

3、Evaluating Language Models

外在评估(extrinsic evaluate): 端到端的评估,将训练的模型直接放到实际运用中去检验。这是判断模型是否有改进的唯一办法,但经常因为成本太高而不适用。

内在评估(intrinsic evaluate):独立于实际运用的衡量方法,一般需要一个测试集。测试集必须独立于训练集之外,否则会导致测试的分数过高。

 

如果频繁地使用一个特定的测试集,可能不经意的会使测试集的某些性质发生改变。

为解决这一问题,可以将数据集分为训练集(training set)、开发集(dev-set)、测试集(test set)

训练集用来训练模型,开发集用来选择超参数,测试集用来测试模型

 

复杂度

复杂度(perplexity)用在测试集上,是测试结果的逆概率。

              

 

 其中PP是perplex的简写。使用链式法则:

             

 

当然,上式可以用n-gram模型简化。  

 

对上面的语料库,分别用PP测试unigram、bi-gram、tri-gram、4-gram模型,可以发现PP值是递减的。

 

 

4、Generalization and Zeros

虽然对于n-gram模型,随着n值的增加,模型的效果往往越好,但是也会出现很多问题——

1、随着n的增加,n个连续的词组成的串可能的组合结果呈现指数的增长趋势,这表明所有字串在语料库中出现数量构成的向量是稀疏的(sparse)。

2、由于语言的复杂性,在语料库中可能会出现未知的词语(unknow words)。

 

一方面,如果某个词串出现在测试集但是不出现在训练集,这表明我们低估了它出现的可能性,这将减低模型在运行数据上的表现;

另一方面,如果该词串出现在训练集但是不出现在测试集,我们将无法计算perplexity!

 

对于未知词语的问题。可以采用<UNK>模型,有两种方法来训练该模型:

1、先预先给定一个固定的词汇库, 对于未知的词语,将其统一记为<UNK>,最后统计<UNK>出现的次数计算概率。

2、没有预先给定的词汇库,而是把训练集中出现个数小于n的词置为<UNK>,或者将训练集出现次数从大到小前V个以外的单词置为<UNK>

 

 

5、Smoothing

我们如何处理词汇表中的单词(它们不是未知单词)但出现在测试集中的未知上下文中(例如,它们出现在训练中从未出现过的单词之后)?

防止语言模型分配这些看不见的事件的概率为零,我们必须削减一点概率,从一些更频繁的事件中获取大量信息,并将其赋予我们从未见过的事件。

这中方法称为平滑(Smoothing),以下介绍几种平滑方法:Laplace (add-one) smoothing,  add-k smoothing, stupid backoff,  Kneser-Ney smoothing.

 

Laplace Smoothing

计算概率时分子分母同时加1:

        

 

 例如unigram模型:

            

 

Add-k Smoothing

计算概率时分子分母同时加k:

          

 

 

Backoff and Interpolation

回退(Backoff):例如计算但是没有的实例时,可以用代替,如果计算仍然没有实例的话,则一直回退下去。

 

插值(Interpolation): n-gram的模型可以用n-gram,(n-1)-gram......unigram的加权混合表示。例如:

         

 

 插值的计算可以更精确一些:

         

 

在一个额外的语料库中,利用极大似然语料库的概率计算lambda函数,一般采用EM算法计算。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

posted @ 2022-01-06 20:43  鱼儿冒个泡  阅读(119)  评论(0编辑  收藏  举报