顶会论文复现:PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

文章目录

  • 1 资料
  • 2 我的总结
  • 3 复现源码
    • 首先你需要有gpt的api接口
    • 安装:
    • 数据集
    • 执行指令
    • 源码
  • 4 结果

1 资料

我复现的源码:https://github.com/Whiffe/test_set_contamination

官网源码:https://github.com/tatsu-lab/test_set_contamination

论文:https://openreview.net/forum?id=KS8mIvetg2

论文翻译:ICLR-2024.Oren.PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

b站复现视频:https://www.bilibili.com/video/BV14d1CYWE26/

2 我的总结

这篇论文的测试数据污染的方法也是很扯淡的,论文结尾也说了,作者自己的方法得先证明数据集内的题目之间的顺序打乱是否有影响,这不就是扯淡么,训练期间,有个策略就是要每次输入训练时,打乱顺序,训练的时候都打乱了,作者测试期间打乱测的出来个屁呀。这也能发顶会,太离谱了。

还有检测时用的logprobs这个值,这个值的低和高不代表污染程度,整个论文让我感到匪夷所思。

我依旧对作者的源码进行了重构,简单化地跑了以下,不然按照作者的本地化部署,巨量的遍历循环数据集,那得跑到啥时候,即使能等它跑完,对大模型的消耗也是巨大的,我用的api来跑,那可是按量收费的。

3 复现源码

首先你需要有gpt的api接口

# 设置API key和API的基础URL,用于调用 OpenAI 接口
API_KEY = ""  # 替换为你的 API key
BASE_URL = ""  # 替换为API的基本URL

安装:

pip install fire
pip install openai

数据集

同一个数据集被打乱
在这里插入图片描述

执行指令

python main.py --dataset_path "benchmarks/boolq/dev2.jsonl" --log_file_path "results_with_qwen_logprobs.json"

源码

