GPT-4拿MIT满分遭质疑!爆火论文数据集漏洞百出,马库斯、LeCun震惊 环球快播报

2023-06-19 21:48:06来源:手机网易网

新智元报道

编辑:编辑部


(资料图)

【新智元导读】GPT-4满分拿下MIT数学本科考试的论文突然爆火,然而还没发酵一天,就被MIT同校生反侦查了。

GPT-4攻克MIT数学和EECS本科考试在网上引起轩然大波。

但是,热度还没发酵一天,有人就站出来就表示,

万万没想到,这篇来自MIT等机构的研究者收集整理的数据集受到了污染,其实GPT-4的结果被夸大了。

这件事震惊了AI圈内多位大佬。

马库斯表示,麻省理工学院EECS的那份论文真的很烂,是对GPT-4的错误信仰的又一个例子。

(这让我想起了关于心智理论的同样夸张的说法)。

还有LeCun转发了一位网友的点评:

那篇关于GPT-4如何通过MIT课程的论文在很多方面都存在严重缺陷。这很好地提醒了我们,预印本是不经过同行评审的,另外公共志愿者评审也很出色。

此外,前谷Google Brain研究员「hardmaru」也表示大受震撼:

「当有人声称一种语言模型可以在某项任务上达到100%的准确率,尤其是这项任务的数据还是来自MIT的EECS课程时。这帮知识渊博的机器学习专家们,不仅没有任何怀疑,而且还对结果进行大肆宣传。」

「在LLM评估中,一种越来越流行但不科学的做法是作者不断迭代和挑选最佳的提示,以便在已知的评估任务中得分高。而这实际上是在间接地告诉LLM应该给出什么答案。」

这究竟是怎么回事?

100%?不可能的

论文中,研究人员从MIT的数学、电气工程与计算机科学(EECS)课业问题、期中和期末考,收集了一个包含4550个问题和解决方案的综合数据集。

然后,让其他LLM在一个没有图像和解决方案的288道随机数据集,以及500道选择题的ReClor验证集中进行测试。

结果发现,GPT-4几乎满分通过考试。

然而,这一结果却让其他研究人员大受震撼,于是他们开始详细检查每个数据点。

很快,研究人员就发现,这是不可能的。

无法解决类

首先,数据集中至少有10个问题是无法用提供的信息来解决的。

与此同时,其中还有一些问题压根就不是有效的问题。

这些数据的占比大概是4%。

来看几个例子:

这两道题目分别是计算传播延迟,以及有关并行运行调用的题目。

研究人员表示,数据集中没有提供必要的条件来得出有效的结果。

而下面这道题目是对两个disk的重量进行比较的计算题,并要求给出解释。

这个题目题干倒没什么问题,就是一开头提到的variation on problem 2,指这道题是问题2的变式。

可是问题2的信息根本没有,没法比较,所以也做不了。

下面这道编程题目是要找出在输入给定的prompt后,输出结果有什么不对的地方。

这道题目解不出来有两个原因,一个是本身给的条件有限,另一个是作为一个LLM,GPT不可能获得交互式终端的权限(最起码题里没给)。

而假如GPT真知道IP地址,那就说明信息泄露了,因为这个地址只有MIT有。

像这种例子还有一些(4%),研究人员都在数据集上进行了标注。

当然,也有一些题目都不能称之为问题,比如下面这个。

根本没有设问,只是一句陈述。

重复性问题

研究人员发现,数据集(288个问题)中有14个问题是重复的。要不就是完全相同,要不就是只有微小的字符差别。

正是因为存在着这些绝对不可解,以及问题重复的情况,所以研究人员对100%这个结果大惑不解。

经过进一步调查,研究人员发现,真相只有一个,那就是存在解题信息的泄露,以及对输出结果的评级有方法上的漏洞。

首先,让我们先来了解一下,少样本(few-shot)是什么意思。

简而言之,研究人员对OpenAI嵌入的数据集内的类似问题进行余弦相似度搜索,并将这些问题和解决方案作为额外的背景纳入模型的提示,以帮助模型解决问题。

