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

news2024/12/24 11:41:34

  在前面的博客中分别介绍了大模型评估过程不同指标的含义,以及如何通过代码,实现指标的收集。如果对如何运行代码生成结果和收集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.0
        return 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.coloradmin.cn/o/1322377.html

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

相关文章

低代码软件开发的革命

一、前言 如果一个概念能在科技圈火起来&#xff0c;它往往兼具字面简明和内涵丰富的特征&#xff0c;并具有某种重塑产业格局的潜力。低代码&#xff08;Low Code&#xff09;就是这样一个典型。顾名思义&#xff0c;低代码是指少用代码&#xff0c;甚至不用代码&#xff0c;仅…

大学生可以自学嵌入式开发吗?

今日话题&#xff0c;大学生可以自学嵌入式开发吗&#xff1f;大学期间完全可以自学嵌入式开发&#xff0c;但这需要极大的毅力和耐心。嵌入式学习的过程可能会让你感到自卑&#xff0c;但也能带来无限成就感。嵌入式开发伴随着一系列问题&#xff0c;这些问题既是挑战也是机会…

Nodejs 第二十六章(反向代理)

什么是反向代理? 反向代理&#xff08;Reverse Proxy&#xff09;是一种网络通信模式&#xff0c;它充当服务器和客户端之间的中介&#xff0c;将客户端的请求转发到一个或多个后端服务器&#xff0c;并将后端服务器的响应返回给客户端。 负载均衡&#xff1a;反向代理可以根…

在Python中使用Kafka帮助我们处理数据

Kafka是一个分布式的流数据平台&#xff0c;它可以快速地处理大量的实时数据。Python是一种广泛使用的编程语言&#xff0c;它具有易学易用、高效、灵活等特点。在Python中使用Kafka可以帮助我们更好地处理大量的数据。本文将介绍如何在Python中使用Kafka简单案例。 一、安装K…

2023 英特尔On技术创新大会直播 | AI 融合发展之旅

前言 2023 年的英特尔 On 技术创新大会中国站&#xff0c;主要聚焦最新一代增强 AI 能力的计算平台&#xff0c;深度讲解如何支持开放、多架构的软件方案&#xff0c;以赋能人工智能并推动其持续发展。 大会的目标之一是优化系统并赋能开发者&#xff0c;特别注重芯片增强技术…

火柴棍等式c语言

分析&#xff1a;我们可以枚举等式&#xff0c;在判断这些等式是由多少根火柴组成&#xff0c;在把火柴数量和之前输入的比较&#xff0c;如果相等&#xff0c;那么就统计一次&#xff0c;注意的是等号和加号需要减去四根。 #include <stdio.h> int f(int a){//判断某一…

国产划片机品牌众多,如何选择优质的供应商?

在半导体行业的发展浪潮中&#xff0c;划片机作为关键设备之一&#xff0c;其性能和质量对于生产过程的高效性和产品的质量具有至关重要的影响。近年来&#xff0c;国产划片机的品牌数量不断增多&#xff0c;为半导体行业提供了更多的选择。然而&#xff0c;如何从众多的品牌中…

sourcetree 无效的源路径 细节提示:系统找不到指定的文件

工具–>选项–>git 直接下拉到底 点击红框&#xff0c;重新下载一个内嵌git就可以了 我感觉是因为改变了原有git安装路径的问题

病案管理的定义、流程及应用分析

病案管理是指针对病人的基本信息&#xff0c;病历&#xff0c;就诊记录等进行收集、整理、存储、分析和应用的一项管理工作。它在医院、医疗机构和医疗行业中具有重要的作用&#xff0c;能够提高医疗服务的质量、效率和安全性。本文将就病案管理的定义、流程以及其在医疗健康领…

超实用的Web兼容性测试经验总结,建议Mark

在日常工作中&#xff0c;我们经常碰到网页不兼容的问题。我们之所以要做兼容性测试&#xff0c;目的在于保证待测试项目在不同的操作系统平台上正常运行。 主要包括待测试项目能在同一操作系统平台的不同版本上正常运行&#xff1b;待测试项目能与相关的其他软件或系统的“和…

