【深度学习】序列生成模型(四):评价方法

文章目录

  • 一、困惑度(Perplexity)
    • 1. 定义
    • 2. 计算
    • 3. 衡量两个分布之间的差异
    • 4. 意义
  • 二、BLEU(Bilingual Evaluation Understudy)
    • 1. 定义
    • 2. 意义
    • 3. 实例
  • 三、ROUGE(Recall-Oriented Understudy for Gisting Evaluation)
    • 1. 定义
    • 2. 意义
    • 3. 实例
  • 四、人工评估

  构建序列生成模型后,为了评价其性能,通常采用一些度量方法。本文将介绍一些常见的评价方法:

一、困惑度(Perplexity)

  困惑度(Perplexity)是一种用来衡量序列生成模型性能的指标。在给定一个测试文本集合的情况下,一个好的序列生成模型应该使得测试集合中句子的联合概率尽可能高。困惑度是信息论中的一个概念,用来度量一个分布的不确定性。

1. 定义

  对于离散随机变量 X ∈ X X \in \mathcal{X} XX,其概率分布为 p ( x ) p(x) p(x),困惑度定义如下:
Perplexity ( X , p ) = 2 H ( p ) = 2 − ∑ x ∈ X p ( x ) log ⁡ 2 p ( x ) \text{Perplexity}(\mathcal{X}, p) = 2^{H(p)}=2^{- \sum_{x \in \mathcal{X}} p(x) \log_2 p(x)} Perplexity(X,p)=2H(p)=2xXp(x)log2p(x)这里的熵 H ( p ) H(p) H(p) 衡量了分布 p p p 的不确定性。困惑度可以看作是对观察到的数据集的估计概率的逆

2. 计算

  考虑一个序列长度为 (T) 的测试集,模型的困惑度为:

PPL ( θ ) = 2 − 1 T ∑ n = 1 N ∑ t = 1 T n log ⁡ 2 p θ ( x n , t ∣ x n , 1 t − 1 ) \text{PPL}(\theta) = 2^{- \frac{1}{T} \sum_{n=1}^{N} \sum_{t=1}^{T_n} \log_2 p_\theta(x_{n,t} | x_{n,1}^{t-1})} PPL(θ)=2T1n=1Nt=1Tnlog2pθ(xn,txn,1t1)

其中 N N N 为测试集中序列的数量, T n T_n Tn 为第 n n n 个序列的长度, p θ p_\theta pθ 是模型对条件概率的估计。困惑度越低,表示模型在给定数据上的拟合越好。

3. 衡量两个分布之间的差异

  对于一个未知的数据分布 p true ( x ) p_{\text{true}}(x) ptrue(x) 和一个模型分布 p θ ( x ) p_\theta(x) pθ(x),困惑度可以用来衡量它们之间的差异。两者之间的交叉熵(cross entropy)为:

Cross Entropy ( p true , p θ ) = − 1 T ∑ n = 1 N ∑ t = 1 T n log ⁡ 2 p θ ( x n , t ) \text{Cross Entropy}(p_{\text{true}}, p_\theta) = -\frac{1}{T} \sum_{n=1}^{N} \sum_{t=1}^{T_n} \log_2 p_\theta(x_{n,t}) Cross Entropy(ptrue,pθ)=T1n=1Nt=1Tnlog2pθ(xn,t)

困惑度可以表示为交叉熵的形式:

PPL ( θ ) = 2 Cross Entropy ( p true , p θ ) / T \text{PPL}(\theta) = 2^{\text{Cross Entropy}(p_{\text{true}}, p_\theta) / T} PPL(θ)=2Cross Entropy(ptrue,pθ)/T

困惑度越低,表示模型分布与真实数据分布越接近。

4. 意义

  困惑度为每个词条件概率的几何平均数的倒数。测试集中所有序列的概率越大,困惑度越小,模型越好。一般情况下,困惑度范围在50到1000之间。在自然语言处理中,困惑度是一个常用的评估指标,用于衡量语言模型的性能。

二、BLEU(Bilingual Evaluation Understudy)

  BLEU(BiLingual Evaluation Understudy)算法是一种用于衡量机器翻译模型或其他序列生成任务中生成序列和参考序列之间的相似度的评价指标。该算法通过计算N元词组(N-Gram)的重合度来评估生成序列的质量。

1. 定义

  设 𝒙 为模型生成的候选序列, s ( 1 ) , ⋯ , s ( K ) \mathbf{s^{(1)}}, ⋯ , \mathbf{s^{(K)}} s(1),,s(K) 为一组参考序列,𝒲 为从生成的候选序列中提取所有N元组合的集合。BLEU算法的精度(Precision)定义如下:

