大模型评估中Pass@k值是如何计算的

  在前面的博客中分别介绍了大模型评估过程不同指标的含义,以及如何通过代码,实现指标的收集。如果对如何运行代码生成结果和收集pass@k指标不清楚,可以参考这两篇博客。

如何对大模型进行评估上

如何对大模型进行评估下

Pass@k的来源

  代码的生成模型主要是通过将样本与参考方案进行匹配来衡量的,其中的匹配可以是精确的,也可以是模糊的(如BLEU分数)。匹配的代码指标存在缺陷。例如,Ren等人(2020年)发现,BLEU在捕捉代码特有的语义特征方面存在问题,并建议对该分数进行若干语义修改。更为根本的是,基于匹配的指标无法解释在功能上等同于参考解决方案的庞大而复杂的程序空间。因此,在无监督代码翻译(Lachaux等人,2020年)和伪代码到代码翻译(Kulal等人,2019年)方面的工作已经转向功能正确性,如果一个样本通过了一组单元测试,就认为它是正确的。我们认为,这种衡量标准也应适用于docstringconditional代码生成。
  评估功能正确性的最有说服力的理由是,人类开发者用它来判断代码。一个被称为"测试驱动开发"的框架规定,在任何实施开始之前,软件需求要转化为测试用例,而成功的定义是通过这些测试的程序。虽然很少有组织采用完全的测试驱动开发,但新代码的集成通常取决于创建和通过单元测试。

  Kulal等人(2019)使用pass@k指标评估功能正确性,即每个问题生成k个代码样本,如果有任何样本通过单元测试,则认为问题已解决,并报告问题解决的总比例。然而,以这种方式计算pass@k会有很高的方差性。相反,为了评估pass@k,我们为每个任务生成n≥k的样本(在本文中,我们使用n=200,k≤100),计算通过单元测试的正确样本c≤n的数量,并计算出无偏估计器。论文中提到的公式如下图所示:

  直接计算这个估计值会导致非常大的数字和数值上的不稳定。为了解决这个问题,我们包括一个数值稳定的numpy实现,它简化了表达式并逐项评估了乘积。人们可能会想用 1−(1−p^)k来估计pass@k,其中pˆ是pass@1的经验估计值。将上面的公式转换成具体的计算代码是这样。

def estimate_pass_at_k(num_samples: Union[int, List[int], np.ndarray],num_correct: Union[List[int], np.ndarray],k: int
) -> np.ndarray:"""Estimates pass@k of each problem and returns them in an array."""def estimator(n: int, c: int, k: int) -> float:"""Calculates 1 - comb(n - c, k) / comb(n, k)."""if n - c < k:return 1.0return 1.0 - np.prod(1.0 - k / np.arange(n - c + 1, n + 1))if isinstance(num_samples, int):num_samples_it = itertools.repeat(num_samples, len(num_correct))else:assert len(num_samples) == len(num_correct)num_samples_it = iter(num_samples)return np.array([estimator(int(n), int(c), k) for n, c in zip(num_samples_it, num_correct)])

  对于上面的数学运算公式,实际在论文中也没有进行透彻的解析,上面的代码是来源于openai的humanEval评估脚本。所以,在实际项目中,本质上就是以openai给出的评估代码计算公式为准。对于使用脚本的人来说,关键是弄清楚里面的几个参数含义即可,即明白什么是n,什么是k,什么是c。

从源代码来分析如何计算Pass@k值

 对于c是非常清晰的,就是通过单元测试的个数,那么k值和n值分别是什么呢?来看下面这段代码就知道了。下图是对一个问题(task_id都是test/0),产出了12个结果答案,并放到jsonl文件中。

 执行评估脚本命令

evaluate_functional_correctness /Users/taoli/human-eval/data/example_samples.jsonl --problem_file=/Users/taoli/human-eval/data/example_problem.jsonl

得到的结果如下图所示:

   通过上面的实验可以看到,n值就是对于每一个问题,生成的答案总数,结合源代码分析,k值是一个数组[1,10,100],包含三个数据,如果n<10,那么只能计算得到pass@1的值,如果100>n>10,能计算得到pass@1和pass@10的值,如果n>100,能计算得到pass@1,pass@10,pass@100的值。

  再来看一下这个数据集,对于每一个任务只有一个答案,执行这样的文件数据,最终只能得到pass@1的值。

  总结而言,因为LLM生成的答案有随机性,如果只为每一个问题生成一个答案作为评估结果,可能会低估LLM的能力,也可能会高估LLM的能力。所以,更好的方式是为每一个答案生成n个结果。n的值越大,评估的结果更接近真实,当n的值很大时,假设,要为每个问题准备200个答案,那么,这200个答案可以分为多次生成,然后组合到jsonl文件中即可。对于LLM来说,本身有窗口大小的限制,一次也无法生成200个答案。

  准备好jsonl文件后,评估脚本会根据n的值,自动生成pass@k的值。

如何解决执行脚本过程中的错误

在执行“evaluate_functional_correctness”脚本中,如果遇到下图的错误

解决办法是:pip3 install multiprocess,将脚本中使用multiprocessing的地方都修改成multiprocess。

