一个统计语言模型包含一个有限集合 V V V,和一个函数 p ( x 1 , x 2 , ⋯ , x n ) p(x_1,x_2,\cdots,x_n) p(x1,x2,⋯,xn):
也可以说统计语言模型是所有词序列上的一个概率分布。
统计语言模型可以给我们任意词序列的概率,也可以给定一个词序列,预测下一个最可能出现的词语。
语言模型中的一些常见术语:
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(w1∣w1i−1)=P(wi∣wi−N+1i−1)。
在进行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(wi∣wi−N+1i−1)=C(wi−N+1i−1)C(wi−N+1i−1wi)。
在ASR领域,习惯使用 < s > <s>和 < / s > </s>来标记开头和结尾,没有在vocabulary中出现的词(OOV,out of vocabulary)一般标记为 < U N K >
在对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(w1w2⋯wN)−N1=NP(w1w2⋯wN)1=N∑i=1NP(wi∣wi−N+1i−1)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(wi∣wi−1)=C(wi−1+V)C(wi−1wi)+1。
平滑算法中有两个非常重要的概念:
齐夫定律: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吗?在实际解决这个问题时,通常有两种方法:
插值与回退是两类平滑算法。
插值法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(wi∣wi−N+1i−1)={p∗(wi∣wi−N+1i−1)α(wi−N+1i−1)Pkatz(wi∣wi−N+2i−1)C(wi−N+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(wi∣wi−1)={C(wi−1)C(wi−1wi)−Dα(wi)P(wi)C(wi−1wi)>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∣{wi−1:C(wi−1wi)>0}∣∣{wi−1:C(wi−1wi)>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(wi∣wi−1)={C(wi−1)C(wi−1wi)−Dα(wi)Pcontinuation(wi)C(wi−1wi)>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(wi∣wi−1)=C(wi−1)C(wi−1wi)−D+β(wi)Pcontinuation(wi)=C(wi−1)C(wi−1wi)−D+β(wi)∑wi∣{wi−1:C(wi−1wi)>0}∣∣{wi−1:C(wi−1wi)>0}∣
ARPA Format是N-gram的标准存储模式:是一个ASCII文件,在一个小标题后跟着一个表,列举出所有非零的N元语法概率。
每个N元语法条目中依次为:
常用工具包:
n-gram的问题是其捕捉句子中长期依赖的能力非常有限,而RNN语言模型恰好可以解决这个痛处。Tomac Mikolov最先将RNN引入语音识别工作中。而随着Deep Learn的发展,又出现了一些对历史记忆更好的模型,如LSTM、GRU等。对于RNN来说,最简单直观的输出是vocabulary size vector with softmax,但是这样会有输出维度过高等问题,而低频词袋法可以降低输出维度(取频率最高的N个词,并将剩余词放入一个词袋中)。
基于类的N元语言模型:在语言学中,将具有同样语义的词归为一类是一种常见的解决数据稀疏的方法。受此启发,在语言模型中,根据词性分析,语义分析,或者特定任务时人为设计,我们可以将词和类别建立联系,通过类别信息,帮助我们提升语言模型建模性能。
缓存模型:如果一个词在句子中用到,那么它很可能被再次用到。
在此专栏,我们学习了以下内容:
熟练掌握上述知识点,我们基本可以完成一个大词汇量连续语音识别系统。