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

本文深入探讨了n-gram语言模型的原理与应用,详细解释了如何利用n-gram模型提升语音识别系统的准确率,特别是在处理长语音段落时的优势。文章还介绍了back-off smoothing技巧,用于解决数据稀疏问题,确保模型的稳定性和泛化能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高山万丈,从平路走起

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

语言模型是通过一个语音识别器来定义一系列的词的这么个东西。一些语言模型还会给每一个词序列一个权重或者概率,来当做这个词序列的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定义

假定一个序列有MMM个词,w1,w2,...,wMw_1,w_2,...,w_Mw1,w2,...,wM,以w1Mw_1^Mw1M来表示。从第iii个词到第jjj个词的子词序列为wijw_i^jwij
给定一个词序列W=w1MW=w_1^MW=w1MWWW的先验概率可以表示为
在这里插入图片描述
在n-gram语言模型中,上面的这个条件概率P(wm∣w1m−1)P(w_m|w_1^{m-1})P(wmw1m1) ,用另外一个条件概率P(wm∣wm−1−nm−1)P(w_m|w_{m-1-n}^{m-1})P(wmwm1nm1) 来近似,当m−n+1&lt;1m-n+1&lt;1mn+1<1的时候,wm−n+1w_{m-n+1}wmn+1就是空的了。也就是说不需要考虑。比如说当n=3,P(w1∣w−1w0)=P(w1)n=3,P(w_1|w_{-1}w_0)=P(w_1)n=3P(w1w1w0)=P(w1)。那么相对应的P(W)P(W)P(W)的先验概率就变成了:
在这里插入图片描述

上面这个式子意味着第mmm个词出现的概率,仅和前n−1n-1n1个词有关系。
另外,n-gram模型和(n−1)(n-1)(n1)阶的马尔科夫模型是一码事,这个马尔科夫模型中的每一个状态都和前面n−1n-1n1个状态相关。
假定w1nw_1^nw1n表示一个n-gram的词,w1,w2,...,wnw_1,w_2,...,w_nw1,w2,...,wn,那么我们就可以用一个文本库来计算n-gram的最大似然估计:
P(wn∣w1n−1)=C(w1n)C1(wn−1)P(w_n|w_1^{n-1})=\frac{C(w_1^n)}{C_1(w^{n-1})}P(wnw1n1)=C1(wn1)C(w1n)
其中C1nC_1^nC1n是用的这个文本库中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(wn∣w1n−1)={P∗(wn∣w1n−1)if C(w1n)&gt;0α(w1n−1)P(wn∣w2n−1)if C(w1n)=0P(w_n|w_1^{n-1}) = \begin{cases} P^*(w_n|w_1^{n-1}) &amp;\text{if } C(w_1^n)&gt;0 \\ \alpha (w_1^{n-1})P(w_n|w_2^{n-1}) &amp;\text{if } C(w_1^n)=0 \end{cases}P(wnw1n1)={P(wnw1n1)α(w1n1)P(wnw2n1)if C(w1n)>0if C(w1n)=0
P∗(wn∣w1n−1)P^*(w_n|w_1^{n-1})P(wnw1n1)是打折后的n-gram概率。之所以打折,那是因为(n-1)个词后面接的词的概率和是等于1的,现在多了个从来没在(n-1)-gram后面出现过的词,那自然得缩减下其他的词的份额。大致是这么个意思。α(w1n−1)\alpha (w_1^{n-1})α(w1n1)是back-off系数,当分配(n-1)-gram的概率给没见过的n-gram的时候用这个系数。
根据这个打折的概率,这个back-off系数计算公式如下:
α(w1n−1)=1−∑wn:C(w1n)&gt;0P∗(wn∣w1n−1)1−∑wn:C(w1n)&gt;0P∗(wn∣w2n−1)\alpha (w_1^{n-1})=\frac{1-\displaystyle\sum_{w_n:C(w_1^n)&gt;0} P^*(w_n|w_1^{n-1})}{1-\displaystyle\sum_{w_n:C(w_1^n)&gt;0} P^*(w_n|w_2^{n-1})}α(w1n1)=1wn:C(w1n)>0P(wnw2n1)1wn:C(w1n)>0P(wnw1n1)
分子表示的是在w1nw_1^nw1n的条件下,未曾出现过的n-gram 概率的和。分母是正则化因子。
而怎么去计算打折后的概率,有好几种方法,其中一种叫 Good-Turing discounting,计算方法如下:
P∗(wn∣w1n−1)=C∗(w1n)C1(wn−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)NC(x)+1NC(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。NrN_rNr表示的是在文本库中出现次数为rrr次的词的个数。只有当C(x)C(x)C(x)比较小的时候,才会用到modified count。
关于Good-Turing Discounting的解释回头补上……

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值