统计语言模型
一个统计语言模型包含一个有限集合 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,⋯,xn⟩∈v+,p(x1,x2,⋯,xn)≥0
- ∑ < x 1 , ⋯ , x n > ∈ v + p ( x 1 , x 2 , ⋯ , x n ) = 1 \sum_{<x_1,\cdots,x_n>\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(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
>
</s>
</s>来标记开头和结尾,没有在vocabulary中出现的词(OOV,out of vocabulary)一般标记为
<
U
N
K
>
<UNK>
<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(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。
平滑算法中有两个非常重要的概念:
- 调整计数(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 Nc≈acβ,其中 α \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∗=1−N1(k+1)Nk+1(c+1)NcNc+1−cN1(k+1)Nk+1c>k1≤c≤k
插值与回退
插值与回退是两类平滑算法。
插值法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}∣
语言模型的存储格式——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∗(wi∣wi−1)
- 词序列 ,如: w i − 1 w i w_{i-1}w_i wi−1wi
- 回退权重(log10格式存储),如: l o g α ( w i − 1 w i ) log \alpha(w_{i-1}w_i) logα(wi−1wi)
常用工具包:
- 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状态。
熟练掌握上述知识点,我们基本可以完成一个大词汇量连续语音识别系统。