排行榜文档

分数归一化

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

分数归一化

此页面解释了 Open LLM 排行榜上六个展示的基准的分数是如何归一化的。我们可以将所有任务分为有子任务的任务、没有子任务的任务和生成式评估。

Open In Colab

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

什么是归一化?

归一化是将不同尺度上测量的数值调整到共同尺度的过程,从而可以比较不同任务之间的分数。对于 Open LLM 排行榜,我们将分数归一化以

  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,下限 = 0.5
  • MUSR 物体放置,num_choices = 5,下限 = 0.2
  • MUSR 团队分配,num_choices = 3,下限 = 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 上更新