N-gram
N-gram 作为一个名词表示的是一个给定文本/音频样本中有n项(音素,音节,字母,单词)的一个连续序列。
数学表达
N-gram 模型表示的是当前这个 word \(w_i\) 依赖于前面 N-1 个word,所以可以表达为
其中,为了方便书写,规定 \(w_{i-n+1}^{i} = w_{i-n+1}\cdots w_{i-1} w_{i}\)
最大似然估计 MLE 表示的是语料库中,在前 n-1 个 word 相同(都是 \(w_{i-n+1}^{i-1}\))的情况下,下一个 word 是 \(w_i\) 的概率。
一般来说,\(c(w_{i-n+1}^i) = \sum_{w_i}c(w_{i-n+1}^{i-1})\)。
有以下几种简单情况
- Unigram \(P(w_i)\):当前word出现的概率和之前的word没有关系(独立)
- Bigram \(P(w_i|w_{i-1})\):当前word出现的概率和前一个词有关
- Trigram \(P(w_i|w_{i-1}w_{i-2})\):当前word出现的概率和前两个词有关
评价标准
好的语言模型的标准
- 拟合:需要对训练集有一个比较好的匹配
- 泛化:对未出现word也要评估的比较好
公式化的评价标准——困惑度 Perplexity
- 在训练集上表示为与训练数据的匹配程度
- 在测试集上表示为对新数据的泛化性能
对于一个 n-gram,其概率为 \(P(w_i|w_{i-n+1}^{i-1})\),
因此可以计算到某个长度为 \(m\) 句子 \(s\) 的概率 \(P(s) = \prod_{i=1}^{m+1} P(w_i|w_{i-n+1}^{i-1})\)
假定某个语料 \(G\) 由 \(l\) 个句子构成,则整个语料的概率为 \(P(G) = \prod_{i=1}^{l} P(s_i)\)
可以计算得到模型 \(P(w_i|w_{i-n+1}^{i-1})\) 对于语料的交叉熵:
其中,\(W_G\) 表示的是语料 \(G\) 中的 word 数量。
而在该语料中的困惑度的定义为:
因此 \(P(G)\) 越大,相对的 Perplexity 值就越小,说明困惑度就越小。所以该值越小,模型预测能力越好。(n-gram 对于英语文本的困惑度范围一般为 50~1000, 对应于交叉熵范围为 6~10 bits/word。)
平滑 Smoothing
目的:用于解决语料稀疏导致的大量0概率问题
基本思想:从其他出现过的样本中合理地匀一些给未出现的(使出现过的 n-gram 概率下降,提升未见的 n-gram 概率)
基本目标:在测试集上语言模型的困惑度越小越好。
基本约束:\(\sum_{w_i}P(w_i|w_{i-n+1}^{i-1}) = 1\)
相关方法:
- 加值 Additive
- 折扣 Discounting
- 重新分配
加值 Additive
-
Add-one:对于每一种 n-gram 出现次数都+1,这样对于未出现过的 n-gram 也得到一定的概率,加值后的词概率为
\[P\left(w_{i} | w_{i-n+1}^{i-1}\right)= \frac{c\left(w_{i-n+1}^{i}\right)+1}{\sum _{w_i} \left[c\left(w_{i-n+1}^{i}\right)+1\right]}= \frac{c\left(w_{i-n+1}^{i}\right)+1}{\sum _{w_i} c\left(w_{i-n+1}^{i}\right)+|V|}, c\left(w_{i-n+1}^{i}\right)>0 \]其中,\(V\) 表示全部可能的基元数 (被考虑语料的词汇量),之前一直不是很明白这里为什么表示的是语料的词汇量。因为按照公式的推导过程我觉得 \(V\) 应该是相同 \(w_{i-n+1}^{i-1}\) 下可能的 \(w_i\) 的种类数。这样理解也没错,但问题的关键就是此时的 \(w_{i-n+1}^i\) 种类的数还是原来的种类数吗? 其实不是了,因为对于语料库中的每个 word (无论是出现的还是未出现的),都可能接在 \(w_{i-n+1}^{i-1}\) 之后,他们也都有了一次的出现次数,所以分母加上的是预料库中的词汇量。
那么,这个简单的方法问题也很明显:- 给未出现的 n-gram 分配了太多的次数/概率了
- 无论未见 n-gram 是高频还是低频都一视同仁,显然不够合理
-
Add-k:对于Add-one的第一个问题,+1 被换成了 +\(k\) (\(0
) \[P\left(w_{i} | w_{i-n+1}^{i-1}\right)=\frac{c\left(w_{i-n+1}^{i}\right) + k}{\sum_{w_{i}} c\left(w_{i-n+1}^{i}\right) + k|V|} \]但问题二还是没有解决。
折扣 Discounting
-
Constant discount:也叫绝对减值法,每种出现的 n-gram,对其出现的次数减去一定常量 \(k\),总折扣 \(count =N_{\geq 1} * k\) (\(N_{\geq 1}\) 表示出现过的可能的 n-gram 类型数) 分配给未见 n-gram,因此折扣过后的词概率为
\[P\left(w_{i} | w_{i-n+1}^{i-1}\right)=\frac{c\left(w_{i-n+1}^{i}\right)-k}{\sum _{w_i} c\left(w_{i-n+1}^{i}\right)}, c\left(w_{i-n+1}^{i}\right)>0 \] -
Good-Turing estimate:用出现 \(c+1\) 次的 n-gram 去重分配出现 \(c\) 次的 n-gram (用出现1次的去估计出现0次的)
设出现次数为 \(c\) 的 n-gram 有 \(n_c\) 种,\(c^*\) 为折扣后的出现次数,那么对于可能出现的 n-gram 总数 \(N\),有以下表达式\[N=\sum_{c=0}^{\infty} n_{c} c^{*}=\sum_{c=1}^{\infty} n_{c} c=\sum_{c=0}^{\infty} n_{c+1}(c+1) \]可以计算得到 \(c^{*}=(c+1) \frac{n_{c+1}}{n_{c}}\),可以看出折扣后的出现次数 \(c^*\) 与 出现次数 \(c\) 的 n-gram 种类数 \(n_c\) 以及出现次数为 \(c+1\) 的 n-gram 种类数 \(n_{c+1}\) 有关,折扣率可表示为 \(d_c=\frac{c^{*}}{c}=\frac{c+1}{c} \cdot \frac{n_{c+1}}{n_{c}}\) ,折扣后的词概率为
\[P\left(w_{i} | w_{i-n+1}^{i-1}\right)=\frac{c^*}{N} \]根据 \(c^*\) 的表达式可以的到 \(c^*_0 = \frac{n_1}{n_0}\),因此未出现过的 n-gram 的概率为 (\(n_0\) 表示接下来未出现的 gram 有多少)
\[P(w_i|w_{i-n+1}^{i-1}, c = 0) = \frac{n_1}{n_0 * N} \]但这也存在一个问题,当 \(c\) 比较大时,\(n_{n+1}\) 可能为 0,这时候 \(c^*\) 就要转化为
\[c^{*}=(c+1) \frac{E[n_{c+1}]}{E[n_{c}]} \]这种情况下,期望如何求解?
不过在实际应用中,一般就直接用 \(n_{c+1}\) 替代 \(E[n_{c+1}]\),在这种情况下,所有语料库中出现过的 n-gram 的折扣后概率和可表示为
\[\sum_{c=1}^{\infty} n_c \frac{c^*}{N} = \sum_{c=1}^{\infty}(c+1)\frac{n_{c+1}}{N}=1 - \frac{n_1}{N} \]同样可以得到所有未见 n-gram 的总概率为 \(\frac{n_1}{N}\)。
问题:对于未出现过的 n-gram 进行了均分概率,但实际上出现的概率可能很不同。
重新分配
-
Katz Backoff:先按 Good-Turing 方法对已见 n-gram 进行折扣,将总折扣分配给未见 n-gram 之时,以它们的 (n-1)-gram 的概率 \(P(w_i | w_{i-n+2}^{i-1})\) 来计算比例。
对于 bigram 来说,数学表示如下
\[ c_{k a t z}\left(w_{i-1}^{i}\right)=\left\{ \begin{array}{ll} d_{c} c, & \text { if } c>0 \\ \alpha\left(w_{i-1}\right) P_{ML}\left(w_{i}\right), & \text { if } c=0 \end{array}\right. \]在\(\alpha\left(w_{i-1}\right)\) 是个由unigram概率 \(P_{ml}(w_i)\) 重分配的常数,简单的意思就是说两个字一起我没见过,但第二个字我还是见过的,按第二个字出现的概率来分配权重。此处折扣率 \(d_c\) 不一定是 Good-Turning 中的 \(\frac{c^*}{c}\),因为实际应用中,我们只折扣低频的 (\(r < k\),表示出现次数高的事件才是可信的,反之不可信)
因此,上式可以表示为
\[ c_{k a t z}\left(w_{i-1}^{i}\right)=\left\{ \begin{array}{ll} c, & \text { if } c>k \\ d_{c} c, & \text { if } 0如开头所说,我们希望折扣能够和 Good-Turing 的折扣成正比,同时也希望总折扣能够与 \(n_1\) 相等以便分给未见的gram。因此,可以列出以下两个式子。
\[1-d_{c}=\mu\left(1-\frac{c^{*}}{c}\right) \\ \sum_{c=1}^{k} n_{c}\left(1-d_{c}\right) c=n_{1} \]根据上述两式可以推导出(会推导的聪明的读者还请告知我怎么推导,感激不尽~)
\[ d_{c}=\frac{\frac{c^{*}}{c}-\frac{(k+1) n_{k+1}}{n_{1}}}{1-\frac{(k+1) n_{k+1}}{n_{1}}} \]同时,我们需要满足该方法中计算的到的总计数和 Good-Turing 中的计数相等
\[ \sum_{w_{i}} c_{k a t z}\left(w_{i-1}^{i}\right)=\sum_{w_{i}} c\left(w_{i-1}^{i}\right) \]可以将 \(\alpha \left(w_{i-1}\right)\) 看作归一化因子,以保证
\[\alpha\left(w_{i-1}\right)\sum_{w_{i}: c\left(w_{i-1}^{i}\right)=0} P_{M L}\left(w_{i}\right) + \sum_{w_{i}: c\left(w_{i-1}^{i}\right)>0} P_{katz}\left(w_{i}|w_{i-1}\right) = 1 \]因此,可以得到 backoff \(\alpha \left(w_{i-1}\right)\) 的值 (因为未见的 n-gram 可能比见过的还多,所以用1减去已见的 n-gram 的当前 word 的 (n-1)-gram 的最大似然之和来求)
\[ \begin{aligned} \alpha\left(w_{i-1}\right) & =\frac{1-\sum_{w_{i}: c\left(w_{i-1}^{i}\right)>0} P_{k a t z}\left(w_{i} | w_{i-1}\right)}{\sum_{w_{i}: c\left(w_{i-1}^{i}\right)=0} P_{M L}\left(w_{i}\right)} \\ & =\frac{1-\sum_{w_{i}: c\left(w_{i-1}^{i}\right)>0} P_{k a t z}\left(w_{i} | w_{i-1}\right)}{1-\sum_{w_{i}: c\left(w_{i-1}^{i}\right)>0} P_{M L}\left(w_{i}\right)} \end{aligned} \]而上式中的 \(P_{k a t z}\left(w_{i} | w_{i-1}\right)\) 表示为
\[P_{k a t z}\left(w_{i} | w_{i-1}\right)=\frac{c_{k a t z}\left(w_{i-1}^{i}\right)}{\sum_{w_{i}} c_{k a t z}\left(w_{i-1}^{i}\right)} \]Interpolation:
-
线性插值法:高阶 gram 概率参考低阶 gram 的概率(信息)
主要是用于弥补部分高阶 gram 的概率为 0 的情况,以达到平滑的目的。
比如说一个 Trigram 模型:
\[\begin{aligned} & P_{interp}\left(w_{i} | w_{i-2}, w_{i-1}\right)=\lambda_{1} P\left(w_{i} | w_{i-2}, w_{i-1}\right)+\lambda_{2} P\left(w_{i} | w_{i-1}\right)+\lambda_{3} P\left(w_{i}\right) \\ & \text {Where: } \sum_{j} \lambda_{j}=1 \end{aligned} \]关于 \(\lambda\) 的计算
-
Kneser-Ney Smoothing:目前最好的平滑方法
产生背景:当高阶不存在时,低阶信息确实有用,但我们需要对低阶概率做一个更好的估计。比如说高频词可能有个固定的搭配,在某些场景才适用 (与之搭配的 (n-1)-gram 类别少)。
在绝对减值法的基础上,考虑了「\(w_i\) 作为其他 (n-1)-gram 的延伸 word 的种类数占所有 n-gram 的种类数的概率」\(P_{ct}\),在bigram的情况下表示如下
\[P_{ct}(w_i) = \frac{\sum_{w_{i-1}:c(w_{i-1}^i)>0}n_{c(w_{i-1}^i)}}{\sum_{w_{i}:c(w_{i-1}^i)>0}\sum_{w_{i-1}:c(w_{i-1}^i)>0}n_{c(w_{i-1}^i)}} \]最终平滑后的词概率为
\[P_{KN}\left(w_{i} | w_{i-1}\right)=\frac{\max \left(c\left(w_{i-1}^{i}\right)-d, 0\right)}{\sum_{w_i: c(w_{i-1}^i) > 0} c\left(w_{i-1}^i\right)}+\lambda\left(w_{i-1}\right) P_{ct}\left(w_{i}\right) \]由于需要满足平滑的约束条件 \(\sum_{w_i}P_{KN}(w_i|w_{i-1}) = 1\),
在一般情况下, \(0
,约束条件可以写成 \[\sum_{w_i: c(w_{i-1}^i) = 0} \frac{0}{\sum_{w_i} c\left(w_{i-1}^i\right)} + \sum_{w_i: c(w_{i-1}^i) > 0}\frac{c\left(w_{i-1}^i\right) - d}{\sum_{w_i: c(w_{i-1}^i) > 0}c\left(w_{i-1}^i\right)} + \lambda(w_{i-1}) \sum_{w_i: c(w_{i-1}^i) \ge 0} \frac{\sum_{w_{i-1}:c(w_{i-1}^i)>0}n_{c(w_{i-1}^i)}}{\sum_{w_{i-1}:c(w_{i-1}^i)>0}\sum_{w_{i}:c(w_{i-1}^i)>0}n_{c(w_{i-1}^i)}} = 1 \]由于\(P_{ct}(w_i)\) 中的 \(n_{c(w_{i-1}w_i)}\) 为未折扣时的种类数,所以 \(\lambda\) 后的一长串可约成1,从而可以推导出归一化因子 \(\lambda(w_{i-1})\)
⚠️ 此处推导存疑,还望各位聪明的读者指点~
\[\begin{aligned} \lambda\left(w_{i-1}\right) &= 1 - \sum_{w_i: c(w_{i-1}^i) > 0}\frac{c\left(w_{i-1}^i\right) - d}{\sum_{w_i: c(w_{i-1}^i) > 0}c\left(w_{i-1}^i\right)}\\ &= 1 - 1 + \frac{d}{\sum_{w_i: c(w_{i-1}^i) > 0}c\left(w_{i-1} w_i\right)}\sum_{w_{i}:c(w_{i-1}^i)>0}n_{c(w_{i-1}^i)}\\ &=\frac{d}{\sum_{w_i: c(w_{i-1}^i) > 0}c\left(w_{i-1}^i\right)}\sum_{w_{i}:c(w_{i-1}^i)>0}n_{c(w_{i-1}^i)} \end{aligned} \]优点:不仅考虑了低阶 gram 的词频,还考虑了与低阶 gram 连接的种类数。
总结
平滑就是为了解决在测试集中出现训练语料中未出现的 n-gram 时的的概率计算,同时需要满足一个基本约束「修正后的当前 word 的所有 n-gram 概率之和依旧等于1」,
我来设计环节:
- 怎么折扣?在什么上折扣?
- 怎么分给未见 n-gram?
- 怎么设计归一化因子?
参考链接:
- 【PPT】第5章 语言模型
- CHAPTER-3 N-gram Language Models
- Speech Recognition — Acoustic, Lexicon & Language Model
- NLP Lunch Tutorial: Smoothing
- NLP 笔记 - 平滑方法(Smoothing)小结
- 系统学习NLP(四)--数据平滑
- 【PPT】Ngram语言模型
- An Empirical Study of Smoothing Techniques for Language Modeling