在这种情况下,只要例子与实际的问题有足够的区别,就还算公平。

然而,研究人员却发现,真实情况下,给到模型的少样本和数据集中的问题一字不差。

于是,研究人员写了个脚本,来简单看一看给到的例子和实际问题之间重叠的部分。

代码如下:

from tqdm.notebook import tqdmimport numpy as npdef longest_common_substring(s1, s2):m = [[0] * (1 + len(s2)) for _ in range(1 + len(s1))]longest, x_longest = 0, 0for x in range(1, 1 + len(s1)):for y in range(1, 1 + len(s2)):if s1[x - 1] == s2[y - 1]:m[x][y] = m[x - 1][y - 1] + 1if m[x][y] > longest:longest = m[x][y]x_longest = xelse:m[x][y] = 0return len(s1[x_longest - longest: x_longest])def calculate_few_shot_overlap(sample):q = (sample["Question"])fs1 = (sample["Few shot question 1"])fs2 = (sample["Few shot question 2"])fs3 = (sample["Few shot question 3"])fs1 = longest_common_substring(q, fs1) / min(len(fs1), len(q))fs2 = longest_common_substring(q, fs2) / min(len(fs2), len(q))fs3 = longest_common_substring(q, fs3) / min(len(fs3), len(q))return np.max([fs1, fs2, fs3])test_dataset["overlap"] = test_dataset.apply(calculate_few_shot_overlap, axis=1)

将这些重叠绘制成直方图如下所示:

可以发现,例子中的问题和实际的问题很多情况下相似度极高。

研究人员认为,为了正确评估GPT的解题能力,相同的问题应该被排除在外。