'''
python main.py --dataset_path "benchmarks/boolq/dev2.jsonl" --log_file_path "results_with_qwen_logprobs.json"此代码用于加载数据集、通过 OpenAI API 计算 token 序列的 logprobs,并通过统计检验比较原始顺序和打乱顺序的 logprobs。
'''# 导入所需的库和模块
import os
import math
import random 
import numpy as np  # 数组和数值计算库
from scipy.stats import t as tdist  # 导入t分布用于统计检验
from multiprocessing import Process, Queue  # 用于并行处理
from tqdm import tqdm  # 用于显示进度条
import json  # 处理 JSON 数据
import fire  # 用于命令行接口
from openai import OpenAI  # 导入OpenAI库用于调用GPT模型# 设置API key和API的基础URL,用于调用 OpenAI 接口
API_KEY = ""  # 替换为你的 API key
BASE_URL = ""  # 替换为API的基本URL# 创建OpenAI客户端,用于后续调用API
client = OpenAI(api_key=API_KEY, base_url=BASE_URL)# 定义两个 lambda 函数:用于展平嵌套列表和打乱列表
flatten = lambda l : [x for s in l for x in s]  # 展平嵌套列表
shuffle = lambda l : random.sample(l, k=len(l))  # 打乱列表def load_dataset(dataset_path):# 加载数据集函数if dataset_path.endswith(".json"):# 如果是JSON文件,读取内容print("loading from json...")with open(dataset_path, "r") as f:data = f.read()examples = json.loads(data)  # 将JSON格式数据解析为Python对象return examples# 如果不是JSON,逐行读取文件with open(dataset_path, "r") as f:lines = f.readlines()  # 读取所有行return lines  # 返回行列表def compute_logprob_of_token_sequence(tokens, context_len=2048, device=0):"""调用 OpenAI API 计算一系列 token 的对数概率 (logprobs)。"""# 将token列表合并成一个输入字符串input_text = " ".join(tokens)try:# 使用 GPT 模型调用API并请求返回logprobsresponse = client.chat.completions.create(messages=[{"role": "user", "content": input_text}],model="gpt-3.5-turbo",  # 使用GPT-3.5模型logprobs=True  # 请求返回 logprobs)# 从响应中提取 logprobslogprobs = [token_logprob.logprob for token_logprob in response.choices[0].logprobs.content]# 计算并返回所有 token 的 logprobs 的和total_logprob = sum(logprobs)return total_logprob  # 返回 logprobs 总和except Exception as e:# 如果发生错误,打印错误信息print(f"An error occurred: {e}")return None  # 返回 None 以表示失败def worker(context_len, device, main_queue, worker_queue):# 工作进程,用于处理多个并行任务while True:# 从 worker_queue 获取 token 列表、shard ID 和是否是 canonical(原始顺序)tokens, shard_id, is_canonical = worker_queue.get()if tokens == None:  # 如果收到 None,表示退出break# 计算 token 序列的 logprobslogprob = compute_logprob_of_token_sequence(tokens, context_len, device=device)# 将结果放入主进程的队列main_queue.put((logprob, shard_id, is_canonical))def main(dataset_path, context_len=2048, num_shards=5, permutations_per_shard=25,random_seed=0, log_file_path=None, max_examples=5000):# 设置随机种子,保证可重复性random.seed(random_seed)np.random.seed(random_seed)# 加载数据集examples = load_dataset(dataset_path)examples = examples[:max_examples]  # 限制加载的示例数量num_examples = len(examples)  # 获取数据集大小print(f"Loaded {num_examples} examples from {dataset_path}")# 对示例进行简单的基于空格的分词tokenized_examples = [ex.split() for ex in examples]# 使用多进程处理请求(在本例中仅使用一个工作进程)processes = []main_queue = Queue()  # 主进程队列,用于收集工作进程的结果worker_queues = [Queue() for _ in range(1)]  # 工作进程队列# 启动工作进程p = Process(target=worker, args=(context_len, 0, main_queue, worker_queues[0]))processes.append(p)p.start()# 计算每个分片的大小(将数据集分为多个分片)shard_counts = [(x + 1 if i < num_examples % num_shards else x) for i, x in enumerate([num_examples // num_shards] * num_shards)]shard_counts = np.asarray(shard_counts)# 生成每个分片的索引shard_example_indices = [0] + np.cumsum(shard_counts).tolist()for i, (start, end) in enumerate(zip(shard_example_indices, shard_example_indices[1:])):shard = tokenized_examples[start:end]# 将原始顺序的logprobs请求提交到worker队列worker_queues[0].put((flatten(shard),  # 展平后的token列表i,               # 分片IDTrue))           # 标识这是canonical(原始顺序)# 将打乱顺序的logprobs请求提交到worker队列for j in range(permutations_per_shard):worker_queues[0].put((flatten(shuffle(shard)),  # 打乱后的token列表i,                        # 分片IDFalse))                   # 标识这是打乱顺序# 等待所有请求完成,并显示进度条total_work = num_shards * (1 + permutations_per_shard)pbar = tqdm(total=total_work)canonical_logprobs = [None for _ in range(num_shards)]  # 存储每个分片的 canonical logprobsshuffled_logprobs  = [[] for _ in range(num_shards)]    # 存储每个分片的打乱顺序 logprobs# 处理worker进程返回的结果completed = 0while completed < total_work:logprob, shard_id, is_canonical = main_queue.get()if is_canonical:canonical_logprobs[shard_id] = logprob  # 存储原始顺序的logprobselse:shuffled_logprobs[shard_id].append(logprob)  # 存储打乱顺序的logprobspbar.update(1)  # 更新进度条completed += 1# 终止工作进程worker_queues[0].put((None, None, None))  # 向worker发送退出信号for p in processes:p.join()  # 等待所有worker进程结束# 计算 p-value(p值,用于统计显著性检验)canonical_logprobs = np.asarray(canonical_logprobs)  # 转换为numpy数组shuffled_logprobs  = np.asarray(shuffled_logprobs)# 进行 t 检验,计算 canonical 和 shuffled 之间的差异diffs = canonical_logprobs - shuffled_logprobs.mean(axis=1)z = np.mean(diffs) / np.std(diffs) * np.sqrt(len(diffs))pval = 1 - tdist.cdf(z, df=len(diffs)-1)  # 计算 p 值print(f"{pval=}")# 将结果写入日志文件(如果指定了log_file_path)if log_file_path is not None:print(f"Writing logprobs to: {log_file_path}")with open(f"{log_file_path}", 'w') as f:f.write(json.dumps({'pval': pval,'permutations_per_shard': permutations_per_shard,'num_shards': num_shards,'canonical_logprobs': canonical_logprobs.tolist(),'shuffled_logprobs': shuffled_logprobs.tolist(),}))if __name__ == '__main__':# 使用Fire库,将命令行参数解析并传递给main函数fire.Fire(main)

