语音识别入门第七节:语言模型

  • 统计语言模型
  • N-gram语言模型与评价方法
  • 平滑算法
    • 拉普拉斯平滑
    • 古德图灵平滑
    • 插值与回退
    • 卡茨平滑
    • 克奈瑟-内平滑
  • 语言模型的存储格式——APRA Format及工具包
  • RNN语言模型
  • 其他语言模型思想简介
  • 大词汇量连续语音识别梳理

统计语言模型

一个统计语言模型包含一个有限集合 V V V,和一个函数 p ( x 1 , x 2 , ⋯   , x n ) p(x_1,x_2,\cdots,x_n) p(x1,x2,,xn)

  • 对于任意 ⟨ x 1 , ⋯   , x n ⟩ ∈ v + , p ( x 1 , x 2 , ⋯   , x n ) ≥ 0 \left \langle x_1,\cdots,x_n \right \rangle \in v^+,p(x_1, x_2, \cdots, x_n)\ge 0 x1,,xnv+,p(x1,x2,,xn)0
  • ∑ < x 1 , ⋯   , x n > ∈ v + p ( x 1 , x 2 , ⋯   , x n ) = 1 \sum_{\in v^+}p(x_1, x_2, \cdots, x_n)=1 <x1,,xn>∈v+p(x1,x2,,xn)=1

也可以说统计语言模型是所有词序列上的一个概率分布。
统计语言模型可以给我们任意词序列的概率,也可以给定一个词序列,预测下一个最可能出现的词语
语言模型中的一些常见术语:

  • 有声停顿(fillers/filled pauses):没有实际意义的有声停顿。
  • 截断(fragment):表示没有说完整。
  • 词目(lemma):词语主干相同,如dogs和dog是一个词目。
  • 词形(wordforms):完整的词语样子,如dogs和dog是两个词形。
  • 型(type):语料库或字典中不同单词的数目。
  • 例(token):语料中单词数目。
  • 字典(vocabulary):语言模型的基本组件,规定了我们对哪些元素进行统计。

N-gram语言模型与评价方法

N-gram使用前N-1个词作为历史,估计当前(第N)个词。即 P ( w 1 ∣ w 1 i − 1 ) = P ( w i ∣ w i − N + 1 i − 1 ) P(w_1|w_1^{i-1})=P(w_i|w_{i-N+1}^{i-1}) P(w1w1i1)=P(wiwiN+1i1)
在进行N-gram模型估计时,最简单的方法就是最大似然方法,即 P ( w i ∣ w i − N + 1 i − 1 ) = C ( w i − N + 1 i − 1 w i ) C ( w i − N + 1 i − 1 ) P(w_i|w_{i-N+1}^{i-1})=\frac{C(w_{i-N+1}^{i-1}w_i)}{C(w_{i-N+1}^{i-1})} P(wiwiN+1i1)=C(wiN+1i1)C(wiN+1i1wi)
在ASR领域,习惯使用 < s > <s> < / s > </s>来标记开头和结尾,没有在vocabulary中出现的词(OOV,out of vocabulary)一般标记为 < U N K > <UNK>
在对N-gram语言模型进行测试评估时,通常分为根据应用实地测试(精确,但耗时耗力)和困惑度两种。
在测试集 W = w 1 , w 2 , ⋯   , w N W=w_1,w_2,\cdots,w_N W=w1,w2,,wN,困惑度就是用单词数归一化后的测试集概率: P P ( W ) = P ( w 1 w 2 ⋯ w N ) − 1 N = 1 P ( w 1 w 2 ⋯ w N ) N = ∑ i = 1 N 1 P ( w i ∣ w i − N + 1 i − 1 ) N PP(W)=P(w_1w_2\cdots w_N)^{-\frac{1}{N}}=\sqrt[N]{\frac{1}{P(w_1w_2\cdots w_N)}}=\sqrt[N]{\sum_{i=1}^{N}\frac{1}{P(w_i|w_{i-N+1}^{i-1})}} PP(W)=P(w1w2wN)N1=NP(w1w2wN)1 =Ni=1NP(wiwiN+1i1)1

平滑算法