另外,在执行脚本前,取消exec(...)的注释,默认情况下,这行代码是被注释掉的。

以上就是对于pass@k的解释,总结而言,对于数学公式,不用过度去纠结,明白两个原则即可。

原则一:pass@k值中,k的值越大,评估越贴近真实。如果只有pass@1的值,可能会低估或者高估大模型的能力。

原则二:无需动态设置k的值,pass@k的值是根据n的值决定的(n是为每个问题生成的答案数量)。

当然,官网的执行命令中,也允许传入自定义的k值,但通常用默认的[1,10,100]即可。

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

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

相关文章

Elasticsearch 向量相似搜索

Elasticsearch 向量相似搜索的原理涉及使用密集向量(dense vector)来表示文档,并通过余弦相似性度量来计算文档之间的相似性。以下是 Elasticsearch 向量相似搜索的基本原理: 向量表示文档: 文档的文本内容经过嵌入模型(如BERT、Word2Vec等)处理,得到一个密集向量(den…

【Spring】12 EmbeddedValueResolverAware 接口

文章目录 1. 简介2. 作用3. 使用3.1 创建并实现接口3.2 配置 Bean3.3 创建启动类3.4 启动 4. 应用场景总结 Spring 框架提供了许多回调接口&#xff0c;以便开发者在 Bean 的生命周期中执行一些特定操作。其中之一是 EmbeddedValueResolverAware 接口&#xff0c;本文将深入探…

单片机LCD1602

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、LCD1602是什么&#xff1f;二、LCD1602 原理三、显示一个字符四、如何显示四位数五、参考历程六、封装成一个显示 字符和一个显示任意四位数的函数总结 前言…

基于ssm防疫信息登记系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本防疫信息登记系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

回溯算法之棋盘问题hard

12.18 51N皇后 题目&#xff1a; 思路&#xff1a; &#xff08;1&#xff09;用回溯的思想寻找每一行皇后的位置 &#xff08;2&#xff09;皇后位置的约束&#xff0c;创建一个新函数。使得与之前行的皇后不在同一列或斜线 &#xff08;3&#xff09;45度斜线行列和相等&…

系统设计——系统安全

HTTPS 是如何工作的&#xff1f; 安全超文本传输​​协议&#xff08;HTTPS&#xff09;是超文本传输​​协议&#xff08;HTTP&#xff09;的扩展。HTTPS 使用传输层安全性&#xff08;TLS&#xff09;传输加密数据。如果数据在网上被劫持&#xff0c;劫持者得到的只是二进制…

CRM客户登记管理系统:企业数字化转型的必备工具

客户登记管理系统&#xff08;CRM&#xff09;是一种用于记录和管理客户信息的软件系统。它用于存储和跟踪客户的基本信息、联系方式、交易历史、服务请求等关键数据&#xff0c;以便企业能够更好地了解客户、提供个性化的服务&#xff0c;并进行有效的销售和营销活动。 CRM系统…

迅为RK3588开发板瑞芯微国产化工业ARM核心板AI人工智能

性能强 iTOP-3588开发板采用瑞芯微RK3588处理器&#xff0c;是全新一代AloT高端应用芯片&#xff0c;采用8nm LP制程&#xff0c;搭载八核64位CPU&#xff0c;四核Cortex-A76和四核Cortex-A55架构&#xff0c;主频高达2.4GHz&#xff0c;8GB内存&#xff0c;32GB EMMC。 四核心…

用于噪声和分段相位测量的鲁棒相位展开算法(全文翻译-2区Optics Express)

摘要&#xff1a;本文提出了一种在存在噪声和分段相位的情况下进行相位展开的鲁棒相位展开算法&#xff08;RPUA&#xff09;。RPUA方法提出了一种新的相位导数模型&#xff0c;结合纠错迭代来实现抗噪声效果。此外&#xff0c;它使用数值载波频率和条纹外推法在空间域中桥接相…

vp与vs联合开发-通过FrameGrabber连接相机

添加控件 1.CogRecordDisplay 控件 用于显示图像 初始化相机对象方法 //启动窗体时 调用初始化相机方法 //封装相机关闭方法 //窗体关闭时 调用相机关闭方法 拍照 设置采图事件 // 保存图像 设置曝光按钮事件 1.可变参数

【Flink-cdc-Mysql-To-Kafka】使用 Flinksql 利用集成的 connector 实现 Mysql 数据写入 Kafka

【Flink-cdc-Mysql-To-Kafka】使用 Flinksql 利用集成的 connector 实现 Mysql 数据写入 Kafka 1&#xff09;环境准备2&#xff09;准备相关 jar 包3&#xff09;实现场景4&#xff09;准备工作4.1.Mysql4.2.Kafka 5&#xff09;Flink-Sql6&#xff09;验证 1&#xff09;环境…

前端视角看 Docker :在国内的基础配置教程(含国内镜像源)

引言 在国内使用Docker时&#xff0c;直接从Docker Hub拉取镜像可能会遇到网络速度慢的问题。配置国内的镜像加速器可以显著提升拉取速度。本教程将指导您完成安装Docker后的基础配置&#xff0c;特别是设置国内镜像加速器。 1. 安装Docker 确保您已在系统上安装Docker。根…