《语音识别原理与应用》洪青阳 第8章 语言模型————平滑技术

语言模型平滑技术

《语音识别原理与技术》洪青阳

语言模型的概率需要通过大量的文本语料来估计,采用最大似然算法。但由于统计语料有限,所以会存在数据稀疏的情況,这可能导致零概率或估计不准的问题,因此对语料中未出现或少量出现的词序列,需要采用平滑技术进行间接预测。

概括起来,平滑技术主要有三种。

  • 折扣法( Discounting):从已有观察值概率调配一些给未观察值概率,例如 Good-Turing(吉德-图灵)折扣法。
  • 插值法(Interpolation):将高阶模型和低阶模型做线性组合,如Jelinek-Mercer 插值法,也可做非线性组合,如Kneser-Ney 插值法。
  • 回退法(Back-off):基于低阶模型估计未观察到的高阶模型,例如Katz 回退法。

Good-Turing 折扣法

Good-Turing 折扣法是从已有观察值概率调配一些给未观察值概率。设总词数为 $N$,出现1次的词数为 $N_1$,出现 $c$ 次的词数为 $N$,因此有
$$
N=\sum_ccN_c
$$
平滑后,出现次数 $c$ 被替换为 $c^*=\frac{(c+1)N_{c+1}}{N_c}$,其对应的概率为
$$
P_{GT}=\frac{c^*}{N}
$$

例如,给定分词后的句子语料(假设只有两句):

  • “我们 明年 会 有全新 的 开始”
  • “我们 彼此 祝福 着 等待 再见 那 一 天”

统计词频数:“我们°出现2次,“明年”出现1次,……,“天” 出现1次,即

折扣前:$N=16$, $N_1=14$, $N_2 =1$

折扣后:$P_0^*=\frac{N_1}{N}=\frac{14}{16}$ ,$P_1^*=\frac{c_1^*}{N}=\frac{2}{14*16}$

由于Good-Turing 折扣法设有考虑高阶模型和低阶模型之间的关系,所以一般不单独使用,而是作为其他平滑技术的一个配套方法。

Jelinek-Mercer 插值法

Jelinek-Mercer 是一种线性插值法。为了避免出现P(W)=0或接近于零的情况,可以用三元模型、二元模型和一元模型的相对概率做插值。最简单的线性插值如下:
$$
\hat{P}\left(w_t \mid w_{t-2} w_{t-1}\right)=\lambda_1 P\left(w_t \mid w_{t-2} w_{t-1}\right)+\lambda_2 P\left(w_t \mid w_{t-1}\right)+\lambda_3 P\left(w_t\right)
$$
其中, $\lambda_1+\lambda_2+\lambda_3=1$ 。

还有一种方法是基于上下文设置权重系数,高频的上下文通常会有高的权重系数。把语料库分为 training data held-out data 和 test data 三部分,固定好 training
data 的n-gram 概率,寻求以下式子的最大值:
$$
\begin{aligned}
\hat{P}\left(w_t \mid w_{t-2} w_{t-1}\right) & =\lambda_1\left(w_{t-2}^{t-1}\right) P\left(w_t \mid w_{t-2} w_{t-1}\right)+\lambda_2\left(w_{t-2}^{t-1}\right) P\left(w_t \mid w_{t-1}\right) \
& +\lambda_3\left(w_{t-2}^{t-1}\right) P\left(w_t\right)
\end{aligned}
$$
其中, $\lambda_1\left(w_{t-2}^{t-1}\right) 、 \lambda_2\left(w_{t-2}^{t-1}\right)$ 和 $\lambda_3\left(w_{t-2}^{t-1}\right)$ 基于 held-out data 通过最大似然优化得到, 即保持 $n$-gram 概率不变, 寻求使得这批集外数据预测概率最高的权重系数。

Kneser-Ney 插值法

在训练数据非常少的情况下,更适合采用 Kneser-Ney 插值法。Kneser-Ney是一种非线性插值法,它以 Absolote discounting(绝对折扣)插值方法该变而来。

Absolute discounting 方法充分利用高阶和低阶语言模型,把高阶的概率信息分配给低阶的一元模型。例如,针对二元模型,Absolute discounting 平滑公式表示如下:
$$
P_{\mathrm{abs}}\left(w_t \mid w_{t-1}\right)=\frac{\max \left(c\left(w_{t-1} w_t\right)-d, 0\right)}{\sum_{w^{\prime}} c\left(w_{t-1} w^{\prime}\right)}+\lambda P_{\mathrm{abs}}\left(w_t\right)
$$
其中, $c\left(w_{t-1} w^{\prime}\right)$ 表示 $w_{t-1} w^{\prime}$ 的组合次数, $w^{\prime}$ 是任意一个词, $d$ 是一个固定的折扣 值, $\lambda$ 是一个规整常量。

$P_{abs}(w_t)$ 是一元模型,它按单词出 现次数进行统计,这样可能会存在出现次数异常偏大现象。比如“杯子〞 出现频次较高,因此单独的“杯子” 按出现次数统计可能会比 “茶” 出现次数多,即 $P_abs(杯子)>P_{abs}(茶)$ ,这样会使 Absolote discounting平滑公式因 $P_{abs}(w)$ 值过大出现“喝杯子”比“喝茶”概率高的奇怪现象。

