首页 > 技术文章 > 语言模型 N-gram 与其平滑方法推导

IO382 2020-06-14 22:26 原文

N-gram

N-gram 作为一个名词表示的是一个给定文本/音频样本中有n项(音素,音节,字母,单词)的一个连续序列。

数学表达

N-gram 模型表示的是当前这个 word \(w_i\) 依赖于前面 N-1 个word,所以可以表达为

\[\begin{aligned} P\left(w_i|w_{i-n+1}^{i-1}\right) & = P(w_i|w_{i-n+1}\cdots w_{i-1}) \\ \{MLE\} & \approx \frac{c(w_{i-n+1}\cdots w_{i-1} w_{i})}{c(w_{i-n+1}\cdots w_{i-1})} \end{aligned} \]

其中,为了方便书写,规定 \(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出现的概率和前两个词有关

评价标准

好的语言模型的标准

  1. 拟合:需要对训练集有一个比较好的匹配
  2. 泛化:对未出现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})\) 对于语料的交叉熵:

\[H_{P}(G)=-\frac{1}{W_{G}} \log _{2} P(G) \]

其中,\(W_G\) 表示的是语料 \(G\) 中的 word 数量。

而在该语料中的困惑度的定义为:

\[\begin{aligned} PP_P(W) &= 2^{H_P(G)} \\ &= P(G)^{-\frac{1}{W_G}} \end{aligned} \]

因此 \(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<k\leq1\))

    \[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<c\leq k \\ \alpha\left(w_{i-1}\right) P_{ML}\left(w_{i}\right), & \text { if } c=0 \end{array}\right. \]

    如开头所说,我们希望折扣能够和 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<d<1\),约束条件可以写成

      \[\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」,

我来设计环节

推荐阅读