语言模型 (language model) 之n-gram LM

高山万丈,从平路走起

开始前先吐槽一下这个公式编辑器……折腾好久搞不定一个公式等号对齐,所以直接放弃了。截图吧。。。。

语言模型是通过一个语音识别器来定义一系列的词的这么个东西。一些语言模型还会给每一个词序列一个权重或者概率,来当做这个词序列的language score,来彰显词序列的重要程度。
有了语言模型,不符合语法规则或者看着就不像句子的输出就可以直接被排除掉,识别错误的情况也会大大减小。毕竟声学模型并不会考虑输出的像不像一句话,它只是听概率的话。
今儿来总结下 n-gram language model。
对于LVCSR来说,一段音频经常会被识别成不符合语法规则的或者无法预料的文本输出。解决这个问题的一个办法就是建立一个统计语言模型。所谓的统计语言模型是从一个很大的文本库中习得的。在这些统计语言模型中,n-gram的使用可谓是广泛。
n-gram模型是一种简单但是最有效的统计语言模型。所谓的“n-gram”指的是一个序列的子序列,这个子序列有n个items。n=1的时候叫unigram,n=2的时候叫bigram,n=3的时候叫trigram。在语音识别的领域,一般都是trigram或者4-gram。
接下来是重头戏,关于n-gram的具体细节。

1. n-gram定义

假定一个序列有 M M M个词, w 1 , w 2 , . . . , w M w_1,w_2,...,w_M w1,w2,...,wM,以 w 1 M w_1^M w1M来表示。从第 i i i个词到第 j j j个词的子词序列为 w i j w_i^j wij
给定一个词序列 W = w 1 M W=w_1^M W=w1M W W W的先验概率可以表示为
语言模型 (language model) 之n-gram LM_第1张图片
在n-gram语言模型中,上面的这个条件概率 P ( w m ∣ w 1 m − 1 ) P(w_m|w_1^{m-1}) P(wmw1m1) ,用另外一个条件概率 P ( w m ∣ w m − 1 − n m − 1 ) P(w_m|w_{m-1-n}^{m-1}) P(wmwm1nm1) 来近似,当 m − n + 1 < 1 m-n+1<1 mn+1<1的时候, w m − n + 1 w_{m-n+1} wmn+1就是空的了。也就是说不需要考虑。比如说当 n = 3 , P ( w 1 ∣ w − 1 w 0 ) = P ( w 1 ) n=3,P(w_1|w_{-1}w_0)=P(w_1) n=3P(w1w1w0)=P(w1)。那么相对应的 P ( W ) P(W) P(W)的先验概率就变成了:
语言模型 (language model) 之n-gram LM_第2张图片

上面这个式子意味着第 m m m个词出现的概率,仅和前 n − 1 n-1 n1个词有关系。
另外,n-gram模型和 ( n − 1 ) (n-1) (n1)阶的马尔科夫模型是一码事,这个马尔科夫模型中的每一个状态都和前面 n − 1 n-1 n1个状态相关。
假定 w 1 n w_1^n w1n表示一个n-gram的词, w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1,w2,...,wn,那么我们就可以用一个文本库来计算n-gram的最大似然估计:
P ( w n ∣ w 1 n − 1 ) = C ( w 1 n ) C 1 ( w n − 1 ) P(w_n|w_1^{n-1})=\frac{C(w_1^n)}{C_1(w^{n-1})} P(wnw1n1)=C1(wn1)C(w1n)
其中 C 1 n C_1^n C1n是用的这个文本库中n-gram出现的次数。
但是这么玩有一个比较严重的问题。文本库里面是文本是有限的,不管咱们使多大劲儿去收集,还是会有很多的n-gram没有出现过或者说出现的次数很少。这样下来,一些重要的n-gram在文本库里就观察不到,这些n-gram在识别的时候就会出问题。为了解决这种数据稀疏导致的问题,可以用一个叫做 back-off smoothing 的技巧。

2. back-off smoothing

back-off smoothing 说白了就是用(n-1)-gram来作为没出现的n-gram的估计。
具体点的操作就是给文本中有的n-gram模型打个折,然后重新分配下,让那些没有出现过的n-gram也能分得一杯羹,称为(n-1)-gram的一部分。
再具体一点就是用公式来说明了,如下:
P ( w n ∣ w 1 n − 1 ) = { P ∗ ( w n ∣ w 1 n − 1 ) if  C ( w 1 n ) > 0 α ( w 1 n − 1 ) P ( w n ∣ w 2 n − 1 ) if  C ( w 1 n ) = 0 P(w_n|w_1^{n-1}) = \begin{cases} P^*(w_n|w_1^{n-1}) &\text{if } C(w_1^n)>0 \\ \alpha (w_1^{n-1})P(w_n|w_2^{n-1}) &\text{if } C(w_1^n)=0 \end{cases} P(wnw1n1)={ P(wnw1n1)α(w1n1)P(wnw2n1)if C(w1n)>0if C(w1n)=0
P ∗ ( w n ∣ w 1 n − 1 ) P^*(w_n|w_1^{n-1}) P(wnw1n1)是打折后的n-gram概率。之所以打折,那是因为(n-1)个词后面接的词的概率和是等于1的,现在多了个从来没在(n-1)-gram后面出现过的词,那自然得缩减下其他的词的份额。大致是这么个意思。 α ( w 1 n − 1 ) \alpha (w_1^{n-1}) α(w1n1)是back-off系数,当分配(n-1)-gram的概率给没见过的n-gram的时候用这个系数。
根据这个打折的概率,这个back-off系数计算公式如下:
α ( w 1 n − 1 ) = 1 − ∑ w n : C ( w 1 n ) > 0 P ∗ ( w n ∣ w 1 n − 1 ) 1 − ∑ w n : C ( w 1 n ) > 0 P ∗ ( w n ∣ w 2 n − 1 ) \alpha (w_1^{n-1})=\frac{1-\displaystyle\sum_{w_n:C(w_1^n)>0} P^*(w_n|w_1^{n-1})}{1-\displaystyle\sum_{w_n:C(w_1^n)>0} P^*(w_n|w_2^{n-1})} α(w1n1)=1wn:C(w1n)>0P(wnw2n1)1wn:C(w1n)>0P(wnw1n1)
分子表示的是在 w 1 n w_1^n w1n的条件下,未曾出现过的n-gram 概率的和。分母是正则化因子。
而怎么去计算打折后的概率,有好几种方法,其中一种叫 Good-Turing discounting,计算方法如下:
P ∗ ( w n ∣ w 1 n − 1 ) = C ∗ ( w 1 n ) C 1 ( w n − 1 ) P^*(w_n|w_1^{n-1})=\frac{C^*(w_1^n)}{C_1(w^{n-1})} P(wnw1n1)=C1(wn1)C(w1n)
其中
C ∗ ( x ) = ( C ( x ) + 1 ) N C ( x ) + 1 N C ( x ) C^*(x)=(C(x)+1)\frac {N_{C(x)+1}}{N_{C(x)}} C(x)=(C(x)+1)NC(x)NC(x)+1
C ∗ ( x ) C^*(x) C(x)叫做modified count。 N r N_r Nr表示的是在文本库中出现次数为 r r r次的词的个数。只有当 C ( x ) C(x) C(x)比较小的时候,才会用到modified count。
关于Good-Turing Discounting的解释回头补上……

你可能感兴趣的:(kaldi,学习,asr)