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

我来设计环节

语言模型 N-gram 与其平滑方法推导的更多相关文章

  1. SRILM的使用及平滑方法说明

    1.简介 SRILM是通过统计方法构建语言模型,主要应用于语音识别,文本标注和切分,以及机器翻译等. SRILM支持语言模型的训练和评测,通过训练数据得到语言模型,其中包括最大似然估计及相应的平滑算法 ...

  2. CTR预估中的贝叶斯平滑方法及其代码实现

    1. 背景介绍 广告形式: 互联网广告可以分为以下三种: 1)展示广告(display ad) 2)搜索广告(sponsored search ad) 3)上下文广告(contextual ad)   ...

  3. CTR预估中的贝叶斯平滑方法(二)参数估计和代码实现

    1. 前言 前面博客介绍了CTR预估中的贝叶斯平滑方法的原理http://www.cnblogs.com/bentuwuying/p/6389222.html. 这篇博客主要是介绍如何对贝叶斯平滑的参 ...

  4. CTR预估中的贝叶斯平滑方法(一)原理及实验介绍

    1. 背景介绍 广告形式: 互联网广告可以分为以下三种: 1)展示广告(display ad) 2)搜索广告(sponsored search ad) 3)上下文广告(contextual ad)   ...

  5. Lambda方法推导(method references)

    在上一篇[http://www.cnblogs.com/webor2006/p/7707281.html]中提到了方法推导的东东: 这里说细的学习一下它,下面走起! Method references ...

  6. 【NOIP考前模拟赛】纯数学方法推导——旅行者问题

    一.写在前面 这题似乎是一道原创题目(不是博主原创),所以并不能在任何OJ上评测,博主在网盘上上传了数据(网盘地址:http://pan.baidu.com/s/1mibdMXi),诸位看官需者自取. ...

  7. 5种方法推导Normal Equation

    引言: Normal Equation 是最基础的最小二乘方法.在Andrew Ng的课程中给出了矩阵推到形式,本文将重点提供几种推导方式以便于全方位帮助Machine Learning用户学习. N ...

  8. jdk1.8 -- 方法推导 静态方法、实例方法、构造方法推导

    一.静态方法的推导 public class MainTest { public static void main(String[] args) { // 正常情况下我们需要通过写一个consumer ...

  9. 基于短语的统计机器翻(PBMT) 开源工具 :Moses

    如何运行Moses 1. Moses的历史 Moses是Pharaoh的升级版本,增加了许多功能.它是一个基于短语的统计机器翻译系统,整个系统用C++语言写成,从训练到解码完全开放源代码,可以运行在L ...

随机推荐

  1. oeong.xyz

    兴趣使然而搭的小破站:oeong.xyz

  2. jchdl - GSL实例 - Sub(二的补码实现)

    https://mp.weixin.qq.com/s/10fgjqPt2pRvIJzjDGYgBg   概念辨析   <IC-二进制, 自然数, 有符号数>:https://mp.weix ...

  3. Java实现蓝桥杯 算法提高 盾神与积木游戏

    题目描述 最近的m天盾神都去幼儿园陪小朋友们玩去了~ 每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们想要的东西.但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他 小朋 ...

  4. Java实现 LeetCode 652 寻找重复的子树(两个map的DFS)

    652. 寻找重复的子树 给定一棵二叉树,返回所有重复的子树.对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可. 两棵树重复是指它们具有相同的结构以及相同的结点值. 示例 1: 1 / \ ...

  5. Java实现 蓝桥杯VIP 算法训练 P1101

    有一份提货单,其数据项目有:商品名(MC).单价(DJ).数量(SL).定义一个结构体prut,其成员是上面的三项数据.在主函数中定义一个prut类型的结构体数组,输入每个元素的值,计算并输出提货单的 ...

  6. Java实现P2102 -- 正整数序列

    P2102 – 正整数序列 给定正整数n, 你的任务是用最少的操作次数把序列1,2,-,n中的所有数都变成0.每次操作可从序列中选择一个或多个整数, 同时减去一个相同的正整数.比如,1,2,3可以把2 ...

  7. java实现 猜数字游戏

    猜数字游戏 猜数字 很多人都玩过这个游戏:甲在心中想好一个数字,乙来猜.每猜一个数字,甲必须告诉他是猜大了,猜小了,还是刚好猜中了.下列的代码模拟了这个过程.其中用户充当甲的角色,计算机充当乙的角色. ...

  8. 简谈Java语言的继承

    Java语言的继承 这里简谈Java语言的三大特性之二——继承. Java语言的三大特性是循序渐进的.是有顺序性的,应该按照封装-->继承-->多态这样的顺序依次学习 继承的定义 百度百科 ...

  9. 06.Django-用户认证

    用户认证 Django 内置一个 auth 模块,帮助用户实现注册.登录.注销以及修改密码等功能,帮助开发者省去了很多功夫 用于认证的数据表 auth_user User是auth模块中维护用户信息的 ...

  10. 关于Api的那些事儿!

    工作中一直在写Api数据接口,但大部分的Api都存在这样的问题 1.接口请求的地址和参数暴露 2.重要接口返回数据明文暴露 3.APP登录态请求的数据完全性问题 4.代码层的数据完全性问题(从代码层有 ...