目录

  • 统计语言模型
  • 零概率问题和平滑方法
    • 拉普拉斯平滑
      • Add‐One 平滑
      • Add‐K 平滑
    • 插值平滑
    • 古德-图灵估计
    • Katz平滑
  • 困惑度(Perplexity)

统计语言模型

统计语言模型的意义是通过计算一个语句出现的概率来判断它合乎语法的可能性,记一个序列S=(w1,w2,⋯,wn)S = (w_1,w_2,\cdots, w_n)S=(w1​,w2​,⋯,wn​),那么:
P(S)=P(w1,w2,⋯,wn)=P(w1)⋅P(w2∣w1)⋅P(w3∣w1,w2)⋯P(wn∣w1,w2,⋯,wn−1)\begin{aligned} P(S) &= P(w_1,w_2,\cdots, w_n)\\ &= P(w_1)\cdot P(w_2|w_1) \cdot P(w_3|w_1,w_2) \cdots P(w_n|w_1,w_2,\cdots, w_{n-1}) \end{aligned}P(S)​=P(w1​,w2​,⋯,wn​)=P(w1​)⋅P(w2​∣w1​)⋅P(w3​∣w1​,w2​)⋯P(wn​∣w1​,w2​,⋯,wn−1​)​
但是实际使用中P(w_n|w_1,w_2,\cdots, w_{n-1})的计算复杂度太高,而且一般越远的词对当前词的影响越小,所以为了简化模型,我们一般使用马尔科夫假设:任一词wiw_iwi​出现的概率只与它前面的一个词wi−1w_{i-1}wi−1​有关:
P(S)=P(w1)⋅P(w1∣w2)⋯P(wn∣wn−1)P(S) = P(w_1) \cdot P(w_1|w_2) \cdots P(w_n|w_{n-1})P(S)=P(w1​)⋅P(w1​∣w2​)⋯P(wn​∣wn−1​)
上述公式对应的语言模型叫作二元模型,使用的是一阶马尔科夫假设。根据大数定律,只要统计量足够,上式就可以通过统计频数计算:
P(wi∣wi−1)=P(wi−1,wi)P(wi−1)=#(wi−1,wi)#(wi−1)P(w_i|w_{i-1}) = \frac{P(w_{i-1},w_i)}{P(w_{i-1})} = \frac{\#(w_{i-1},w_i)}{\#(w_{i-1})}P(wi​∣wi−1​)=P(wi−1​)P(wi−1​,wi​)​=#(wi−1​)#(wi−1​,wi​)​
实际当时,常用的除了上述二元模型还有三元模型
P(S)=P(w1)⋅P(w1∣w2)⋯P(wn∣wn−2,wn−1)P(S) = P(w_1) \cdot P(w_1|w_2) \cdots P(w_n|w_{n-2},w_{n-1})P(S)=P(w1​)⋅P(w1​∣w2​)⋯P(wn​∣wn−2​,wn−1​)

因为N元模型的空间复杂度是O(∣V∣N)O(|V|^N)O(∣V∣N),其中∣V∣|V|∣V∣是词典大小,一般有几万到几十万;而使用N元模型的时间复杂度是O(∣V∣N−1)O(|V|^{N-1})O(∣V∣N−1),因此N不能特别大。而且当N从1到2,再从2到3,模型的效果上升明显;但再往后,效果提升就不那么明显了,但资源的耗费却增加得非常快,所以一般很少使用四元以上的模型。


零概率问题和平滑方法

现在假如我们要训练一个三元中文模型,汉语词汇量大约是20万,那么这个三元模型将会有∣V∣3=8×1015|V|^3 = 8 \times 10^{15}∣V∣3=8×1015量级的参数。而假如从互联网上刨去垃圾,有100亿个有意义的中文网页,每个网页平均有1000个词。依然也只有101310^{13}1013量级的训练数据。因此,会有很多词的统计词频直接是零,但这并不意味着这些词出现的概率就真的是零。这种情况称之为“模型不平滑”,也叫零概率问题。解决上述问题常用的几种方法有:

拉普拉斯平滑

Add‐One 平滑