Halcon深度学习方法

1、异常检测和全局上下文异常检测 图(1)异常检测示例 在图(1)上图中&#xff0c;异常检测示例&#xff1a;为输入图像的每个像素都分配一个分数&#xff0c;表明它显示未知特征(即异常)的可能性&#xff1b;在图(1)下图中&#xff0c;全局上下文异常检测示例&#xff1a;为输入…

浅谈云性能测试的关键要点

随着云计算的广泛应用&#xff0c;云性能测试成为确保云服务质量和性能的关键环节。云性能测试不仅涵盖了传统性能测试的方面&#xff0c;还需要考虑云环境的特殊性。以下是云性能测试的几个关键要点&#xff1a; 1. 模拟真实云环境 云环境具有虚拟化、弹性扩展等特点&#xff…

Python基础教程——最详细python安装库的方法(安装pygame库为例)!

Python安装库方法大全&#xff08;以安装pygame库为例&#xff09; 方法一、在pycharm内部直接安装【直接上图】 第一种方法安装不了就用第二种 如果显示package pygame &#xff08;库名&#xff09; install successfully 到此第一种方法结束恭喜你安装成功 如果报了错那就…

Python---进程

1. 进程的介绍 在Python程序中&#xff0c;想要实现多任务可以使用进程来完成&#xff0c;进程是实现多任务的一种方式。 2. 进程的概念 一个正在运行的程序或者软件就是一个进程&#xff0c;它是操作系统进行资源分配的基本单位&#xff0c;也就是说每启动一个进程&#xf…

德人合科技 | 防止公司电脑文件数据资料外泄,自动智能透明加密保护系统

【透明加密软件】——防止公司电脑文件数据资料防止外泄&#xff0c;自动智能透明加密保护内部核心文件、文档、图纸、源代码、音视频等资料&#xff01; PC端访问地址&#xff1a; www.drhchina.com &#x1f31f; 核心功能&#xff1a; 透明加密&#xff1a;采用高级加密算…

telnet的交互原理(wireshark分析)

telnet的交互原理&#xff08;wireshark篇&#xff09; telnet的协议类型是tcp&#xff0c;他的密钥用的是明文的&#xff0c;容易被捕获&#xff0c;所以后来的windows基本弃用了telnet服务端但依然保留了客户端。 下面是他的交互抓包&#xff1a; 这里面的前三条运用的是tc…

如何通过控制台排查定位EasyTsdb

过去我们发现EasyTsdb占用磁盘较大&#xff0c;但我们却不能直接看到哪个模型占用空间多&#xff1f;更不可能知道是哪个指标数据量大&#xff1f; 当EasyTsdb负载高时&#xff0c;我们无法定位当时哪个模型或者哪个请求占用了资源&#xff0c;也不知道是从什么时候开始出现高…

net6使用StackExchangeRedis实现分布式缓存

上一篇讲解了Redis的搭建及ServiceStack.Redis 与 StackExchange.Reids 的区别https://blog.csdn.net/qq_39569480/article/details/105249607 这篇文章遗我们来说下使用Microsoft.Extensions.Caching.StackExchangeRedis来对redis进行操作及帮助类。 首先在windows上安装red…

springboot 学生信息管理

介绍 一个学生信息管理后台&#xff0c;适用于大作业&#xff0c;课设等 软件架构 springbootmybatisthymeleaf &#xff08;前后端未分离&#xff09; 安装教程 注&#xff1a;mysql数据库要8.0以上&#xff0c;&#xff0c;本地mysql新建一个名为 student 的空数据库&am…

关于“Python”的核心知识点整理大全29

目录 11.2.4 方法 setUp() 注意 11.3 小结 第二部分 项目1 外星人入侵 第&#xff11;2 章 武装飞船 注意 12.1 规划项目 12.2 安装 Pygame 注意 12.2.1 使用 pip 安装 Python 包 注意 如果你启动终端会话时使用的是命令python3&#xff0c;那么在这里应使用命令…