4 结果

在这里插入图片描述
在这里插入图片描述

{“pval”: 0.1696232809691942, “permutations_per_shard”: 25, “num_shards”: 5, “canonical_logprobs”: [-3.3727318899495287, -26.976947896884596, -8.280387231770165, -11.1112375389544, -15.317197114102502], “shuffled_logprobs”: [[-30.909075783811705, -1.9435003494767502, -6.068986559756483, -26.58900908523132, -16.12269960305306, -4.46379730144066, -2.1558121800502787, -2.7554792693991, -31.682284527334303, -2.6273379016797502, -29.87468835264795, -29.607210920316206, -21.57213257741471, -11.95329938606544, -9.972366131973049, -1.09951527892729, -24.01362313224146, -12.456106343552321, -13.67304127957505, -8.3861853631837, -1.19935666177955, -1.3937543557773802, -1.8002136455626179, -18.009020852617073, -17.578153150829802], [-1.048417377427077, -2.3941244789539704, -8.412327189846044, -24.544644694362702, -5.74892321528065, -1.055017764263738, -9.581590557731854, -7.1433768327109, -2.737799236512142, -23.983025399790144, -9.26424030310054, -14.993957307794997, -2.9504655498746724, -12.080805583617936, -30.364195487487766, -1.9539559864239302, -9.9784173216152, -5.28962663901724, -15.477334895809188, -12.511526170812552, -2.6651197975443917, -7.0888789550949, -3.2381118496705326, -9.586995443264478, -19.668003974102017], [-4.233909482393801, -7.066849438078104, -5.8159291705155995, -10.790016564647766, -5.962899019632103, -5.1748830459693185, -2.6900913199189995, -14.64220487293797, -12.072412084641194, -7.0405692357728995, -3.757379365485161, -4.3277333949891, -18.239703727872094, -1.2460728438048796, -1.5030126277381202, -3.4466863958886114, -4.680143685284249, -4.651795277712018, -20.354000748485447, -1.4471048784444498, -10.138775905959701, -18.178129422154928, -8.530598762226427, -7.489915270562131, -3.1585280028892795], [-11.69612743268735, -7.769248518398181, -6.86862614461919, -6.518956643516701, -3.803943939116793, -13.014972477420848, -8.689137998628949, -15.809698635575, -7.99394916393605, -10.31342520238305, -15.928287922934501, -4.502634127164701, -8.7768807739485, -4.220711983509, -28.029167855395826, -2.81686953962755, -9.31479084741635, -11.158157243828, -6.721924684535599, -10.066673909472277, -4.500597344717, -21.480636945940205, -9.300124195747498, -11.9573958015312, -14.577081120902347], [-6.629690439094301, -10022.289585636432, -7.999280733182201, -11.308060008804496, -5.2692347206537, -7.0436708680337015, -4.26530791126701, -4.130906993623899, -5.9630648153422, -7.950204238607298, -7.942466538914552, -12.449199286857947, -25.78205265161044, -17.262547473382632, -5.530209510927001, -8.1570511425078, -5.8230390775959995, -5.532957394563099, -16.9681575425189, -5.454541042652198, -4.4566292699186, -2.14531132561838, -38.43645063084328, -33.65827228043184, -2.714607539457402]]}

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

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

