NLP知识点 - perplexity 困惑度

2023-12-14 05:45

本文主要是介绍NLP知识点 - perplexity 困惑度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(一) Perplexity

困惑度(Perplexity,缩写为PPL)是衡量语言模型好坏的一个常用指标。

语言模型(language model)是用来预测句子中的next word的概率分布(probability distribution),并计算一个句子的概率。一个好的语言模型,应该给well-written 的句子更高的生成概率,阅读这些句子不应该让人感到困惑。

困惑度的定义:

p e r p l e x i t y ( W ) = P ( w 1 w 2 . . . w n ) − 1 N perplexity(W)=P(w_1w_2...w_n)^{-\frac{1}{N}} perplexity(W)=P(w1w2...wn)N1
在语言模型在测试集 W = { w 1 , w 2 , . . . , w N } W=\{w_1, w_2, ..., w_N\} W={w1,w2,...,wN}上的困惑度,是测试集的逆概率,然后用单词数量进行归一化。

核心思想是,句子的概率越大,其困惑度越小,说明语言模型越好。

(二)Perplexity with Example

假设我们的语言模型,词表只有[“a”, “the”, “red”, “fox”, “dog”, “.”] 六个词。

下面计算“a red fox.”这句话 W W W的概率。

P ( W ) = P ( w 1 w 2 . . . w n ) P(W)=P(w_1w_2...w_n) P(W)=P(w1w2...wn)
所以:
P ( a r e d f o x . ) = P ( a ) ∗ P ( r e d ∣ a ) ∗ P ( f o x ∣ a r e d ) ∗ P ( . ∣ a r e d f o x ) P(a\ red\ fox.)=P(a)*P(red|a)*P(fox|a\ red)*P(.|a \ red\ fox) P(a red fox.)=P(a)P(reda)P(foxa red)P(.∣a red fox)

假设:
句子中首字的概率如下:
P ( w 1 = a ) = 0.4 P(w_1=a)=0.4 P(w1=a)=0.4
P ( w 1 = t h e ) = 0.3 P(w_1=the)=0.3 P(w1=the)=0.3
P ( w 1 = r e d ) = 0.15 P(w_1=red)=0.15 P(w1=red)=0.15
P ( w 1 = f o x ) = 0.08 P(w_1=fox)=0.08 P(w1=fox)=0.08
P ( w 1 = d o g ) = 0.07 P(w_1=dog)=0.07 P(w1=dog)=0.07
P ( w 1 = . ) = 0 P(w_1=.)=0 P(w1=.)=0

所以 P ( a ) = 0.4 P(a)=0.4 P(a)=0.4

然后,假设我们的模型给出了前一个词为a,后一个词的概率分布:
P ( w 2 = a ∣ a ) = 0.01 P(w_2=a|a)=0.01 P(w2=aa)=0.01
P ( w 2 = t h e ∣ a ) = 0.01 P(w_2=the|a)=0.01 P(w2=thea)=0.01
P ( w 2 = r e d ∣ a ) = 0.27 P(w_2=red|a)=0.27 P(w2=reda)=0.27
P ( w 2 = f o x ∣ a ) = 0.3 P(w_2=fox|a)=0.3 P(w2=foxa)=0.3
P ( w 2 = d o g ∣ a ) = 0.4 P(w_2=dog|a)=0.4 P(w2=doga)=0.4
P ( w 2 = . ∣ a ) = 0.01 P(w_2=.|a)=0.01 P(w2=.∣a)=0.01

所以 P ( r e d ∣ a ) = 0.27 P(red|a)=0.27 P(reda)=0.27

