统计语言模型:自然语言从它产生开始,逐渐演变成一种上下文相关的信息表达和传递方式。因此让计算机处理自然语言,一个基本问题就是为自然语言这种上下文相关的特性建立数学模型,这个数学模型就是在自然语言处理中常说的统计语言模型(Statistical Language Model)。它是今天所有自然语言处理的基础,并且广泛应用于机器翻译、语音识别、印刷体或手写体识别、拼写纠错、汉字输入和文献查询。
目录
1.用数学的方法描述语言规律
2. 高阶语言模型
3.模型的训练、零概率问题和平滑方法
统计语言模型产生的初衷是为了解决语音识别问题。在语音识别中,计算机需要知道一个文字序列是否能构成一个大家理解并且有意义的句子,然后显示或打印给使用者。
比如:
这句话就很通顺,意义也很明白。
如果改变一些词的顺序,或者替换掉一些词,将这句话变成:
意思就含混了,虽然多少还能猜到一点。
但如果再换成:
基本上读者就不知所云了。
第一个句子合乎语法,词义清晰。第二个句子虽不合乎语法,但是词义还算清晰。而第三个句子则连词义都不清晰了。上世纪 70 年代以前,科学家们也是这样想的,他们试图判断这个文字序列是否合乎文法、含义是否正确等。但是语言的结构千变万化,要通过制定规则来覆盖所有的文法根本是不可能的。而弗里德里克·贾里尼克(Frederick Jelinek)换了一个角度,用一个简单的统计模型就很漂亮地搞定了这个问题。
贾里尼克的出发点很简单:一个句子是否合理,就看它的可能性大小如何。上面的例子中,第一个句子出现的概率大致是,第二个句子出现的概率是 ,第三个句子出现的概率是 。因此第一个句子出现的可能性最大,是第二个句子的 10万倍,是第三个句子的一百亿亿亿亿亿亿倍。
用更普遍而严格的描述是:
假定 S 是一个有意义的句子,由一连串特定顺序排列的词 ?1,?2,⋯,??组成,n为句子的长度。那么 S 在文本中出现的可能性就是 S 的概率 P(S)。于是可以把 P(S) 展开表示为:
利用条件概率公式,S 这个序列出现的概率等于每一个词出现的条件概率相乘,于是:
其中表示句子第一个词为的概率;是在已知第一个词的前提下,第二个词出现的概率,以此类推。不难看出,词的出现概率取决于他前面的所有词。
从计算上来看,第一个词的条件概率 ?(?1) 很容易算,第二个词的条件概率 ?(?2∣?1)也还不太麻烦,但是从第三个词的条件概率 ?(?3∣?1,?2)开始就非常难算了,因为它涉及到三个变量 ?1,?2,?3而每个变量的可能性/可能取值都是语言字典的大小。到了最后一个词 ??,条件概率 ?(??∣?1,?2,⋯,??−1) 的可能性太多,根本无法估算。
从 19 世纪到 20 世纪初,俄国有个数学家叫马尔可夫(Andrey Markov),他提出了一种偷懒但还颇为有效的方法:假设任意一个词语 出现的概率只同它前面的词 有关。于是问题就变得很简单了,这种假设在数学上称为马尔可夫假设。
现在,句子S出现的概率就变得简单了:
上面的公式对应的统计语言模型是二元模型(Bigram Model)。当然,也可以假设一个词由前面的 N−1 个词决定,对应的模型稍微复杂些,被称为 N 元模型。
接下来的问题就是如何估计条件概率 。根据它的定义:
而估计联合概率和边缘概率很简单。根据大数定理,只要统计量足够,相对频率就等于概率,因而只需在语料库(corpus)的文本中统计一下这两个词前后相邻出现的次数,以及出现了多少次,然后把这两个数分别处以语料库大小N,即可得到这些词或2元组的概率:
于是:
更一般的,对于n-gram:
这似乎有点难以置信,用这么简单的数学模型就能解决复杂的语音识别、机器翻译等问题,而用很复杂的文法规则和人工智能却做不到。其实很多语言学家都曾质疑过这种方法的有效性,但事实证明,统计语言模型比任何已知的借助某种规则的解决方法更有效。
在基于一阶马尔可夫假设的二元模型(bi-gram/2-gram)中,句子中每个词只和前面一个词有关,这似乎过于简化了,或者说近似地过头了。比如说在句子“美丽的花朵”中,“花朵”其实是和“美丽”有关,也就是说是与前面的第二个词有关。因此,更普遍的假设是某个词和前面的若干个词有关。
正如之前介绍的那样,N 元模型(n-gram)假设每个词 和前面的 N−1 个词有关,与更前面的词无关(不是与前面所有的词相关),这样词 的概率只取决于前面的 N−1 个词 。因此:
这种假设被称为 N−1 阶马尔可夫假设,对应的语言模型称为 N 元模型(N-Gram Model)。N=2时就是之前介绍的二元模型,而 N=1 的一元模型实际上是一个上下文无关模型,即假定当前词的出现概率与前面的词无关。在实际中应用最多的就是 N=3 的三元模型(trigram/3-gram),更高阶的模型就很少使用了。
我们之前在上一篇博客中曾经探讨过这个问题:
1.首先,N 元模型的大小(空间复杂度)几乎是 N 的指数函数,即 ,这里 |V|是一种语言词典的词汇量,一般在几万到几十万个。其次,使用 N 元模型的速度(时间复杂度)也几乎是一个指数函数,即 。因此,N 不能很大。
2.当 N 从 1 到 2,再从 2 到 3 时,模型的效果上升显著。而当模型从 3 到 4 时,效果的提升就不是很显著了,而资源的耗费却增加地非常快。所以,除非是为了做到极致不惜资源,很少有人会使用四元以上的模型。
还有一个问题,三元、四元或更高阶的模型也并不能覆盖所有的语言现象。在自然语言处理中,上下文之间的相关性可能跨度非常大,甚至可以从一个段落跨到另一个段落。因此,即便再怎么提高模型的阶数,对这种情况也无可奈何,这就是马尔可夫模型的局限性,这时就需要采用其他一些长程的依赖性(Long Distance Dependency)来解决这个问题了,如之后学习的神经语言模型LSTM/GRU等可以很好的解决这个问题。
语言模型中所有的条件概率称为模型的参数,通过对语料的统计,得到这些参数的过程(计算这些条件概率)称为模型的训练。前面提到的二元模型训练方法似乎非常简单,只需计算一下前后相邻出现的次数 和 单独出现的次数 的比值即可。而的取值可能是词典中的任意一个单词,即考虑所有可能的组合,基于语料库计算频数、频率及条件概率,对于N元模型也是同理,这样做的话,的很多组合可能没有意义,在语料库中没有出现过,即=0。那么是否意味着条件概率=0?反之,如果,都在语料库中只出现一次,那么能否得到=1,这样非常绝对的结论?
注意词典和语料库不是一个概念,词典基于语料库构建,对语料库分词,去重,调整顺序来构建词典。n-gram模型,可以理解为考虑词典中的所有可能组合,然后基于语料库进行统计,计算条件概率,存储起来,应用时直接查询计算即可。这样考虑所有可能组合,很多组合会没有意义,在语料库中也不会出现,就会存在0概率/数据稀疏的问题,此时需要使用平滑方法,对没有见过的gram赋于一个非0的概率值。
还会面临统计可靠性或统计量不足的问题。在数理统计中,我们之所以敢用对采样数据进行观察的结果来预测概率,是因为有大数定理(Law of Large Number)在背后做支持,它的要求是有足够的观察值。但是在估计语言模型的概率时,很多人恰恰忘了这个道理,因此训练出来的语言模型“不管用”,然后回过头来怀疑这个方法是否有效。那么如何正确地训练一个语言模型呢?
一个直接的办法就是增加数据量,但是即使如此,仍会遇到零概率或者统计量不足的问题。假定要训练一个汉语的语言模型,汉语的词汇量大致是 20 万这个数量级,训练一个三元模型就有 个不同参数。假设抓取 100 亿个有意义的中文网页,每个网页平均 1000 词,全部用作训练也依然只有 。因此,如果用直接的比值计算概率,大部分条件概率依然是零,这种模型我们称之为“不平滑”。
训练统计语言模型的艺术就在于解决好统计样本不足时的概率估计问题。
关于平滑技术的详细介绍,可以阅读这篇博客自然语言处理中N-Gram模型的Smoothing算法
当然,如果对这些平滑算法不是很懂也不必太担心,平滑技术在统计自然语言处理时代,用得比较多;现代的神经网络对语言模型建模的方式,由于本身结构的原因,自动解决了这个问题,我们之后还会学习。