马尔可夫链1-初探马尔可夫

马尔可夫链1-初探马尔可夫

初探马尔可夫链,内容取自吴军所著《数学之美》。

用数学的方法描述语言的规律

假定S表示某一个有意义的句子,由一连串特定顺序排列的句子w1, w2, … wn组成,这里n是句子的长度。现在,我们想知道S在文本中出现的可能性,也就是数学上所说的S的概率P(S)。当然,可以把人类有史以来讲过的话统计一下,同时不要忘记统计进化了几百年上千年可能讲过的话,就知道这句话可能出现的概率了。这种方法恐怕连傻子都知道行不通。因此,需要有个模型来估算它。既然S=w1, w2, … wn,那么不妨把P(S)展开表示:

P(S)=P(w1,w2,,wn)(1)

利用条件概率公式,S这个序列出现的概率等于每一个词出现的条件概率相乘,于是P(w1, w2, … wn)可展开为:
P(w1,w2,,wn)=P(w1)P(w2|w1)P(w3|w1,w2)P(wn|w1,w2,,wn1)(2)

其中P(w1)表示第一个词w1出现的概率;P(w2|w1)是在已知第一个词的前提下,第二个词出现的概率;以此类推。不难看出,到了词wn,它出现的概率取决于它前面的所有词。

从计算上看,第一个词的条件概率P(w1)很容易算,第二个词的条件概率P(w2|w1)还不算麻烦,第三个词的条件概率P(w3|w1w2)已经非常难算了,因为它涉及到三个变量w1, w2, w3,每个变量的可能性都是一种语言字典的大小。到了最后一个词wn,条件概率P(wn|w1, w2, … ,wn)的可能性太多,无法估算。怎么办?

19世纪初到20世纪初,俄罗斯有个数学家叫马尔可夫(Andrey Markov),他给了个偷懒但还颇为有效的方法,也就是每当遇到这种情况时,就假设任意一个词wi出现的概率只同它前面的词wi-1有关,于是问题就变得很简单了。这种假设在数学上称为马尔可夫假设。现在,S出现的概率就变得简单了:

P(S)=P(w1)P(w2|w1)P(w3|w2)P(wi|wi1)P(wn|wn1)(3)

上述公式对应统计语言模型是二元模型(Bigram Model)。顺便提一句,和语言模型相关的很多名词的中文翻译,最早是由《数学之美》作者吴军在20多年前提出的,依然沿用至今。Bigram Model 当初译为二元文法模型,现在吴军觉得直接叫做二元模型更准确。当然,也可以假设一个词由前面的N-1个词决定,对应的模型稍微复杂些,被称为N元模型。

那么接下来的问题就是如何计算条件概率P(wi|wi-1),问题就回归到了下面这个大家都熟知公式了:

P(wi|wi1)=P(wi,wi1)P(wi1)(4)

高阶语言模型

上一节中模型的假设前提是,句子中每个词只和前面一个词有关,而和更前面的词就无关了,这似乎太简化了,或者说近似得过头了。确实是这样,读者很容易找到一些例子:某个词和前面第二个词有关,比如说“美丽的花朵”,花朵其实和美丽有关,。因此,更普遍的假设是某个词和前面若干词有关。

假定文本中的每个词wi和前面的N-1个词有关,而与更前面的词无关,这样当前词wi的概率只取决于前面N-1个词P(wi-N+1, wi-N+2, … , wi-1),因此

P(wi|w1,w2,,wi1)=P(wi|wiN+1,wiN+1,,wii)(5)

上述公式的这种假设被称为N-1阶马尔可夫假设,对应的语言模型称为N元模型(N-Gram Model)。N=2的二元模型就是第一节中提到的公式(3)。而N=1的一元模型实际上是一个上下文无关的模型,也就是假定当前词出现的概率与前面的词无关。而在实际应用中最多的是N=3的三元模型,更高阶的模型就很少使用了。

