论文地址:https://arxiv.org/pdf/2306.08997.pdf
简单概括,一个来自 MIT 的研究团队从自己学校的数学、电气工程和计算机科学 (EECS) 专业的课程问题、期中考试和期末考试中,整理出了一个包含 4550 个问题和解决方案的综合数据集。
然后,研究团队让各种大语言模型去完成这个数据集的题目,结果太吓人:GPT-3.5 能做对 1/3,GPT-4 几乎满分通过。
论文作者表示,提升模型表现主要靠「四件套」:Few-shot learning、CoT、Self-critique、Expert。
就像上表中所示,加持 GPT-4 的手法越多,模型的答题正确率就越高。原始的 GPT-4 本来就能拿到 90% 的正确率得分,一番运作之后,甚至直接拿到满分。
但大部分讨论得很激烈的网友可能没注意到,这个分数本身就是用 GPT-4 打的……
三位同样来自 MIT 的学生第一时间发现了这篇论文,作为险些被 GPT-4 赶超的群体,他们想立即领会一下爆款论文的方法论。
研究了一小时后,他们对该论文的方法产生了怀疑。
两小时后,他们意识到:数据集本身有问题。
尽管原论文的作者宣称已手动审查了发布的数据集质量,但三人发现,有明显的迹象表明,测试数据集的很大一部分被污染了。
也就是说,模型就像一个学生在考试前被告知了答案,这是赤裸裸的「作弊」。
产生质疑后,他们立即着手在数据集上完成了零样本 GPT-4 的运行,并对数据的前 30% 进行了手动评分,结果与原论文相差甚远,应该说是一个天上、一个地下。
「作为麻省理工学院的本科生,至少根据我们的经验,这个测试集并不能准确地代表在麻省理工学院获得 EECS 学位所需的理解广度和深度。」三人在博客中这么写道。
最新进展:零样本 GPT-4 的准确率能达到 62.5% 了,但还是和论文里宣称的 90% 差很多。
三人还质疑了「过度宣传」的风潮:「这些论文通常在任何合法的同行评审之前就被上传到 Arxiv,并在 Twitter 上广泛分享。在这种情况下,可能会传播不良信息,并为未来的工作树立一个糟糕的先例。」
「深度学习」斗士 Gary Marcus 也不出意料地声援了这波质疑:
同时,三人也在博客中指出一点:《Exploring the MIT Mathematics and EECS Curriculum Using Large Language Models》论文上列出的几个作者都是本科生研究人员,让这些人对工作中出现的任何失误负责是不合适的。相反,责任应该在指导作者身上 —— 他们才是被期望确保工作符合其领域内公共学术标准的人。
接下来让我们看下,这篇「爆火」论文都有哪些问题。
数据集到底有什么问题?
首先,从原论文中得知,研究者收集的数据集包含获得 MIT 学位考试所需的 30 门数学和 EECS 课程的 4550 个问题和相应的解决方案,涵盖核心课程和选修课程。
论文中写道:「在没有图像和有解决方案的问题中随机选择了 288 个问题的测试集。」
这个数据集(不包括用于微调开源 LLM 的训练集)随着论文的公开也被发布到 GitHub 上,同时发布的还有用于生成报告的测试性能的代码。然而,作者 Drori 教授在最近的一次提交中已经将其删除。
经过检查、对比,三人确信这个被删掉的文件代表了论文中分析的测试集,因为评估代码中的所有数据的文件路径都指向它,没有提供任何修改其内容的代码,而且它在最初发布的 GitHub 仓库中是可用的。此外,该文件满足了论文中规定的所有模式要求(行数等)。这些证据似乎非常有力地支持了下面的所有主张,
「但我们要承认,这个文件有可能被换成了一个用于测试的不同文件。如果是这样的话,我们认为证明的责任在于作者公开发布这个数据和用它做的所有分析。」
那么,被掩盖的问题究竟是什么呢?三人给出了自己的分析。
无法解决的问题(约占测试集的 4%)
鉴于原论文表示,任何形式的 GPT-4 都能在测试集上产生一个完美的分数,三人开始检查个别数据点。他们很快就发现,根本不可能有满分,因为数据集中至少有 10 个问题是无法用所提供的信息解决的,另外几个问题在这种情况下根本就不是有效的问题。
像这种「有问题的问题」,至少占据了测试集的 4%。
在一个扩展的 excel 文档里,三人对已经发现有问题的数据集例子进行了注释。「红色」代表用提供的信息无法解决的问题,「黄色」代表一部分不太合理的问题。
页面地址:https://docs.google.com/spreadsheets/d/1FZ58hu-lZR-e70WP3ZPNjp9EK_4RgrQvQfsvjthQh_Y/edit?usp=sharing
重复的问题(约占测试集的 5%)
使用文本相似性检测,三人发现有 14 个问题(7 对)在 288 个问题的测试集中是重复的,在这些情况下,问题串之间的唯一区别是极小的字符级噪音,甚至完全相同。
鉴于这些无法解决的问题,GPT-4 能够通过任何方式获得 100% 的准确率,也是难以置信。要么是在某个阶段出现了答案泄漏到 prompt 中,要么是问题没有被正确打分。
这些初步的发现促使他们从少样本示例开始进一步调查(如果模型在零样本正确率方面失败的话),最终发现,既有解题信息的泄露,也有用于对模型输出进行分级的方法问题。具体情况如下:
少样本示例中的信息泄露
值得注意的是,原论文中还提到了「少样本示例」这个事。
简而言之,论文对 OpenAI 嵌入的数据集内的类似问题进行余弦相似度搜索,并将这些问题和解决方案作为额外的上下文纳入模型的 prompt,帮助模型解决问题。
这个方法本身是没问题的,只要这些示例与有关问题有足够的差异,且避免暴露不公平的信息。
只是随机扫描已发布的测试数据集时,三人注意到一些奇怪的事情:许多提供给模型的「少样本示例」与问题本身几乎一字不差。
为了进一步了解这一点,他们写了一个简单的脚本,查看了所提供的几个示例的问题陈述和所列出的问题之间的重叠情况,并绘出了直方图:
许多提供的少样本与问题本身几乎相同,这意味着模型得到的是问题的答案或与问题非常相似的问题。通常情况下,这来自于大量的共享背景的多环节问题的重复。
他们认为,为了正确评估 GPT 的解题能力,多环节问题的其他部分应该被完全排除在某一问题的少样本示例之外。事实上,他们发现这些多环节问题的解决方案,往往直接提到或给出了模型被要求解决的另一部分问题的答案。
不仅如此,在对这些数据的挖掘中,他们还发现了整个问题被重复的样本。比如:
在这两种情况下,答案是完全相同的。很难说不算信息泄漏了。
GPT-4 自动打分,有问题
此外,三人还在原论文开源的打分机制中发现了问题:
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 = True
for prompt in prompts:
prompt_response = prompt(expert) # calls fresh ChatCompletion.create
prompt_grade = grade(course_name, question, solution, prompt_response) # GPT-4 auto-grading comparing answer to solution
question_output+=[prompt_response, prompt_grade]
if correct(prompt_grade):
crit = False
break
if crit:
for critique in critiques:
crit_response = self_critique_response(expert, course_name, question, question_output[-2], critique) # calls fresh ChatCompletion.create
crit_grade = grade(course_name, question, solution, crit_response) # GPT-4 auto-grading comparing answer to solution
question_output+=[crit_response,crit_grade]
if correct(crit_grade):
break
repeat_grading('MIT_test_set.csv', 'MIT_test_set_graded.csv')
在代码中,能看出流程上处理分级存在严重的问题:论文是用 GPT-4 去评估检查的,包括 a)原始问题,b)解决方案,c)GPT 自己的答案,作为分级 prompt 中的参数。
在更多的技术领域,GPT 更有可能出现隐性误解,这种自动评分更有可能出现「自我欺骗」的结果。
此外,虽然 prompt 级联是最近许多 GPT 论文中常见的技术,但这里有大量数据泄漏的可能性。每一级不仅提供基于 ground truth 的二元信息,而且还在继续 prompt,直到达到正确答案。
尽管这些创建的 prompt 并没有看到实际的答案,但重新 prompt 直到达到正确答案的形式已经足够了,尤其是在占测试集 16% 的多选题中,无限次的尝试(几乎)保证了正确答案一定会出现。
这就好比有人拿着答题纸,告诉正在考试的学生答得对不对,一直提示到学生得到正确答案。
总结
在博客的最后,三位这样写道:
这篇论文道出了最近人工智能领域研究的一个更大趋势。随着该领域的进展越来越快,新发现的时间节奏似乎在缩短,这往往伴随着捷径。一个特别令人担忧的趋势是使用像 GPT-4 这样基于语言的模型来评估一个模型的准确性的技术。
虽然是一个有用的工具,但它的结论绝不应该被夸大,也不应该被当作 ground truth。最近的工作表明,如果没有准确的 ground truth 信息,GPT-4 评估器就不能可靠地用于验证。至少,应该选择一个随机的数据集子集,将 GPT-4 的性能与人类的评估进行比较。语言模型还不能被当作产生 ground truth 的神谕。
此外,在使用数据之前,无论是用于训练、推理、基准测试还是其他方面,重新评估每一个数据点并进行基本的检查是极其重要的。鉴于有关数据集的规模较小,简单的人工验证很容易在工作范围内完成。
我们的批评主要是针对这项研究的方法和严谨性,而不是针对其内容。我们对大型语言模型实际解决麻省理工学院课程的能力没有任何意见,只是认为本文未能以科学严谨的方式证明这一点。