类似地,假设我们的模型给出了前两个词为a red,第三个词的概率分布;以及前三个词为a red fox,第四个词的概率分布:
P ( w 3 = a ∣ a r e d ) = 0.02 P(w_3=a|a\ red)=0.02 P(w3=aa red)=0.02
P ( w 3 = t h e ∣ a r e d ) = 0.03 P(w_3=the|a\ red)=0.03 P(w3=thea red)=0.03
P ( w 3 = r e d ∣ a r e d ) = 0.03 P(w_3=red|a\ red)=0.03 P(w3=reda red)=0.03
P ( w 3 = f o x ∣ a r e d ) = 0.55 P(w_3=fox|a\ red)=0.55 P(w3=foxa red)=0.55
P ( w 3 = d o g ∣ a r e d ) = 0.22 P(w_3=dog|a\ red)=0.22 P(w3=doga red)=0.22
P ( w 3 = . ∣ a r e d ) = 0.15 P(w_3=.|a\ red)=0.15 P(w3=.∣a red)=0.15
以及
P ( w 4 = a ∣ a r e d f o x ) = 0.02 P(w_4=a|a\ red\ fox)=0.02 P(w4=aa red fox)=0.02
P ( w 4 = t h e ∣ a r e d f o x ) = 0.03 P(w_4=the|a\ red\ fox)=0.03 P(w4=thea red fox)=0.03
P ( w 4 = r e d ∣ a r e d f o x ) = 0.03 P(w_4=red|a\ red\ fox)=0.03 P(w4=reda red fox)=0.03
P ( w 4 = f o x ∣ a r e d f o x ) = 0.02 P(w_4=fox|a\ red\ fox)=0.02 P(w4=foxa red fox)=0.02
P ( w 4 = d o g ∣ a r e d f o x ) = 0.11 P(w_4=dog|a\ red\ fox)=0.11 P(w4=doga red fox)=0.11
P ( w 4 = . ∣ a r e d f o x ) = 0.79 P(w_4=.|a\ red\ fox)=0.79 P(w4=.∣a red fox)=0.79

所以 P ( a r e d f o x . ) = P ( a ) ∗ P ( r e d ∣ a ) ∗ P ( f o x ∣ a r e d ) ∗ P ( . ∣ a r e d f o x ) = 0.4 ∗ 0.27 ∗ 0.55 ∗ 0.79 = 0.0469 P(a\ red\ fox.)=P(a)*P(red|a)*P(fox|a\ red)*P(.|a \ red\ fox)=0.4*0.27*0.55*0.79=0.0469 P(a red fox.)=P(a)P(reda)P(foxa red)P(.∣a red fox)=0.40.270.550.79=0.0469

此时,可以看到生成的这句话的概率为0.0469。我们是否可以直接比较这句话的概率与当前语言模型生成的其他句子的概率,来判定生成句子的好坏呢?答案是否定的,因为句子的最终概率是单词概率连乘得到的,所以随着句子长度的增加,概率会越来越小。所以我们想要找一个不受句子长度影响的衡量方式。

考虑到句子的概率是连乘得到的,所以这个问题可以通过计算几何平均来解决。此时,我们将利用句子中单词的数量 n n n来对句子概率进行归一化:
P n o r m ( W ) = P ( W ) n P_{norm}(W)=\sqrt [n] {P(W)} Pnorm(W)=nP(W)

此时,a red fox. 这句话的归一化概率为
P n o r m ( a r e d f o x . ) = P ( a r e d f o x . ) 4 = P ( a r e d f o x . ) 1 / 4 = 0.465 P_{norm}(a\ red\ fox.)=\sqrt [4] {P(a\ red\ fox.)}=P(a\ red\ fox.)^{1/4}=0.465 Pnorm(a red fox.)=4P(a red fox.) =P(a red fox.)1/4=0.465

现在,所有的概率都被归一化了,可以比较不同长度句子的概率了。

进一步地,困惑度这个概念被提出来,他是归一化概率的倒数。即:

P e r p l e x i t y = 1 P n o r m ( W ) = 1 P ( W ) 1 n = 1 P ( w ) 1 n Perplexity = \frac{1}{P_{norm}(W)}=\frac{1}{P(W)^\frac{1}{n}}={\frac{1}{P(w)}^{\frac{1}{n}}} Perplexity=Pnorm(W)1=P(W)n11=P(w)1n1

因为是概率的倒数,所以困惑度越低,句子概率越高,语言模型就越好。

这篇关于NLP知识点 - perplexity 困惑度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/491343

相关文章

嵌入式软件工程师应聘知识点