Kneser-Ney 插值法对此做了改进,保留了 Absolute discounting 平滑公式的第一部分,但重写了第二部分。第二部分中的概率不是词单独出现的概率,而是与其他词组合的概率。Kneser-Ney 平滑公式如下:
$$
P_{\mathrm{KN}}\left(w_t \mid w_{t-1}\right)=\frac{\max \left(c\left(w_{t-1} w_t\right)-d, 0\right)}{\sum_{w^{\prime}} c\left(w_{t-1} w^{\prime}\right)}+\lambda \frac{\left|\left{w_{t-1}: c\left(w_{t-1}, w_t\right)>0\right}\right|}{\left|\left{w_{j-1}: c\left(w_{j-1}, w_j\right)>0\right}\right|}
$$
其中, $\lambda$ 是规整的常量, $d$ 是一个固定的折扣值, $w_{j-1} w_j$ 是任意两个词的组合。第 一部分的分母可进一步表示为一元模型统计, 因此 Kneser-Ney 平滑公式还可简 化为
$$
P_{\mathrm{KN}}\left(w_t \mid w_{t-1}\right)=\frac{\max \left(c\left(w_{t-1} w_t\right)-d, 0\right)}{c\left(w_{t-1}\right)}+\lambda \frac{\left|\left{w_{t-1}: c\left(w_{t-1}, w_t\right)>0\right}\right|}{\left|\left{w_{j-1}: c\left(w_{j-1}, w_j\right)>0\right}\right|}
$$
Kneser-Ney 平滑法还有一个改进版本,其分别针对一元、二元、三元和三元以上的组合,设定不同的折扣值d,这种配置会取得更佳的平滑效果。

Katz 回退法

Katz 在 1987 年发表的论文中, 在 Good-Turing 折扣法的基础上, 提出了蚥 进的平滑技术,其主要贡献是回退法。

例如, 计算 $P\left(w_t \mid w_{t-2} w_{t-1}\right)$, 当出现的三元统计次数不是很多时, 可以采用 Good-Turing 折扣法进行平滑。当完全没有相关的三元统计时, 可以使用二元语法来估计, 如果没有相关的二元统计, 那么我们就用一元模型估计。

综合起来, 采用 Katz 平滑技术的概率估计公式如下:
$$
P\left(w_t \mid w_{t-2} w_{t-1}\right)=\left{\begin{array}{cl}
\frac{C\left(w_{t-2} w_{t-1} w_t\right)}{C\left(w_{t-2} w_{t-1}\right)}, & \text { 当 } C>C^{\prime} \text { 时 } \
d \frac{C\left(w_{t-2} w_{t-1} w_t\right)}{C\left(w_{t-2} w_{t-1}\right)}, & \text { 当 } 0<C<C^{\prime} \text { 时 } \
\text { backoff }\left(w_{t-2} w_{t-1}\right) P\left(w_t \mid w_{t-1}\right) &
\end{array}\right.
$$
其中, $C$ 是 $C\left(w_{t-2} w_{t-1} w_t\right)$ 的简写, 表示三个词同时出现的次数。 $C^{\prime}$ 是一个计数囯 值, 当 $C>C^{\prime}$ 时, 直接采用最大似然法估计概率; 当 $0<C<C^{\prime}$ 时, 则采用 Good-Turing 折扣法。 $d$ 是折扣系数。backoff $\left(w_{t-2} w_{t-1}\right)$ 是回退权重, 计算回退权 重, 是先采用折扣法计算低阶统计概率, 然后得到
$$
\text { backoff }\left(w_{t-2} w_{t-1}\right)=\frac{1-\sum P\left(w \mid w_{t-2} w_{t-1}\right)}{\sum P\left(w^{\prime} \mid w_{t-1}\right)}=\frac{1-\sum P\left(w \mid w_{t-2} w_{t-1}\right)}{1-\sum P\left(w \mid w_{t-1}\right)}
$$
其中, $w$ 是在训练语料中 $w_{t-2} w_{t-1}$ 之后出现的词, $w^{\prime}$ 是在训练语料中 $w_{t-2} w_{t-1}$ 之后 末出现的词。

采用 Katz 回退法, 训练好的语宆模型格式如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
\data
ngram 1=n1 # 一元语言模型
ngram 2=n2二元语言模型
ngram 3=n3三元语言模型

\1-grams :
pro_1 wordl back_pro1

\2-grams :
pro_2 word1 word2 back_pro2

\3-grams:
pro_3 word1 word2 word3

\end \

其中, pro_1 是一元模型 (1-grams) 单词的对数概率, pro_2 是二元模型 (2-grams 的对数概率, pro_3 是三元模型 (3-grams) 的对数概率。一元模型和二元模型后面分别带有回退权重 back_pro1 和 back_pro2。

如果要得到三个词出现的概率 $P$ (word3/word1,word2), 则根据以上语言模型, 其计算过程如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
if (存在 (word1, word2, word3) 的三元模型) { 
return pro_ 3 (word1, word2, word3) ;
}else if (存在 (word1, word2) 二元模型) {
return back_pro2 (word1, word2) *P (word3 / word2) ;
}else{
return P(word3 | word2);
}

if (存在 (word1, word2) 的二元模型) {
return pro_ 2 (word1, word2);
}else{
return back_pro2(word1)*pro_1 (word2) :
}

如果不存在(word 1,word 2 ,word 3 )的三元模型, 则采用回退法, 即结合回退权 重 back_pro2(word1,word2) 来计算: back_pro2(word1,word2) $* P($ word3/word2)。如 “拨打 郑州 局” 这样的组合, 如果语料库中没有,即没有相应的三元模型, 则 查找 “拨打 郑州” 和 “郑州 局” 的组合概率和回退概率。注意, 概率均为对数 概率,假设值如下:

$-3.220352$ 拨打 郑州 $-0.4072262$

$-3.012735$ 郑州 局 $-0.3083073$

则 $P($ “拨打 郑州 局” $)=P($ “局 | 拨打 郑州” $)=$ back_pro2(拨打,郑州)*P(局 郑州 $)=\ln \left(\mathrm{e}^{-0.4072262 *} \mathrm{e}^{-3.012735}\right)=-3.4199612$ 。