由于语料的稀疏性,有些词序列找不到,它的概率就是0,此时可以使用平滑算法,将一部分看见的事件概率量分给未看见的事件。

拉普拉斯平滑

intuition:将每个计数加1,从而使得任何次序列都有计数。如 P ( w i ) = C ( w i ) N P(w_i)=\frac{C(w_i)}{N} P(wi)=NC(wi) N N N为总token数, P l a p l a c e ( w i ) = C ( w i ) + 1 N + V P_{laplace}(w_i)=\frac{C(w_i)+1}{N+V} Plaplace(wi)=N+VC(wi)+1 P l a p l a c e ( w i ∣ w i − 1 ) = C ( w i − 1 w i ) + 1 C ( w i − 1 + V ) P_{laplace}(w_i|w_{i-1})=\frac{C(w_{i-1}w_i)+1}{C(w_{i-1}+V)} Plaplace(wiwi1)=C(wi1+V)C(wi1wi)+1
平滑算法中有两个非常重要的概念:

  • 调整计数(adjusted count)—— c ∗ c^* c:描述平滑算法仅对分子的影响,以拉普拉斯为例, c i ∗ = ( c i + 1 ) N N + V c_i^*=(c_i+1)\frac{N}{N+V} ci=(ci+1)N+VN
  • 相对打折折率(discount ratio)—— d c d_c dc:打折计数和原计数的比率, d c = c ∗ c d_c=\frac{c^*}{c} dc=cc
    拉普拉斯平滑算法的缺点:对于比较稀疏的语料,会将原来计数较高的词序列,进行一个很严重的概率削减。

古德图灵平滑

