你不知道的MMLU那些事儿

今天企鹅小弟给大家继续带来关于评测有意思的知识,你知道吗?茴香豆有X种写法,MMLU的评测也有各不相同的方式,那评测出来的结果也是有高有低。

啥是MMLU

Open LLM 排行榜是 Hugging Face 设立的一个用于评测开放大语言模型的公开榜单。MMLU是Open LLM 排行榜排行榜上的四个评测基准其中之一: 大规模多任务语言理解 (Massive Multitask Language Understanding,MMLU) 基准。它也是一个大家很喜欢对比的评测指标之一。

Open LLM 排行榜 实际上只是对开源基准测试库 EleutherAI LM Evaluation Harness 的一个封装,该库是由 EleutherAI 非营利性人工智能研究实验室创建。神奇的是在 EleutherAI lm-evaluation-harness 上运行 LLaMA 模型所得的 MMLU 分数与 LLaMA 论文宣称的分数有很大差距。这是咋回事呢?

MMLU的N种测试方法

经证实,LLaMA 团队所采用的是另一个开源实现,即由最初提出并开发 MMLU 基准的加州大学伯克利分校团队所实现的版本,我们将其命名为 "原始实现"。

随着调查的持续深入,我们又发现了另一个饶有趣味的实现,即由斯坦福大学基础模型研究中心(CRFM)开发的一个全面的评估基准 ------ 语言模型整体评估(Holistic Evaluation of Language Models,HELM),其中也实现了 MMLU 基准,我们将其称为 HELM 实现。

EleutherAI Harness 与斯坦福 HELM 的设计理念虽路径不同但目标一致,二者均在单个代码库中集成了多个评测基准(包括 MMLU),旨在为模型提供一个全景式性能评估工具。Open LLM 排行榜同样秉持着这一理念。

为了明晰得分差异的问题根源,我们决定在同一组模型上运行 MMLU 评测的三种不同实现,并依据得分对这些模型进行排序:

  • Harness 实现
  • HELM 实现
  • 原始实现

我们发现,MMLU 的不同实现所给出的得分竟存在极大差异,甚至改变了模型的排名顺序!

接下来,我们先简要了解一下人们通常如何对现代大规模语言模型进行自动化评估,以便尝试探究这种差异的来源。

如何对 LLM 模型进行自动化评估

MMLU 测试由一组多项选择题构成,相较于开放式问答题这一题型,此基准相对较为简单。然而,正如后续将会看到的那样,即便如此简单,其中仍存在一定空间,使得实现细节上的差异足以对评测结果产生影响。MMLU 基准涵盖"人文""社会科学""STEM"等 57 个通用知识领域。其中,每个问题包含四个可能选项,且每个问题仅有一个正确答案。

下面给出一个例子:

vbnet 复制代码
Question: Glucose is transported into the muscle cell:

Choices:
A. via protein transporters called GLUT4.
B. only in the presence of insulin.
C. via hexokinase.
D. via monocarbylic acid transporters.

Correct answer: A

大语言模型在各类人工智能模型之中实际上属于相对较为简单的模型类型。其输入为"文本字符串"(亦可称为"提示"),该输入内容会被切分成词元(词元可以是单词、子词或者字符,具体取决于模型的要求),并被输送至模型之中。依据此输入,模型会预测词汇表中每一个词元成为下一个输出词元的概率。至此,即可得到词汇表中每一个词适合作为输入提示的下一个词的可能性。

然后,我们能够采取一些策略从这个概率分布中选定一个词元作为输出词元,例如可以选择概率最大的词元(或者我们还能够通过采样引入些许噪声,以避免出现"过于机械"的答案)。接着,我们将选择的词元添加到提示中,并将其输送给模型以继续生成下一个词元,依此类推,直至句子结束。

上图呈现了 ChatGPT 或 Hugging Chat 生成答案的流程。

综上所述,从模型中获取信息以进行评测,主要存在两种方法:

  1. 获取某一组特定词元的输出概率,并将其与样本中的备选项进行对比;
  2. 获取模型生成的文本(采用上文所述的方法逐个迭代生成),并将这些文本与样本中的备选项进行对比。

