语言模型(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∏n​p(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∏n​p(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∏n​p(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∏n​p(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∏n​p(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∏n​p(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∑n​log[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​)=λ1​p(wi​∣wi−2​,wi−1​)+λ2​p(wi​∣wi−1​)+λ3​p(wi​)
其中,λ1+λ2+λ3=1\lambda_1+\lambda_2+\lambda_3=1λ1​+λ2​+λ3​=1​。其实Interpolation做的是对多种N-gram模型的结果的加权平均

模型的评估

对于语言模型,我们的评估指标叫做困惑度perplexityppl的计算有两种公式,以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=2n​p(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∑n​p(wi​∣wi−1​)

第二种公式中,xxx为average log likelihood

N-gram模型详解相关推荐

  1. 使用pickle保存机器学习模型详解及实战(pickle、joblib)

    使用pickle保存机器学习模型详解及实战 pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议. "Pickling"是将Python对象层次结构转换为字节 ...

  2. Transformer 模型详解

    Transformer 是 Google 的团队在 2017 年提出的一种 NLP 经典模型,现在比较火热的 Bert 也是基于 Transformer.Transformer 模型使用了 Self- ...

  3. TensorFlow Wide And Deep 模型详解与应用 TensorFlow Wide-And-Deep 阅读344 作者简介:汪剑,现在在出门问问负责推荐与个性化。曾在微软雅虎工作,

    TensorFlow Wide And Deep 模型详解与应用 TensorFlow Wide-And-Deep 阅读344  作者简介:汪剑,现在在出门问问负责推荐与个性化.曾在微软雅虎工作,从事 ...

  4. TensorFlow Wide And Deep 模型详解与应用

    Wide and deep 模型是 TensorFlow 在 2016 年 6 月左右发布的一类用于分类和回归的模型,并应用到了 Google Play 的应用推荐中 [1].wide and dee ...

  5. 数学建模——智能优化之模拟退火模型详解Python代码

    数学建模--智能优化之模拟退火模型详解Python代码 #本功能实现最小值的求解#from matplotlib import pyplot as plt import numpy as np imp ...

  6. 数学建模——智能优化之粒子群模型详解Python代码

    数学建模--智能优化之粒子群模型详解Python代码 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplo ...

  7. 数学建模——支持向量机模型详解Python代码

    数学建模--支持向量机模型详解Python代码 from numpy import * import random import matplotlib.pyplot as plt import num ...

  8. 数学建模——一维、二维插值模型详解Python代码

    数学建模--一维.二维插值模型详解Python代码 一.一维插值 # -*-coding:utf-8 -*- import numpy as np from scipy import interpol ...

  9. 数学建模——线性规划模型详解Python代码

    数学建模--线性规划模型详解Python代码 标准形式为: min z=2X1+3X2+x s.t x1+4x2+2x3>=8 3x1+2x2>=6 x1,x2,x3>=0 上述线性 ...

  10. 数学建模_随机森林分类模型详解Python代码

    数学建模_随机森林分类模型详解Python代码 随机森林需要调整的参数有: (1) 决策树的个数 (2) 特征属性的个数 (3) 递归次数(即决策树的深度)''' from numpy import ...

最新文章

  1. Golang垃圾回收机制(一)
  2. MySQL时间格式TIMESTAMP和DATETIME的区别
  3. Spring MVC中的验证组
  4. ci 地址去掉index.php,CI框架如何删除地址栏的 index.php
  5. leetcode 回文数
  6. 如何利用机器学习进行海量数据挖掘
  7. 接口测试第二课(Fiddler实现APP抓包)
  8. 鸿蒙手机开发者活动,华为 12 月16 日举行鸿蒙 2.0 手机开发者 Beta 活动
  9. 安利一个黑科技!还有两款电视盒子播影神器,放假了应该用得到~
  10. Excel线性回归分析
  11. 华为HCIE云计算培训笔记第3天
  12. html-box-sizing
  13. 2020-07-28 activeMq 两种模式的测试
  14. 分享一个动态sql编写工具
  15. 抛弃光驱,让你的U盘变光驱,制作USB-CDROM,用U盘安装系统
  16. 7-1 计算存款利息 (10分) 本题目要求计算存款利息
  17. win10/11上一键切换全拼/双拼
  18. 详解智能制造中的计算机视觉应用瓶颈问题
  19. 第一章 README
  20. 两种技能增长曲线:对数增长曲线(先快后慢)和指数增长曲线(先慢后快)

热门文章

  1. 快进来看程序员风格的修真小说!
  2. urchin的安装及使用
  3. Java和C专项练习
  4. JavaWeb网上图书商城
  5. 大一计算机考试题库打字题,大一计算机考试题库
  6. python笑脸猫图案_酷叮猫编程课堂:python生成字符画
  7. ESP8266学习笔记(3)——GPIO接口使用
  8. python如何提交作业_提交作业
  9. Css3之画五角星跟六角星
  10. 勒索病毒防护形式_病毒的完整形式是什么?