嵌入式软件工程师应聘 修改浏览权限 | 删除 数据结构(C语言)部分常考的知识点: 1、局部变量能、全局变量和静态变量 2、堆和栈 3、Const、volatile、define、typedef的用途 4、链表(比如链表的插入、删除和排序) 5、排序(考查冒泡法的较多) 6、可重入函数 、malloc函数 7、指针(常考函数指针,函数指针,数组指针,指针数组和

数据库期末复习知识点

A卷 1. 选择题(30') 2. 判断范式(10') 判断到第三范式 3. 程序填空(20') 4. 分析填空(15') 5. 写SQL(25') 5'一题 恶性 B卷 1. 单选(30') 2. 填空 (20') 3. 程序填空(20') 4. 写SQL(30') 知识点 第一章 数据库管理系统(DBMS)  主要功能 数据定义功能 (DDL, 数据定义语

nlp基础-文本预处理及循环神经网络

1 认识文本预处理 1 文本预处理及其作用 定义:文本送给模型之前,提前要做的工作 作用:指导模型超参数的选择 、提升模型的评估指标 举个例子: 思路常识,打造成 X Y关于Y:10分类标签是否均衡关于X:数据有没有脏数据 数据长度(512)样本不够! 文本预处理 工作 结束 的标志:准备出来X和Y 能送给模型 2 文本预处理的主要环节 1 文本处理的基本方法 分词:按照一定规

2025秋招NLP算法面试真题(二)-史上最全Transformer面试题:灵魂20问帮你彻底搞定Transformer

简单介绍 之前的20个问题的文章在这里: https://zhuanlan.zhihu.com/p/148656446 其实这20个问题不是让大家背答案,而是为了帮助大家梳理 transformer的相关知识点,所以你注意看会发现我的问题也是有某种顺序的。 本文涉及到的代码可以在这里找到: https://github.com/DA-southampton/NLP_ability 问题

408计算机网络知识点——第四章 网络层

文章目录 网络层概述分组转发和路由选择分组转发路由选择 网络层向上层提供的两种服务面向连接的虚电路服务无连接的数据报服务 网际协议IP网际协议IP异构网络互连IPv4地址及其编址方法IPv4地址概述IPv4地址的表示方法分类编址A类地址B类地址C类地址特殊地址 划分子网子网掩码默认子网掩码 无分类编址地址掩码CIDR地址块路由聚合 IPv4地址的应用规划采用定长的子网掩码进行子网划分采用

GUI (图形界面)知识点

一:组件知识点 JTextField:    作用:  定义文本域,只支持单行输入。                使用:  定义文本域:  JTextField jtf=new JTextField(20); //20为列数(列:近似平均字符宽度,它与平台有关)                        获取值:      String jtfText=jtf.getText();

最优二叉树(哈夫曼树)知识点

路径:在一棵树中从一个结点往下到孩子或孙子结点之间的通路 结点的路径长度:从根节点到该节点的路径上分支的数目 树的路径长度:树中每个结点的路径长度之和 结点的权:给树中的结点赋予一个某种含义的值,则该值为该节点的权 结点的带权路径长度:结点的路径长度乘以结点的权 树的带权路径长度(WPL):树中所有叶子结点的带权路径长度 (Weight Path Length)   最优二叉树(哈夫

NLP中文本的嵌入层

在自然语言处理(NLP)任务中,模型学习的不是原始的文本字符串,而是这些字符串通过分词和索引化过程转换成的单词索引。实际学习的内容是这些单词索引对应的嵌入向量及其在模型中的权重。 原始文本到模型输入的过程 原始文本: 例如:“hello world” 分词(Tokenization): 将文本字符串分割成单词、子词或字符。例如:["hello", "world"] 构建词汇表(Voc

面试:关于word2vec的相关知识点Hierarchical Softmax和NegativeSampling

1、为什么需要Hierarchical Softmax和Negative Sampling 从输入层到隐含层需要一个维度为N×K的权重矩阵,从隐含层到输出层又需要一个维度为K×N的权重矩阵,学习权重可以用反向传播算法实现,每次迭代时将权重沿梯度更优的方向进行一小步更新。但是由于Softmax激活函数中存在归一化项的缘故,推导出来的迭代公式需要对词汇表中的所有单词进行遍历,使得每次迭代过程非常缓慢

线程知识点(一)

文章目录 一、线程是什么?二、进程与线程的关系三、种类内核级线程用户级线程混合型线程 总结 一、线程是什么? 线程是程序最基本的运行单位,真正运行的是进程中的线程。 线程是大多数操作系统支持的调度单位, 执行单元,某些系统不支持线程技术。 是允许应用程序并发执行多个任务的一种机制,同一程序中的所有线程均会独立执行相同程序。 共享同一份全局内存区域,其中包据初始化数据段、未初