P N ( x ) = ∑ w ∈ W min ⁡ ( c w ( x ) , max ⁡ k = 1 K c w ( s k ) ) ∑ w ∈ W c w ( x ) P_N(\mathbf{x}) = \frac{\sum_{w \in \mathcal{W}} \min(c_w(\mathbf{x}), \max_{k=1}^{K} c_w(\mathbf{s}_k))}{\sum_{w \in \mathcal{W}} c_w(\mathbf{x})} PN(x)=wWcw(x)wWmin(cw(x),maxk=1Kcw(sk))

其中 c w ( x ) c_w(\mathbf{x}) cw(x) 是N元组合 w w w 在生成序列 x \mathbf{x} x 中出现的次数, c w ( s k ) c_w(\mathbf{s}_k) cw(sk) 是N元组合 w w w 在参考序列 s k \mathbf{s}_k sk 中出现的次数。

  为了处理生成序列长度短于参考序列的情况,引入长度惩罚因子 b ( x ) b(\mathbf{x}) b(x)

b ( x ) = { 1 if  l x > l s exp ⁡ ( 1 − l s l x ) if  l x ≤ l s b(\mathbf{x}) = \begin{cases} 1 & \text{if } l_x > l_s \\ \exp\left(1 - \frac{l_s}{l_x}\right) & \text{if } l_x \leq l_s \end{cases} b(x)={1exp(1lxls)if lx>lsif lxls

其中 l x l_x lx 是生成序列的长度, l s l_s ls 是参考序列的最短长度。

  BLEU算法通过计算不同长度的N元组合的精度,并进行几何加权平均,得到最终的BLEU分数:

BLEU-N ( x ) = b ( x ) × exp ⁡ ( ∑ N = 1 N ′ α N log ⁡ P N ( x ) ) \text{BLEU-N}(\mathbf{x}) = b(\mathbf{x}) \times \exp\left(\sum_{N=1}^{N'} \alpha_N \log P_N(\mathbf{x})\right) BLEU-N(x)=b(x)×exp N=1NαNlogPN(x)

其中 N ′ N' N 为最长N元组合的长度, α N \alpha_N αN 是不同N元组合的权重,一般设为 1 / N ′ 1/N' 1/N

2. 意义

  • BLEU算法的值域范围是 [0, 1],值越大表示生成的序列与参考序列越相似,质量越高。
  • BLEU只关注精度,不考虑召回率,即不关心参考序列中的N元组合是否在生成序列中出现。

3. 实例

【深度学习】序列生成模型(五):评价方法计算实例:计算BLEU-N得分【理论到程序】

main_string = 'the cat sat on the mat'
string1 = 'the cat is on the mat'
string2 = 'the bird sat on the bush'# 计算单词
unique_words = set(main_string.split())
total_occurrences, matching_occurrences = 0, 0for word in unique_words:count_main_string = main_string.count(word)total_occurrences += count_main_stringmatching_occurrences += min(count_main_string, max(string1.count(word), string2.count(word)))similarity_word = matching_occurrences / total_occurrences
print(f"N=1: {similarity_word}")# 计算双词
word_tokens = main_string.split()
bigrams = set([f"{word_tokens[i]} {word_tokens[i + 1]}" for i in range(len(word_tokens) - 1)])
total_occurrences, matching_occurrences = 0, 0for bigram in bigrams:count_main_string = main_string.count(bigram)total_occurrences += count_main_stringmatching_occurrences += min(count_main_string, max(string1.count(bigram), string2.count(bigram)))similarity_bigram = matching_occurrences / total_occurrences
print(f"N=2: {similarity_bigram}")

三、ROUGE(Recall-Oriented Understudy for Gisting Evaluation)

  ROUGE(Recall-Oriented Understudy for Gisting Evaluation)算法最初被应用于文本摘要领域,类似于BLEU算法,但ROUGE算法关注的是召回率(Recall)。

1. 定义

  设 x \mathbf{x} x 为从模型分布 p θ p_{\theta} pθ 中生成的一个候选序列, s ( 1 ) , ⋯ , s ( K ) \mathbf{s^{(1)}}, ⋯ , \mathbf{s^{(K)}} s(1),,s(K) 为从真实数据分布中采样得到的一组参考序列, W \mathcal{W} W 为从参考序列中提取N元组合的集合,ROUGE-N算法的定义为:

ROUGE-N ( x ) = ∑ k = 1 K ∑ w ∈ W min ⁡ ( c w ( x ) , c w ( s ( k ) ) ) ∑ k = 1 K ∑ w ∈ W c w ( s ( k ) ) \text{ROUGE-N}(\mathbf{x}) = \frac{\sum_{k=1}^{K} \sum_{w \in \mathcal{W}} \min(c_w(\mathbf{x}), c_w(\mathbf{s}(k)))}{\sum_{k=1}^{K} \sum_{w \in \mathcal{W}} c_w(\mathbf{s}(k))} ROUGE-N(x)=k=1KwWcw(s(k))k=1KwWmin(cw(x),cw(s(k)))

其中 c w ( x ) c_w(\mathbf{x}) cw(x) 是N元组合 w w w 在生成序列 x \mathbf{x} x 中出现的次数, c w ( s ( k ) ) c_w(\mathbf{s}(k)) cw(s(k)) 是N元组合 w w w 在参考序列 s ( k ) \mathbf{s}(k) s(k) 中出现的次数。

2. 意义

  • ROUGE算法的评价重点是召回率,即生成序列中有多少N元组合与参考序列中的N元组合相匹配。与BLEU算法不同,ROUGE更注重生成序列覆盖参考序列的内容。
  • ROUGE-N可用于评估模型生成的文本与参考文本之间的相似性,尤其在文本摘要等任务中常被使用。

3. 实例

【深度学习】序列生成模型(六):评价方法计算实例:计算ROUGE-N得分【理论到程序】

main_string = 'the cat sat on the mat'
string1 = 'the cat is on the mat'
string2 = 'the bird sat on the bush'words = list(set(string1.split(' ')+string2.split(' ')))  # 去除重复元素total_occurrences, matching_occurrences = 0, 0
for word in words:matching_occurrences += min(main_string.count(word), string1.count(word)) + min(main_string.count(word), string2.count(word))total_occurrences += string1.count(word) + string2.count(word)print(matching_occurrences / total_occurrences)bigrams = []
split1 = string1.split(' ')
for i in range(len(split1) - 1):bigrams.append(split1[i] + ' ' + split1[i + 1])split2 = string2.split(' ')
for i in range(len(split2) - 1):bigrams.append(split2[i] + ' ' + split2[i + 1])bigrams = list(set(bigrams))  # 去除重复元素total_occurrences, matching_occurrences = 0, 0
for bigram in bigrams:matching_occurrences += min(main_string.count(bigram), string1.count(bigram)) + min(main_string.count(bigram), string2.count(bigram))total_occurrences += string1.count(bigram) + string2.count(bigram)print(matching_occurrences / total_occurrences)

四、人工评估

  • 定义: 通过人工评价来获取生成序列的质量,可以包括流畅性、准确性等方面。

  • 解释: 人工评估是一种直观且综合性的评估方法,但相对来说较为主观。

在实际应用中,通常会综合使用多个评价指标,以全面评估生成模型的性能。

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

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

相关文章

linux 内核经典RCU

如果不关心使用的RCU是不可抢占RCU还是可抢占RCU,应该使用经典RCU的编程接口。最初的经典RCU是不可抢占RCU,后来实现了可抢占RCU,经典RCU的意思发生了变化:如果内核编译了可抢占RCU,那么经典RCU的编程接口被实现为可抢…

分布式全局ID之雪花算法

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 雪花算法 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、什么是雪花算法&#xff1f…

Kafka--Kafka日志索引详解以及生产常见问题分析与总结

一、Kafka的Log日志梳理 ​ 这一部分数据主要包含当前Broker节点的消息数据(在Kafka中称为Log日志)。这是一部分无状态的数据,也就是说每个Kafka的Broker节点都是以相同的逻辑运行。这种无状态的服务设计让Kafka集群能够比较容易的进行水平扩展。比如你需要用一个新…

嵌入式开发工程师

嵌入式开发 岗位需求 上岗必备 文章目录 嵌入式开发前言一、负责新产品的电路图、PCB、嵌入式程序、软硬件调试等工作二、负责对现有产品进行硬件优化、调试、维护、排故等工作三、 负责各种单片机,传感器,元器件选型以及BOM表整理四、 负责硬件产品研发和量产过程中项目设计…

网络技术基础与计算思维实验教程_3.1_单BSS实验(基本服务集合实验)

无线局域网的最小基本组件是基本服务BSS 实验内容 实验目的 实验原理 实验步骤 为了显示AP的有效通信范围 切换到物理工作区 把物理工作区导航到城市家园 直接在城市家园放置AP0 可以看到AP0的通信范围 放置笔记本电脑 在默认情况下 笔记本电脑上 安装了以太网卡 现在换成无…

大模型之二十一-小语言模型塞道开启

当前提到大语言模型,大家想到的都是动辄百亿规模以上参数量的模型,13B、70B都是稀疏平常入门级的,但是目前从模型层面来看,模型参数量的规模两极分化已经来临,早期各大公司为了效果怼上去,采取了简单粗暴的…

[Angular] 笔记 4:ngFor

ngFor 是一个 for 循环,只能用于循环遍历 list,不能用于遍历单个实体。 下图中的 pokemons 通常是数据库中的数据: 例子: app.components.ts: // 使用类型检查 interface Pokemon {id: number;name: string;type: string;// is…

c++学习:static在类中的空间分配+实战+单例设计模式

目录 情况一: 证实方法: 结果: 情况二: 证实方法: 结果: 实战1:在同一个类中不同对象中传递消息 方法一: 方法二: 实战2:该类只用创建一次&#xff0…

【postgresql】PSQLException: An I/O error occurred while sending to the backend.

org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend. 发送到后端时发生I/O错误。 java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 34284 尝试将超出范围的整数作为2字节值发送:34284 pos…

C++学习——访问限定符

在C中,protected, friend, 和 public 是访问限定符,用于指定类成员的访问级别。 访问限定符 public public 成员可以从类的任何地方访问,包括类的外部。这通常是你希望外部代码能够直接访问和操作的那些方法和属性。比如,一个类…

OpenHarmony开发环境快速搭建(无需命令行)

一. 搭建Windows环境 在嵌入式开发中,很多开发者习惯于使用Windows进行代码的编辑,比如使用Windows的Visual Studio Code进行OpenHarmony代码的开发。但当前阶段,大部分的开发板源码还不支持在Windows环境下进行编译,如Hi3861、H…

LLM微调(四)| 微调Llama 2实现Text-to-SQL,并使用LlamaIndex在数据库上进行推理

Llama 2是开源LLM发展的一个巨大里程碑。最大模型及其经过微调的变体位居Hugging Face Open LLM排行榜(https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard)前列。多个基准测试表明,就性能而言,它正在接近GPT-3.5…

助老理发,寒冬送暖从头开始

为进一步弘扬尊老、敬老、爱老、助老的中华民族传统美德,解决老年人年龄大、冬季出行不便的问题,2023年12月20日,绿萝志愿服务队在翠堤社区开展了“助老理发”志愿活动。 大雪过后天气格外寒冷,但志愿者们依旧早早的来现场做…

【Flink-Bug】Flink 自定义 Sink 重写 RichSinkFunction 方法时重复调用 open 的解决方案

【Flink-Bug】Flink 自定义 Sink 重写 RichSinkFunction 方法时重复调用 open 的解决方案 Flink 自定义 RichinkFunction 时可能会重写 open 方法进行某些连接的初始化操作,但是会出现重复调用 open 方法的问题,如:MQ,如果重复调用…

【Unity实现海浪盒_GerstnerWaves算法_焦散Caustics效果_案例分享】

Unity实现海浪盒效果 背景设置好顶点色参数海浪盒水体部分效果为了快速实现效果,下面用Shadergraph实现效果。ShaderGraph水体全节点ShaderGraph全节点模块序号ShaderGraph属性ShaderGraph Graph Setting1. GerstnerWave 顶点动画部分,输出的是顶点偏移和NormalOSWaves算法Ge…

扭蛋机小程序搭建,“互联网+”下的发展优势

随着我国生活水平和消费能力不断提高,人们对各种潮流文化类的产品需求也快速上升。至此,我国潮流文化市场得到了快速发展! 扭蛋机作为潮玩中的一种商业模式,深受不同年龄层用户的喜爱。并且扭蛋机的种类也是各式各样,…

MYSQL单表删除重复的数据方法

先简述遇到的问题:我要删除一张表的数据,先是查询到所有的重复的数据id直接进行删除操作,但是一直执行不完(一直执行就是删除不完) DELETE FROM table WHERE id IN ( SELECT MAX(id) id from table where rId…

P2089 烤鸡

烤鸡 题目背景 猪猪 Hanke 得到了一只鸡。 题目描述 猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 10 10 10 种配料(芥末、孜然等&#xff…

Vue 官方周报 #124 - 使用JSDoc记录组件属性

Hi &#x1f44b; 当你将鼠标悬停在IDE中的组件上时&#xff0c;显示组件属性所对应的描述&#xff0c;这个功能在开发过程中会很有用。你可以在传递给defineProps函数的TypeScript接口中使用JSDoc来实现这一点&#xff1a; MyComponent.vue <script setup lang"ts&…

【音视频 | AAC】AAC格式音频文件解析

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…