def repeat_grading(input_path, output_path, num_experts = 3, num_fs = 3, most_recent_q = 0):df = pd.read_csv(input_path)df = df.iloc[most_recent_q:]for index, row in df.iterrows():print("Completing question", index)question_output = row.values.tolist()course_name = row["Course Name"]question = row["Question"]solution = row["Solution"]fs_qs = [[row["Few shot question 1"], row["Few shot solution 1"]], [row["Few shot question 2"], row["Few shot solution 2"]], [row["Few shot question 3"], row["Few shot solution 3"]]]experts = get_experts(course_name, question, num_experts).split(", ")prompts = [lambda expert: zero_shot_response(question, expert),lambda expert: few_shot_response(expert, question, fs_qs),lambda expert: few_shot_response(expert, question, fs_qs, True)critiques = [["Review your previous answer and find problems with your answer.", "Based on the problems you found, improve your answer."], ["Please provide feedback on the following incorrect answer.","Given this feedback, answer again."]]for expert in experts:print("Using expert", expert)question_output.append(expert)crit = Truefor prompt in prompts:prompt_response = prompt(expert) # calls fresh ChatCompletion.createprompt_grade = grade(course_name, question, solution, prompt_response) # GPT-4 auto-grading comparing answer to solutionquestion_output+=[prompt_response, prompt_grade]if correct(prompt_grade):crit = Falsebreakif crit:for critique in critiques:crit_response = self_critique_response(expert, course_name, question, question_output[-2], critique) # calls fresh ChatCompletion.createcrit_grade = grade(course_name, question, solution, crit_response) # GPT-4 auto-grading comparing answer to solutionquestion_output+=[crit_response,crit_grade]if correct(crit_grade):breakrepeat_grading("MIT_test_set.csv", "MIT_test_set_graded.csv")

同时,研究人员还在代码里发现了一些错别字/错误,导致了与论文中描述的或作者预期不同的提示。

以下是零样本函数的函数参数:

def zero_shot_response(system, question, max_tokens=8192):try:messages = [{"role": "system", "content": f"You are {system}\n"f"Your task is to answer the following question."},{"role": "user", "content": f"Please answer the following question.\n" +f"Question: {question}\n"

而如下则是它在代码中的调用方式:

prompts = [lambda expert: zero_shot_response(question, expert) ...

因此,所有的零样本的结果的prompt都是错误的。

此外,打分机制也存在问题。

def repeat_grading(input_path, output_path, num_experts = 3, num_fs = 3, most_recent_q = 0):df = pd.read_csv(input_path)df = df.iloc[most_recent_q:]for index, row in df.iterrows():print("Completing question", index)question_output = row.values.tolist()course_name = row["Course Name"]question = row["Question"]solution = row["Solution"]fs_qs = [[row["Few shot question 1"], row["Few shot solution 1"]], [row["Few shot question 2"], row["Few shot solution 2"]], [row["Few shot question 3"], row["Few shot solution 3"]]]experts = get_experts(course_name, question, num_experts).split(", ")prompts = [lambda expert: zero_shot_response(question, expert),lambda expert: few_shot_response(expert, question, fs_qs),lambda expert: few_shot_response(expert, question, fs_qs, True)critiques = [["Review your previous answer and find problems with your answer.", "Based on the problems you found, improve your answer."], ["Please provide feedback on the following incorrect answer.","Given this feedback, answer again."]]for expert in experts:print("Using expert", expert)question_output.append(expert)crit = Truefor prompt in prompts:prompt_response = prompt(expert) # calls fresh ChatCompletion.createprompt_grade = grade(course_name, question, solution, prompt_response) # GPT-4 auto-grading comparing answer to solutionquestion_output+=[prompt_response, prompt_grade]if correct(prompt_grade):crit = Falsebreakif crit:for critique in critiques:crit_response = self_critique_response(expert, course_name, question, question_output[-2], critique) # calls fresh ChatCompletion.createcrit_grade = grade(course_name, question, solution, crit_response) # GPT-4 auto-grading comparing answer to solutionquestion_output+=[crit_response,crit_grade]if correct(crit_grade):breakrepeat_grading("MIT_test_set.csv", "MIT_test_set_graded.csv")

我们可以看到,在流程处理分级也存在问题。

评分本身是由GPT-4进行的,以原始问题,解决方案和GPT自己的答案,作为依据的参数。

而在很多技术领域,GPT更有可能出现隐性误解,这种自动评分有可能出现自我安慰的结果。

此外,虽然提示级联是最近许多GPT论文中常见的技术,但这里有大量数据泄漏的可能性。

虽然这些创建的prompt没有答案本身,但重新prompt直到得到正确答案的二进制反馈是足够的,尤其是在占测试集16%的多选题中,无限的尝试几乎保证了正确答案一定会出现。

这就好比有人拿着答题纸告诉学生他们是否得到了正确的答案,错了就再来,直到他们得到答案。

这显然不够严谨。

GPT-4不能作为「基准真值」

最后,Raunak Chowdhuri表示以上的观察结果也仅是自己发现最明显的问题。

随着人们继续审查这篇论文的数据分析方法,更多的问题还会爆出。

而这篇论文反映了最近人工智能研究的一个更大趋势,AI发展越来越快,每天论文不断涌现,往往还有些是通过捷径「滥竽充数」。

其中,一个特别令人担忧的趋势是使用GPT-4等预言模型,来评估模型准确性的技术。虽然这是一个有用的工具,但它的结论绝不能被夸大或视为基准真值。

最近的研究表明,如果没有准确的基准真值,GPT-4评估器用于验证不可靠。至少,应该选择数据集的一个随机子集来比较GPT-4与人类对应物的性能。

因此,语言模型还不能被视为基准真值的生成预言机。

此外,在使用数据之前,重新评估每个数据点,并执行基本的健全性检查是极其重要的,无论是用于训练、推理、基准测试还是其他用途。

对此,Chowdhuri批评主要是关于这项研究的方法论和严谨性,而不是其内容。

也不是说,大型语言模型没有能力真正通过MIT的课程考试,只是这篇论文没有以科学严谨的方式证明这一点。

参考资料:

https://twitter.com/togelius/status/1670290844740378625

https://twitter.com/hardmaru/status/1670248677603151880

https://twitter.com/sauhaarda/status/1670053720233750530

https://flower-nutria-41d.notion.site/No-GPT4-can-t-ace-MIT-b27e6796ab5a48368127a98216c76864

关键词: