Pass@k 评价指标

什么是 Pass@k 评价指标?

Pass@k 是一种用于 程序生成代码生成任务 的评价指标,尤其是在 自动编程代码生成模型 的评估中非常有用。该指标用于衡量模型在生成多个候选解时,是否能正确解决某个问题。

Pass@k 的定义:

Pass@k 是在给定一个编程任务的情况下,模型生成的 k 个解(样本) 中,至少有 一个解是正确的 的概率。

具体来说:

  • k 表示模型生成的候选解的数量。
  • Pass@k 衡量的是,当生成了 k 个解 时,至少 一个解能正确通过所有测试用例

如果 Pass@k = 1.0,意味着在生成的 k 个解中,至少有 一个解正确的


Pass@k 的计算公式

Pass@k 的计算可以通过以下步骤进行:

  1. 对于每个测试问题:

    • 模型生成 k 个候选解
    • 对每个候选解进行 测试,判断该解是否通过所有测试用例(即验证是否正确)。
  2. 如果 k 个解 中有至少 一个解 通过了所有测试用例,那么该问题就视为 通过

  3. 计算所有测试问题中 通过的比例

Pass@k = 通过的测试问题数 总测试问题数 \text{Pass@k} = \frac{\text{通过的测试问题数}}{\text{总测试问题数}} Pass@k=总测试问题数通过的测试问题数


Pass@k 的计算示例

假设在一个编程任务中,我们有 3 个测试问题,每个问题的模型生成了 3 个候选解。以下是每个问题的测试结果:

测试问题 候选解 1 候选解 2 候选解 3 是否通过
问题 1 失败 成功 失败 通过(至少一个解通过)
问题 2 失败 失败 失败 未通过
问题 3 成功 失败 成功 通过(至少一个解通过)
  • 问题 1:生成的 3 个解中,第 2 个解通过了测试,问题 通过
  • 问题 2:生成的 3 个解均未通过测试,问题 未通过
  • 问题 3:生成的 3 个解中,第 1 个和第 3 个解通过了测试,问题 通过

Pass@k 计算:

  • 通过的测试问题数:2(问题 1 和问题 3)
  • 总测试问题数:3

Pass@3 = 2 3 ≈ 0.6667 \text{Pass@3} = \frac{2}{3} \approx 0.6667 Pass@3=320.6667

因此,Pass@3 = 0.6667


OpenAI HumanEval 论文中的无偏估计

OpenAI 的 HumanEval 论文 中,提出了一种 针对每个问题生成多个样本并进行无偏估计的方法,这是为了解决 单个解的正确性评估 可能引入的偏差问题。

无偏估计的核心思想

  1. 生成多个候选解:对于每个问题,模型生成 n 个解
  2. 评估通过率:评估 n 个解中的每一个 是否能够正确解决问题(通过所有测试用例)。
  3. 计算无偏估计:对于每个问题,计算至少 一个解通过测试的概率。这种方法能够 消除单一解评估带来的偶然性和偏差

无偏估计计算步骤

  1. 假设对于某个问题,生成了 n 个候选解,每个解的通过率为 P pass P_{\text{pass}} Ppass

  2. 计算 至少一个解通过测试的概率

    • 该概率是计算 所有解都不通过 的概率,然后取 1 减去该概率

    P pass@k = 1 − ( 1 − P pass ) n P_{\text{pass@k}} = 1 - (1 - P_{\text{pass}})^n Ppass@k=1(1Ppass)n

    其中:

    • P pass P_{\text{pass}} Ppass 是每个候选解通过测试的概率(如在 HumanEval 数据集上通过率为 0.1)。
    • n n n 是生成的候选解数量。
  3. 这样计算可以 消除模型偶然性,使得 Pass@k 更加稳定和公平。

HumanEval 示例

假设在 HumanEval 数据集 上,每个问题生成了 3 个候选解,假设 每个解通过测试的概率为 0.1,则可以计算:

P pass@3 = 1 − ( 1 − 0.1 ) 3 = 1 − ( 0.9 ) 3 = 1 − 0.729 = 0.271 P_{\text{pass@3}} = 1 - (1 - 0.1)^3 = 1 - (0.9)^3 = 1 - 0.729 = 0.271 Ppass@3=1(10.1)3=1(0.9)3=10.729=0.271

所以,Pass@3 的无偏估计为 0.271,意味着 至少一个解通过的概率是 0.271


总结

评价指标 描述
Pass@k 衡量在生成的 k 个候选解 中,至少 一个解能正确通过测试 的比例。
计算方式 对每个问题,计算模型生成的候选解中至少一个通过的概率,并统计最终通过的比例。
无偏估计 通过生成多个候选解,并计算至少一个解通过的概率,避免单个解评估的偶然性与偏差。
应用场景 主要应用于 自动编程、代码生成、程序合成等任务,用于评估模型生成代码的能力。

Pass@k 是 代码生成任务 中一个常见的评估指标,结合 无偏估计 方式,可以更准确地评估模型在多解生成中的表现。