N-gram模型详解
语言模型(Language Model)
基本概念
什么是语言模型?简言之,语言模型可以理解为是一种用于判度一个句子是否通顺的模型。举例来说,假设我们有一个训练好的语言模型modelmodelmodel,给定两个句子:我喜欢AI、喜欢我AI。显然第一个句子更通顺,或者说出现的可能性更大,所以modelmodelmodel,给出的结果就是P(我喜欢AI)>P(喜欢我AI)P(我喜欢AI)>P(喜欢我AI)P(我喜欢AI)>P(喜欢我AI)。
于是,我们得到了语言模型的目标:计算一个句子或者一列词的概率,即
compute:p(s)=p(w1,w2...wn)compute: p(s)=p(w_1, w_2...w_n) compute:p(s)=p(w1,w2...wn)
Chain Rule
计算上面式子的一个方法是基于概率论中的链式法则,即
p(w1,w2,...,wn)=p(w1)p(w2∣w1)p(w3∣w1,w2)...p(wn∣w1,w2...wn−1)p(w_1, w_2, ..., w_n) = p(w_1)p(w2|w1)p(w3|w1, w2)...p(w_n|w_1,w_2...w_{n-1}) p(w1,w2,...,wn)=p(w1)p(w2∣w1)p(w3∣w1,w2)...p(wn∣w1,w2...wn−1)
等式中的条件概率可以基于对语料库的统计来计算。但是不难发现,假设我们的句子比较长,那么我们要找的短语也会很长,而事实上大多数短语在语料库中是不存在的,这就会造成严重的稀疏性。
Markov Assumption
使用链式法则会出现稀疏性问题,因此我们采用马尔科夫假设,即当前事件只依赖于它前一个或者前几个事件。根据依赖事件数量的不同,上述式子有以下几种计算方式:
p(s)=p(w1)p(w2∣w1)p(w3∣w2)...p(wn∣wn−1)=p(w1)∏i=2np(wi∣wi−1)p(s)=p(w_1)p(w_2|w_1)p(w_3|w_2)...p(w_n|w_{n-1}) \\ =p(w_1)\prod_{i=2}^{n}p(w_i|w_{i-1}) p(s)=p(w1)p(w2∣w1)p(w3∣w2)...p(wn∣wn−1)=p(w1)i=2∏np(wi∣wi−1)
p(s)=p(w1)p(w2∣w1)p(w3∣w1,w2)...p(wn∣wn−1)=p(w1)p(w2∣w1)∏i=3np(wi∣wi−2,wi−1)p(s)=p(w_1)p(w_2|w_1)p(w_3|w_1, w_2)...p(w_n|w_n-1) \\ =p(w_1)p(w_2|w_1)\prod_{i=3}^{n}p(w_i|w_{i-2},w_{i-1}) p(s)=p(w1)p(w2∣w1)p(w3∣w1,w2)...p(wn∣wn−1)=p(w1)p(w2∣w1)i=3∏np(wi∣wi−2,wi−1)
当然,还可以依赖于三个词、四个词……但是依赖的词越多,计算出的概率精度可能就越低。
N-gram模型
N-gram模型是基于马尔科夫假设的一系列基础的语言模型。具体可以分为unigram, bigram, trigram, n-gram。
分类
Unigram
如果我们考虑词语都是独立的,或者说每个词只依赖于其本身,那么目标函数可以改写为
p(s)=p(w1)p(w2)...p(wn)=∏i=1np(wi)p(s)=p(w_1)p(w_2)...p(w_n) \\ =\prod_{i=1}^{n}p(w_i) p(s)=p(w1)p(w2)...p(wn)=i=1∏np(wi)
Bigram
根据first order的马尔科夫假设,即每个词依赖于它的前一个词
p(s)=p(w1)p(w2∣w1)p(w3∣w2)...p(wn∣wn−1)=p(w1)∏i=2np(wi∣wi−1)p(s)=p(w_1)p(w_2|w_1)p(w_3|w_2)...p(w_n|w_{n-1}) \\ =p(w_1)\prod_{i=2}^{n}p(w_{i}|w_{i-1}) p(s)=p(w1)p(w2∣w1)p(w3∣w2)...p(wn∣wn−1)=p(w1)i=2∏np(wi∣wi−1)
Trigram
根据second order的马尔科夫假设,即每个词依赖于它的前两个词
p(s)=p(w1)p(w2∣w1)p(w3∣w1,w2)...p(wn∣wn−2,wn−1)=p(w1)p(w2∣w1)∏i=3np(wi∣wi−2,wi−1)p(s)=p(w_1)p(w_2|w_1)p(w_3|w_1,w_2)...p(w_n|w_{n-2},w_{n-1})\\ =p(w_1)p(w_2|w_1)\prod_{i=3}^{n}p(w_i|w_{i-2},w_{i-1}) p(s)=p(w1)p(w2∣w1)p(w3∣w1,w2)...p(wn∣wn−2,wn−1)=p(w1)p(w2∣w1)i=3∏np(wi∣wi−2,wi−1)
N-gram
事实上,N>2N\gt2N>2的模型都被称为N-gram模型,常用的NNN一般为1,2,3
模型的训练
N-gram模型是基于对语料库的统计来进行训练的,举例来说,对于Bigram模型,我们要计算p(cat∣the)p(cat|the)p(cat∣the),那么公式为
p(cat∣the)=C(the,cat)C(the)p(cat|the) = \frac{C(the, cat)}{C(the)} p(cat∣the)=C(the)C(the,cat)
其中C(wi)C(w_i)C(wi)表示语料库中单词wiw_iwi出现的次数。
仍然以Bigram模型为例,我们的目标函数是
J=p(w1)∏i=2np(wi∣wi−1)J=p(w_1)\prod_{i=2}^np(w_i|w_{i-1}) J=p(w1)i=2∏np(wi∣wi−1)
由于又涉及到多个概率连乘问题,所以我们映射到对数空间,即
J,=log(J)=log[p(w1)]+∑i=2nlog[p(wi∣wi−1)]J^, = log(J) = log[p(w_1)]+\sum_{i=2}^nlog[p(w_i|w_{i-1})] J,=log(J)=log[p(w1)]+i=2∑nlog[p(wi∣wi−1)]
我们的任务是最大化这个对数似然,因此这种参数估计的方式就叫做MLE(Maximum Log Likelihood)
模型的平滑
在实际预测过程中,我们往往会遇到没有出现过的组合形式,举例来说:
我们的语料库是:“我 非常 喜欢 AI”,“我 喜欢 你”, “AI 是 全民 趋势”,而给定的任务是计算p(你喜欢AI)p(你喜欢AI)p(你喜欢AI)。假设我们的模型是Bigram,那么这个概率就是:
p(你喜欢我)=p(你)p(喜欢∣你)p(AI∣喜欢)p(你 喜欢 我)=p(你)p(喜欢|你)p(AI|喜欢) p(你喜欢我)=p(你)p(喜欢∣你)p(AI∣喜欢)
而我们在语料库没有找到“你 喜欢”这种组合,即C(你,喜欢)=0C(你, 喜欢)=0C(你,喜欢)=0。那么这样一来整个概率值就是0,这显然是不合适的。为了解决这种问题,我们引入语言模型的平滑,下面介绍三种方法
Add-One Smoothing
Add One Smoothing又被称为拉普拉斯平滑,它的计算公式是(以Bigram为例)
padd−1(wi∣wi−1)=C(wi−1,wi)+1C(wi−1)+Vp_{add-1}(w_i|w_{i-1})=\frac{C(w_{i-1},w_i)+1}{C(w_{i-1})+V} padd−1(wi∣wi−1)=C(wi−1)+VC(wi−1,wi)+1
即给每个Bigram分子加1,分母加词库大小V。分母加V的目的是保证概率和为1。下面这四张图(两组)清晰地说明了这种方法
Original
After add-one smoothing
但是,这种方法的一个潜在问题就是,它会降低一些原有组合的置信度,详见红框标出的位置。
Add-K Smoothing
在add-one smoothing的基础之上,又提出了add-k smoothing,这种方法与add-one smoothing原理相同,只是扩大了K倍,即
padd−k(wi−1∣wi)=C(wi−1,wi)+kC(wi−1)+k∗Vp_{add-k}(w_{i-1}|w_i)=\frac{C(w_{i-1},w_i)+k}{C(w_{i-1})+k*V} padd−k(wi−1∣wi)=C(wi−1)+k∗VC(wi−1,wi)+k
Interpolation
Interpolation利用的是一种融合的思想,它所解决的是这样的问题:
加入我们的语料库中有“in the”,“kitchen”,而我们要预测的是“in the kitchen”和“in the hell”。显然,如果利用Trigram模型,这两个结果都是0。
所以Interpolation考虑的就是综合利用Unigram、Bigram、Trigram信息以避免出现zero term。具体的计算公式为(以Trigram为例):
p(wi∣wi−2,wi−1)=λ1p(wi∣wi−2,wi−1)+λ2p(wi∣wi−1)+λ3p(wi)p(w_{i}|w_{i-2},w_{i-1})=\lambda_1p(w_i|w_{i-2},w_{i-1})+\lambda_2p(w_i|w_{i-1})+\lambda_3p(w_i) p(wi∣wi−2,wi−1)=λ1p(wi∣wi−2,wi−1)+λ2p(wi∣wi−1)+λ3p(wi)
其中,λ1+λ2+λ3=1\lambda_1+\lambda_2+\lambda_3=1λ1+λ2+λ3=1。其实Interpolation做的是对多种N-gram模型的结果的加权平均
模型的评估
对于语言模型,我们的评估指标叫做困惑度perplexity。ppl的计算有两种公式,以Bigram为例:
1、PPL(M)=p(w1,w2,...,wn)−1n=1p(w1)∏i=2np(wi∣wi−1)n1、PPL(M)=p(w_1, w_2, ..., w_n)^{-\frac{1}{n}}=\sqrt[n]{\frac{1}{p(w_1)\prod_{i=2}^n{p(w_i|w_{i-1})}}} 1、PPL(M)=p(w1,w2,...,wn)−n1=np(w1)∏i=2np(wi∣wi−1)1
2、PPL(M)=2−x,x=1/n∑i=2np(wi∣wi−1)2、PPL(M)=2^{-x},x=1/n\sum_{i=2}^np(w_i|w_{i-1}) 2、PPL(M)=2−x,x=1/ni=2∑np(wi∣wi−1)
第二种公式中,xxx为average log likelihood
N-gram模型详解相关推荐
- 使用pickle保存机器学习模型详解及实战(pickle、joblib)
使用pickle保存机器学习模型详解及实战 pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议. "Pickling"是将Python对象层次结构转换为字节 ...
- Transformer 模型详解
Transformer 是 Google 的团队在 2017 年提出的一种 NLP 经典模型,现在比较火热的 Bert 也是基于 Transformer.Transformer 模型使用了 Self- ...
- TensorFlow Wide And Deep 模型详解与应用 TensorFlow Wide-And-Deep 阅读344 作者简介:汪剑,现在在出门问问负责推荐与个性化。曾在微软雅虎工作,
TensorFlow Wide And Deep 模型详解与应用 TensorFlow Wide-And-Deep 阅读344 作者简介:汪剑,现在在出门问问负责推荐与个性化.曾在微软雅虎工作,从事 ...
- TensorFlow Wide And Deep 模型详解与应用
Wide and deep 模型是 TensorFlow 在 2016 年 6 月左右发布的一类用于分类和回归的模型,并应用到了 Google Play 的应用推荐中 [1].wide and dee ...
- 数学建模——智能优化之模拟退火模型详解Python代码
数学建模--智能优化之模拟退火模型详解Python代码 #本功能实现最小值的求解#from matplotlib import pyplot as plt import numpy as np imp ...
- 数学建模——智能优化之粒子群模型详解Python代码
数学建模--智能优化之粒子群模型详解Python代码 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplo ...
- 数学建模——支持向量机模型详解Python代码
数学建模--支持向量机模型详解Python代码 from numpy import * import random import matplotlib.pyplot as plt import num ...
- 数学建模——一维、二维插值模型详解Python代码
数学建模--一维.二维插值模型详解Python代码 一.一维插值 # -*-coding:utf-8 -*- import numpy as np from scipy import interpol ...
- 数学建模——线性规划模型详解Python代码
数学建模--线性规划模型详解Python代码 标准形式为: min z=2X1+3X2+x s.t x1+4x2+2x3>=8 3x1+2x2>=6 x1,x2,x3>=0 上述线性 ...
- 数学建模_随机森林分类模型详解Python代码
数学建模_随机森林分类模型详解Python代码 随机森林需要调整的参数有: (1) 决策树的个数 (2) 特征属性的个数 (3) 递归次数(即决策树的深度)''' from numpy import ...
最新文章
- Golang垃圾回收机制(一)
- MySQL时间格式TIMESTAMP和DATETIME的区别
- Spring MVC中的验证组
- ci 地址去掉index.php,CI框架如何删除地址栏的 index.php
- leetcode 回文数
- 如何利用机器学习进行海量数据挖掘
- 接口测试第二课(Fiddler实现APP抓包)
- 鸿蒙手机开发者活动,华为 12 月16 日举行鸿蒙 2.0 手机开发者 Beta 活动
- 安利一个黑科技!还有两款电视盒子播影神器,放假了应该用得到~
- Excel线性回归分析
- 华为HCIE云计算培训笔记第3天
- html-box-sizing
- 2020-07-28 activeMq 两种模式的测试
- 分享一个动态sql编写工具
- 抛弃光驱,让你的U盘变光驱,制作USB-CDROM,用U盘安装系统
- 7-1 计算存款利息 (10分) 本题目要求计算存款利息
- win10/11上一键切换全拼/双拼
- 详解智能制造中的计算机视觉应用瓶颈问题
- 第一章 README
- 两种技能增长曲线:对数增长曲线(先快后慢)和指数增长曲线(先慢后快)