语音识别-浅谈语言模型
统计语言模型
统计语言模型的定义
统计语言模型是所有词序列上的一个概率分布
统计语言模型的作用
- 计算任意词序列的概率,以便确定概率最大的词序列。
- 给定一个历史词序列,预测下一个出现概率最大的词,并计算这个概率。
假定 s = ( w 1 , w 2 , ⋯ , w n ) \boldsymbol{s}=\left( w_1,w_2,\cdots,w_n\right) s=(w1,w2,⋯,wn)表示一个有意义的词序列,,其概率可以表示为:
P ( s ) = P ( x 1 = w 1 , x 2 = w 2 , ⋯ , x n = w n ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 , w 2 ) … P ( w n ∣ w 1 , w 2 , ⋯ , w n − 1 ) = ∏ i = 1 n P ( w i ∣ w 1 i − 1 ) \begin{aligned} P(\boldsymbol{s})&=P(x_1=w_1,x_2=w_2,\cdots,x_n=w_n)\\ &=P(w_1)P(w_2|w_1)P(w_3|w_1,w_2)\ldots P(w_n|w_1,w_2,\cdots,w_{n-1})\\ &=\prod_{i=1}^n P(w_i|w_1^{i-1}) \end{aligned} P(s)=P(x1=w1,x2=w2,⋯,xn=wn)=P(w1)P(w2∣w1)P(w3∣w1,w2)…P(wn∣w1,w2,⋯,wn−1)=i=1∏nP(wi∣w1i−1)
其他知识
如何计算语言模型中的概率
在语料库中计数,语料库分为训练集(training set),验证集/保留集(dev/held-out set),测试集(testing set)。保留集从训练集中分离,用于计算一些参数,例如插值模型中的插值系数。
常见术语
我们以下面两句话为例介绍统计语言模型中常见的几个术语:
- I uh have a re- report today.
- 我 是 不 是 老 了。
有声停顿(fillers/filled pauses): 如uh就是一个没有实际意义的有声停顿。
截断(fragment):表示没有说完整,如re-。
词目(lemma):词语主干(stem)相同,比如dogs和dog是一个词目。
词形(wordforms):完整的词语样子,比如dogs和dog是两个词形。
型(type):语料库或者字典中不同单词的数目,2中有5种型(我 是 不 老 了)。
例(token):语料中单词数目,2中有6例。
字典(vocabulary):语言模型的基本组件,规定了我们对哪些元素进行统计。
N-gram语言模型
为了简化计算,我们采用
N
N
N阶马尔可夫假设,即假定每个词出现的概率只和前
N
−
1
N-1
N−1个词有关,在此假设下的统计语言模型被称为N-gram语言模型。
当
N
=
1
N=1
N=1时,每个词出现的概率都与其他词无关,此时的语言模型被称为unigram。
当
N
=
2
N=2
N=2时,每个词出现的概率只与之前的1个词有关,此时的语言模型被称为bigram。
当
N
=
3
N=3
N=3时,每个词出现的概率只与之前的2个词有关,此时的语言模型被称为trigram。
实际中最常用的是3-gram语言模型,主要有两个原因:
(1)阶数越高,计算量越大,潜在的计算量呈指数增长;
(2)高阶模型会面临严重的数据稀疏问题。况且,更高阶的模型并不一定能够覆盖所有的语言现象。
N-gram语言模型的估计
通常使用最大似然估计来计算每个词序列出现的条件概率,这是对训练数据的最佳估计,N-gram语言模型用前
N
−
1
N-1
N−1个词估计第
N
N
N个词,有
P
(
w
i
∣
w
1
i
−
1
)
=
P
(
w
i
∣
w
i
−
N
+
1
i
−
1
)
=
c
o
u
n
t
(
w
i
−
N
+
1
i
−
1
w
i
)
c
o
u
n
t
(
w
i
−
N
+
1
i
−
1
)
P(w_i|w_1^{i-1})=P(w_i|w_{i-N+1}^{i-1})=\frac{count(w_{i-N+1}^{i-1}w_i)}{count(w_{i-N+1}^{i-1})}
P(wi∣w1i−1)=P(wi∣wi−N+1i−1)=count(wi−N+1i−1)count(wi−N+1i−1wi)
我们以bigram语言模型为例,有
P
(
w
i
∣
w
i
−
1
)
=
c
o
u
n
t
(
w
i
−
1
w
i
)
c
o
u
n
t
(
w
i
−
1
)
P(w_i|w_{i-1})=\frac{count(w_{i-1}w_i)}{count(w_{i-1})}
P(wi∣wi−1)=count(wi−1)count(wi−1wi)
在语料库中统计词序列
w
i
−
1
w
i
w_{i-1}w_i
wi−1wi和
w
i
−
1
w_{i-1}
wi−1的数量即可。
开头,结尾和未知词怎么处理?
在语音识别中,一般用
<
s
>
<s>
<s>表示句子的开头,
<
/
s
>
</s>
</s>表示句子的结尾,vocabulary中没有的词用
<
U
N
K
>
<UNK>
<UNK>表示。
N-gram语言模型的评价方法
N-gram语言模型的评价方法主要有两种:
- 根据实际应用评价,例如在语音识别,机器翻译中的表现来评价。
- 计算困惑度(Perplexity),其基本思想是给测试集的句子赋予较高概率值的语言模型较好。
此处主要介绍第二种评价方法,对于句子
s
=
(
w
1
,
w
2
,
⋯
,
w
n
)
\boldsymbol{s}=\left( w_1,w_2,\cdots,w_n\right)
s=(w1,w2,⋯,wn),困惑度就是用单词数归一化后的测试集概率:
P
P
(
s
)
=
P
(
w
1
w
2
⋯
w
n
)
−
1
N
=
1
P
(
w
1
w
2
⋯
w
n
)
n
=
1
∏
i
=
1
n
P
(
w
i
∣
w
i
−
N
+
1
i
−
1
)
n
\begin{aligned} PP(\boldsymbol{s})&=P(w_1w_2 \cdots w_n)^{-\frac{1}{N}}\\ &=\sqrt[n]{\frac{1}{P(w_1w_2 \cdots w_n)}}\\ &=\sqrt[n]{\frac{1}{\prod_{i=1}^n P(w_i|w_{i-N+1}^{i-1})}}\\ \end{aligned}
PP(s)=P(w1w2⋯wn)−N1=nP(w1w2⋯wn)1=n∏i=1nP(wi∣wi−N+1i−1)1
注:通常在语音模型工具包中会给出PPL和PPL1两个值,其中PPL考虑词数和句子数,例如
<
s
>
<s>
<s>,而PPL1只考虑词数。
平滑算法
由于语料的稀疏性,有些词序列找不到,需要对数据进行平滑。
拉普拉斯平滑(Laplace Smoothing/Add-one Smoothing)
基本思想:将每个计数加一,从而使得任何词序列都有计数,以bigram为例:
P
l
a
p
l
a
c
e
(
w
i
∣
w
i
−
1
)
=
c
o
u
n
t
(
w
i
−
1
w
i
)
+
1
c
o
u
n
t
(
w
i
−
1
)
+
v
P_{laplace}(w_i|w_{i-1})=\frac{count(w_{i-1}w_i)+1}{count(w_{i-1})+v}
Plaplace(wi∣wi−1)=count(wi−1)+vcount(wi−1wi)+1
其中
v
v
v是vocabulary的大小。
优点:算法简单,解决了概率为0的问题。
缺点:原来计数量较高的词序列,概率削减严重,认为所有未出现的词序列概率相等也有点不合理。
古德图灵平滑(Good-turing Smoothing)
基本思想:用你看见过一次的事情(Seen Once)估计你未看见的事件(Unseen Events),并依次类推,用看见过两次的事情估计看见过一次的事情等等。
对于任何出现
r
r
r次的n元组,都假设它出现了
r
∗
r^*
r∗次:
r
∗
=
(
r
+
1
)
n
r
+
1
n
r
r^*=(r+1)\frac{n_{r+1}}{n_r}
r∗=(r+1)nrnr+1
其中
n
r
n_r
nr是训练集中出现
r
r
r次的N元组的数量,对这个统计数进行归一化得到概率为:
p
r
=
r
∗
N
p_r=\frac{r^*}{N}
pr=Nr∗
其中
N
N
N是总的token数量。
插值(Interpolation)平滑
基本思想:从所有N-grams估计中,把所有的概率估计混合。例如,我们优化一个trigram模型,我们将统计的trigram,bigram和unigram计数进行插值,以trigram为例:
P
(
w
i
∣
w
i
−
2
w
i
−
1
)
=
λ
1
P
(
w
i
∣
w
i
−
2
w
i
−
1
)
+
λ
2
P
(
w
i
∣
w
i
−
1
)
+
λ
3
P
(
w
i
)
\begin{aligned} P(w_i|w_{i-2}w_{i-1})&= \lambda_1 P(w_i|w_{i-2}w_{i-1})+\lambda_2P(w_i|w_{i-1})+\lambda_3 P(w_i) \end{aligned}
P(wi∣wi−2wi−1)=λ1P(wi∣wi−2wi−1)+λ2P(wi∣wi−1)+λ3P(wi)
其中插值系数
λ
i
\lambda_i
λi可以通过EM算法来估计,步骤如下:
- 确定训练集,保留集,测试集;
- 根据训练集构造初始语言模型,并确定初始的 λ i \lambda_i λi;
- 基于EM算法迭代地优化
λ
i
\lambda_i
λi, 使得保留集概率(如下式)最大化:
l o g P ( w 1 ⋯ w n ∣ M ( λ 1 ⋯ λ k ) ) = ∑ i l o g P M ( λ 1 ⋯ λ k ) ( w i ∣ w i − 1 ) logP(w_1\cdots w_n|M(\lambda_1\cdots \lambda_k))=\sum_i logP_{M(\lambda_1\cdots \lambda_k)}(w_i|w_{i-1}) logP(w1⋯wn∣M(λ1⋯λk))=i∑logPM(λ1⋯λk)(wi∣wi−1)
回退(Back off)平滑
基本思想: 若N阶语言模型存在,直接使用打折后的概率(常使用Good-turing算法进行打折);若高阶语言模型不存在(i.e. unseen events),将打折节省出的概率量,依照N-1阶的语言模型概率进行分配,依此类推。
语言模型的存储格式
ARPA Format
ARPA Format是N-gram的标准存储格式,是一个ASCII表,在小标题后跟着一个表,列举出所有非零的N元语法概率。在每个N元语法的条目中,依次为:
折扣后的对数概率,
词序列,
回退权重。
例如:
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,
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
- IRSTLM:https://github.com/irstlm-team/
总结
总结下基于统计的 n-gram 语言模型的优缺点:
优点:
- 采用极大似然估计,参数易训练;
- 完全包含了前 n-1 个词的全部信息;
- 可解释性强,直观易理解。
缺点:
- 缺乏长期依赖,只能建模到前 n-1 个词;
- 随着 n 的增大,参数空间呈指数增长;
- 数据稀疏,难免会出现OOV的问题;
- 单纯的基于统计频次,泛化能力差。