为什么N一般取值都这么小呢?这里主要由两个原因。首先,N元模型的大小(或者说空间复杂度)几乎是N的指数函数,即O(|V|N),这里|V|是一种语言词典的词汇量,一般在几万到几十万个。而使用N元模型的速度(或者说时间复杂度),也几乎是一个指数函数,即O(|V|N-1)。因此,N不能很大。当N从1到2,再从2到3时,模型的效果上升显著。而当模型从3到4时,效果的提升就不是很显著了,而资源的耗费增加却非常快,所以,除非是不惜资源为了做到极致,很少有人使用四元以上的模型。Google的罗塞塔翻译系统和语言搜索系统,使用的是模型,该模型存储于500台以上的Google服务器中。

最后还有一个问题,是否三元或者四元甚至更高阶的模型就能覆盖所有的语言现象呢?答案显然是否定的。因为自然语言中,上下文之间的相关性可能跨度非常大,甚至可以从一个段落跨到另一个段落。因此,即使模型的阶数再提高,对这种情况也无可奈何,这就是马尔可夫假设的局限性,这时就要采用其他一些长程的依赖性(Long Distance Dependency)来解决这个问题了。

模型的训练、零概率问题和平滑方法

使用语言模型需要知道模型中所有的条件概率,我们称之为模型的参数。通过对语料的统计,得到这些参数的过程称作模型的训练。在前一节中提到的模型训练方法,似乎非常简单。比如对二元模型,就是拿两个数字,一个是(wi-1, wi)在语料中同现的次数#(wi-1, wi),另一个是(wi-1)在语料中单独出现的次数#(wi-1),计算下比值即可。但问题是,如果同现的次数#(wi-1, wi)=0怎么办,是否意味着条件概率P(wi|wi-1)=0?反过来如果#(wi-1, wi)和#(wi-1)都只出现一次,是否可以得出P((wi|wi-1))=1这样非常绝对的结论?这就涉及到统计的可靠性问题了。

在数理统计中,我们之所以敢于用对采样数据的观察结果来预测概率,是因为有大数定理(Law of Large Numbers)在背后做支持,它的要求是有足够的观测值。例如,在某镇中心的楼上,看到楼下熙熙攘攘的人群中又550个男性,520个女性,我们大致可以认为这个地方男性出现的概率是550 / (550+520) = 51.4%, 而女性为48.6%。但是,如果是一大早,我们从楼上看下午,只有5个人,4个女性和1个男性,我们是否敢说,这个地方女性占80%,男性占20%呢?显然不敢,因为这5个人出现的情况有非常大的随机性。也许第二天早晨,楼下只有3个人且全是男性,我们同样不敢得到女性不会出现在这里的预测。

这是生活中的常识。但是在估计语言模型的概率时,很多人恰恰忘了这个道理,因此训练出来的模型“不管用”,然后回过头来怀疑这个方法是否有效。其实这个方法屡试不爽,今天的数字通信很大程度就建立在这个基础上,只是如何使用的问题而已。那么如何正确地训练一个语言模型呢?

一个直接的办法就是增加数据量,但是即使如此,依然会遇到零概率或者统计量不足的问题。假定要训练一个汉语的语言模型,汉语的词汇量大致是20万这个量级,训练一个三元模型就有200 0003 = 8 * 1015个不同的参数。加入从互联网上刨去垃圾数据,有十亿个有意义的中文网页,这已经是相当高估的数据,每个网页平均1000词。那么即使互联网上全部的中文内容都用作训练,依然只有1013,远远小于8 x 1015,因此,如果用直接的比值计算概率,大部分条件概率依然是零,这种模型我们称之为“不平滑”。在实际应用中,统计语言模型的零概率问题是无法回避的,必须解决。

训练统计语言模型的艺术就在于解决好统计样本不足时的概率估计问题。1953年古德(I. J. Good) 在他老板图灵(Alan Turing)的指导下,提出了在统计中相信可靠的统计数据,而对不可信的统计数据打折扣的一种概率估计方法,同时将折扣出来的那一小部分概率给予未看见的事件(Unseen Events)。古德和图灵还给出了一个很漂亮的重新估算概率的公式,这个公式后来被称为古德-图灵估计(Good-Turing Estimate)。