假定语料库的大小为N,词典的大小为V:
P(wi)=#(wi)+1N+VP(wi∣wi−1)=#(wi,wi−1)+1#(wi−1)+VP(wi∣wi−1,wi−2)=#(wi,wi−1,wi−2)+1#(wi−1,wi−2)+CV2\begin{aligned} P(w_i) &= \frac{\#(w_i)+1}{N+V}\\ P(w_i|w_{i-1}) &= \frac{\#(w_i,w_{i-1})+1}{\#(w_{i-1})+V}\\ P(w_{i}|w_{i-1},w_{i-2}) &= \frac{\#(w_i,w_{i-1},w_{i-2})+1}{\#(w_{i-1},w_{i-2})+C_{V}^2} \end{aligned}P(wi​)P(wi​∣wi−1​)P(wi​∣wi−1​,wi−2​)​=N+V#(wi​)+1​=#(wi−1​)+V#(wi​,wi−1​)+1​=#(wi−1​,wi−2​)+CV2​#(wi​,wi−1​,wi−2​)+1​​

Add‐K 平滑

P(wi)=#(wi)+KN+KVP(wi∣wi−1)=#(wi,wi−1)+K#(wi−1)+KVP(wi∣wi−1,wi−2)=#(wi,wi−1,wi−2)+K#(wi−1,wi−2)+KCV2\begin{aligned} P(w_i) &= \frac{\#(w_i)+K}{N+KV}\\ P(w_i|w_{i-1}) &= \frac{\#(w_i,w_{i-1})+K}{\#(w_{i-1})+KV}\\ P(w_{i}|w_{i-1},w_{i-2}) &= \frac{\#(w_i,w_{i-1},w_{i-2})+K}{\#(w_{i-1},w_{i-2})+KC_{V}^2} \end{aligned}P(wi​)P(wi​∣wi−1​)P(wi​∣wi−1​,wi−2​)​=N+KV#(wi​)+K​=#(wi−1​)+KV#(wi​,wi−1​)+K​=#(wi−1​,wi−2​)+KCV2​#(wi​,wi−1​,wi−2​)+K​​
其中KKK是可以使用优化的方法来寻找的参数。

插值平滑

上述拉普拉斯平滑的一个问题是:只要是未见词,估算的概率都是一样的(特别是对于高阶估计,更容易出现未见词),但这其实是不太合理的,因为即使是未见词,概率也会有高低之分。所以插值平滑的原理就是利用低阶统计量做插值,这样的话即使一些词的高阶统计量为0,也可以用低阶统计量去补充:
P(wi)=λP^(wi)+(1−λ)1NP(wi∣wi−1)=λP^(wi∣wi−1)+(1−λ)P(wi)P(wi∣wi−1,wi−2)=λ1P^(wi∣wi−1,wi−2)+λ2P(wi∣wi−1)+λ3P(wi),λ1+λ2+λ3=1\begin{aligned} &P(w_i) = \lambda \hat{P}(w_i) + (1-\lambda) \frac{1}{N}\\ &P(w_i|w_{i-1}) = \lambda \hat{P}(w_i|w_{i-1}) + (1-\lambda) P(w_i)\\ &P(w_i|w_{i-1},w_{i-2}) = \lambda_1 \hat{P}(w_i|w_{i-1},w_{i-2}) + \lambda_2 P(w_i|w_{i-1}) + \lambda_3P(w_i) , \quad \lambda_1 + \lambda_2 + \lambda_3 =1 \end{aligned}​P(wi​)=λP^(wi​)+(1−λ)N1​P(wi​∣wi−1​)=λP^(wi​∣wi−1​)+(1−λ)P(wi​)P(wi​∣wi−1​,wi−2​)=λ1​P^(wi​∣wi−1​,wi−2​)+λ2​P(wi​∣wi−1​)+λ3​P(wi​),λ1​+λ2​+λ3​=1​
其中P^表示概率值直接由频度估计\hat{P}表示概率值直接由频度估计P^表示概率值直接由频度估计。

古德-图灵估计

