Le biais
du max

Cas 3 du fil A. Déroulé autoporteur des marches 0 à 3, telles qu'elles ont été tenues le 14/09/2026. À lire lentement, une fois, en jouant avec chaque figure.

le bruit, ce qui vient du tiragela sélection, ce qui vient du gestela vraie valeur, fixe

0La question unique et les trois niveauxrien de nouveau ici, juste le décor posé proprement

Une seule question organise tout, comme pour les cas 1 et 2 : qu'est-ce qui varierait si je refaisais l'expérience ? La nouveauté du cas 3 tient en une ligne. La réponse n'est plus seulement « le score varierait ». C'est aussi « l'identité de la gagnante varierait ». Le choix a été fait sur le tirage, donc le choix fait partie de ce qui bouge.

Le décor, pris dans ton métier. Tu règles un RAG : 5 tailles de chunk × 8 valeurs de top-k, soit 40 configurations. Ton eval set contient n = 5 000 questions annotées. Tu lances les 40, tu gardes la meilleure, elle affiche 90,9 %, tu l'écris dans ta slide.

Le cas témoin

Pour isoler le mécanisme on prend le pire cas pédagogique : les 40 configs se valent exactement, toutes valent 90,0 % en vérité. Ce n'est pas réaliste, c'est un témoin. On veut savoir ce que la procédure affiche quand il n'y a rien à trouver. Si elle affiche quand même un beau chiffre, tu sais que le beau chiffre ne prouve rien.

Le vocabulaire, fixé avant tout calcul

objetnotationstatutne pas confondre avec
vraie accuracy d'une configpfixe, inconnuele score affiché
score mesuré d'une configaléatoire, dépend du tiragep
bruit de mesureb = p̂ − paléatoire, centréle biais
erreur-typeSE = √(p(1−p)/n)écart-type de , donc de bσ = √(p(1−p))
biaisE[p̂] − pdécalage systématique de l'espérancele bruit, qui est aléatoire
estimandla quantité qu'on prétend estimerl'estimateur, la formule qu'on calcule

Deux distinctions font tout le cas 3. Bruit contre biais : le bruit est une variable aléatoire centrée qui rétrécit en 1/√n ; le biais est un nombre, un décalage de l'espérance, que n ne fait pas bouger. Estimand contre estimateur : « biaisé » ne veut rien dire tout seul, un estimateur est biaisé par rapport à un estimand. Le même nombre peut être sans biais pour une question et biaisé pour une autre. C'est ta remarque sur les dés, « c'est normal, c'est le max », et elle était juste.

La chaîne accuracy → SE, chaque règle nomméerefaite parce que trois briques étaient écrasées en une le 14/09

Une config fixée à l'avance, un eval set de n questions.

Maillon 1. Chaque question i donne Xi = 1 si la réponse est bonne, 0 sinon. Hypothèse : questions tirées indépendamment dans la même population, donc Xi iid ~ Bernoulli(p). L'accuracy est p̂ = (1/n) Σ Xi. Reconnaître que l'accuracy est une moyenne empirique est le maillon qui débloque tout.

Le même p pour toutes les questions : hypothèse ou conséquence ?

Écrire Xi ~ Bernoulli(p) avec le même p pour les 5 000 questions semble affirmer que les questions se valent. Elles ne se valent pas, et pourtant le même p est correct. Le « même p » n'est pas un postulat supplémentaire : c'est une conséquence du choix de rendre aléatoire le tirage de la question.

Cas extrême, pour voir. Population de 10 questions. Le modèle en réussit toujours 7, en rate toujours 3. Aucune question ne porte « 0,7 » : chacune a θ = 1 ou θ = 0. Tire une question au hasard : tu réponds juste si tu tombes sur une des 7, donc P(X = 1) = 0,7. Or X ne prend que deux valeurs. Une variable à deux valeurs avec P(X = 1) = 0,7 est une Bernoulli(0,7), par définition. Le 0,7 est la moyenne des θ sur la population, et cette moyenne existe même si aucune question individuelle ne la porte.

Avec des θ intermédiaires. Cinq questions de difficultés 0,99 · 0,95 · 0,90 · 0,70 · 0,40. Pour que X = 1 il faut tomber sur une question et la réussir, donc on somme sur les cinq cas : ⅕·0,99 + ⅕·0,95 + ⅕·0,90 + ⅕·0,70 + ⅕·0,40 = 3,94/5 = 0,788. C'est E[θ(q)], la moyenne des difficultés pondérée par la probabilité de tirer chaque question. Fais bouger le tirage dans la figure : la population ne change pas, p si.

Une fois que tu regardes Xi — juste ou faux — sans regarder quelle question est tombée, l'information « facile ou dure » a disparu dans le 0 ou le 1. Il ne reste qu'une pièce truquée à p. La chaîne ne se sert de rien d'autre. Et le p est le même à chaque position parce que le mécanisme de tirage est le même à la position 1, à la position 2 et à la position 5 000 — pas parce que les questions se ressembleraient.

Ce qui casserait vraiment le maillonQuestions non tirées identiquement : 300 faciles d'un fichier puis 200 dures d'un autre, dans un ordre connu — les Xi ne sont plus identiquement distribués, il faut stratifier. Modèle qui change en cours de route (apprentissage en ligne, cache qui se remplit) : p n'est plus fixe. Reformulations d'une même question : là c'est l'indépendance qui casse, pas le « même p ».
L'autre modèle d'aléa, honnêtementOn pourrait aussi traiter les 5 000 questions comme fixes et ne rendre aléatoire que la réponse du modèle. Alors Var() = Σθi(1−θi)/n2, plus petite que p(1−p)/n — la figure le montre. Deux modèles d'aléa, deux SE, aucun n'est faux. Le nôtre répond à « qu'est-ce qui varie si je re-tire un eval set », c'est-à-dire à la question unique, et c'est celui qu'il faut pour généraliser à des questions nouvelles. L'autre répond à « qu'est-ce qui varie si je relance sur ces 5 000-là », question plus étroite.

Maillon 2. E[p̂] = (1/n) Σ E[Xi] = p, par linéarité de l'espérance, qui vaut toujours, aucune indépendance requise. Donc est sans biais. Ceci suppose tacitement qu'aucune sélection n'a été faite sur le tirage : c'est l'hypothèse que le cas 3 casse.

Maillon 3, en trois briques séparées.

Var() = Var((1/n) Σ Xi) = (1/n2) Var(Σ Xi)

Règle 1, Var(aX) = a2Var(X). D'où le n2 au dénominateur. Rien à voir avec l'indépendance.

Var(Σ Xi) = Σ Var(Xi) = n · Var(X1)

Règle 2, Var(X+Y) = Var X + Var Y + 2Cov, avec indépendance ⇒ Cov = 0. Ici, et seulement ici, l'indépendance sert. Des questions corrélées cassent ce maillon et sous-estiment la variance.

Var(X1) = E[X12] − E[X1]2 = p − p2 = p(1−p)

Propre à Bernoulli, parce que X2 = X quand X ne vaut que 0 ou 1. Assemblage : n·p(1−p)/n2 = p(1−p)/n. Le n2 de la règle 1 et le n de la règle 2 se simplifient en un seul n. « Pourquoi n et pas n2 ? » attend cette simplification.

Maillon 4, le plug-in. La formule contient p, inconnu. On substitue : SÊ = √(p̂(1−p̂)/n). Légitime parce que p̂ → p et que p(1−p) est plate près de son sommet. Ordre à ne pas inverser : le plug-in vient d'abord, et Wald est le nom de l'intervalle qui l'accepte (p̂ ± 1,96 SÊ). Wilson le refuse, garde p inconnu et inverse le test.

Fil rouge. n = 5 000, p = 0,90 : SE = √(0,09/5000) = √(1,8·10−5) = 0,00424, soit 0,42 point. Avec 500 questions : √(0,09/500) = 0,0134 = 1,34 point. SE en points, pas en fraction ; un eval set de 500 items a une précision de l'ordre du point.

Maillon 5, TCL. Pour n grand, p̂ ≈ N(p, SE2), donc le bruit b = p̂ − p ≈ N(0, SE2). Cette gaussienne centrée sera le « dé » de toute la suite.

1Le max de deux, sans aucune probabilitébrique unique : prendre le max d'objets aléatoires décale vers le haut

Deux dés à six faces, indépendants. Tu ne gardes que le plus haut. Chaque dé vaut 3,5 en moyenne. Le max, lui, vaut combien ? Avant de compter, lance. Regarde la moyenne du max se stabiliser, et où.

Le comptage exact confirme ce que le lancer montre. Sur la ligne i de la grille 6 × 6, la valeur i apparaît i fois (pour j ≤ i), puis j = i+1 … 6 donnent leurs propres valeurs. Somme des 36 max = 161. E[max] = 161/36 = 4,47, soit +0,97 au-dessus de 3,5, alors qu'aucun dé n'est truqué.

Et ta remarque, qui est le pivot de toute la page : c'est normal, c'est le max. Oui. 4,47 est un estimateur parfait de E[max de deux dés]. Il n'est « trop haut » que si tu l'annonces comme la valeur d'un dé. L'erreur n'est pas de calculer le max. L'erreur est de calculer un max et de l'annoncer comme une moyenne.

Transposition à deux configs

Deux configs valant toutes deux 90,0 %. Chaque score s'écrit p̂ = 90,0 + b avec b ~ N(0, 0,422). Tu reportes le plus haut. Comme les vraies valeurs sont égales, reporter max(90,0 + b1, 90,0 + b2) revient à reporter 90,0 + max(b1, b2). Le geste se réduit au max des bruits. Même expérience que les dés, avec des gaussiennes à la place des faces.

Fréquence du dépassement. Le max est négatif seulement si les deux bruits le sont, ce qui arrive avec probabilité ½ × ½ = ¼ (indépendance ⇒ produit). Donc P(max > 0) = 1 − ¼ = 3/4. Pas 1 : rien n'interdit deux tirages malchanceux en même temps. Le geste ne garantit rien sur un tirage, il déplace la distribution.

Ampleur du dépassement. Identité algébrique, vraie pour tous réels : max(a,b) = (a+b)/2 + |a−b|/2. Le max dépasse la moyenne de la moitié de l'écart. Les bruits sont centrés, donc E[max] = E|b1 − b2| / 2. Or b1 − b2 est gaussien de variance 2SE² (règle 2), et pour un gaussien centré E|X| = σX√(2/π). D'où E[max] = SE·√2·√(2/π)/2 = SE/√π ≈ 0,56 SE. Avec SE = 0,42 : +0,24 point. Fréquence et ampleur sont deux quantités : 3/4 des fois au-dessus, et de 0,56 SE en moyenne.

Nuance à garder pour plus tardDeux dés sont indépendants ; deux configs mesurées sur le même eval set ont des bruits corrélés (un fichier tombé facile remonte les deux). L'identité le montre : si b1 et b2 bougent ensemble, |b1 − b2| rétrécit et le gonflement avec. Tout ce qui suit calcule la version indépendante, une borne haute. C'est l'appariement du cas 2 qui revient.

2De 2 à 40brique unique : P(max ≤ t) = P(toutes ≤ t) = Φ(t)k

C'est le geste de la marche 1, « passer par : toutes en dessous », écrit une fois pour toutes. Le max de k bruits est sous un seuil t si et seulement si chacun l'est. Par indépendance, le « et » devient un produit :

P(max ≤ t) = P(b1t) · … · P(bkt) = Φ(t/SE)k

La seule formule nouvelle de la page. La figure la montre telle qu'elle est : un produit qui fond à chaque config ajoutée.

Le calcul unique

40 configs valant toutes 90,0 %. Probabilité que la gagnante dépasse 1,96 SE au-dessus de 90,0, autrement dit qu'elle paraisse significativement meilleure que 90 % alors que l'effet est nul :

P(max > 1,96 SE) = 1 − Φ(1,96)40 = 1 − 0,97540 = 1 − 0,363 = 0,64

Détail : ln(0,975) = −0,0253 ; × 40 = −1,013 ; exp = 0,363. Deux fois sur trois, la gagnante de 40 configs identiques franchit le seuil de significativité. Le lecteur de ta slide voit une amélioration « significative » là où il n'y a rien.

Repères, donnés et non dérivés

kE[max] / SEbiais, SE = 0,42biais, SE = 1,34 (n = 500)
20,560,24 pt0,76 pt
101,540,65 pt2,1 pt
402,160,91 pt2,9 pt
1002,511,05 pt3,4 pt

Le biais croît lentement avec k (de 40 à 100 configs : +0,35 SE) mais linéairement avec SE. Petit eval set et beaucoup de configs, c'est le pire mélange, et c'est la situation ordinaire des evals LLM.

2′La course des 40 et la colonne responsable« E sur quoi ? » : la question qui a bloqué

Voici ton sweep dans le cas témoin. Quarante configs, toutes à 90,0 en vérité (la ligne verte). Chaque barre est le bruit tiré pour cette config : à droite quand le tirage l'a favorisée, à gauche quand il l'a desservie. La gagnante est en rouge. Retire l'eval set et regarde deux choses : le score de la gagnante, et qui gagne.

Qu'est-ce qui a mis la gagnante en haut ? La longueur de sa barre bleue. La vraie valeur est la même pour toutes : elle ne peut pas départager. Tout le classement est fabriqué par le bruit. Tu crois trier des configs, tu tries des bruits. D'où la décomposition de ton chiffre : 90,9 = 90,0 + 0,91. La première partie appartient à la config, la seconde à l'eval set. Et ce +0,91 n'a rien d'exceptionnel : c'est le plus grand de 40 tirages d'écart-type 0,42, dont l'espérance est 2,16 × 0,42 = 0,91. C'est la valeur attendue du geste.

« E sur quoi ? »

L'espérance est prise sur les répétitions de l'expérience entière : nouveau tirage, les 40 bruits sont retirés d'un coup, une nouvelle gagnante émerge. C'est ce que fait le bouton. Mais il faut dire de quelle variable aléatoire on prend l'espérance, et deux candidates se confondent en français :

variable Avariable B
définitionle bruit de chunk 1024 / k=10, config nommée avant d'ouvrir le fichierle bruit de la config que j'ai retenue
en formuleb17max(b1, …, b40)
sur mille répétitionsmoyenne 0moyenne +0,91
identité stable ?oui, toujours la 17non : tantôt la 17, tantôt la 3, tantôt la 39

Même expérience, même aléa, deux nombres. Dans B, « la config que j'ai retenue » n'est pas une config : c'est une règle de désignation, « celle qui a le plus gros bruit ». Une fonction du tirage. Et l'espérance d'une fonction du tirage n'a aucune raison de valoir l'espérance de ses composantes : E[chaque dé] = 3,5, E[max] = 4,47.

Image mentale, pour que ça tienne : mille équipes font le même sweep sur mille eval sets. Chacune reporte 90,9 en moyenne. Mais chacune a une gagnante différente.

Ce que tu as mesuré est une propriété de la procédure (« lance 40, garde le max »), pas de la config. C'est le mouvement du cas 1 : l'IC à 95 % porte sur la procédure qui le fabrique, pas sur l'intervalle en main. Les 40 mesures sont sans biais. Leur max ne l'est pas. Aucune n'est fausse, et pourtant le résultat l'est.

Piège nommé : la K-fold ne répare pas çaUne CV à 5 folds moyenne chaque score sur 5 morceaux : le bruit passe de 0,42 à 0,42/√5 ≈ 0,19 point. Chaque estimation est plus précise. Mais tu prends toujours le max sur 40 : biais ≈ 2,16 × 0,19 ≈ 0,4 point au lieu de 0,9. Réduit, pas supprimé. Précision de mesure et biais de sélection sont deux axes indépendants. Rien dans « mesurer mieux » ne défait « choisir sur ce qu'on a mesuré ».

3La gagnante retestéebrique unique : un bruit tiré après la sélection est indépendant d'elle, donc centré

Tu retiens la gagnante. Tu régénères un eval set frais de 5 000 questions, jamais vu, et tu remesures cette seule config. Remonte à la course et appuie sur Remesurer la gagnante : sa barre est retirée, avec un bruit neuf.

Tu attends 90,0 %. Exactement la vraie valeur. Le nouveau bruit est tiré après que le choix a été fait : la sélection a travaillé sur l'ancien tirage, elle n'a aucune prise sur celui-ci. C'est un bruit ordinaire, centré. Sur ce tirage précis tu obtiendras 90,3 ou 89,6, pas 90,0 pile : le bruit n'est pas nul, il est centré. C'est la distinction que tu as faite toi-même, et elle est la bonne.

tirage de la sélectiontirage frais
bruit présent ?ouioui
E[bruit]+0,91, sélectionné0, non sélectionné
réalisation+0,91inconnue, ±0,42 autour de 0
nature de l'erreursystématique, toujours dans le même sensaléatoire, s'annule en moyenne, rétrécit en 1/√n

Ce qui disparaît n'est donc pas le bruit, c'est le biais. La remesure reste bruitée mais devient sans biais. Tu convertis une erreur systématique en erreur aléatoire, et c'est tout l'intérêt : l'aléatoire se réduit en agrandissant l'échantillon, le systématique non. Agrandis l'eval set à 50 000 questions en continuant de sélectionner dessus : SE tombe à 0,13, le biais devient 2,16 × 0,13 = 0,28, toujours 2,16 SE. Le biais ne se dilue pas avec n, il se dilue avec la séparation des tirages.

Régression vers la moyenne. Le nom du phénomène. Ce qui a été retenu pour son extrémité revient à sa vraie valeur quand on le remesure indépendamment, parce que l'extrémité appartenait au tirage, pas à l'objet. Le chiffre qui pique : si tu remesures les 40 sur l'eval set frais, ta gagnante regagne une fois sur 40. Le hasard pur. La sélection n'a rien sélectionné.

La réparation en découle

Si un bruit tiré après la sélection est centré, alors il faut un tirage que la sélection n'a pas vu. Ce n'est pas une convention, c'est forcé par la brique.

La règle : tout regard sur le test set pour prendre une décision le transforme en validation set. Un deuxième coup d'œil, c'est k = 2, et le gonflement recommence. Version cross-validation : la nested CV, boucle interne pour sélectionner sur le train, boucle externe sur un fold jamais vu par la boucle interne. Détail qui surprend en entretien : la boucle externe n'évalue pas une config, elle évalue la procédure « faire une CV interne et prendre la meilleure », et chaque fold externe peut élire une config différente. C'est littéralement la variable B.

Le prix. Couper 5 000 questions en deux moitiés divise n par 2, donc multiplie chaque SE par √2 : 0,42 → 0,59 point. Tu perds 40 % de précision sur chaque mesure. Tu échanges de la précision contre de la validité, et c'est toujours le bon échange : une mesure précise et biaisée te ment avec assurance, une mesure bruitée et honnête te dit où elle est incertaine.

La lecture correcte, avec la phrase au tableau

« Chaque mesure individuelle est sans biais. Mais “la gagnante” n'est pas une config fixée, c'est une fonction du tirage, le max de k bruits centrés, et un max de variables centrées n'est pas centré. Son score est gonflé d'environ E[max]·SE, soit 2,16 SE pour k = 40. La seule réparation est de mesurer sur un tirage que la sélection n'a pas vu ; le prix est un SE multiplié par √2. » Phrase fausse tentante : « sélectionner sur le test set donne toujours un score gonflé ». Tentante parce que le biais est bien systématique. Fausse parce qu'elle confond biais et bruit : une fois sur quatre (k = 2) le max est en dessous de la vraie valeur. Le geste déplace l'espérance, il ne garantit rien sur un tirage. Deuxième phrase fausse tentante : « avec plus de données, ou une cross-validation, le problème disparaît ». Tentante parce que ça réduit le bruit. Fausse parce que le biais reste 2,16 SE quel que soit SE : il se dilue avec la séparation des tirages, pas avec n.

Où chaque maillon casse

#maillonhypothèsece qui casse
1accuracy = moyenne de Bernoulli iidquestions indépendantesreformulations d'une même question ⇒ SE sous-estimée
2E[p̂] = pconfig fixée avant le tirageconfig choisie sur le tirage ⇒ cas 3
3SE = √(p(1−p)/n)règle 1 + règle 2 + Bernoulliécraser les trois briques ⇒ « pourquoi n et pas n² ? » sans réponse
4bruit ≈ N(0, SE²)n grand, p loin de 0 et 1petit eval set ⇒ Wilson, et un biais du max en points entiers
5P(max ≤ t) = Φ(t)kbruits indépendantsmême eval set pour les k configs ⇒ bruits corrélés ⇒ le calcul est une borne haute
6biais ≈ E[max]·SEvraies valeurs égales (cas témoin)écarts réels entre configs ⇒ le biais diminue mais reste (marche 4)
7remesure centréetirage jamais vu par la sélectionun seul regard décisionnel sur le test set ⇒ il redevient validation
8splitaccepter SE × √2refuser le prix ⇒ garder un chiffre précis et faux

Chaque fois que tu reportes un score, demande-toi si le choix de ce que tu reportes a été fait sur le même tirage que la mesure.

Marche 4, la porte non franchie

Les marches 1 à 3 sont tenues. La marche 4, les ponts, est reportée à la revue du 18/09 et n'est pas déroulée ici parce que tu ne l'as pas encore tentée. Elle attaque le maillon 6 (vraies valeurs différentes) et le maillon 7 (ce que le bootstrap voit et ne voit pas), avec trois situations : le bootstrap autour de la gagnante, le peeking d'un A/B test, le prompt tuné 30 fois sur un eval set de 200 items. Chacune se résout avec la seule question : où est le max, et sur quoi est-il pris ?

Fin du fil A. Retour à l’index des fiches, ou au cas 1 pour reprendre la chaîne depuis le début.