古德-图灵估计的原理是这样的:对于没有看见的事件,我们不能认为它发生的概率就是零,因此我们从概率的总量(Probability Mass)中,分配一个很小的比例给予这些没有看见的事件。这样一来,看见的哪些事件的概率总和就小于1了,因此,需要将所有看见的事件概率调小一点。至于小多少,要根据“越是不可信的统计折扣越多”的方法进行。
图1这里写图片描述

以统计词典中的每个词的概率为例,来说明古德-图灵估计公式。

假定在语料库中出现r次的词有Nr个,特别的,未出现的词数量为N0。语料库的大小为N。那么,很显然

N=r=1Nr(6)

出现r次的词在整个语料库中的相对频度(Relative Frequency)则是r/N,如果不做任何优化处理,就以整个相对频度作为这些词的概率估计。

现在假定当r比较小时,他的统计可能不可靠,因此出现r次的那些词在计算他们的概率时要使用更小一点的次数,是dr(而不直接使用r),古德-图灵估计按照下面的公式计算dr:

dr=(r+1)Nr+1Nr(7)

显然
rdrNr=N(8)

一般来说,出现一次的词的数量比出现两次的多,出现两次的比出现三次的多。这种规律称为Zipf定律(Zipf’s Law)。下图示一个小语料库中,出现r次的词数量Nr和r的关系。
图2 这里写图片描述
可以看出r越大,词的数量Nr越小,即Nr+1 < Nr。因此,一般情况下dr < r,而d0 > 0这样就给出未出现的词赋予了一个很小的非零值,从而解决了零概率的问题。同时下调了出现频率很低的词的概率。当然,在实际的自然语言处理中,一般对出现次数超过某个阈值的词,频率不下调,只对出现次数低于这个阈值的词,频率才下调,下调得到的频率总和给未出现的词。

这样出现r次的词的概率估计为dr/N。于是,对于频率超过一定阈值的词,他们的概率估计就是他们在语料库中的相对频度,对于频率小于这个阈值的词,它们的概率估计就小于他们的相对频度,出现次数越少的,折扣越多。对于未看见的词,也给予了一个比较小的概率。这样所有词的概率估计都很平滑了。

对于二元组(wi-1, wi)的条件概率估计P(wi-1|wi)也可以做同样的处理。我们知道,通过前一个词wi-1预测后一个词wi时,所有可能情况的条件概率总和应该为1,即

wiVP(wi|wi1)=1(9)

对于出现次数非常少的二元组(wi-1, wi),他们的出现次数需要按照古德-图灵的方法打折扣,这样 wi1,wiseenP(wi|wi1)<1 ,同时意味着有一部分概率量没有分配出去,留给了没有看到的二元组(wi-1, wi)。基于这种思想,估计二元模型概率的公式如下:
P(wi|ww1)=f(wi|wi1)fgt(wi|wi1)Q(wi1)f(wi)(wi1,wi)T0<(wi1,wi)<Totherwise(10)

其中T是一个阈值,一般在8-10左右,函数fgt()表示经过古德-图灵估计后的相对频度,而
Q(wi1)=1wiseenP(wi|wi1)wiunseenf(wi)(11)

这样可以保证等式(9)成立。

这种平滑的方法,最早由前IBM科学家卡茨(S. M. Katz)提出,故称为卡茨退避法(Katz backoff)。类似地,对于三元模型,概率估计的公式如下:

P(wi|wi2,wi1)=f(wi|wi2,wi1)fgt(wi|wi2,wi1)Q(wi2,wi1)f(wi|wi1)(wi2,wi1,wi)>T0<(wi2,wi1,wi)<Totherwise(12)

对于一般情况的N元模型概率估计公式,以此类推。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值