齐夫定律:Given a large sample of words used, the frequency of any word is inversely proportional to its rank in the frequency table(自然语言语料库中,一个词出现的频率与它在频率表里的排名成反比)。也就是说,在语料库(语言)中,大部分词都是低频词,只有很少的常用词。
intuition:用你看见过一次的事情估计你从未看见的事情,并依次类推。
古德图灵平滑算法一般性的表示为:用你看见过 c + 1 c+1 c+1次的事情来估计你看见过 c c c次的事情。
频率c出现的频数: N c = ∑ x : c o u n t ( x ) = c 1 N_c=\sum_{x:count(x)=c}1 Nc=x:count(x)=c1
对于古德图灵平滑算法,其调整计数为: c ∗ = ( c + 1 ) N c + 1 N c c^*=(c+1)\frac{N_{c+1}}{N_c} c=(c+1)NcNc+1,其遗漏量为 P G T ∗ ( U n s e e n E v e n t s ) = N 1 N P_{GT}^*(Unseen Events)=\frac{N_1}{N} PGT(UnseenEvents)=NN1
但是古德图灵平滑也有一个切实问题,如果一个词在预料中出现了N词,但是没有出现N+1次的词序列,难道这个概率变为0吗?在实际解决这个问题时,通常有两种方法:

  • c > k ( e . g . k = 5 ) c>k(e.g. k=5) c>k(e.g.k=5)时, N c ≈ a c β N_c \approx ac^\beta Ncacβ,其中 α \alpha α β \beta β为参数,对 N c N_c Nc进行平滑。
  • 认为 c > k c>k c>k(katz建议k=5),认为技术可靠不进行打折。
    { c ∗ = c c > k c ∗ = ( c + 1 ) N c + 1 N c − c ( k + 1 ) N k + 1 N 1 1 − ( k + 1 ) N k + 1 N 1 1 ≤ c ≤ k \left\{\begin{matrix} c^*=c &c>k \\ c^*=\frac{(c+1)\frac{N_{c+1}}{N_c}-c\frac{(k+1)N_{k+1}}{N_1} }{1-\frac{(k+1)N_{k+1}}{N_1} } &1\le c\le k \end{matrix}\right. c=cc=1N1(k+1)Nk+1(c+1)NcNc+1cN1(k+1)Nk+1c>k1ck

插值与回退

插值与回退是两类平滑算法。
插值法Intuition:从所有N-grams估计中,把所有的概率估计进行混合。例如我们优化一个tri-gram模型,我们将tri-gram,bigram和unigram计数进行插值,完成单个语言模型内部的优化。
回退法Intuition:如果在估计一个高阶语言模型非零序列时,我们直接使用这个概率,当高阶语言模型我们需要查找的词序列不存在是,我们回退到低阶语言模型。

卡茨平滑

卡茨平滑算法是一种递归回退的算法。Intuition:若N阶语言模型存在,直接使用打折后的概率(常用古德图灵平滑算法进行打折), 若高阶语言模型不存在,则将打折节省出的概率量,依照N-1阶的语言模型进行分配,依此类推。
P k a t z ( w i ∣ w i − N + 1 i − 1 ) = { p ∗ ( w i ∣ w i − N + 1 i − 1 ) C ( w i − N + 1 i ) > 0 α ( w i − N + 1 i − 1 ) P k a t z ( w i ∣ w i − N + 2 i − 1 ) o t h e r w i s e P_{katz}(w_i|w_{i-N+1}^{i-1})=\left\{\begin{matrix} p^*(w_i|w_{i-N+1}^{i-1}) &C(w_{i-N+1}^i)>0 \\ \alpha (w_{i-N+1}^{i-1})P_{katz}(w_i|w_{i-N+2}^{i-1}) &otherwise \end{matrix}\right. Pkatz(wiwiN+1i1)={p(wiwiN+1i1)α(wiN+1i1)Pkatz(wiwiN+2i1)C(wiN+1i)>0otherwise

克奈瑟-内平滑

绝对折扣(克奈瑟-内平滑的一部分)

古德图灵打折后获得此表
C(MLE) 0 1 2 3 4 5 6 7 8 9
c*(GT) 0.0000270 0.446 1.26 2.24 3.24 4.22 5.19 6.21 7.24 8.25

研究人员对“AP新闻专线”语料的bigram进行古德图灵打折后获得上表,发现,除0和1外,其他近似减0.75就可以了,因此,研究人员认为,我们是否可以直接对统计计数减去一个绝对值,用其作为调整计数,即: P a b s o l u t e ( w i ∣ w i − 1 ) = { C ( w i − 1 w i ) − D C ( w i − 1 ) C ( w i − 1 w i ) > 0 α ( w i ) P ( w i ) o t h e r w i s e P_{absolute}(w_i|w_{i-1})=\left\{\begin{matrix} \frac{C(w_{i-1}w_i)-D}{C(w_{i-1})} &C(w_{i-1}w_i)>0 \\ \alpha (w_i)P(w_i) &otherwise \end{matrix}\right. Pabsolute(wiwi1)={C(wi1)C(wi1wi)Dα(wi)P(wi)C(wi1wi)>0otherwise,在实际应用中,0和1会特殊处理。
克奈瑟-内平滑Intuition:对于一个词,如果它的语料库中出现更多种不同上下文时,它可能应该有更高的概率。为了刻画这种想法,研究人员提出了接续概率: P c o n t i n u a t i o n ( w i ) = ∣ { w i − 1 : C ( w i − 1 w i ) > 0 } ∣ ∑ w i ∣ { w i − 1 : C ( w i − 1 w i ) > 0 } ∣ P_{continuation}(w_i)=\frac{| \{ w_{i-1}:C(w_{i-1}w_i)>0 \} | }{\sum _{w_i}| \{ w_{i-1}:C(w_{i-1}w_i)>0 \} | } Pcontinuation(wi)=wi{wi1:C(wi1wi)>0}{wi1:C(wi1wi)>0}
克奈瑟-内平滑就是将绝对值打折和接续概率进行一个有机的结合,它的回退式为: P K N ( w i ∣ w i − 1 ) = { C ( w i − 1 w i ) − D C ( w i − 1 ) C ( w i − 1 w i ) > 0 α ( w i ) P c o n t i n u a t i o n ( w i ) o t h e r w i s e P_{KN}(w_i|w_{i-1})=\left\{\begin{matrix} \frac{C(w_{i-1}w_i)-D}{C(w_{i-1})} &C(w_{i-1}w_i)>0 \\ \alpha (w_i)P_{continuation}(w_i) &otherwise \end{matrix}\right. PKN(wiwi1)={C(wi1)C(wi1wi)Dα(wi)Pcontinuation(wi)C(wi1wi)>0otherwise,插值式为: P K N ( w i ∣ w i − 1 ) = C ( w i − 1 w i ) − D C ( w i − 1 ) + β ( w i ) P c o n t i n u a t i o n ( w i ) = C ( w i − 1 w i ) − D C ( w i − 1 ) + β ( w i ) ∣ { w i − 1 : C ( w i − 1 w i ) > 0 } ∣ ∑ w i ∣ { w i − 1 : C ( w i − 1 w i ) > 0 } ∣ P_{KN}(w_i|w_{i-1}) =\frac{C(w_{i-1}w_i)-D}{C(w_{i-1})} + \beta (w_i)P_{continuation}(w_i) = \frac{C(w_{i-1}w_i)-D}{C(w_{i-1})}+\beta (w_i)\frac{|\{w_{i-1}:C(w_{i-1}w_i)>0\}|}{\sum _{w_i}|\{w_{i-1}:C(w_{i-1}w_i)>0\}|} PKN(wiwi1)=C(wi1)C(wi1wi)D+β(wi)Pcontinuation(wi)=C(wi1)C(wi1wi)D+β(wi)wi{wi1:C(wi1wi)>0}{wi1:C(wi1wi)>0}

语言模型的存储格式——APRA Format及工具包

ARPA Format是N-gram的标准存储模式:是一个ASCII文件,在一个小标题后跟着一个表,列举出所有非零的N元语法概率。
每个N元语法条目中依次为:

  • 折扣后对数概率(log10格式存储),如: l o g 10 P ∗ ( w i ∣ w i − 1 ) log_{10}P^*(w_i|w_{i-1}) log10P(wiwi1)
  • 词序列 ,如: w i − 1 w i w_{i-1}w_i wi1wi
  • 回退权重(log10格式存储),如: l o g α ( w i − 1 w i ) log \alpha(w_{i-1}w_i) lo(wi1wi)

常用工具包:

  • SRILM(最常用):http://www.speech.sri.com/projects/srilm
  • KenLM:https://github.com/kpu/kenlm
  • KaldiLM:http://www.danielpovey.com/files/kaldi/kaldi_lm.tar.gz
  • IRSTLM:https://github.com/irstlm-team

RNN语言模型

n-gram的问题是其捕捉句子中长期依赖的能力非常有限,而RNN语言模型恰好可以解决这个痛处。Tomac Mikolov最先将RNN引入语音识别工作中。而随着Deep Learn的发展,又出现了一些对历史记忆更好的模型,如LSTM、GRU等。对于RNN来说,最简单直观的输出是vocabulary size vector with softmax,但是这样会有输出维度过高等问题,而低频词袋法可以降低输出维度(取频率最高的N个词,并将剩余词放入一个词袋中)。

其他语言模型思想简介

基于类的N元语言模型:在语言学中,将具有同样语义的词归为一类是一种常见的解决数据稀疏的方法。受此启发,在语言模型中,根据词性分析,语义分析,或者特定任务时人为设计,我们可以将词和类别建立联系,通过类别信息,帮助我们提升语言模型建模性能。
缓存模型:如果一个词在句子中用到,那么它很可能被再次用到。

大词汇量连续语音识别梳理

在此专栏,我们学习了以下内容:

  • 语言模型:建模word间的跳转概率。
  • 字典:提供word到phone的映射,及语言模型建模元素。
  • HMM:建模phone或triphone等基本单元发声过程。
  • GMM:建模每个HMM状态的发射概率,即声学似然分。
  • 决策树:triphone等建模单元绑定,解决数据稀疏问题。
  • 前向后向算法:更新HMM参数。
  • EM算法:更新GMM参数。
  • Viterbi算法:解码或对齐。
  • Embedding Training算法:更新GMM-HMM模型参数,即Viterbi Training。
  • 特征提取:从音频获取MFCC、Fbank等特征。
  • DNN:建模每帧观测的后验概率,后转化为似然概率,提供给每个HMM状态。

熟练掌握上述知识点,我们基本可以完成一个大词汇量连续语音识别系统。

你可能感兴趣的:(语音识别入门,语音识别,语言模型,算法)