语言模型 N-gram 与其平滑方法推导
N-gram
N-gram 作为一个名词表示的是一个给定文本/音频样本中有n项(音素,音节,字母,单词)的一个连续序列。
数学表达
N-gram 模型表示的是当前这个 word \(w_i\) 依赖于前面 N-1 个word,所以可以表达为
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出现的概率和前两个词有关
评价标准
好的语言模型的标准
- 拟合:需要对训练集有一个比较好的匹配
- 泛化:对未出现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 数量。
而在该语料中的困惑度的定义为:
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}
\]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 与其平滑方法推导的更多相关文章
- SRILM的使用及平滑方法说明
1.简介 SRILM是通过统计方法构建语言模型,主要应用于语音识别,文本标注和切分,以及机器翻译等. SRILM支持语言模型的训练和评测,通过训练数据得到语言模型,其中包括最大似然估计及相应的平滑算法 ...
- CTR预估中的贝叶斯平滑方法及其代码实现
1. 背景介绍 广告形式: 互联网广告可以分为以下三种: 1)展示广告(display ad) 2)搜索广告(sponsored search ad) 3)上下文广告(contextual ad) ...
- CTR预估中的贝叶斯平滑方法(二)参数估计和代码实现
1. 前言 前面博客介绍了CTR预估中的贝叶斯平滑方法的原理http://www.cnblogs.com/bentuwuying/p/6389222.html. 这篇博客主要是介绍如何对贝叶斯平滑的参 ...
- CTR预估中的贝叶斯平滑方法(一)原理及实验介绍
1. 背景介绍 广告形式: 互联网广告可以分为以下三种: 1)展示广告(display ad) 2)搜索广告(sponsored search ad) 3)上下文广告(contextual ad) ...
- Lambda方法推导(method references)
在上一篇[http://www.cnblogs.com/webor2006/p/7707281.html]中提到了方法推导的东东: 这里说细的学习一下它,下面走起! Method references ...
- 【NOIP考前模拟赛】纯数学方法推导——旅行者问题
一.写在前面 这题似乎是一道原创题目(不是博主原创),所以并不能在任何OJ上评测,博主在网盘上上传了数据(网盘地址:http://pan.baidu.com/s/1mibdMXi),诸位看官需者自取. ...
- 5种方法推导Normal Equation
引言: Normal Equation 是最基础的最小二乘方法.在Andrew Ng的课程中给出了矩阵推到形式,本文将重点提供几种推导方式以便于全方位帮助Machine Learning用户学习. N ...
- jdk1.8 -- 方法推导 静态方法、实例方法、构造方法推导
一.静态方法的推导 public class MainTest { public static void main(String[] args) { // 正常情况下我们需要通过写一个consumer ...
- 基于短语的统计机器翻(PBMT) 开源工具 :Moses
如何运行Moses 1. Moses的历史 Moses是Pharaoh的升级版本,增加了许多功能.它是一个基于短语的统计机器翻译系统,整个系统用C++语言写成,从训练到解码完全开放源代码,可以运行在L ...
随机推荐
- ajax实现注册并选择头像后上传
在初次接触ajax后,我们做了一个crm训练的项目,大多数小组都有注册用户这一项,但是都忽略掉了一个功能,那就是,很多网站的注册是可以上传头像的,在这里我做了一个在已有的头像数组里选择图片上传作头像的 ...
- golang内存逃逸
golang程序变量会携带油一组校验数据,用来证明它的整个生命周期是否在运行时完全可知.如果变量通过了这些校验,它就可以在栈上分配.否则就说它逃逸了,必须在堆上分配 能引起变量逃逸到堆上的典型 ...
- java实现第四届蓝桥杯快速排序
快速排序 题目描述 快速排序算法是典型的分治思想的运用.它使用某个key把全部元素分成两组,其中一组的元素不大于另一组.然后对这两组再次进行递归排序. 以下代码实现了快速排序.请仔细阅读代码,填写缺少 ...
- java实现第七届蓝桥杯取球博弈
题目9.取球博弈 取球博弈 两个人玩取球的游戏. 一共有N个球,每人轮流取球,每次可取集合{n1,n2,n3}中的任何一个数目. 如果无法继续取球,则游戏结束. 此时,持有奇数个球的一方获胜. 如果两 ...
- java实现第四届蓝桥杯剪格子
剪格子 题目描述 如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子 ...
- Entity Framework Core遇到的问题汇总
1.add-migration : 无法将“add-migration”项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次. 使用E ...
- 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...
- Spting:基于注解的组件化管理
@Component,@Controller(控制层),@Service(业务层),@Repository(持久层) 以上四个注解的功能完全相同,不过在实际开发中,要在不同功能的类上加上响应的注解 1 ...
- 分享一个springboot脚手架
项目介绍 在我们开发项目的时候各个项目之间总有一些可共用的代码或者配置,如果我们每新建一个项目就把代码复制粘贴再修改就显得很没有必要.于是我就做了一个 poseidon-boot-starter 该项 ...
- CAS(乐观锁)与ABA问题
cas是什么 CAS 全称 compare and swap 或者compare and exchange 比较并且交换.用于在没有锁的情况下,多个线程对同一个值的更新. cas原理 例如,我们对一 ...