以下内容学习、摘录自《数学之美》
统计语言模型( Statistical Language Model),是今天所有自然语言处理的基础,并且广泛应用于机器翻译、语音识别、印刷体或手写体识别、拼写纠错、汉字输入和文献查询。
举个栗子:
信息服务部在2017年共建设项目77个,保障系统运行正常率99%。
这句话就很通顺,意思也很明白。如果改变一些词的顺序,或者替换掉一些词,将这句话变成:
信息服务部77个建设项目,保障正常率99%系统运行在2017年。
意思就含混了,虽然多少还能猜到一点。但是如果再换成:
77正常率个信息服务部建设运行99%项目,保障系统在2017年。
基本上读者就不知所云了。如果问一个没有学过自然语言处理的人,句子为什么会变成这样,他可能会说,第一个句子合乎语法,词义清晰。第二个句子虽不合乎语法,但是词义还算清晰。而第三个句子则连词义都不清晰了。上个世纪70年代以前,科学家们也是这样想的,他们试图判断这个文字序列是否合乎文法、含义是否正确等。正如我们上节所讲,这条路走不通。
而贾里尼克换了一个角度,用一个简单的统计模型很漂亮地搞定了这个问题:一个句子是否合理,就看它的可能性大小如何。至于可能性就用概率来衡量。
假定S表示某一个有意义的句子,由一连串特定顺序排列的词W1,W2,…,Wn组成,这里n是句子的长度(句子中词汇的个数)。于是S出现的可能性也就是数学上所说的S的概率P(S)=P(W1, W2, ..., Wn)。
利用条件概率公式,以上算式可以展开为:
P(W1, W2, ..., Wn) = P(W1)*P(W2|W1)*P(W3|W1,W2)...P(Wn|W1,W2,...,Wn-1)
其中P(W1)表示第一个词W1出现的概率;P(W2|W1)是在已知第一个词的前提下,第二个词出现的概率;以此类推,词Wn出现的概率取决于它前面所有的词。
从计算上来看,第一个词的条件概率P(W1)很容易算,第二个词的条件概率P(W2|W1)也还不太麻烦,第三个词的条件概率P(W3|w1,w2)已经非常难算了,因为它涉及到三个变量W1,W2,W3,每个变量的可能性都是种语言字典的大小。到了最后一个词Wn,条件概率P(wn|w1,w2,…,Wn-1)的可能性太多,无法估算。怎么办?从19世纪到20世纪初,俄国有个数学家叫马尔可夫( Andrey Markov),他提出了一种偷懒但还颇为有效的方法,也就是每当遇到这种情况时,就假设任意一个词Wi出现的概率只同它前面的词Wi-1有关,于是问题就变得很简单了。这种假设在数学上称为马尔可夫假设。
现在,S出现的概率就变得简单了:
P(S)=P(W1)*P(W2|W1)*P(W3|W2)...P(Wn|Wn-1)
上述公式就是统计语言模型的二元模型(Bigram Model)。接下来的问题就是如何计算P(Wn|Wn-1),根据概率论,该公式可以变化为:
P(Wn|Wn-1)=P(Wn-1,Wn)/P(Wn-1)
因为在互联网时代有大量的语料库(Corpus)可以作为训练样本,所以只要数一数Wn-1、Wn这对词在语料库中前后相邻出现了多少次,以及Wn-1本身在相同的语料库中出现了多少次,就可得到P(Wn|Wn-1)。
现在,读者也许已经开始能感受到数学的美妙之处了,它把一些复杂的问题变得如此简单。这似乎有点让人难以置信,用这么简单的数学模型能解决复杂的语音识别、机器翻译等问题,而用很复杂的文法规则算法却做不到。其实不光是普通人,就连很多语言学家都曾质疑过这种方法的有效性,但事实证明,统计语言模型比任何已知的借助某种规则的解决方法更有效。我们不妨看三个真实的例子:第一个例子是原本名不见经传的李开复一下子成了语音识别领域的顶级科学家;第二个例子是 Google的机器翻译项目罗塞塔在起步很晩、以及两年内便一鸣惊人地夺得NIST评测第一;第三个例子是虽然以前在实验室中有不少科学家能够让计算机回答简单的问题,比如“中国的人口是多少?”,但是没有计算机能够回答“为什么”和“怎么做”这一类的难题,比如“为什么天空是蓝色的?”,而利用统计语言模型结合大数据,在很大程度上能够人工合成出这些问题的答案。
统计语言模型称为N元模型(N- Gram Model)。如果N=2,那么就是上面的二元模型公式(3.3)。而N=1的一元模型实际上是一个上下文无关的模型,也就是假定当前词出现的概率与前面的词无关。而在实际中应用最多的是N=3的三元模型,更高阶的模型就很少使用了。为什么N取值一般都这么小呢?这主要是因为复杂度,当N从1到2,再从2到3时,模型的效果上升显著。而当模型从3到4时,效果的提升就不是很显著了,而资源的耗费却增加得非常快。Google的罗塞塔翻译系统和语音搜索系统,使用的是四元模型,该模型存储于500台以上的 Google服务器中。
使用语言模型需要知道模型中所有的条件概率,我们称之为模型的参数。通过对语料的统计,得到这些参数的过程称作模型的训练。在数理统计中,我们之所以敢用对采样数据进行观察的结果来预测概率,是因为有大数定理( Law of Large Numbers)在背后做支持,它的要求是有足够的观测值。例如,在某镇中心的楼上,看到楼下熙熙攘攘的人群中有550个男性,520个女性,我们大致可以认为这个地方男性出现的概率是550/(550+520)=51.4%,而女性出现的概率为520/(550+520)=48.6%。但是,某天一大早,我们从楼上看下去,只有5个人4个女性1个男性,我们敢不敢说,女性出现的概率为80%,而男性只有20%呢?显然不敢,因为这5个人出现的情况有非常大的随机性。这是生活中的常识。但是在估计语言模型的概率时,很多人恰恰忘了这个道理,因此训练出来的语言模型“不管用”,然后回过头来怀疑这个方法是否有效。其实这个方法屡试不爽,今天的数字通信很大程度就建立在这个基础上,问题在于如何使用。训练统计语言模型的艺术就在于决绝好统计样本不足时的概率估计问题。
模型训练中另一个重要的问题就是训练数据,或者说语料库的选取。如果训练语料和模型应用的领域相脱节,那么模型的效果往往会大打折扣。比如,某个语言模型的应用是网页搜索,则该模型的训练数据就应该是杂乱的网页数据和用户输入的搜索串,而不是传统的、规范的新闻稿,即使前者夹杂着噪音和错误。这里有一个很好的例子:因为开发者认为《人民日报》的语料干净、无噪音,就用来训练web搜索引擎,但实际得到的效果较差。后来改用爬取的网页来训练,尽管有很多噪音,但是因为训练数据和应用数据一致,反而有很好的搜索质量。
在训练数据和应用数据一致并且训练量足够大的情况下,训练语料的噪音高低也会对模型的效果产生一定的影响,因此,在训练之前有时需要对训练数据进行预处理。一般情况下,少量的(没有模式的)随机噪音清除起来成本非常高,通常就不做处理了。但是对于能找到模式( Pattern)的、量比较大的噪音还是有必要过滤的,而且它们也比较容易处理,比如网页文本中存在的大量制表符。
数学的精彩之处就在于简单的模型可以干大事。