排行榜文档

分数归一化

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

分数归一化

本页解释了在开放大语言模型排行榜(Open LLM Leaderboard)上,针对六个基准测试的分数是如何进行归一化的。我们可以将所有任务分为三类:包含子任务的任务、不包含子任务的任务以及生成式评估。

Open In Colab

注意: 点击上方按钮,在交互式笔记本中探索分数归一化过程(创建副本以进行编辑)。

什么是归一化?

归一化是将不同尺度上测量的值调整到同一通用尺度的过程,从而可以跨不同任务比较分数。对于开放大语言模型排行榜,我们进行分数归一化是为了:

  1. 考虑不同任务的难度差异和随机猜测基线。
  2. 为所有任务提供一个一致的尺度(0-100),以便进行公平比较。
  3. 确保对随机猜测的改进在分数中得到恰当反映。

通用归一化过程

基本的归一化过程包括两个步骤:

  1. 减去随机基线分数(下界)。
  2. 将结果缩放到 0-100 的范围。

我们使用以下归一化函数:

def normalize_within_range(value, lower_bound, higher_bound):
    return (value - lower_bound) / (higher_bound - lower_bound)

归一化不包含子任务的任务

对于不包含子任务的任务(例如 GPQA、MMLU-PRO),归一化过程非常直接:

  • 确定下界(随机猜测基线)。
  • 应用归一化函数。
  • 缩放到百分比。

示例:归一化 GPQA 分数

GPQA 有 4 个 num_choices,因此下界是 0.25 (1/num_choices = 1/4 = 0.25)。

raw_score = 0.6  # Example raw score
lower_bound = 0.25
higher_bound = 1.0

if raw_score < lower_bound:
    normalized_score = 0
else:
    normalized_score = normalize_within_range(raw_score, lower_bound, higher_bound) * 100

print(f"Normalized GPQA score: {normalized_score:.2f}")
# Output: Normalized GPQA score: 46.67

归一化包含子任务的任务

对于包含子任务的任务(例如 MUSR、BBH),我们遵循以下步骤:

  • 计算每个子任务的下界。
  • 对每个子任务的分数进行归一化。
  • 对归一化后的子任务分数取平均值。

示例:归一化 MUSR 分数

MUSR 有三个子任务,选项数量不同:

  • MUSR 谋杀悬疑案,num_choices = 2,lower_bound = 0.5
  • MUSR 物体放置,num_choices = 5,lower_bound = 0.2
  • MUSR 团队分配,num_choices = 3,lower_bound = 0.33
subtasks = [
    {"name": "murder_mysteries", "raw_score": 0.7, "lower_bound": 0.5},
    {"name": "object_placement", "raw_score": 0.4, "lower_bound": 0.2},
    {"name": "team_allocation", "raw_score": 0.6, "lower_bound": 0.333}
]

normalized_scores = []

for subtask in subtasks:
    if subtask["raw_score"] < subtask["lower_bound"]:
        normalized_score = 0
    else:
        normalized_score = normalize_within_range(
            subtask["raw_score"], 
            subtask["lower_bound"], 
            1.0
        ) * 100
    normalized_scores.append(normalized_score)
    print(f"{subtask['name']} normalized score: {normalized_score:.2f}")

overall_normalized_score = sum(normalized_scores) / len(normalized_scores)
print(f"Overall normalized MUSR score: {overall_normalized_score:.2f}")

# Output:
# murder_mysteries normalized score: 40.00
# object_placement normalized score: 25.00
# team_allocation normalized score: 40.00
# Overall normalized MUSR score: 35.00

生成式评估

像 MATH 和 IFEval 这样的生成式评估需要采用不同的方法:

  1. MATH: 使用精确匹配准确率。下界实际上是 0,因为随机猜测不太可能产生正确答案。
  2. IFEval
    • 对于实例级评估(ifeval_inst),我们使用严格准确率。
    • 对于提示级评估(ifeval_prompt),我们也使用严格准确率。
    • 两者的下界都是 0,因为随机生成不太可能产生正确答案。

这种方法确保即使对于生成式任务,我们也能提供可在不同评估之间进行比较的归一化分数。

更多信息

有关更详细的信息和示例,请参阅我们关于分数归一化的博客文章

如果您有任何问题或需要澄清,请在排行榜页面上发起新的讨论。

< > 在 GitHub 上更新