古德-图灵估计的原理是:

  1. 对于可靠的统计数据,我们选择相信
  2. 对于不可信的统计数据,我们对它打一定折扣
  3. 对于未看见的数据,把上述折扣出来的一小部分概率赋予给它

假定在语料库中出现r次的词有NrN_rNr​个,特别的,未出现的词数量为N0N_0N0​那么有:
N=∑rrNrN = \sum_r rN_rN=r∑​rNr​
出现rrr次的词的相对频度就是rN\frac{r}{N}Nr​。当rrr比较大的时候,我们认为此时的统计数据是可靠的,那么就可以以这个相对频度作为这些词的概率估计。

但是当rrr比较小时,我们认为统计数据不可靠,也就是说出现rrr次的那些词在计算它们的概率时要使用一个小一点的数,记为drd_rdr​:
dr=(r+1)⋅Nr+1/Nrd_r = (r+1) \cdot N_{r+1}/N_rdr​=(r+1)⋅Nr+1​/Nr​
那么显然有∑rdr⋅Nr=N\sum_r d_r\cdot N_r = N∑r​dr​⋅Nr​=N。一般来说,语料库中出现r次的词数量NrN_rNr​与rrr满足如下关系:

可以看出,当rrr比较小时,NrN_rNr​下降得很快,满足Nr+1Nr<rr+1\frac{N_{r+1}}{N_r} < \frac{r}{r+1}Nr​Nr+1​​<r+1r​,因此dr<rd_r < rdr​<r,而d0>0d_0 > 0d0​>0。这样就给未见词赋予了一个很小的非零值,从而解决了零概率问题。

Katz平滑

Katz平滑利用了古德-图灵估计对频数小于阈值的概率进行削减,然后削减出来的总量,按照频数为零的项的低阶gram的频度来分配:

