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.
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
| objet | notation | statut | ne pas confondre avec |
|---|---|---|---|
| vraie accuracy d'une config | p | fixe, inconnue | le score affiché |
| score mesuré d'une config | p̂ | aléatoire, dépend du tirage | p |
| bruit de mesure | b = p̂ − p | aléatoire, centré | le biais |
| erreur-type | SE = √(p(1−p)/n) | écart-type de p̂, donc de b | σ = √(p(1−p)) |
| biais | E[p̂] − p | décalage systématique de l'espérance | le bruit, qui est aléatoire |
| estimand | la quantité qu'on prétend estimer | l'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.
Maillon 2. E[p̂] = (1/n) Σ E[Xi] = p, par linéarité de l'espérance, qui vaut toujours, aucune indépendance requise. Donc p̂ 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(p̂) = 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 p̂ : 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.
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(b1 ≤ t) · … · P(bk ≤ t) = Φ(t/SE)kLa 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,64Dé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
| k | E[max] / SE | biais, SE = 0,42 | biais, SE = 1,34 (n = 500) |
|---|---|---|---|
| 2 | 0,56 | 0,24 pt | 0,76 pt |
| 10 | 1,54 | 0,65 pt | 2,1 pt |
| 40 | 2,16 | 0,91 pt | 2,9 pt |
| 100 | 2,51 | 1,05 pt | 3,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 A | variable B | |
|---|---|---|
| définition | le bruit de chunk 1024 / k=10, config nommée avant d'ouvrir le fichier | le bruit de la config que j'ai retenue |
| en formule | b17 | max(b1, …, b40) |
| sur mille répétitions | moyenne 0 | moyenne +0,91 |
| identité stable ? | oui, toujours la 17 | non : 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.
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élection | tirage frais | |
|---|---|---|
| bruit présent ? | oui | oui |
| E[bruit] | +0,91, sélectionné | 0, non sélectionné |
| réalisation | +0,91 | inconnue, ±0,42 autour de 0 |
| nature de l'erreur | systématique, toujours dans le même sens | alé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
Où chaque maillon casse
| # | maillon | hypothèse | ce qui casse |
|---|---|---|---|
| 1 | accuracy = moyenne de Bernoulli iid | questions indépendantes | reformulations d'une même question ⇒ SE sous-estimée |
| 2 | E[p̂] = p | config fixée avant le tirage | config choisie sur le tirage ⇒ cas 3 |
| 3 | SE = √(p(1−p)/n) | règle 1 + règle 2 + Bernoulli | écraser les trois briques ⇒ « pourquoi n et pas n² ? » sans réponse |
| 4 | bruit ≈ N(0, SE²) | n grand, p loin de 0 et 1 | petit eval set ⇒ Wilson, et un biais du max en points entiers |
| 5 | P(max ≤ t) = Φ(t)k | bruits indépendants | même eval set pour les k configs ⇒ bruits corrélés ⇒ le calcul est une borne haute |
| 6 | biais ≈ E[max]·SE | vraies valeurs égales (cas témoin) | écarts réels entre configs ⇒ le biais diminue mais reste (marche 4) |
| 7 | remesure centrée | tirage jamais vu par la sélection | un seul regard décisionnel sur le test set ⇒ il redevient validation |
| 8 | split | accepter SE × √2 | refuser 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.