perplexity 衡量指标_求通俗解释NLP里的perplexity是什么?

高赞回答讲得已经非常通俗易懂,不过由于自然语言处理的发展,出现了许多不同类型的模型,对困惑度这个指标的计算方法颇有不同(包括前面的高赞回答也只是展开了一个子集),常常让人摸不着头脑。所以这个回答旨在尽量全面地梳理不同语境下的perplexity的计算,帮助解决因为这些历史原因造成的困惑。润风:困惑度(perplexity)的基本概念及多种模型下的计算(N-gram, 主题模型, 神经网络)​zhuanlan.zhihu.com

让人困惑的困惑度

发现网络上的关于困惑度(perplexity)大多数都是利用了N-gram或者主题模型的例子来阐述的。但是现在这个年代来学习这个指标的人多半都是想研究神经网络的,而两者对困惑度的计算方法又很不同,这就不能不让人对“困惑度”感到“困惑”了。本人虽然才疏学浅,还是斗胆在这里尝试写一篇文章,试图用简洁的方式来梳理清楚其中的困惑。

困惑度的基本定义

首先,困惑度是用来评价语言模型好坏的指标。语言模型是衡量句子好坏的模型,本质上是计算句子的概率:

对于句子s(词语w的序列):

它的概率为:【公式1】公式1

困惑度与测试集上的句子概率相关,其基本思想是:给测试集的句子赋予较高概率值的语言模型较好,当语言模型训练完之后,测试集中的句子都是正常的句子,那么训练好的模型就是在测试集上的概率越高越好[1],公式如下:

这里想补充一下参考资料里没有强调的一些点根号内是句子概率的倒数,所以显然 句子越好(概率大),困惑度越小,也就是模型对句子越不困惑。 这样我们也就理解了这个指标的名字。

开N次根号(N为句子长度)意味着几何平均数(把句子概率拆成字符概率的连乘)需要平均的原因是,因为每个字符的概率必然小于1,所以越长的句子的概率在连乘的情况下必然越小,所以为了对长短句公平,需要平均一下

是几何平均的原因,是因为其的特点是,如果有其中的一个概率是很小的,那么最终的结果就不可能很大,从而要求好的句子的每个字符都要有基本让人满意的概率 [2]机器翻译常用指标BLEU也使用了几何平均,还有机器学习常用的F score使用的调和平均数 ,也有类似的效果

在不同具体模型下的计算

不同模型的困惑度计算的差别,实际上都是来源于对句子概率的计算方式的不同,所以主要围绕句子概率展开:

N-gram(uni-gram, bi-gram, tri-gram)

网络上常见的例子:

对uni-gram语言模型(一元语言模型),其采用了单个词语概率独立的简化假设。

用词袋模型(Bag Of Words)这个名字来解释它可能更形象。把一个词语看做一种颜色的小球,句子的产生就是从一个装有所有词语的袋子里面有放回地抽出小球的过程。抽到每类小球(词语)的概率互相独立。

故句子的概率不使用【公式1】,而是用每个词语(uni-gram)的概率相乘:【公式2】

对于bi-gram语言模型(二元语言模型),其采用马尔科夫假设:一个词的出现仅依赖于它前面出现的一个词。

故句子的概率就是每个词语(bi-gram)的概率相乘:

tri-gram类似:

实际上,都是把句子概率拆分成了N-gram的小单元概率计算。

注意,马上我们就要迎来第一个困惑点:这些小单元的概率如何计算

第一类、统计语言模型,采用的是从数据集中的N-gram出现频率直接统计得到概率的方法。如uni-gram就是单个词语的出现频率(词频/语料库中所有的词语数量),而例如tri-gram则是

主题模型

第二类使用主题模型(LDA等)来作为语言模型。

实际上,这种模型也采用了词袋模型的假设,所以句子概率的计算同【公式2】。

只是,对于其中的uni-gram的概率计算,并不再来自于频率统计,而是采用了融合主题的更复杂的建模,提升了模型的泛化性能,是一种进步,想了解具体原理的我推荐 [3]。

神经网络

神经网络(这里我主要指RNN/LSTM/GRU)在主题模型的基础上又跨出了一大步。计算句子概率不再需要做出简化假设,分解为N-gram计算,而是可以使用最上面写的最根本的【公式1】来计算:LSTM示意图[4]

LSTM的具体原理我推荐看 [4] 来了解。这里我只简单说一下,由于LSTM的序列性,其每一步预测的词语概率自然而然就是以前面所有的上下文为条件的条件概率,即:

这点与前面提到的两类模型都有根本不同。从而让我们可以利用【公式1】来计算句子概率,取得更好的效果。

另外,神经网络中的困惑度常常不是直接使用句子概率来计算的,而是使用了cross entropy(或者negative log likelihood,二者实际上是等价的)(图源[5])

这是因为现在的深度学习框架对它们有现成的计算函数,用起来很方便。并且把上面的公式展开推导一下,可以得到与【公式1】实际上等价的结果(上图中还对语料库所有句子求了个算数平均)。

因为perplexity可以从cross entropy中得到,而cross entropy又是除了语言模型以外的文本生成任务(如机器翻译,摘要生成等)也常用的loss,所以我们也可以把perplexity拓展到语言模型外,用cross entropy来计算文本生成里的困惑度。

机器翻译的框架OpenNMT就使用了困惑度作为一个指标。[6]

另,语言模型常使用BPC(Bits-per-character)来衡量其好坏,实际上它就是平均cross entropy(log以2为底),也就是PPL计算公式里的2的指数上面的部分。其信息论解释可见[7]

基本概念到此为止,下面还有一些新方向的延伸。

GPT/BERT/XLnet

顺便提一下近年来流行的GPT/BERT/XLnet,它们又代表了语言模型的新方向,对上述方法又做出了改动,因而在此一并梳理。

这里主要引用XLNet的论述

GPT是Auto-regressive模型,其句子概率计算方法同【公式1】

BERT自称为(Masked Language Model, MLM),在XLNet中被称为denoising auto-encoding。一般只是用来预测MASK位置的词语概率,而不是句子概率,所以也有说它不算是一种语言模型的。它的概率计算方法:

即,以被MASK处理后的整句话的上下文为条件,计算所有被mask位置的词语的概率之和。

XLnet用的则是Permutation Language Modeling,说来话长,具体详见论文吧。

本文涉及概念较多,也许难免还会有些小问题,如果发现问题,欢迎指正。

本文参考资料,并且都是继续深入理解的很好资料:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#在Linux上的开发指南

本人才疏学浅,在此记录自己用C#在Linux上开发的一点经验,写下这篇指南。(给想要在Linux上开发C#程序的朋友提供建议) 目前在Linux上跑的网站:http://douxiubar.com | http://douxiubar.com/AdminLogin/Index&#xff0…

Oracle入门(十四E)之条件表达式case和deocde函数

一、表达式(1)条件表达式 共有两种条件表达式,即 CASE 表达式和DECODE 表达式。就 CASE 比较两个表达式而言,该表达式在逻辑上等效于之前学习的NULLIF 函数。如果两个表达式相等,则返回null,如果不相等&…

4.基于NIO的群聊系统

【README】 1.本文总结自B站《netty-尚硅谷》,很不错; 2.文末有错误及解决方法; 【1】群聊需求 1)编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非 阻塞) 2)实…

构建高性能.NET应用之配置高可用IIS服务器-第二篇 IIS请求处理模型

在IIS 中,Http监听者(http.sys)和请求处理者由两个系统服务在控制着。一个是WWW 服务,另外一个就是Windows Process Activation。 对于WWW服务,它主要是监控IIS的配置文件,将新的配置信息用到HTTP.sys和WAS上。同时它也维持一些性…

Oracle入门(十四F)之PL/SQL定义变量

一、变量介绍 (1)变量的使用可以使用变量: 临时存储数据存储值的操作可重用性(2)PL/SQL中的变量处理变量是: 在声明部分中声明和初始化在可执行部分中使用和分配新值变量可以是:作为…

小米手环nfc门卡摸拟成功后不能开门_如何使用小米手环5 NFC版进行门卡模拟(如公司门禁卡、小区门禁卡、学校门禁卡等)?...

由于本人最近购入了小米手环5 NFC版,所以对小米手环模拟门禁卡比较清楚一点。说一下用该手环模拟门禁的方法吧,我本人模拟的是学校公寓的门禁卡,不过学校的门禁卡是加密卡,可能操作起来稍微比不加密的门禁卡麻烦一点,因…

5.NIO零拷贝与传统IO的文件传输性能比较

【README】 1.本文总结自B站《netty-尚硅谷》,很不错; 2.本文部分内容参考自 NIO效率高的原理之零拷贝与直接内存映射 - 腾讯云开发者社区-腾讯云 【1】零拷贝原理 【1.1】传统IO的文件拷贝 【图解】 step1)调用 sys_read系统调用&#…

二进制漏洞利用与挖掘_二进制各种漏洞原理实战分析总结