相关文章

禁用微软的windos安全中心

目录 一、为什么禁用 二、WDControl_1.5.0程序禁用windows安全中心 步骤1--- 步骤2--- 三、禁用widows安全中心成功 一、为什么禁用 描述&#xff1a;下载第三方软件常常会收到病毒防护秒杀&#xff0c; 第1---直接无法下载 第2---提前下载在U盘解压会被干掉程序文件 …

Spark第一天

MapReduce过程复习 Spark由五部分组成 RDD五大特征 1、 Spark -- 代替MapReduce <<<<< scala是单机的&#xff0c;spark是分布式的。>>>>> 开源的分布式计算引擎 可以快速做计算 -- 因为可以利用内存来做一些计算 (1) 分为5个库(模块) : 1、…

【hot100-java】排序链表

链表题。 使用归并排序法。 一图解决。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; thi…

网络安全之XXE攻击

0x01 什么是 XXE 个人认为&#xff0c;XXE 可以归结为一句话&#xff1a;构造恶意 DTD 介绍 XXE 之前&#xff0c;我先来说一下普通的 XML 注入&#xff0c;这个的利用面比较狭窄&#xff0c;如果有的话应该也是逻辑漏洞。 既然能插入 XML 代码&#xff0c;那我们肯定不能善罢…

C++之String类模拟实现(下)

片头 哈喽~小伙伴们&#xff0c;在上一篇中&#xff0c;我们讲解了C的string类的相关函数&#xff0c;这一章中&#xff0c;我们将继续深入学习string类函数&#xff0c;准备好了吗&#xff1f;咱们开始咯~ 五、对内容进行修改 ⑤insert函数 在指定位置插入字符或者字符串 …

docker安装elasticsearch(es)+kibana

目录 docker安装elasticsearch 一.准备工作 1.打开docker目录 2.创建elasticsearch目录 3.打开elasticsearch目录 4.拉取elasticsearch镜像 5.检查镜像 二.挂载目录 1.创建数据挂载目录 2.创建配置挂载目录 3.创建插件挂载目录 4.权限授权 三.编辑配置 1.打开con…

重学SpringBoot3-集成Spring Boot Actuator

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Spring Boot Actuator 1. 什么是 Spring Boot Actuator&#xff1f;2. Spring Boot Actuator 的核心功能3. Spring Boot 3 中集成 Actuator3.1 添加…

Thread类的基本用法

一.线程创建 继承Thread来创建一个线程 实现 Runnable 接⼝ 匿名内部类创建 Thread ⼦类对象 匿名内部类创建 Runnable ⼦类对象 lambda 表达式创建 Runnable ⼦类对象 二.线程中断 ⽬前常⻅的有以下两种⽅式&#xff1a; 1. 通过共享的标记来进⾏沟通 2. 调⽤ interrup…

计算机网络(以Linux讲解)

计算机网络 网络协议初识协议分层OSI七层模型TCP/IP五层模型--初识 网络中的地址管理IP地址MAC地址 网络传输基本流程网络编程套接字预备知识网络字节序socket编程UDP socketTCP socket地址转换函数Jsoncpp 进程间关系与守护进程进程组会话控制终端作业控制守护进程 网络命令TC…

数学建模算法与应用 第15章 预测方法

目录 15.1 微分方程模型 Matlab代码示例&#xff1a;求解简单的微分方程 15.2 灰色预测模型&#xff08;GM&#xff09; Matlab代码示例&#xff1a;灰色预测模型 15.3 自回归模型&#xff08;AR&#xff09; Matlab代码示例&#xff1a;AR模型的预测 15.4 指数平滑法 M…

openrtp ps流和纯rtp流

