语音识别-语言模型

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)

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

基于马尔科夫假设(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取1、2、3时,n-gram模型分别称为unigram、bigram和trigram语言模型。

  • 更大的n:对下一个词出现的约束信息更多,具有更大的辨别力
  • 更小的n:在训练语料库中出现的次数更多,具有更可靠的统计信息,具有更高的可靠性。

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

2)构造语言模型

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

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

如给定句子集“<s> I am Sam </s>

         <s> Sam I am </s>

         <s> I do not like green eggs and ham </s>”

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

c(wi)如下:

c(wi-1,wi)如下:

则bigram为:

那么,句子“<s> I want english food </s>”的概率为:

    p(<s> I want english food </s>)=p(I|<s>)

                      ×  P(want|I) 

                      ×  P(english|want)  

                      ×  P(food|english)  

                      ×  P(</s>|food)

                      =  0.000031

为了避免数据溢出、提高性能,通常会使用取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)技术来解决。 

3. 数据平滑

1)加法平滑

基本思想是为避免零概率问题,将每个n元对得出现次数加上一个常数δ(0<δ≤1):

clip_image016

承接上一节给的例子,经Add-one Smoothing后,c(wi-1, wi)如下所示:

则bigram为

在V >> c(wi-1)时,即训练语料库中绝大部分n-gram未出现的情况(一般都是如此),Add-one Smoothing后有些“喧宾夺主”的现象,效果不佳。

2)Good-Turing Smoothing

利用频率的类别信息来对频率进行平滑:

clip_image018 (5)

clip_image020

其中,N(c)表示频率为c的n-gram的数量。

3)线性插值平滑

该数据平滑技术主要利用低元n-gram模型对高元n-gram模型进行线性插值。因为在没有足够的数据对高元n-gram模型进行概率估计时,低元n-gram模型通常可以提供有用的信息。

clip_image022

clip_image024 (6)

clip_image026可以通过EM算法来估计。

4)Katz平滑

也称为回退(back-off)平滑,其基本思想是当一个n元对的出现次数足够大时,用最大似然估计方法估计其概率;当n元对的出现次数不够大时,采用Good-Turing估计对其平滑,将其部分概率折扣给未出现的n元对;当n元对的出现次数为0时,模型回退到低元模型。

clip_image028

clip_image030 (6)

参数clip_image032clip_image034保证模型参数概率的归一化约束条件,即clip_image036

4. n-gram解码算法

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

clip_image037

常用的解码算法是viterbi算法,它采用动态规划的原理能够很快地确定最合适的路径。这里就不详细介绍该算法了。 

5. 语言模型工具

推荐开源语言模型工具:

6. 训练数据集的获取

推荐开源n-gram数据集:

当然,数据集的选取很大程度上影响着模型的好坏,获取适合自己工程的数据集才是好的数据集,在实际项目中,经常使用诸如爬虫算法在网络上获取适合自己的数据集,例如,你在开发一个与金融有关的语音识别项目,你就可以通过爬虫算法在网络上搜索所有与金融有关的网页,文章等资源,来建立自己的语料库(数据集)。

7. 语言模型文件格式ARPA




以上介绍的是n-gram语言模型,现在也有使用RNN(循环神经网络)进行语言模型进行建模!~~~~


猜你喜欢

转载自blog.csdn.net/nsh119/article/details/80193925