本部分将对常见的二进制漏洞做系统分析,方便在漏洞挖掘过程中定位识别是什么类型漏洞,工欲善其事,必先利其器。0x01栈溢出漏洞原理栈溢出漏洞属于缓冲区漏洞的一种,实例如下:编译后使用windbg运行直接运行到了地址0x41…

Oracle入门(十四H)之良好的编程实践

一、为什么要学习它 好的编程实践是技巧,可以按照创建最好的代码可能。 编程实践涵盖了一切从代码更多可以用更快的速度创建代码性能。 软件工程团队通常会遵循风格指导让团队中的每个人使用相同的技术。 这使它更容易阅读和修改编写的代码其他。二、编程实践已经学…

微软.NET 正式劈腿成功,横跨所有平台

.NET官方博客宣布了《Announcing .NET Core RC2 and .NET Core SDK Preview 1》,正式如期发布了.NET Core RC2, 现在可以放心的基于.NET Core 构建 ASP.NET Core, console apps 和 class libraries for Windows, OS X and Linux。这里贴张图表达下他们之间的关系: …

2.BIO与NIO区别

【README】 1.本文总结自B站《netty-尚硅谷》,很不错;2.本文介绍 BIO, NIO的知识;【1】BIO(传统java IO模型) 1)BIO-Blocking IO:同步阻塞,服务器实现模式为一个连接一…

k8s往secret里导入证书_K8S之Secret

简介secret顾名思义,用于存储一些敏感的需要加密的数据。这些数据可能是要保存在pod的定义文件或者docker的镜像中。把这些数据通过加密的方式存放到secrets对象中,可以降低信息泄露的风险。在secret中存储的数据都需要通过base64进行转换加密后存放。创…

Oracle入门(十四G)之PL / SQL中检索数据

一、PL / SQL中检索数据 (1)PL / SQL中的SQL语句可以在PL / SQL中使用以下几种SQL语句:•SELECT从数据库检索数据。•DML语句,例如INSERT,UPDATE和DELETE,以更改数据库中的行。•事务控制语句,例…

.NET Core 1.0 CentOS7 尝试

昨天宣布 ASP.NET Core RC2,据说差不多稳定了,以后不会有大改了。 参考:https://blogs.msdn.microsoft.com/webdev/2016/05/16/announcing-asp-net-core-rc2/ 一、环境装备 等待很久了,高兴之余昨晚安装一个CentOS系统,版本如下&a…

6.netty线程模型-Reactor

【README】 1..本文部分内容翻译自: [Netty] Nettys thread model and simple usage 2.netty模型是以 Reactor模式为基础的,具体的,netty使用的是 主从Reactor多线程模型; 3.先介绍了 Reactor线程模型;后介绍了 Ne…

python mac读取 文件属性_从Python获取和设置mac文件和文件夹查找器标签

macfile模块是^{}模块的一部分,在"2006-11-20 0.2.0"中被重命名为mactypes使用此模块,以下两个函数可用于获取和设置appscript 1.0版的查找器标签:from appscript import appfrom mactypes import File as MacFile# Note these lab…

Oracle入门(十四.1)之PL / SQL简介

一、PL / SQL描述程序语言扩展到SQL: •允许将基本程序逻辑和控制流与SQL语句组合在一起。 •是Oracle专有编程语言。- 它只能用于Oracle数据库或工具。二、程序语言扩展到SQL•是一种程序语言。 - 当遵循一系列指令时会产生结果。 •是3GL(第三代编程语…

构建高性能.NET应用之配置高可用IIS服务器-第三篇 IIS中三个核心组件的讲解(上)

今天的文章的比较的容易,主要讲述IIS中三个比较重要的组件:协议监听者(Protocol Listeners),WWW服务(World Wide Web Publishing Service)和WAS(Windows Process Activation Service),理解这三个组件的功能,是理解IIS…

7.netty服务器中提交任务到NioEventLoop(Nio事件循环执行线程)

【README】 1.本文总结自 B站 《尚硅谷-netty》; 2.NioEventLoop实际上是一个提交到线程池的Runnable任务,在while无限循环中运行 taskQueue中的任务(串行); 【1】提交任务到NioEventLoop 1)NioEventLoop&#xff1…

Oracle入门(十四.2)之PL / SQL的好处

一、PL / SQL的好处在Oracle数据库中使用PL / SQL编程语言有很多好处。 1.将过程构造与SQL集成 2.模块化程序开发 3.改进的性能 4.与Oracle工具集成 5.便携性6.异常处理二、优点 优点1:使用SQL集成程序化结构PL / SQL的首要优势是程序结构与SQL的集成。 SQL是一种非…