改进openrtp 程序 OpenRtp 以RTP协议为主&#xff0c;发送音视频&#xff0c;因为工作量比较大&#xff0c;所以耽误了一些时间&#xff0c;前面一直没有时间来修改这个程序&#xff0c;也有一些人提了意见&#xff0c;现在重视一下&#xff0c;把这个程序做好&#xff0c;让学…

NirCmd-sendkeysendkeypress

引入script [Script File] This command allows you to execute a sequence of commands stored inside the file specified in [Script File] parameter. Example: script "c:\temp\msg.ncl" Example for a script:infobox "Hello !" "This is the …

大型生物制药企业如何实现安全又高效地跨网域数据传输?

大型生物制药企业由于组织结构庞大、业务覆盖研发、生产及销售&#xff0c;因此内部会再细分为多个管理单位&#xff0c;包括研发部门、生产部门、质量控制部门、供应链管理部门及营销部和日常业务支撑部门等。在物理区域划分上&#xff0c;大型生物制药企业会设立实验室、研发…

下载相应版本的PyTorch

1、前置条件 下载某个版本的Python&#xff0c;本文涉及的Python版本为3.10 2、查看该Python版本可以下载的whl文件格式 pip debug --verbose 从上图可以发现python3.10可以下载格式为cp310-cp310-win_amd64的whl文件 PyTorch各稳定版本下载链接&#xff1a;https://downloa…

【工具】音视频翻译工具基于Whisper+ChatGPT

OpenAI推出的开源语音识别工具Whisper&#xff0c;以其卓越的语音识别能力&#xff0c;在音频和视频文件处理领域大放异彩。与此同时&#xff0c;ChatGPT也在翻译领域崭露头角&#xff0c;其强大的翻译能力备受赞誉。因此&#xff0c;一些字幕制作团队敏锐地捕捉到了这两者的结…

Nginx UI 一个可以管理Nginx的图形化界面工具

Nginx UI 是一个基于 Web 的图形界面管理工具&#xff0c;支持对 Nginx 的各项配置和状态进行直观的操作和监控。 Nginx UI 的功能非常丰富&#xff1a; 在线查看服务器 CPU、内存、系统负载、磁盘使用率等指标 在线 ChatGPT 助理 一键申请和自动续签 Let’s encrypt 证书 在…

Flink 批作业如何在 Master 节点出错重启后恢复执行进度?

摘要&#xff1a;本文撰写自阿里云研发工程师李俊睿&#xff08;昕程&#xff09;&#xff0c;主要介绍 Flink 1.20 版本中引入了批作业在 JM failover 后的进度恢复功能。主要分为以下四个内容&#xff1a; 背景解决思路使用效果如何启用 一、背景 在 Flink 1.20 版本之前&am…

react antd redux 全局状态管理 解决修改菜单状态 同步刷新左侧菜单

npm i react-redux1.src新建两个文件 globalState.js 全局状态定义 store.js 全局存储定义 2.globalState.js import { createSlice } from "reduxjs/toolkit";export const globalState createSlice({name: "globalState",initialState: { data: {} },r…

rpa批量发送邮件如何通过编辑器编发邮件?

rpa批量发送邮件的技巧&#xff1f;怎么使用rpa邮箱群发助手&#xff1f; 手动发送邮件变得越来越繁琐且效率低下。为了解决这一问题&#xff0c;越来越多的企业开始采用RPA技术来批量发送邮件。AokSend将详细探讨如何通过编辑器来实现rpa批量发送邮件的功能&#xff0c;从而提…

微信小程序处理交易投诉管理,支持多小程序,一键授权模式

大家好&#xff0c;我是小悟 1、问题背景 玩过微信小程序生态的&#xff0c;或许就有这种感受&#xff0c;如果收到投诉单&#xff0c;不会及时通知到手机端&#xff0c;而是每天早上10:00向小程序的管理员及运营者推送通知。通知内容为截至前一天24时该小程序账号内待处理的交…