前言

        语言模型是针对某种语言建立的概率模型,目的是建立一个能够描述给定词序列在语言中的出现的概率的分布。

         给定下边两句话:

                 定义机器人时代的大脑引擎,让生活更便捷、更有趣、更安全。 

                 代时人机器定义引擎的大脑,生活让更便捷,有趣更,安更全。

         语言模型会告诉你,第一句话的概率更高,更像一句”人话”。

        语言模型是用来约束单词搜索的。它定义了哪些词能跟在上一个已经识别的词的后面(匹配是一个顺序的处理过程),这样就可以为匹配过程排除一些不可能的单词。大部分的语言模型都是使用n-gram模型,它包含了单词序列的统计和有限状态模型,它通过有限状态机来定义语音序列。有时候会加入权值。为了达到比较好的识别准确率,语言模型必须能够很好的约束空间搜索,也就是说可以更好的预测下一个词。语言模型是约束词汇包含的单词的,这就出现一个问题,就是名字识别(因为名字可以随便由几个单词组成)。为了处理这种情况,语言模型可以包含更小的块,例如亚单词,甚至音素。但是这种情况,识别准确率将会低于基于单词的语言模型。

        语言模型技术广泛应用于语音识别、OCR、机器翻译、输入法等产品上。语言模型建模过程中,包括词典、语料、模型选择,对产品的性能有至关重要的影响。Ngram模型是最常用的建模技术,采用了马尔科夫假设,目前广泛地应用于工业界。

语言模型的技术难点

        语言模型的性能,很大程度上取决于语料的质量和体量。和特定任务匹配的大语料,永远是最重要的。但是实际应用中,这样的语料往往可遇不可求。

        传统的Ngram建模技术,对长距离的依赖处理的欠佳。如工业界常用的四元模型,即当前词的概率,只依赖三个历史词。因此,更远距离的历史词在建模中,没有对当前词概率产生影响。

        此外,Ngram模型建模的参数空间过于庞大。同样以四元模型为例,词典大小为V,参数空间就是V4。实际应用中V大小为几万到几百万,可想而知,参数空间有多大。在这样的参数规模下,多大的数据显得都有些稀疏。

        近年来提出的神经网络语言模型技术,一定程度上解决了参数空间大,长距离依赖的问题。而且对于相似的词,概率估计上自带一定程度的平滑,从另一个角度解决了数据稀疏的问题。但是神经网络语言模型的缺点是训练时间长,实际应用中查询速度较慢,需要结合硬件做加速。

1. 语言模型的目的

        提到语言模型,给一个大家最熟悉的使用场景就是输入法,智能拼音输入法,打出一串拼音,直接给出了合适的句子,即使不是你想要的,但确实是符合语法习惯的,例如,你的名字叫“福贵”你输入了“fugui”,出来的可能是“富贵”,但不会出来“抚跪”,这就是语言模型的功劳!~~~~

        一句话,语音识别中语言模型的目的就是根据声学模型输出的结果,给出概率最大的文字序列!~~~

2. n-gram语言模型

        1)n-gram概念

        p(S)=p(w1,w2,w3,w4,w5,…,wn) = p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)                  //链规则

        p(S)被称为语言模型,即用来计算一个句子概率的模型。

那么,如何计算p(wi|w1,w2,...,wi-1)呢?最简单、直接的方法是直接计数做除法,如下:

        p(wi|w1,w2,...,wi-1) = p(w1,w2,...,wi-1,wi) / p(w1,w2,...,wi-1)

但是,这里面临两个重要的问题:数据稀疏严重;参数空间过大,无法实用。

        2)基于马尔科夫假设(Markov Assumption):下一个词的出现仅依赖于它前面的一个或几个词。

        假设下一个词的出现依赖它前面的一个词,则有:

        p(S)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1) = p(w1)p(w2|w1)p(w3|w2)...p(wn|wn-1)   // bigram

        假设下一个词的出现依赖它前面的两个词,则有:

        p(S)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1) = p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|wn-1,wn-2)   // trigram

那么,我们在面临实际问题时,如何选择依赖词的个数,即n。当n取0、1、2时,n-gram模型分别称为unigram、bigram和trigram语言模型。

更大的n:对下一个词出现的约束信息更多,具有更大的辨别力;

更小的n:在训练语料库中出现的次数更多,具有更可靠的统计信息,具有更高的可靠性。

理论上,n越大越好,经验上,trigram用的最多,尽管如此,原则上,能用bigram解决,绝不使用trigram。

        3)构造语言模型

        通常,通过计算最大似然估计(Maximum Likelihood Estimate)构造语言模型,这是对训练数据的最佳估计,公式如下:

        p(w1|wi-1) = count(wi-1, wi) / count(wi-1)

       如给定句子集:

        “ I am Sam

          Sam I am

          I do not like green eggs and ham

       部分bigram语言模型如下所示:

       

 

        句子“ I am Sam 的概率为:

        p( I am Sam  ) = p(I|) ×  P(am|I) ×  P(Sam|am)  ×  P(|Sam)  = 0.67 * 0.67 * 0.5 * 0.5 = 0.112225

        为了避免数据溢出、提高性能,通常会使用取log后使用加法运算替代乘法运算。

        log(p1*p2*p3*p4) = log(p1) + log(p2) + log(p3) + log(p4)

        count(X)表示在训练语料中出现的次数,训练语料的规模越大,参数估计的结果越可靠。但即使训练数据的规模很大,如若干GB,还是会有很多语言现象在训练语料中没有出现过,这就会导致很多参数(某n元对的概率)为0。举个例子来说明一下,IBM Brown利用366M英语语料训练trigram,结果在测试语料中,有14.7%的trigram和2.2%的bigram在训练中没有出现;根据博士期间所在的实验室统计结果,利用500万字人民日报训练bigram模型,用150万字人民日报作为测试语料,结果有23.12%的bigram没有出现。这种问题也被称为数据稀疏(Data Sparseness),解决数据稀疏问题可以通过数据平滑(Data Smoothing)技术来解决。 (加法平滑/线性插值平滑/katz平滑/)  

3. n-gram解码算法

对于音字转换问题,输入拼音nixianzaiganshenme,可能对应着很多转换结果,对于这个例子,可能的转换结果如下图所示(只画出部分的词语节点),各节点之间构成了复杂的网络结构,从开始到结束的任意一条路径都是可能的转换结果,从诸多转换结果中选择最合适的结果的过程就需要解码算法。

 

相关链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: