什么是 Pass@k 评价指标?
Pass@k 是一种用于 程序生成 和 代码生成任务 的评价指标,尤其是在 自动编程 或 代码生成模型 的评估中非常有用。该指标用于衡量模型在生成多个候选解时,是否能正确解决某个问题。
Pass@k 的定义:
Pass@k 是在给定一个编程任务的情况下,模型生成的 k 个解(样本) 中,至少有 一个解是正确的 的概率。
具体来说:
- k 表示模型生成的候选解的数量。
- Pass@k 衡量的是,当生成了 k 个解 时,至少 一个解能正确通过所有测试用例。
如果 Pass@k = 1.0,意味着在生成的 k 个解中,至少有 一个解 是 正确的。
Pass@k 的计算公式
Pass@k 的计算可以通过以下步骤进行:
-
对于每个测试问题:
- 模型生成 k 个候选解。
- 对每个候选解进行 测试,判断该解是否通过所有测试用例(即验证是否正确)。
-
如果 k 个解 中有至少 一个解 通过了所有测试用例,那么该问题就视为 通过。
-
计算所有测试问题中 通过的比例:
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=32≈0.6667
因此,Pass@3 = 0.6667。
OpenAI HumanEval 论文中的无偏估计
在 OpenAI 的 HumanEval 论文 中,提出了一种 针对每个问题生成多个样本并进行无偏估计的方法,这是为了解决 单个解的正确性评估 可能引入的偏差问题。
无偏估计的核心思想
- 生成多个候选解:对于每个问题,模型生成 n 个解。
- 评估通过率:评估 n 个解中的每一个 是否能够正确解决问题(通过所有测试用例)。
- 计算无偏估计:对于每个问题,计算至少 一个解通过测试的概率。这种方法能够 消除单一解评估带来的偶然性和偏差。
无偏估计计算步骤
-
假设对于某个问题,生成了 n 个候选解,每个解的通过率为 P pass P_{\text{pass}} Ppass。
-
计算 至少一个解通过测试的概率:
- 该概率是计算 所有解都不通过 的概率,然后取 1 减去该概率。
P pass@k = 1 − ( 1 − P pass ) n P_{\text{pass@k}} = 1 - (1 - P_{\text{pass}})^n Ppass@k=1−(1−Ppass)n
其中:
- P pass P_{\text{pass}} Ppass 是每个候选解通过测试的概率(如在 HumanEval 数据集上通过率为 0.1)。
- n n n 是生成的候选解数量。
-
这样计算可以 消除模型偶然性,使得 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−(1−0.1)3=1−(0.9)3=1−0.729=0.271
所以,Pass@3 的无偏估计为 0.271,意味着 至少一个解通过的概率是 0.271。
总结
评价指标 | 描述 |
---|---|
Pass@k | 衡量在生成的 k 个候选解 中,至少 一个解能正确通过测试 的比例。 |
计算方式 | 对每个问题,计算模型生成的候选解中至少一个通过的概率,并统计最终通过的比例。 |
无偏估计 | 通过生成多个候选解,并计算至少一个解通过的概率,避免单个解评估的偶然性与偏差。 |
应用场景 | 主要应用于 自动编程、代码生成、程序合成等任务,用于评估模型生成代码的能力。 |
Pass@k 是 代码生成任务 中一个常见的评估指标,结合 无偏估计 方式,可以更准确地评估模型在多解生成中的表现。