P(wi)={rNifr≥TdrNif0<r<TremainNifr=0P(w_i)=\left\{ \begin{aligned} & \frac{r}{N} & if \ r \geq T \\ &\frac{d_r}{ N} & \qquad if \ 0 < r < T \\ &\frac{\text{remain}}{N} & if \ r=0 \end{aligned} \right. P(wi​)=⎩⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎧​​Nr​Ndr​​Nremain​​if r≥Tif 0<r<Tif r=0​
其中 remain=1−∑wiseenP(wi)\text{remain} = 1- \sum_{wi \ seen}P(w_i)remain=1−∑wi seen​P(wi​)。

对于二元模型,同样有:
P(wi∣wi−1)={r#(wi−1)ifr≥Tdr#(wi−1)if0<r<Tremain∑wiunseenf(wi)f(wi)ifr=0P(w_i|w_{i-1})=\left\{ \begin{aligned} & \frac{r}{\#(w_{i-1})} & if \ r \geq T \\ &\frac{d_r}{\#(w_{i-1})} & \qquad if \ 0 < r < T \\ &\frac{\text{remain}}{\sum_{w_i \ unseen}f(w_i)}f(w_i) & if \ r=0 \end{aligned} \right. P(wi​∣wi−1​)=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​​#(wi−1​)r​#(wi−1​)dr​​∑wi​ unseen​f(wi​)remain​f(wi​)​if r≥Tif 0<r<Tif r=0​
其中 remain=1−∑wiseenP(wi∣wi−1)\text{remain} = 1- \sum_{wi \ seen}P(w_i|w_{i-1})remain=1−∑wi seen​P(wi​∣wi−1​),f(wi)f(w_i)f(wi​) 是频度。上面第二项的计算方法是:

  1. 最终折扣量与Good-Turing估计预测的减值量成正比例
  2. 全局二元语法分布中被折扣的计数总量等于根据Good-Turing估计应该分配给次数为零的二元语法的总数

记折扣量为μr\mu_rμr​,所以有公式:
1−μr=ρ(1−(r+1)⋅Nr+1r⋅Nr)1 - \mu_r = \rho (1- \frac{(r+1)\cdot N_{r+1}}{r\cdot N_r})1−μr​=ρ(1−r⋅Nr​(r+1)⋅Nr+1​​)
又因为Good-Turing估计分配给次数为零的二元语法的总数为N1N_1N1​(why?):
所以有∑k=1TNk(1−μr)r=N1\sum_{k=1}^T N_k (1-\mu_r) r = N_1k=1∑T​Nk​(1−μr​)r=N1​
上式的解即为:
μr=(r+1)⋅Nr+1r⋅N−(T+1)NT+1N11−(T+1)NT+1N1\mu_r = \frac{\frac{(r+1)\cdot N_{r+1}}{r\cdot N} - \frac{(T+1)N_{T+1}}{N_1}}{1 - \frac{(T+1)N_{T+1}}{N_1}}μr​=1−N1​(T+1)NT+1​​r⋅N(r+1)⋅Nr+1​​−N1​(T+1)NT+1​​​
因此
dr=μr⋅r=(r+1)⋅Nr+1N−r⋅(T+1)NT+1N11−(T+1)NT+1N1d_r = \mu_r \cdot r = \frac{\frac{(r+1)\cdot N_{r+1}}{ N} - r\cdot \frac{(T+1)N_{T+1}}{N_1}}{1 - \frac{(T+1)N_{T+1}}{N_1}}dr​=μr​⋅r=1−N1​(T+1)NT+1​​N(r+1)⋅Nr+1​​−r⋅N1​(T+1)NT+1​​​


困惑度(Perplexity)

困惑度 是语言模型的一个衡量标准。因为单纯序列的似然概率是一个难以理解、难以比较的数字。 毕竟,较短的序列比较长的序列更有可能出现, 因此评估模型产生长篇巨著《战争与和平》的可能性会比产生中篇小说《小王子》可能性要小得多。

一个好的语言模型应该能让我们准确地预测下一个词元。 所以我们可以通过一个序列中 所有的 n 个词元的交叉熵损失的平均值 来衡量:

1n−∑t=1nlog P(xt∣x1,⋯,xt−1)\frac{1}{n} - \sum_{t=1}^n \text{log }P(x_t|x_1, \cdots, x_{t-1})n1​−t=1∑n​log P(xt​∣x1​,⋯,xt−1​)

其中 PPP 由语言模型给出, xtx_txt​ 是在时间步 ttt 从该序列中观察到的实际词元。 这使得不同长度的文档的性能具有了可比性。 由于历史原因,自然语言处理的科学家更喜欢使用一个叫做困惑度(perplexity)的量。 简而言之,它是上式的指数:

exp(1n−∑t=1nlog P(xt∣x1,⋯,xt−1))\text{exp}\Big(\frac{1}{n} - \sum_{t=1}^n \text{log }P(x_t|x_1, \cdots, x_{t-1})\Big)exp(n1​−t=1∑n​log P(xt​∣x1​,⋯,xt−1​))

如果是使用神经网络来编码语言模型,那么神经网络的输出loss的均值的指数值,即为一个句子的困惑度

  • 在最好的情况下,模型总是完美地估计标签词元的概率为1。 在这种情况下,模型的困惑度为1。
  • 在最坏的情况下,模型总是预测标签词元的概率为0。 在这种情况下,困惑度是正无穷大。

Reference:
数学之美,吴军
自然语言处理综论,冯志伟
数据平滑技术总结
统计语言模型之平滑方法详解

统计语言模型,平滑方法,困惑度相关推荐

  1. 困惑度 (perplexity)

    困惑度 (perplexity) 在自然语言处理中,对于一个语言模型,一般用困惑度来衡量它的好坏,困惑度越低,说明语言模型面对一句话感到困惑的程度越低,语言模型就越好. 对于LDA模型,最常用的两个评 ...

  2. 困惑度 perplexity

    在自然语言处理中,困惑度是用来衡量语言模型优劣的一个方法.它的值是对交叉熵损失函数做指数运算后得到的结果. 交叉熵损失函数 单个训练样本的损失: loss=−1n∑i=1nyilogyi^=−logy ...

  3. LDA主题模型困惑度计算

    对于LDA模型,最常用的两个评价方法困惑度(Perplexity).相似度(Corre). 其中困惑度可以理解为对于一篇文章d,所训练出来的模型对文档d属于哪个主题有多不确定,这个不确定成都就是困惑度 ...

  4. LDA主题模型绘制困惑度(perplexity)-主题数曲线——python

    主题建模作为一种基于机器学习的文本内容分析技术,一般用于推断文本文档中隐藏主题的技术.很多研究使用了基于Latent Dirichlet Allocation (LDA)的主题建模算法来处理大规模文档 ...

  5. 自然语言处理(NLP)-语言模型【用来判断一句话语法上是否通顺】:N-gram语言模型(基于语料库的统计结果)--> N-gram神经网络语言模型 【语言模型的评估(①:PPL困惑度;②:BPC)】

    统计语言模型实际上是一个概率模型,所以常见的概率模型都可以用于求解这些参数 常见的概率模型有:N-gram 模型.决策树.最大熵模型.隐马尔可夫模型.条件随机场.神经网络等 目前常用于语言模型的是 N ...

  6. nlp5-n-gram/语言模型(数据平滑方法

    文章目录 1.句子的先验概率 1.1 n-gram 2. 参数估计 3. 数据平滑 3.1 数据平滑度方法 3.1.1加1法 3.1.2减 1.句子的先验概率 这个联合概率太小了 窗口越大,共现的可能 ...

  7. 【LM】(八)语言模型评价指标——困惑度Perplexity原理及代码

    0.语言模型 语言模型(Language Model,LM),基于统计的语言模型,给出一句话的前k个词,预测第k+1个词,即求第k+1个词出现的概率p(xk+1|x1,x2,...,xk).在深度网络 ...

  8. 语言模型 python实现uni-gram和bi-gram 使用ppl困惑度对比模型效果 山东大学2019 NLP实验1

    语言模型 实验目的 实验内容 数据集 Example: 实验环境 实验思路 train test 代码实现 一元语法 train test 二元语法 Train test 测试结果 实验目的 理解并实 ...

  9. perplexity 衡量指标_通俗解释困惑度 (Perplexity)-评价语言模型的好坏

    一.语言模型 本文尽量通俗解释一下困惑度的概念.既然题目中写了是用来评价语言模型的好坏,那么首先来看一下语言模型:忆臻:深入浅出讲解语言模型​zhuanlan.zhihu.com 简单地说,语言模型就 ...

最新文章

  1. Java 回调函数的理解
  2. java枚举类使用 == 还是equals来进行比较
  3. myisam和innodb
  4. 【LeetCode】390. 消除游戏
  5. Jackson、JSON-lib、Gson性能对比
  6. 统一异常处理ControllerAdvice
  7. xshell用ssh连接VMware中的ubuntu
  8. Lectra力克公司发布新战略 助力客户打造“工业4.0”智造流程
  9. C++:单例模式——线程安全模式、饥汉模式、懒汉模式
  10. 机器学习笔记09:支持向量机(二)-核函数(Kernels)
  11. 【JS教程】移动端 Touch(触摸)事件
  12. 如何实现视频平台会员多账号登录
  13. 各种可执行文件的打包教程,让你的可执行文件美观起来(打包成一个文件,自定义图标)!!!
  14. 用c语言实现一个简单的计算器(数据结构)
  15. 【入行必修】 揭开 AI人工智能工程师 三大岗位 工作内容的 神秘面纱!
  16. 数据库表设计字段说明
  17. 毕业论文之转化为三线表格(wps)
  18. 项目管理团队协作工具
  19. CSS3 2 2D 3D转换
  20. 高斯函数和C++简单实现

热门文章

  1. dya04 js_02
  2. 关于转行产品经理的十大顾虑《上》
  3. 微软公司2007年秋季校园招聘在线宣讲会
  4. CSDN~BLOG目录
  5. [mov,mp4,m4a,3gp,3g2,mj2 @ 0000025ce897db40] moov atom not found
  6. [CC-TRIPS]Children Trips
  7. 基于微信小程序的师生答疑交流平台APP
  8. Linux 上DenyHosts阻止SSH暴力***
  9. uip1.0核心模块uip_process函数解读
  10. 网络安全术语和协议栈自身的脆弱性