当前位置: 首页 > backend >正文

【NLP 困惑度解析和python实现】

**困惑度(Perplexity)**是自然语言处理和机器学习中常用的评价指标,尤其在评估语言模型时广泛使用。它衡量的是一个概率模型对一个样本(如一句话)的预测能力。


一、困惑度的定义

对于一个语言模型 $ P $ 和一个测试语料 $ W = w_1, w_2, \dots, w_N $,其困惑度定义为:

Perplexity = P ( w 1 , w 2 , … , w N ) − 1 N = exp ⁡ ( − 1 N ∑ i = 1 N log ⁡ P ( w i ) ) \text{Perplexity} = P(w_1, w_2, \dots, w_N)^{-\frac{1}{N}} = \exp\left( -\frac{1}{N} \sum_{i=1}^N \log P(w_i) \right) Perplexity=P(w1,w2,,wN)N1=exp(N1i=1NlogP(wi))

其中:

  • $ N $ 是测试集中词的总数;
  • $ P(w_i) $ 是模型对第 $ i $ 个词的概率估计;
  • 求和是对所有词的概率取对数后的总和;
  • 外层指数化是为了得到更直观的数值。

二、计算步骤

假设你有一个语言模型,并且已经对某个句子做了概率预测(即每个词的概率),你可以按以下步骤计算困惑度:

步骤 1:获取词的对数概率

给定一个句子,例如:

“the cat sat on the mat”

假设你的模型输出了每个词的条件概率如下:

概率 P ( w i ) P(w_i) P(wi) log ⁡ P ( w i ) \log P(w_i) logP(wi)
the0.1-2.30
cat0.05-3.00
sat0.02-3.91
on0.07-2.66
the0.1-2.30
mat0.08-2.53

注意,上表中使用的 log ⁡ \log log 是以自然对数(ln)为基础的。

步骤 2:求平均对数概率

avg_log_prob = 1 N ∑ i = 1 N log ⁡ P ( w i ) = − 2.30 − 3.00 − 3.91 − 2.66 − 2.30 − 2.53 6 = − 16.7 6 = − 2.783 \text{avg\_log\_prob} = \frac{1}{N} \sum_{i=1}^N \log P(w_i) = \frac{-2.30 -3.00 -3.91 -2.66 -2.30 -2.53}{6} = \frac{-16.7}{6} = -2.783 avg_log_prob=N1i=1NlogP(wi)=62.303.003.912.662.302.53=616.7=2.783

步骤 3:计算困惑度

Perplexity = exp ⁡ ( − avg_log_prob ) = exp ⁡ ( 2.783 ) ≈ 16.16 \text{Perplexity} = \exp(-\text{avg\_log\_prob}) = \exp(2.783) \approx 16.16 Perplexity=exp(avg_log_prob)=exp(2.783)16.16


三、代码示例(Python)

import math# 假设这是模型对每个词的预测概率
probs = [0.1, 0.05, 0.02, 0.07, 0.1, 0.08]# 计算 log probabilities
log_probs = [math.log(p) for p in probs]# 平均 log probability
avg_log_prob = sum(log_probs) / len(log_probs)# 计算困惑度
perplexity = math.exp(-avg_log_prob)print("Perplexity:", perplexity)

输出类似:

Perplexity: 16.16

四、解释与意义

  • 困惑度越低越好,表示模型对测试数据的预测越准确。
  • 如果困惑度很高,说明模型难以确定下一个词是什么,不确定性大。
  • 最理想的情况是模型对每个词都给出高概率,这时困惑度会很低。

五、注意事项

  1. 平滑处理:实际中由于某些词可能未出现在训练数据中,直接使用最大似然估计会导致概率为 0,困惑度变成无穷大。通常需要使用 拉普拉斯平滑Kneser-Ney 平滑 等方法。

  2. 交叉熵损失:困惑度和交叉熵密切相关。实际上,在深度学习中我们常用交叉熵损失来训练语言模型,而困惑度是它的指数形式:

    Perplexity = exp ⁡ ( CrossEntropyLoss ) \text{Perplexity} = \exp(\text{CrossEntropyLoss}) Perplexity=exp(CrossEntropyLoss)


http://www.xdnf.cn/news/6222.html

相关文章:

  • 并查集原理及实现:路径压缩,按秩合并
  • 【AAAI 2025】 Local Conditional Controlling for Text-to-Image Diffusion Models
  • 《P2345 [USACO04OPEN] MooFest G》
  • 深度学习Dropout实现
  • Linux 内核 IPv4 协议栈中的协议注册机制解析
  • 在 Angular 中, `if...else if...else`
  • 默认打开程序配置错误怎么办?Windows 默认打开文件类型设置
  • 一致性哈希
  • 数据结构:ArrayList简单实现与常见操作实例详解
  • C#高级编程:加密解密
  • 自动化测试避坑指南:5大常见问题与应对策略
  • Java面向对象三大特性深度解析
  • Pass-the-Hash攻击原理与防御实战指南
  • 进程间通信(Windows事件)
  • 【教程】Docker方式本地部署Overleaf
  • 内存划分包括 Flash存储器、SRAM 和 外设寄存器
  • nginx 出现大量connect reset by peer
  • 第二章日志分析-apache日志分析
  • 秒删node_modules[无废话版]
  • 数据结构(八)——查找
  • 达梦数据库 【-6111: 字符串转换出错】问题处理
  • HVV蓝队实战面试题
  • 全新开发-iVX图形化编程VS完整IDE
  • 有关多线程
  • vue中,created和mounted两个钩子之间调用时差值受什么影响
  • Ubuntu摄像头打开失败
  • 16S18S_OTU分析(3)
  • 正则表达式(二)-高级应用_谨慎使用
  • Spark之搭建Yarn模式
  • 日本动漫风格人像街拍Lr调色预设,手机滤镜PS+Lightroom预设下载!