具备这些知识后,我们便可着手深入探究 MMLU 的三种实现方式,以明晰传入至模型的输入内容、预期的输出结果以及如何对这些输出进行比较。

不同MMLU的区别所在:prompt

我们先比较一下对同一个 MMLU 数据集样本,这三种实现都是如何构建模型输入的:

原始实现 HELM 实现 Harness 实现
The following are multiple choice questions (with answers) about us foreign policy.How did the 2008 financial crisis affect America's international reputation?A. It damaged support for the US model of political economy and capitalismB. It created anger at the United States for exaggerating the crisisC. It increased support for American global leadership under President ObamaD. It reduced global use of the US dollarAnswer: The following are multiple choice questions (with answers) about us foreign policy.Question: How did the 2008 financial crisis affect America's international reputation?A. It damaged support for the US model of political economy and capitalismB. It created anger at the United States for exaggerating the crisisC. It increased support for American global leadership under President ObamaD. It reduced global use of the US dollarAnswer: Question: How did the 2008 financial crisis affect America's international reputation?Choices:A. It damaged support for the US model of political economy and capitalismB. It created anger at the United States for exaggerating the crisisC. It increased support for American global leadership under President ObamaD. It reduced global use of the US dollarAnswer:

可以看到,三者之间差异虽小,但仍不可忽视:

  • 首句 (或指令): 差异不大。HELM 实现额外多加了一个空格,但注意 Harness 实现是没有指令句的;
  • 问题: HELM 实现和 Harness 实现都加了 Question: 前缀;
  • 选项: Harness 实现在选项之前加了 Choice: 前缀。

如何用上面构建的提示评估模型?

我们首先看看 原始实现 是如何做的: 其仅比较模型对四个选项字母的预测概率。

这种方法其实是有点放水的,举个例子:

在上述情境中,鉴于模型给予 D 选项的概率在四个选项中处于最高值,故原始实现判定模型预测正确并给予加一分之操作。然而,若从全局视角审视完整的概率输出,会发现"Zygote"这个单词的概率实则为最高,但其并不在四个选项之列(此仅为示例,并非真实案例)。

那么,应如何确保模型最大限度地减少此类错误的发生呢?

我们可采用"少样本"方法,于提示中为模型提供一个或多个范例(涵盖示例问题及其答案),如下:

上图所示,我们在提示中添加了一个范例,旨在向模型传达我们的预期,如此一来,在进行预测时,模型便不太可能给出超出选项范围的答案。

鉴于这种方法能够提升性能,因此在全部三种实现方式中,我们均选择以 5 样本方式进行 MMLU 评估(即每个提示中都包含 5 个范例)。(需注意:在每个基准测试中,虽然我们使用了相同的 5 个范例,但其排列顺序可能有所不同,这也有可能导致性能出现差异,不过在此我们不进行深入探讨。另外,我们还必须注意避免范例中的某些答案泄漏到预测样本中......)

HELM 实现:接下来我们再来审视 HELM 实现。其少样本提示的实现与原始实现类似,然而其模型评估方式与我们刚刚所看到的原始实现存在很大差异:它是根据模型预测的下一个输出词元的概率来选择输出文本,并将生成的文本与正确答案的文本进行对比,具体情况如下所示:

此时,如果输出词元中 "Zygote" 概率最高 (如上图),则模型会输出 "Zygote",然后 HELM 实现就将其判为错误,模型就无法得分:

Harness 实现:最后,我们来审视 Harness 的具体实现方式。Open LLM 排行榜采用了这一实现方案。在针对同一数据集进行得分计算时,其方法有所不同。

在此处,我们依旧运用概率进行计算,但此次采用的是完整答案序列的概率。该完整序列涵盖选项字母及其后的答案文本,例如"C. The second pharyngeal arch"。为了计算完整序列的概率,我们获取每个词元的概率(与上述其他实现方式相同),并求取它们的联合概率。为确保数值的稳定性,在计算联合概率时,我们主要计算对数概率并进行求和。最后,可选择对其进行归一化处理(也可不进行)。归一化主要是将对数联合概率除以词元数量,以避免长答案在得分方面具有不公平的优势(后续将详细介绍其原理)。其工作原理如下图所示:

下表总结了每种实现对模型的输出形式的要求:

原始实现 HELM 实现 Harness 实现(截至 2023 年 1 月)
比较选项字母的预测概率: 期望模型输出正确选项的字母: 比较所有答案文本的概率:
A B C D A A. It damaged support for the US model of political economy and capitalism B. It created anger at the United States for exaggerating the crisis C. It increased support for American global leadership under President Obama D. It reduced global use of the US dollar

搞清楚这些之后,我们比较一下多个模型在这三种实现上的得分:

MMLU (HELM 实现) MMLU (Harness 实现) MMLU (原始实现)
huggingface/llama-65b 0.637 0.488 0.636
tiiuae/falcon-40b 0.571 0.527 0.558
huggingface/llama-30b 0.583 0.457 0.584
EleutherAI/gpt-neox-20b 0.256 0.333 0.262
huggingface/llama-13b 0.471 0.377 0.47
huggingface/llama-7b 0.339 0.342 0.351
tiiuae/falcon-7b 0.278 0.35 0.254
togethercomputer/RedPajama-INCITE-7B-Base 0.275 0.34 0.269

可以看到,即便对于相同的 MMLU 数据集,模型的绝对分数和相对排名 (参见第一张图) 对评测基准的实现方式仍非常敏感。

假设成功完美复刻了一个 LLaMA 65B 模型,并运用 Harness 对其予以评估(得分 0.488,详见上表)。当下,欲将其与他人公开发表的成果进行对比(假定对方是在原始 MMLU 实现上展开评估,得分为 0.637),分数竟相差达 30%之巨。此时,或许会产生这样的想法:"天哪,我的训练完全失败了。"然而,事实并非如此,这些仅仅是毫无可比性的数字,即便它们皆被称为"MMLU 分数",且均是在同一 MMLU 数据集上进行评测的。

那么,是否存在一种评估大规模语言模型性能的"最佳方法"呢?此问题难以回答。正如上文所见,采用不同的评测方式对不同的模型进行评估时,其排名会变得混乱无序。为了尽可能确保公平性,人们或许会倾向于选择那个平均打分最高的评测方法,因为看上去似乎它更能"发掘"模型的实力。在本文中,这意味着应当使用原始实现。但正如上文所提及的,使用仅对四个选项的概率进行排序的方式有可能以某种特定方式对模型放宽要求,并且它更偏向那些性能较弱的模型。此外,从开源模型中获取词元预测概率(或似然)或许较为容易,但闭源 API 模型可能并不会提供这样的应用程序接口。

总结

在整个过程推进中,我们收获了一个至关重要的教训:评测得分与具体实现之间存在紧密关联。具体而言,即便是提示、分词等细微之处的差异,都有可能引发最终得分的差异。仅仅依靠"MMLU 得分"这几个表述,难以带来充足的信息量,原因在于其各自所使用的评测代码实现可能存在不同,故而根本不具有可比性。

这也正是我们需要开放、标准化且可重复的基准测试的缘由所在。诸如 EleutherAI Eval Harness 或者 Stanford HELM 这样的开放基准对于整个社区而言价值无可估量。若没有它们,我们将无法对不同模型以及论文之间的结果进行比较,更无从谈及对大规模语言模型的改进。

相关推荐
姜西西_2 分钟前
递归 算法专题
算法·深度优先
nurupo1233 分钟前
C++学习路线(二十五)
c++·学习·算法
LNTON羚通1 小时前
算法定制LiteAIServer视频智能分析平台裸土检测技术实现、应用场景与优势概览
大数据·算法·目标检测·音视频·监控
书鸢12362 小时前
力扣每日一题合集
java·算法·leetcode
我不会JAVA!3 小时前
排序算法(3) C++
c++·算法·排序算法
Willliam_william3 小时前
SystemC学习(3)— APB_SRAM的建模与测试
学习·算法
Gui林3 小时前
【GL07】C语言要点
c语言·算法
爱编程— 的小李4 小时前
有序序列合并(c语言)
c语言·算法
云卓SKYDROID4 小时前
无人机反步滑膜控制算法!
算法·无人机·知识科普·云卓科技·反步滑膜控制算法
云卓科技4 小时前
无人机之自动控制原理篇
科技·算法·目标检测·机器人·无人机