Depuis 58 runs on parle de « tĂȘtes d'attention » sans en avoir jamais vu une. Cette page en ouvre 144 â celles de Pythia 160M, un modĂšle entiĂšrement ouvert â et montre les nombres qu'elles produisent. Puis elle en coupe quelques-unes pour vĂ©rifier qu'on n'a pas rĂȘvĂ©. Les sections 8 et 9 posent ensuite tous les rĂ©glages d'un modĂšle Ă plat â les sept nombres qu'on Ă©crit avant d'entraĂźner, et ce que « lire 32 000 jetons » coĂ»te vraiment.
Ce qu'est une tĂȘte, en une phrase : pour chaque jeton du texte, elle rĂ©partit 100 % d'attention sur les jetons dĂ©jĂ lus, lui-mĂȘme compris. C'est tout. Une tĂȘte = un tableau de nombres, une ligne par jeton, chaque ligne sommant Ă 1. Il y en a 144 qui tournent en parallĂšle, et le modĂšle n'a jamais reçu la moindre instruction sur ce que chacune devait regarder.
Un jeton n'est pas un mot : c'est le morceau de texte que le modÚle manipule. tapis se découpe en tap + is, dort en d + ort. Tous les mots en gras de cette page sont définis en bas, dans Les mots de cette page.
Choisis une phrase. Chaque vignette est une tĂȘte : une ligne = un jeton, une colonne = le jeton regardĂ©. Le coin en haut Ă gauche est le dĂ©but de la phrase. Tout est vide au-dessus de la diagonale â un modĂšle de langue ne voit jamais l'avenir.
Les 12 colonnes sont les 12 tĂȘtes d'une couche ; les 12 lignes sont les 12 couches, la couche 0 en haut. Clique une vignette : la page descend sur la vue en grand (section 3), avec les numĂ©ros de jetons sur les deux bords.
Commence par « Du bruit pur ». Douze jetons tirĂ©s au hasard â itarian, Figure, Mus, fĂŒr⊠â rĂ©pĂ©tĂ©s une fois. Aucune grammaire, aucun sens, rien Ă comprendre. Le modĂšle prĂ©dit quand mĂȘme la suite : itarian Ă 83,3 %. Il n'a pas compris la sĂ©quence, il a retrouvĂ© oĂč le jeton courant Ă©tait dĂ©jĂ passĂ© et recopiĂ© ce qui venait aprĂšs.
Sur la grille de cette phrase, la plupart des vignettes sont une barre verticale collĂ©e Ă gauche. Cherche celles qui portent une seconde diagonale, dĂ©calĂ©e, parallĂšle Ă la vraie : ce sont les tĂȘtes d'induction. Elles sont dans les couches 4 Ă 8.
« Du français » donne la mĂȘme leçon Ă l'envers. Pythia est entraĂźnĂ© presque uniquement sur de l'anglais, et pourtant Le chat dort sur le tapis . Le chat dort sur le continue par tap Ă 94,7 %. Recopier ne demande pas de comprendre â c'est prĂ©cisĂ©ment ce qui rend ce mĂ©canisme si gĂ©nĂ©ral.
« Deux prénoms » est plus dur. When Mary and John went to the shop , John gave a drink to : il faut repérer que John est déjà pris et sortir l'autre prénom. Le modÚle répond Mary à 28,4 %, contre John à 8,3 %. La copie seule aurait donné le contraire.
Une vignette n'est pas un dessin, c'est un tableau. Autant de lignes et de colonnes que la phrase a de jetons â les morceaux de mots que le modĂšle manipule, parfois un mot entier, parfois trois lettres. « Du bruit pur » en compte 24 : le tableau fait donc 24 lignes sur 24 colonnes. Chaque case contient un pourcentage. Rien d'autre.
Une case, en vrai, avant toute rĂšgle. Ouvre couche 6, tĂȘte 6 sur « Du bruit pur ». Les jetons sont numĂ©rotĂ©s Ă partir de 0 : le jeton 12 est le second itarian, celui qui ouvre la copie. Prends sa ligne, va Ă la colonne 1 â Figure, le jeton qui suivait le premier itarian. La case affiche 89,0 %.
Ce nombre se lit dans un seul sens : quand le modĂšle traite le second itarian, cette tĂȘte place 89,0 % de son attention sur Figure. Le reste de la ligne est miette : 4,3 % sur theme, 2,7 % sur le premier itarian, 2,7 % sur Comb, et deux cases Ă 0,4 %. Les sept autres colonnes de cette ligne sont Ă zĂ©ro. Sur l'image ouverte en grand, survole n'importe laquelle de ces cases : la mĂȘme valeur s'affiche sous le tableau.
Ces six cases additionnĂ©es font 99,6 %, pas 100 %. Les valeurs sont arrondies avant d'ĂȘtre envoyĂ©es Ă la page, au 0,4 % prĂšs, pour que le fichier reste petit. Aucun total lu sur cette page ne tombera pile.
Confondre les deux axes retourne le sens. « itarian regarde Figure » et « Figure regarde itarian » sont deux cases différentes, et l'une des deux n'existe pas.
La moitiĂ© en haut Ă droite est toujours vide. Un modĂšle de langue â un programme qui ne fait qu'une chose, deviner le jeton suivant â est entraĂźnĂ© Ă ne jamais regarder plus loin que le jeton qu'il traite. La phrase entiĂšre lui est bien donnĂ©e d'un coup ; c'est un masque, posĂ© dans le code avant le calcul, qui met Ă zĂ©ro toute case au-dessus de la diagonale. Quand il traite le jeton 12, les jetons 13 et au-delĂ lui sont donc cachĂ©s.
Reste que chaque ligne totalise 100 %. La cause s'appelle le softmax : l'opĂ©ration qui convertit les scores bruts d'une tĂȘte en pourcentages, en les forçant Ă faire 100 % ensemble. Une tĂȘte ne peut ni s'abstenir, ni distribuer 200 %. Elle a 100 % Ă rĂ©partir sur les jetons dĂ©jĂ lus, pas un de plus.
ConsĂ©quence Ă connaĂźtre avant de conclure quoi que ce soit : la premiĂšre ligne de toutes ces images, dans les 144 tĂȘtes et sur les quatre phrases, vaut 100 % sur la premiĂšre colonne. Le premier jeton n'a que lui-mĂȘme Ă regarder. Une case pleine, lĂ , ne signifie rien.
Survole une case.
Ces quatre notes â et surtout la façon dont elles sont calculĂ©es â sont expliquĂ©es en section 4. Les numĂ©ros de jetons Ă©crits sur les bords de l'image servent Ă retrouver une case prĂ©cise : la case (12, 1) dont parle toute cette page est la ligne 12, colonne 1.
Trois formes reviennent, et chacune se reconnaĂźt sans hĂ©sitation une fois qu'on l'a vue. La troisiĂšme colonne donne une tĂȘte rĂ©elle Ă ouvrir pour voir la forme en grand, avec la note qu'elle a obtenue.
| La forme | Ce que ça veut dire | La tĂȘte Ă ouvrir |
|---|---|---|
| Une barre verticale collĂ©e au bord gauche. Une seule colonne foncĂ©e, la colonne 0, sur toute la hauteur. Le reste est clair. | Chaque jeton envoie presque tout sur le premier jeton de la phrase. La tĂȘte ne relie rien : elle se gare. C'est le puits â le softmax l'oblige Ă poser ses 100 % quelque part, et ces tĂȘtes-lĂ les posent, mesure faite, sur le jeton 0. | couche 9, tĂȘte 5 â puits 1,000, la plus haute des 144. Sur « Du bruit pur », la ligne du jeton 12 met 100 % sur la colonne 0. |
| Un trait fin juste sous la diagonale. Une case foncĂ©e par ligne, toujours dĂ©calĂ©e d'un cran vers la gauche. | Chaque jeton envoie presque tout sur celui qui le prĂ©cĂšde immĂ©diatement. C'est la tĂȘte jeton prĂ©cĂ©dent. Elle ne relie pas les deux copies de la phrase : sa case foncĂ©e reste collĂ©e Ă la diagonale, un cran Ă gauche. | couche 3, tĂȘte 0 â prĂ©cĂ©dent 0,857, trĂšs loin devant la deuxiĂšme du classement, Ă 0,555. Ligne du jeton 12 : 96,9 % sur aline, qui est le jeton 11. |
| Une deuxiĂšme diagonale, parallĂšle Ă la vraie, dĂ©calĂ©e vers la gauche. Elle n'apparaĂźt que sur une phrase qui se rĂ©pĂšte. | Chaque jeton de la deuxiĂšme copie regarde le jeton qui avait suivi sa premiĂšre occurrence. C'est l'induction, la recopie. Sur « Du bruit pur » le motif fait 12 jetons, donc la deuxiĂšme diagonale est dĂ©calĂ©e de 11 colonnes (12 pour retomber sur le mĂȘme jeton, moins 1 pour prendre celui qui le suivait). | couche 6, tĂȘte 6 â induction 0,850, la meilleure des 144, de peu : la suivante est Ă 0,849. Ligne du jeton 12 : 89,0 % sur la colonne 1. |
Une quatriĂšme forme n'a pas de nom parce qu'elle ne dit rien : le nuage. Des cases moyennes un peu partout, sans structure. C'est le cas ordinaire â couche 0, tĂȘte 3, sur la ligne du jeton 12, met 27 % sur elle-mĂȘme, 20 % sur der, 16 % sur itzerland, puis s'Ă©tale. Sa note d'induction : 0,019. La plupart des 144 tĂȘtes ressemblent à ça. C'est pour cette raison qu'on les note toutes au lieu de les choisir Ă l'Ćil.
Une carte de chaleur ne prouve rien : l'Ćil trouve des motifs partout. Alors on donne Ă chacune des 144 tĂȘtes quatre notes calculĂ©es, pas devinĂ©es. Chaque note est une moyenne d'attention vers des positions prĂ©cises.
| Note | Ce qu'on mesure | Sur quoi |
|---|---|---|
| puits | attention vers le jeton 0 | 8 phrases anglaises ordinaires, écrites à la main dans le code du run : « The doctor asked the nurse⊠», « In 1969 the first humans landed on the Moon⊠», « A small brown dog was sleeping under the kitchen table⊠», etc. |
| précédent | attention vers le jeton juste avant | |
| soi | attention vers le jeton courant | |
| induction | attention vers le jeton qui avait suivi la précédente occurrence du jeton courant | 40 séquences tirées au hasard puis répétées |
Pour les trois premiĂšres notes, la ligne 0 est Ă©cartĂ©e du calcul â le premier jeton n'a que lui-mĂȘme Ă regarder, une case pleine lĂ ne voudrait rien dire. Sans cette prĂ©caution, la note « puits » serait gonflĂ©e par un artefact.
Le dĂ©tail de l'induction compte : la sĂ©quence est alĂ©atoire, elle n'a aucun sens. Le modĂšle ne peut pas s'en sortir par le vocabulaire, la grammaire ou la culture gĂ©nĂ©rale. La seule stratĂ©gie qui marche est de retrouver oĂč le jeton courant est dĂ©jĂ apparu et de recopier ce qui venait aprĂšs. Une tĂȘte qui note haut sur cette Ă©preuve fait vraiment ce travail-lĂ .
Personne n'a dĂ©signĂ© la couche 6, ni la tĂȘte 6, ni la couche 4. On a fabriquĂ© une Ă©preuve, on l'a fait passer aux 144 tĂȘtes sans exception, chacune est ressortie avec une note chiffrĂ©e, et on a triĂ© la colonne.
Couche 6 tĂȘte 6 arrive premiĂšre avec 0,850, couche 4 tĂȘte 8 juste derriĂšre avec 0,849 â comme un Ă©lĂšve sort premier d'un classement, pas parce qu'on l'a montrĂ© du doigt.
Le choix humain est en amont, et il est unique : dĂ©cider quelle case de la matrice on va lire. Une fois cette case fixĂ©e, plus personne ne choisit â la machine lit les 144 tĂȘtes et trie. Tout ce qui suit sert Ă montrer quelle case, et pourquoi celle-lĂ .
Deux Ă©preuves, en fait. Celle dĂ©crite ici note l'induction (des sĂ©quences rĂ©pĂ©tĂ©es). Les trois autres notes â puits, prĂ©cĂ©dent, soi â sortent d'une seconde Ă©preuve : 8 phrases anglaises ordinaires, sur lesquelles on lit des positions fixes (le jeton 0, le jeton d'avant, le jeton lui-mĂȘme). MĂȘme principe, cases diffĂ©rentes.
L'Ă©preuve est une suite de 25 jetons tirĂ©s au hasard dans une large tranche du vocabulaire, puis recollĂ©e Ă elle-mĂȘme : 50 jetons, deux copies identiques d'une bouillie.
Le hasard n'est pas de la coquetterie, c'est toute l'astuce. Sur une phrase anglaise normale, une tĂȘte peut avoir l'air brillante en s'appuyant sur la grammaire, sur les mots frĂ©quents, sur ce qui traĂźnait dans son corpus d'entraĂźnement. Ici il n'y a rien de tout ça : aucune grammaire, aucun sens, aucun mot attendu aprĂšs un autre.
Reste une seule rĂ©gularitĂ© exploitable dans une telle suite : le jeton courant est dĂ©jĂ passĂ© plus tĂŽt, et quelque chose le suivait. La note mesure exactement ça â combien d'attention part vers ce quelque chose. C'est la note appelĂ©e induction, dont le classement suit juste en dessous : un nom savant pour « recopier ce qui venait aprĂšs, la fois d'avant ».
Prenons la phrase « Du bruit pur » de la grille plus haut : 12 jetons tirĂ©s au hasard, rĂ©pĂ©tĂ©s une fois. Chaque tĂȘte rend donc un tableau de 24 lignes et 24 colonnes â une ligne par jeton qui regarde, une colonne par jeton regardĂ©, et chaque ligne partage 100 % entre ses colonnes.
(12, 1).| TĂȘte | case (12, 1) | OĂč va vraiment son attention, ligne 12 | Lecture |
|---|---|---|---|
| couche 6, tĂȘte 6 | 0,890 | col. 1 Figure 0,89 · col. 6 theme 0,04 · col. 0 itarian 0,03 | presque tout son poids sur la case attendue |
| couche 4, tĂȘte 8 | 0,227 | col. 0 itarian 0,49 · col. 1 Figure 0,23 · col. 6 theme 0,20 | la case attendue reçoit sa part, mais le premier jeton en reçoit deux fois plus |
| couche 3, tĂȘte 0 | 0,000 | col. 11 aline 0,97 | tout sur le jeton juste avant la ligne 12, rien sur la copie |
| couche 9, tĂȘte 5 | 0,000 | col. 0 itarian 1,00 | tout sur le tout premier jeton de la phrase |
| couche 0, tĂȘte 3 | 0,008 | col. 12 itarian 0,27 · col. 10 der 0,20 · col. 8 itzerland 0,16 | rĂ©parti sur plusieurs colonnes, la plus grosse part sur la ligne elle-mĂȘme (colonne 12) |
Ces cinq tĂȘtes voient exactement la mĂȘme phrase, dans le mĂȘme passage du modĂšle. Rien ne les distingue Ă part le nombre inscrit dans la case (12, 1). Aucun jugement n'intervient : on compare des cases.
D'oĂč vient le dĂ©calage de 11 et pas de 12 ? On recule de 12 pour retomber sur le mĂȘme jeton, puis on avance d'un cran pour prendre celui qui le suivait : 12 â 1 = 11. C'est l'unique calcul de toute la dĂ©monstration.
Une case, c'est une anecdote. On refait donc la mĂȘme lecture ligne aprĂšs ligne dans la deuxiĂšme copie : ligne 13 vers colonne 2, ligne 14 vers colonne 3, et ainsi de suite jusqu'Ă la ligne 22. Moyenne de ces onze cases.
La ligne 23 n'est pas comptĂ©e, et ce n'est pas un tri arrangeant : Ă la ligne 23, la colonne Ă lire serait la 12, c'est-Ă -dire le dĂ©but de la deuxiĂšme copie. Il n'y a plus rien de « dĂ©jĂ vu » Ă viser. On s'arrĂȘte donc Ă la ligne d'avant.
Cette moyenne dĂ©pend encore du tirage : ce motif-lĂ Ă©tait peut-ĂȘtre facile. Alors on recommence sur 40 sĂ©quences alĂ©atoires diffĂ©rentes et on remoyenne. La note du run, c'est ça â et rien d'autre.
| TĂȘte | Moyenne sur cette seule phrase | Note du run, 40 sĂ©quences |
|---|---|---|
| couche 6, tĂȘte 6 | 0,869 | 0,850 |
| couche 4, tĂȘte 8 | 0,774 | 0,849 |
| couche 3, tĂȘte 0 | 0,000 | 0,000 |
| couche 9, tĂȘte 5 | 0,091 | 0,028 |
| couche 0, tĂȘte 3 | 0,050 | 0,019 |
Les valeurs bougent d'une colonne Ă l'autre â 0,774 contre 0,849 pour couche 4 tĂȘte 8 â mais l'ordre des cinq tĂȘtes, lui, ne bouge pas. Une tĂȘte haute sur cette phrase reste haute sur 40 tirages ; une tĂȘte Ă zĂ©ro reste Ă zĂ©ro. Le classement ne tient donc pas Ă ce motif-ci.
Fin de l'histoire. Les 144 tĂȘtes passent les deux Ă©preuves, chacune ressort avec ses 4 notes, on trie le tableau, on lit les premiĂšres lignes. Ce sont les classements juste en dessous â obtenus sans qu'Ă aucun moment quelqu'un ait Ă©crit « regarde la couche 4 ».
Une Ă©criture, deux formes : le run note entre 0 et 1 (0,850), la page affiche en pourcentage (85,0 %). C'est le mĂȘme nombre. Et les tailles d'Ă©chantillon â 40 sĂ©quences, 25 jetons, 8 phrases, 32 sĂ©quences d'Ă©preuve, 8 tirages au hasard â ont Ă©tĂ© fixĂ©es avant de regarder le moindre rĂ©sultat : ce sont des rĂ©glages, pas des conclusions.
Voici, sans rien cacher, toutes les cases qui entrent dans la note de couche 6 tĂȘte 6 sur la phrase « Du bruit pur ». Une ligne du tableau de la tĂȘte, une colonne, une valeur lue.
| On est Ă la ligne | On lit la colonne | Valeur |
|---|---|---|
| 12 itarian | 1 Figure | 0,890 |
| 13 Figure | 2 (espaces) | 0,996 |
| 14 (espaces) | 3 Mus | 0,216 |
| 15 Mus | 4 fĂŒr | 0,686 |
| 16 fĂŒr | 5 conservative | 0,949 |
| 17 conservative | 6 theme | 0,965 |
| 18 theme | 7 annels | 0,906 |
| 19 annels | 8 itzerland | 0,996 |
| 20 itzerland | 9 Comb | 0,973 |
| 21 Comb | 10 der | 0,980 |
| 22 der | 11 aline | 1,000 |
| somme | 9,557 | |
| divisé par 11 | 0,869 | |
Pas de formule cachĂ©e, pas de pondĂ©ration : onze nombres additionnĂ©s, divisĂ©s par onze. Pour couche 3 tĂȘte 0, les onze mĂȘmes cases valent toutes 0,000 â elle ne met jamais rien lĂ . Sa note est donc 0,000, et ce n'est pas une punition : elle fait un autre mĂ©tier, qui se lit dans une autre case.
Le run, lui, ne travaille pas sur cette phrase de 12 jetons mais sur des sĂ©quences de 25 jetons rĂ©pĂ©tĂ©s â soit 24 cases par sĂ©quence, sur 40 sĂ©quences. La note publiĂ©e, 0,850, est la moyenne de 960 nombres. Le mĂȘme calcul tourne pour les 144 tĂȘtes : 138 240 cases lues en tout.
Une barre par tĂȘte, la plus haute Ă gauche. C'est ça, le classement â et c'est la seule raison pour laquelle couche 6 tĂȘte 6 est en tĂȘte : elle est la premiĂšre ligne du tableau triĂ©.
Change de note et regarde la pile se rĂ©organiser complĂštement : les tĂȘtes qui dominent l'induction ne sont pas celles qui dominent « jeton prĂ©cĂ©dent ». Chaque note range les mĂȘmes 144 tĂȘtes dans un ordre diffĂ©rent, parce que chaque note lit une case diffĂ©rente.
Cinq tĂȘtes envoient 99,6 Ă 100,0 % de leur attention sur le tout premier jeton d'une phrase ordinaire â couche 9, tĂȘte 5, Ă 1,000. Elles ne lisent rien. C'est le puits d'attention : le softmax force chaque tĂȘte Ă rĂ©partir 100 % quelque part, alors celle qui n'a rien Ă dire sur cette phrase se gare sur le jeton 0.
Et ce n'est pas cinq tĂȘtes marginales : 38 des 144 dĂ©passent 90 % de puits. Le phĂ©nomĂšne est massif.
Une tĂȘte n'a pas un mĂ©tier. Les trois premiĂšres du classement d'induction sont aussi des puits presque parfaits sur l'anglais ordinaire : couche 6 tĂȘte 6 Ă 0,994, couche 4 tĂȘte 8 Ă 0,953, couche 4 tĂȘte 6 Ă 0,987. La mĂȘme tĂȘte est muette ou dĂ©cisive selon l'entrĂ©e. C'est pour ça que les deux notes sont mesurĂ©es sur deux corpus diffĂ©rents â et pourquoi « Ă quoi sert cette tĂȘte ? » n'a pas de rĂ©ponse unique.
Le circuit, lui, se lit. Une seule tĂȘte domine le classement « jeton prĂ©cĂ©dent » : couche 3, tĂȘte 0, Ă 0,857 quand la deuxiĂšme est Ă 0,555. Juste au-dessus d'elle, la couche 4 porte quatre des huit meilleures tĂȘtes d'induction. Une tĂȘte qui marque « le jeton d'avant » en couche 3, des tĂȘtes qui s'en servent pour recopier en couche 4 : c'est la structure en deux Ă©tages dĂ©crite dans la littĂ©rature â retrouvĂ©e ici sur ce modĂšle, avec nos propres sĂ©quences, sans l'avoir cherchĂ©e.
Tout ce qu'on a regardĂ© jusqu'ici est une sortie : change la phrase, les 144 cartes changent. Les poids, eux, ne bougent jamais â ce sont les 162 322 944 nombres fixĂ©s Ă la fin de l'entraĂźnement. Une tĂȘte n'est rien d'autre qu'une tranche de ces nombres.
| Dans le modĂšle | Forme | Nombres |
|---|---|---|
layers[6].attention.query_key_value.weight | 2304 Ă 768 | 1 769 472 |
layers[6].attention.dense.weight | 768 Ă 768 | 589 824 |
Ces deux matrices portent les 12 tĂȘtes de la couche 6, empilĂ©es. La tĂȘte 6 occupe les lignes 1152 Ă 1343 de la premiĂšre et les colonnes 384 Ă 447 de la seconde. DĂ©coupĂ©es, ça donne quatre tranches :
ce que ce jeton cherche
ce que chaque jeton offre
ce qui est transporté
ce qui repart dans le modĂšle
196 608 poids en tout, soit 0,121 % du modĂšle. C'est ça, physiquement, « la tĂȘte (6,6) ». Les cartes d'attention, elles, ne sont stockĂ©es nulle part : elles sont recalculĂ©es Ă chaque phrase.
Et ils sont illisibles. Les huit premiers nombres de Wq : 0,0189 · 0,0013 · 0,0005 · 0,0005 · â0,0400 · 0,0120 · â0,0015 · â0,0029. L'ensemble tient entre â0,374 et 0,447, Ă©cart-type 0,079. Aucun de ces nombres ne « veut dire » quelque chose, et personne ne sait les lire directement.
C'est toute la diffĂ©rence avec le dĂ©tecteur d'offres de ce site, dont les poids se lisent mot Ă mot â jobs = +8,41, career = +4,96. LĂ , un poids est collĂ© Ă un mot. Ici, il faut passer par les sorties pour dire quoi que ce soit â et c'est exactement pour ça que cette page mesure des cartes plutĂŽt que des poids.
La preuve que la carte sort bien de ces poids-lĂ . Le script training/local/attention_poids.py dĂ©coupe les 196 608 nombres, refait le calcul complet Ă la main â normalisation, question Ă clĂ©, encodage des positions, masque, softmax â et compare le rĂ©sultat Ă la carte que le modĂšle produit lui-mĂȘme.
Ăcart maximum : 7,73 Ă 10â»â·. La case (12, 1) refaite Ă la main donne 0,889903 ; le modĂšle donne 0,889903. Les onze cases de la note remoyennĂ©es donnent 0,869.
La carte d'attention n'est donc pas une illustration ni une approximation : c'est le produit exact des poids et de l'entrĂ©e. C'est aussi le seul moyen honnĂȘte de relier les deux â sans ce contrĂŽle, « la carte vient des poids » serait une affirmation de plus.
Non : la couche ne dĂ©cide rien. Le nombre de tĂȘtes est Ă©crit une seule fois, pour le modĂšle entier, et chaque couche reçoit la mĂȘme valeur. Il n'a aucun lien avec le nombre de couches â sur les modĂšles posĂ©s sur cette machine, les deux nombres diffĂšrent presque toujours, et il arrive mĂȘme qu'ils bougent en sens inverse.
Le fichier de configuration de Pythia-160M, celui que lisent les runs 059 Ă 061, porte deux clĂ©s distinctes qui tombent sur la mĂȘme valeur :
num_hidden_layers : 12 â le nombre de couchesnum_attention_heads : 12 â le nombre de tĂȘteshidden_size : 768 â la largeur du modĂšleLu par cat sur /root/.cache/huggingface/hub/models--EleutherAI--pythia-160m-deduped/snapshots/582159a2.../config.json. Ce sont deux clĂ©s indĂ©pendantes, pas une clĂ© qui en dĂ©duit l'autre. grep -c num_attention_heads renvoie 1 : il n'existe qu'une seule dĂ©claration de tĂȘtes pour tout le modĂšle, et aucune clĂ© par couche.
Deux clĂ©s sĂ©parĂ©es qui valent 12 toutes les deux, c'est exactement ce qui fait naĂźtre l'idĂ©e d'un lien. Le lien n'existe pas, et la preuve est dans la mĂȘme famille d'architecture, dans le mĂȘme cache.
tiny-random-GPTNeoXForCausalLM est un modĂšle de test prĂ©sent dans le cache local. Son model_type est gpt_neox, exactement celui de Pythia. Son config donne 5 couches et 4 tĂȘtes. MĂȘme code, mĂȘmes clĂ©s, deux nombres diffĂ©rents.
Et les modÚles du projet le confirment à plus grande échelle :
24 couches, 14 tĂȘtes. Lu dans l'en-tĂȘte des 9 fichiers qwen25-05b-*.gguf.
28 couches, 12 tĂȘtes. Le modĂšle est plus gros, et il a moins de tĂȘtes que le 0.5B.
{'dim': 192, 'heads': 6, 'blocs': 5}, lu dans le point de sauvegarde lui-mĂȘme.
Le passage du 0.5B au 1.5B est le cas le plus net : les couches augmentent (24 â 28) pendant que les tĂȘtes diminuent (14 â 12). Si un lien existait, ce serait impossible.
| ModĂšle | Couches | TĂȘtes | Largeur | Taille d'une tĂȘte | TĂȘtes clĂ©s/valeurs |
|---|---|---|---|---|---|
| Pythia-160M-deduped config.json | 12 | 12 | 768 | 64 | 12 |
| tiny-random-GPTNeoX config.json | 5 | 4 | 32 | 8 | 4 |
| Qwen2.5-0.5B en-tĂȘte GGUF | 24 | 14 | 896 | 64 | 2 |
| Qwen2.5-1.5B en-tĂȘte GGUF | 28 | 12 | 1536 | 128 | 2 |
| run-004f-sketchy-scratch .pt | 5 | 6 | 192 | 32 | 6 |
| run-034-moe train.py | 8 | 6 | 384 | 64 | 6 |
| run-013-vqgpt train.py | 6 | 8 | 256 | 32 | 8 |
| run-003-attention mini_transformer.py | 1 | 4 | 100 | 25 | 4 |
Sources : config.json du cache HuggingFace pour les deux premiers ; en-tĂȘte GGUF lu octet par octet pour les Qwen (qwen2.block_count, qwen2.attention.head_count, qwen2.attention.head_count_kv, qwen2.embedding_length) ; torch.load pour run-004f ; train.py lignes 30-32 pour run-034 (D = 384, COUCHES = 8, TETES = 6), ligne 179 pour run-013 (def __init__(self, dim=256, heads=8, blocs=6, ...)), ligne 19 de mini_transformer.py pour run-003. Sur les 8 lignes du tableau, une seule a couches = tĂȘtes.
Ce n'est pas une supposition, ça se lit dans la forme des poids. Dans qwen25-05b-base-q8.gguf, les 24 matrices de requĂȘtes blk.N.attn_q.weight ont toutes la forme (896, 896) â une seule forme distincte sur 24 couches. Dans qwen25-15b-base-q8.gguf, les 28 ont toutes (1536, 1536). Chez Pythia, les 12 layers.N.attention.query_key_value.weight ont toutes la forme [2304, 768].
Il n'y a d'ailleurs nulle part oĂč Ă©crire un nombre de tĂȘtes par couche : le format GGUF stocke qwen2.attention.head_count comme un entier unique, et le config de Pythia n'a qu'une clĂ© num_attention_heads. Le code du projet fait la mĂȘme chose : self.blocs = nn.ModuleList(Bloc(dim, heads, ffn_dim) for _ in range(blocs)) â heads est Ă©crit une fois, la boucle le repasse tel quel Ă chaque bloc.
largeur = nombre de tĂȘtes Ă taille d'une tĂȘte
Les tĂȘtes dĂ©coupent la largeur, elles ne s'y ajoutent pas. C'est dĂ©jĂ Ă©crit dans le code du projet, trois fois : self.dim, self.heads, self.d_head = dim, heads, dim // heads (mini_transformer.py ligne 22), self.heads, self.d_head = heads, dim // heads (mini_gpt.py ligne 32), self.heads, self.dh = heads, dim // heads (run-013/train.py ligne 161). Et dans run-059/train.py ligne 65 : DIM = cfg.hidden_size // NT.
ConsĂ©quence directe : la division doit tomber juste. D'oĂč les gardes Ă©crites Ă la main dans le projet â assert dim % heads == 0 (mini_transformer.py ligne 21) et assert large % tetes == 0 (run-062-tetes-largeur/train.py ligne 83). Ce mĂȘme run-062 est la dĂ©monstration en acte : ses couches sont figĂ©es Ă 4 (def __init__(s, large, tetes, couches=4)) pendant que les tĂȘtes balaient 1, 2, 4, 8, 16, 32 Ă largeur 256 constante â soit des tĂȘtes de 256, 128, 64, 32, 16 et 8. Deux rĂ©glages, deux boutons.
La taille d'une tĂȘte n'est Ă©crite dans aucun de ces fichiers. Ni le config de Pythia, ni les 16 en-tĂȘtes GGUF ne portent de clĂ© head_dim, key_length ou value_length â recherche explicite sur ces trois motifs, aucun rĂ©sultat. Elle est toujours dĂ©duite par division. Elle est ensuite recoupĂ©e par la forme des tenseurs, ce qui la rend sĂ»re : chez Pythia, 2304 = 3 Ă 12 Ă 64 ; chez Qwen 0.5B, la sortie clĂ©s vaut 128 = 2 Ă 64.
C'est l'attention groupĂ©e : plusieurs tĂȘtes de requĂȘtes se partagent un mĂȘme jeu de clĂ©s et de valeurs, pour allĂ©ger la mĂ©moire. Les 16 modĂšles Qwen du projet le font tous, et ça se lit deux fois.
Dans l'en-tĂȘte : qwen2.attention.head_count = 14 mais qwen2.attention.head_count_kv = 2 sur le 0.5B, soit 7 tĂȘtes de requĂȘtes par tĂȘte clĂ©s/valeurs. Et 12 contre 2 sur le 1.5B, soit 6 pour 1.
Dans les poids : sur les 24 couches du 0.5B, attn_q.weight fait (896, 896) alors que attn_k.weight et attn_v.weight ne font que (896, 128). Sur les 28 couches du 1.5B, (1536, 1536) contre (1536, 256). Les matrices de clĂ©s et de valeurs sont littĂ©ralement 7 fois, puis 6 fois plus petites que celles des requĂȘtes â et elles portent la mĂȘme quantisation, donc le rapport vaut aussi sur le disque.
Les adaptateurs LoRA du projet montrent la mĂȘme asymĂ©trie, cette fois dans des poids PyTorch entraĂźnĂ©s sur cette machine : run-015-adaptateur-lora a q_proj.lora_B de forme (896, 16) mais k_proj.lora_B et v_proj.lora_B de forme (128, 16), sur les 24 couches. run-046-detecteur-15b : (1536, 16) contre (256, 16), sur les 28 couches.
Pythia, lui, ne fait pas d'attention groupĂ©e : la clĂ© num_key_value_heads est absente de son config (grep -c renvoie 0), et son bloc QKV fusionnĂ© vaut 2304 = 3 Ă 768, soit autant de place pour les clĂ©s et les valeurs que pour les requĂȘtes. Aucun modĂšle Ă©crit Ă la main dans le projet n'en fait non plus.
La gĂ©omĂ©trie des Qwen (24 couches / 14 tĂȘtes, 28 couches / 12 tĂȘtes) n'est pas un choix fait dans ce projet : elle est hĂ©ritĂ©e des modĂšles de dĂ©part. Les deux fichiers base portent un lien de licence vers huggingface.co/Qwen/Qwen2.5-0.5B et Qwen2.5-1.5B. Les 14 autres fichiers ne portent aucune trace de leur variante dans l'en-tĂȘte : sft, rl, grpo, star, skills⊠n'existent que dans le nom de fichier.
En revanche l'entraĂźnement a bien changĂ© les poids sans jamais toucher Ă la forme : les 9 fichiers 0.5B ont tous une gĂ©omĂ©trie identique (24 couches, 896, 14 tĂȘtes, 2 kv, 290 tenseurs) et les 7 fichiers 1.5B aussi (28 couches, 1536, 12 tĂȘtes, 2 kv, 338 tenseurs), mais les premiers octets de blk.0.attn_q.weight donnent 16 empreintes sha256 toutes diffĂ©rentes, Ă des dĂ©calages de fichier identiques. MĂȘme plan mĂ©moire, contenu diffĂ©rent.
config.json d'origine de Qwen2.5 n'est prĂ©sent sur cette machine.run-003-attention.pt n'est pas dans le fichier de poids : ses clĂ©s racine sont run, state_dict, vocab, max_tokens, acc_test. Le 4 vient de la valeur par dĂ©faut de mini_transformer.py, non surchargĂ©e Ă l'appel â c'est une infĂ©rence Ă partir du code, pas une lecture du fichier.Le fait qui rend la question intĂ©ressante : Ă largeur fixĂ©e, changer le nombre de tĂȘtes ne change aucun poids. Wq, Wk, Wv et Wo font chacune 256 Ă 256 qu'il y ait 1 tĂȘte de 256 ou 32 tĂȘtes de 8. Le dĂ©coupage ne fait que regrouper les mĂȘmes nombres autrement. Si la qualitĂ© change, ce n'est donc pas parce qu'on a ajoutĂ© de la capacitĂ©.
Le run-062 entraĂźne 24 modĂšles Ă©crits de zĂ©ro â 8 configurations Ă 3 graines â sur du Shakespeare au caractĂšre. Trois graines, parce qu'un Ă©cart de 0,01 sans elles est indiscernable du bruit d'initialisation.
| DĂ©coupage | Poids | Perte de validation | Ăcart-type sur 3 graines |
|---|---|---|---|
| 4 tĂȘtes de 64 | 3 221 504 | 1,5144 | ± 0,0050 |
| 2 tĂȘtes de 128 | 3 221 504 | 1,5176 | ± 0,0043 |
| 1 tĂȘte de 256 | 3 221 504 | 1,5188 | ± 0,0028 |
| 8 tĂȘtes de 32 | 3 221 504 | 1,5210 | ± 0,0045 |
| 16 tĂȘtes de 16 | 3 221 504 | 1,5270 | ± 0,0002 |
| 32 tĂȘtes de 8 | 3 221 504 | 1,5443 | ± 0,0027 |
La colonne des poids est identique sur les six lignes â le run le vĂ©rifie et refuse de conclure si ce n'est pas le cas.
Oui, le dĂ©coupage compte â et l'optimum est au milieu. Ăcart du meilleur au pire : 0,0299, contre 0,0032 de bruit entre graines. Neuf fois le bruit : ce n'est pas un accident de tirage.
Les deux extrĂȘmes perdent, mais pas Ă©galement. Une seule grosse tĂȘte coĂ»te +0,0044 ; trente-deux tĂȘtes minuscules coĂ»tent +0,0299, soit sept fois plus. Ămietter est bien plus coĂ»teux que regrouper â Ă 8 dimensions par tĂȘte, une tĂȘte ne peut presque plus rien distinguer.
L'optimum tombe sur des tĂȘtes de 64, exactement la valeur qu'utilisent Pythia-160M et Qwen2.5-0.5B (section 6). Ce n'est pas une confirmation d'autoritĂ© : c'est le mĂȘme optimum retrouvĂ© indĂ©pendamment, sur un autre corpus et Ă une autre Ă©chelle.
Pour savoir si 0,0299 est beaucoup ou peu, il faut une rĂ©fĂ©rence : que vaut un vrai gain de capacitĂ© ? On fixe donc la taille de tĂȘte Ă 64 et on fait varier la largeur.
| Largeur | Poids | Perte |
|---|---|---|
| 128 (2 tĂȘtes) | 824 320 | 1,6470 |
| 256 (4 tĂȘtes) | 3 221 504 | 1,5144 |
| 512 (8 tĂȘtes) | 12 734 464 | 1,5396 |
Le témoin n'est pas monotone, et ça compte. De 128 à 256, quadrupler les poids gagne 0,1326. De 256 à 512, les quadrupler encore fait perdre 0,0252.
Ce n'est pas « la largeur nuit ». C'est que le budget d'entraĂźnement est saturĂ© : 2 000 pas et un corpus d'un million de caractĂšres ne suffisent pas Ă un modĂšle de 12,7 millions de poids. Ă budget fixĂ©, le plus gros modĂšle n'est pas le meilleur â il est le moins bien entraĂźnĂ©.
J'avais Ă©crit le run en supposant que ce balayage donnerait une Ă©chelle propre. Il donne autre chose, et je le publie tel quel : le seul Ă©cart de capacitĂ© exploitable ici est 128 â 256, et c'est celui-lĂ qu'il faut comparer.
La réponse à la question, avec les deux chiffres cÎte à cÎte :
du meilleur au pire, Ă poids strictement identiques
de 128 Ă 256 de largeur
La capacitĂ© vaut environ 4,4 fois le dĂ©coupage. Le nombre de tĂȘtes n'est donc pas un levier de qualitĂ© : c'est un rĂ©glage, qui coĂ»te s'il est mal mis et ne rapporte presque rien s'il est bien mis. Ni « la taille » ni « le nombre » n'augmente la qualitĂ© â ils se partagent une largeur, et c'est la largeur qui compte.
Portée du résultat : un corpus, une profondeur (4 couches), un budget d'entraßnement. Rien ne dit que l'optimum reste à 64 sur un modÚle de 70 milliards. Ce qui est établi ici, c'est la forme du compromis et son ordre de grandeur. Tout est dans tetes062.json.
Cette page a manipulĂ© des mots â largeur, tĂȘtes, couches â sans jamais les poser cĂŽte Ă cĂŽte. Les voici tous. Un modĂšle de langue, du plus petit au plus gros, est entiĂšrement dĂ©crit par sept nombres. On les Ă©crit dans un fichier avant de lancer l'entraĂźnement. Aucun n'est appris : ils sont dĂ©cidĂ©s, et ils ne changent plus.
| Le réglage | En clair | Pythia-160M | Ce qui se passe si on l'augmente |
|---|---|---|---|
| largeur « hidden size » |
Combien de nombres décrivent un jeton à l'intérieur du modÚle. C'est la taille du paquet qui traverse tous les étages. | 768 | La qualité monte, les poids montent vite. C'est le vrai levier (section 7). |
| taille de tĂȘte | Combien de ces nombres une seule tĂȘte reçoit. Chaque tĂȘte ne voit qu'une tranche du paquet, jamais le paquet entier. | 64 | Rien en soi : elle prend sa place sur le voisin. |
| nombre de tĂȘtes | En combien de tranches la largeur est dĂ©coupĂ©e Ă chaque Ă©tage. | 12 | Rien non plus, seul. Mal rĂ©glĂ©, ça coĂ»te ; bien rĂ©glĂ©, ça ne rapporte presque rien. |
| tĂȘtes de clĂ©s « tĂȘtes KV » |
Combien de tranches ont leur propre clĂ© et valeur. Souvent moins que le nombre de tĂȘtes : plusieurs tĂȘtes se partagent alors les mĂȘmes. | 12 | Ne change pas la qualitĂ© ; change la mĂ©moire nĂ©cessaire pour lire long (section 9). |
| couches | Combien de fois le paquet est retravaillĂ©, l'un aprĂšs l'autre. Chaque couche a son propre jeu de tĂȘtes et son propre bloc dense. | 12 | La qualitĂ© monte, les poids montent, et le calcul devient plus long Ă dĂ©rouler. |
| taille du bloc dense « FFN » |
Le morceau de calcul placĂ© aprĂšs l'attention dans chaque couche. Il ne compare pas les jetons entre eux : il retravaille chacun sĂ©parĂ©ment. | 3 072 | Les poids montent le plus vite de tous â c'est dĂ©jĂ le plus gros bloc du modĂšle. |
| vocabulaire | Combien de jetons distincts le modÚle connaßt. Sa liste de morceaux de mots. | 50 304 | Textes découpés en moins de jetons, mais deux grosses tables de poids qui grossissent. |
| contexte | Combien de jetons il peut lire d'un seul tenant. | 2 048 | N'ajoute aucun poids, et coûte pourtant le plus cher à l'usage. C'est toute la section 9. |
largeur = nombre de tĂȘtes Ă taille de tĂȘte
Chez Pythia : 12 Ă 64 = 768. Deux des trois nombres suffisent, le troisiĂšme s'en dĂ©duit â c'est pour ça qu'on ne peut pas « ajouter des tĂȘtes » sans les rĂ©trĂ©cir. Tous les autres rĂ©glages sont libres les uns des autres.
Le nombre de couches, en particulier, ne dĂ©cide de rien. Il n'impose ni le nombre de tĂȘtes ni la largeur, et toutes les couches d'un mĂȘme modĂšle partagent exactement le mĂȘme dĂ©coupage â le relevĂ© de la section 6 le montre sur six modĂšles.
Toute cette page parle d'attention. Il faut donc dire ce qu'elle pĂšse. Voici les 162 322 944 poids de Pythia-160M, rangĂ©s par bloc â lus dans le fichier du modĂšle, pas estimĂ©s.
| Bloc | Poids | Part | Ce que c'est |
|---|---|---|---|
| bloc dense (FFN) | 56 669 184 | 34,9 % | 12 couches Ă deux matrices 768 Ă 3 072 |
| embeddings d'entrée | 38 633 472 | 23,8 % | 50 304 jetons à 768 : le paquet de départ de chaque jeton |
| embeddings de sortie | 38 633 472 | 23,8 % | la mĂȘme table Ă l'envers, pour produire les pourcentages finaux |
| attention | 28 366 848 | 17,5 % | les 144 tĂȘtes de cette page, Q, K, V et sortie comprises |
| layernorm et biais | 19 968 | 0,0 % | de petits réglages par couche |
L'attention, c'est 17,5 % du modĂšle. Les 144 cartes de cette page, les tĂȘtes d'induction, la tĂȘte (3, 0) sans qui plus rien ne se copie â tout ça tient dans moins d'un cinquiĂšme des poids. Le reste est ailleurs : un tiers dans les blocs denses, la moitiĂ© dans les deux tables de jetons.
Et une tĂȘte seule, c'est 0,121 % â les 196 608 poids de la section 5. C'est le bon ordre de grandeur Ă garder en tĂȘte quand on lit « telle tĂȘte fait telle chose » : on parle d'un milliĂšme du modĂšle.
Le contexte est le rĂ©glage Ă part. Il n'apparaĂźt dans aucun compte de poids â un modĂšle qui lit 2 048 jetons et le mĂȘme qui en lit 32 768 pĂšsent pareil. Et pourtant c'est lui qui dĂ©cide si le modĂšle tient sur une carte graphique. Quatre verrous diffĂ©rents le limitent, chacun branchĂ© sur un paramĂštre diffĂ©rent.
Un entier, max_position_embeddings ou context_length. Il ne garantit rien, il autorise. C'est une déclaration de l'auteur du modÚle, pas une propriété mesurée.
Une tĂȘte ne sait pas dans quel ordre les jetons arrivent : elle voit un sac. Il faut donc lui dire oĂč chacun se trouve. La façon la plus simple, celle de mes deux modĂšles maison, est d'apprendre un paquet de nombres par position â une ligne pour la position 0, une pour la 1, et ainsi de suite.
Ăa coĂ»te contexte Ă largeur poids : 128 Ă 256 = 32 768 dans mon run-062, soit 1,02 % du modĂšle. Bon marchĂ©. Mais Ă la position 128, il n'y a plus de ligne. Le code ne se dĂ©grade pas : il s'arrĂȘte. C'est un mur franc, et c'est la seule limite de contexte qui soit honnĂȘte.
Pythia et Qwen n'apprennent aucune position. Ils appliquent une formule : chaque paire de nombres de la tranche d'une tĂȘte est tournĂ©e d'un angle proportionnel Ă la position. Aucune table, donc aucun mur â on peut leur passer n'importe quelle longueur, ça calcule.
Mais chaque paire tourne Ă sa propre vitesse, et la plus lente finit quand mĂȘme par boucler. Au-delĂ de ce tour complet, deux positions Ă©loignĂ©es redeviennent indiscernables. Le rĂ©glage qui commande la longueur de ce tour est la base.
Rotary â on Ă©crit aussi RoPE â c'est la mĂ©thode. Au lieu de ranger la position d'un jeton dans une table, on prend les nombres de la tranche d'une tĂȘte deux par deux, et on fait tourner chaque paire d'un angle proportionnel Ă la position. Pas les mots : les nombres. La base est le rĂ©glage principal de cette mĂ©thode â un entier Ă©crit dans le fichier du modĂšle, 10 000 chez Pythia, 1 000 000 chez Qwen.
Ci-dessous, un cadran par paire. Le premier des deux jetons comparés est cloué à midi, l'aiguille marque le second. Tant qu'une aiguille n'a pas bouclé, elle sait encore dire de combien les deux jetons sont éloignés. Une fois qu'elle a fait son tour, elle confond cet écart avec un écart bien plus court.
Pythia-160M â base 10 000, 8 paires tournĂ©es, fenĂȘtre dĂ©clarĂ©e 2 048 jetons
à 2 048 jetons d'écart, 2 aiguilles sur 8 n'ont pas fini leur premier tour.
elles n'ont pas fini leur premier tour
le tour complet de la plus lente
19 869 Ă· 2 048
la base est une ligne de configuration, pas une matrice apprise
Pourquoi la premiĂšre aiguille ne bouge jamais. Quelle que soit la base, elle tourne d'un radian par jeton : c'est la paire de rĂ©fĂ©rence, et elle boucle toujours au bout de 6,3 jetons. La base n'accĂ©lĂšre personne â elle Ă©carte les vitesses, en ralentissant les suivantes. C'est pour ça que le premier trait de l'axe reste clouĂ© quand tu tires le curseur, et que tous les autres filent vers la droite.
Une aiguille bouclĂ©e n'est pas cassĂ©e. Elle sert encore, trĂšs bien, pour les jetons voisins : elle ne sait juste plus faire la diffĂ©rence entre proche et lointain. Et le modĂšle ne lit jamais une aiguille seule â il les lit toutes ensemble. La portĂ©e n'est donc pas un mur : c'est le point Ă partir duquel il ne lui reste plus rien pour distinguer deux positions.
Une aiguille n'est pas une tĂȘte. C'est une paire de nombres Ă l'intĂ©rieur de la tranche d'une tĂȘte : les 144 tĂȘtes de Pythia tournent toutes avec exactement les mĂȘmes 8 aiguilles. Et chez Pythia, seuls 16 des 64 nombres d'une tranche tournent â les 48 autres ne portent aucune position.
Mes deux modĂšles maison n'ont pas d'horloge et ne sont pas dans la liste : ils apprennent une ligne de nombres par position, c'est le verrou 2 juste au-dessus. C'est ce qui leur donne un mur franc Ă 128 et 256 jetons.
Ce que cette horloge ne dit pas. Elle ne fait que de la gĂ©omĂ©trie : Ă quel Ă©cart deux positions se confondent. Elle ne dit rien de la qualitĂ©. Pousser la base ne rend pas un modĂšle bon sur du texte long â il n'a jamais Ă©tĂ© entraĂźnĂ© Ă l'ĂȘtre. C'est exactement ce que la fin de cette section reconnaĂźt ne pas avoir mesurĂ©.
Base, dimensions tournĂ©es et fenĂȘtre dĂ©clarĂ©e sont lues dans les fichiers des modĂšles (contexte.json) ; tout le reste de ce bloc est de l'arithmĂ©tique Ă partir de ces trois nombres. La seule formule, pour qui la veut : le tour complet de la paire numĂ©ro n vaut 2Ï Ă base^((nâ1)/P), oĂč P est le nombre de paires.
| ModÚle | dims tournées | base | tour complet | contexte | marge |
|---|---|---|---|---|---|
| chargement⊠| |||||
C'est la derniĂšre colonne qui compte, pas l'avant-derniĂšre. Qwen 0.5B travaille avec 124 fois sa fenĂȘtre en rĂ©serve. Le 1.5B, qui annonce 128 k, n'en a plus que 38 â mĂȘme base, mĂȘme famille, mais l'ambition sur le contexte a mangĂ© la marge. Passer la base de 10 000 Ă 1 000 000 est exactement la manĆuvre qu'on emploie pour rallonger un modĂšle dĂ©jĂ entraĂźnĂ© : elle ne coĂ»te aucun poids. Le bouton « â Pythia avec la base de Qwen » de l'horloge la fait : Ă 2 048 jetons d'Ă©cart, Pythia passe de 2 aiguilles qui savent encore Ă 4, et sa marge de Ă9,7 Ă Ă545,6.
Elle a deux lignes.
La mĂ©moire. Pour ne pas tout recalculer Ă chaque nouveau jeton, le modĂšle garde la clĂ© et la valeur de chaque jeton dĂ©jĂ lu : c'est le cache KV. Sa taille par jeton est 2 Ă couches Ă tĂȘtes de clĂ©s Ă taille de tĂȘte Ă octets. Elle ne dĂ©pend ni de la largeur, ni du FFN, ni du vocabulaire.
| ModĂšle | Le calcul | par jeton | au contexte plein |
|---|---|---|---|
| chargement⊠| |||
Pythia-160M coĂ»te trois fois plus par jeton que Qwen 0.5B, alors qu'il est trois fois plus petit. Parce que Pythia a 12 tĂȘtes de clĂ©s et Qwen en a 2.
Le calcul. L'attention compare chaque jeton Ă chaque jeton : une carte n Ă n par tĂȘte et par couche â exactement les images du haut de cette page. Le total est nÂČ Ă tĂȘtes Ă couches, et le nÂČ Ă©crase tout le reste.
| ModĂšle | contexte | cases pour un passage plein |
|---|---|---|
| chargement⊠| ||
De Pythia Ă Qwen 1.5B : prĂšs de 10 000 fois plus de calcul d'attention, pour dix fois plus de poids. Doubler le contexte quadruple cette facture, toujours.
Une trace concrĂšte dans le fichier de Pythia : son masque causal, le triangle qui interdit de regarder vers l'avant, est stockĂ© en 2 048 Ă 2 048 par couche. 50 331 648 nombres â plus que tous les poids d'attention du modĂšle rĂ©unis. Ce ne sont pas des poids appris, mais c'est de la mĂ©moire, et elle grandit en nÂČ.
La section 7 concluait que le nombre de tĂȘtes n'est pas un levier de qualitĂ©. Voici son vrai rĂŽle. Qwen 0.5B a 14 tĂȘtes de requĂȘtes et 2 tĂȘtes de clĂ©s : sept tĂȘtes se partagent les mĂȘmes clĂ©s et valeurs. La qualitĂ© y perd un peu, le cache y gagne beaucoup.
2 tĂȘtes de clĂ©s · 32 768 jetons
14 tĂȘtes de clĂ©s · mĂȘme modĂšle, mĂȘme qualitĂ©
Sept fois plus de mĂ©moire pour le mĂȘme modĂšle. VoilĂ pourquoi le nombre de tĂȘtes de requĂȘtes et le nombre de tĂȘtes de clĂ©s ont Ă©tĂ© sĂ©parĂ©s : le premier est un rĂ©glage de qualitĂ©, le second un budget de contexte. Sans cette sĂ©paration, 32 768 jetons ne tiendraient plus sur la T4 qui a servi Ă tous les runs de ce projet.
Les mĂȘmes formules, Ă la main. Change un curseur et regarde ce qui bouge â et surtout ce qui ne bouge pas.
tĂȘtes Ă taille de tĂȘte
2 Ă couches Ă tĂȘtes de clĂ©s Ă taille de tĂȘte Ă 2 octets
et ce n'est que le cache : les poids s'ajoutent
contexteÂČ Ă tĂȘtes Ă couches
La largeur, le bloc dense, le vocabulaire. Ce sont pourtant les trois quarts des poids du modĂšle. Un modĂšle deux fois plus large ne lit pas plus loin : ces blocs travaillent jeton par jeton, ils coĂ»tent par jeton et jamais par paire de jetons. Seuls les rĂ©glages qui touchent l'attention â couches, tĂȘtes de clĂ©s, taille de tĂȘte â entrent dans la facture du contexte.
RĂ©sumĂ© en une ligne : la base de rotary dĂ©cide de la portĂ©e et ne coĂ»te rien ; couches Ă tĂȘtes de clĂ©s Ă taille de tĂȘte dĂ©cide de la mĂ©moire ; le nÂČ dĂ©cide du calcul.
Tous les chiffres ci-dessus sont lus ou calculĂ©s Ă partir des fichiers de modĂšles prĂ©sents sur ce serveur â les GGUF des deux Qwen, le config.json de Pythia, mes propres train.py. C'est un relevĂ© et de l'arithmĂ©tique, pas une expĂ©rience.
Ce qui manque : à partir de quelle longueur la qualité décroche réellement. Un modÚle qui annonce 128 k n'est pas forcément bon à 128 k, et rien ici ne le teste. Cette mesure-là demande un run, comme celui de la section 7.
La section prĂ©cĂ©dente dit que Qwen a « 14 tĂȘtes et 2 tĂȘtes de clĂ©s » et que c'est ce qui rend son cache sept fois moins gros. Question lĂ©gitime : est-ce qu'on peut les voir ? La rĂ©ponse tient en trois temps â oui dans le fichier, non sur les images, et oui si on coupe.
Les quatre matrices d'attention de la couche 0 de Qwen2.5-0.5B, telles que le run les a lues :
| Matrice | Forme | Ce qu'elle produit par jeton |
|---|---|---|
| chargement⊠| ||
La matrice des clĂ©s ne produit que 128 nombres par jeton, contre 896 pour les requĂȘtes. Il n'y a de la place que pour 2 jeux de clĂ©s face Ă 14 jeux de requĂȘtes. Sept tĂȘtes lisent forcĂ©ment les mĂȘmes clĂ©s â c'est Ă©crit dans la forme du tenseur, avant toute mesure. Chez Pythia, ces quatre matrices font 768 partout : aucune asymĂ©trie, aucun partage.
Il n'existe pas de carte d'attention « de la tĂȘte de clĂ©s ». Chaque tĂȘte garde sa propre requĂȘte, donc sa propre carte. Voici les 24 Ă 14 = 336 cartes de Qwen : le trait vertical marque la frontiĂšre entre les deux groupes, tĂȘtes 0 Ă 6 d'un cĂŽtĂ©, 7 Ă 13 de l'autre.
24 lignes : les 24 couches. 14 colonnes : les 14 tĂȘtes. Clique une vignette pour l'ouvrir en grand.
Rien ne saute aux yeux Ă la frontiĂšre. Les tĂȘtes d'un mĂȘme groupe ne se ressemblent pas visiblement plus que les autres. C'est normal : partager les clĂ©s ne partage pas les requĂȘtes, et c'est la requĂȘte qui dĂ©cide de la ligne qu'on lit. Le partage Ă©conomise de la mĂ©moire â il ne fabrique pas des jumelles.
Survole une case.
La seule façon de rendre le partage visible est celle de la section 12 : on met une piĂšce Ă zĂ©ro et on regarde ce qui casse. Ici la piĂšce est une tranche de clĂ©s â 64 nombres Ă la sortie de k_proj â et la question est : quelles tĂȘtes changent ?
Si le partage est rĂ©el, exactement 7 tĂȘtes doivent bouger et les 7 autres ne doivent pas bouger du tout. Pas « presque pas » : Ă©cart exactement zĂ©ro. Le test a Ă©tĂ© fait sur les 24 couches Ă 2 tranches = 48 cas.
| Tranche de clĂ©s coupĂ©e | TĂȘtes qui bougent | Cas | Ăcart max chez les autres |
|---|---|---|---|
| chargement⊠| |||
« 7 tĂȘtes ont bougĂ© » ne dit pas si on mesure le partage ou si on mesure sa propre mĂ©thode. Donc le mĂȘme test, exactement, sur Pythia-160M, qui a 12 tĂȘtes et 12 tĂȘtes de clĂ©s â aucun partage.
chargementâŠ
Deux modÚles, une seule méthode, deux réponses différentes et toutes deux exactement celles que la forme des fichiers annonçait. C'est ce qui autorise à dire que le partage est une propriété de Qwen et pas un artefact du crochet.
Deux contrÎles de plus, tous deux à écart exactement 0 : les couches situées avant la coupe ne bougent pas (couper les clés de la couche 12 ne peut rien changer aux couches 0 à 11), et le modÚle revient intact aprÚs chaque crochet. Le run échoue s'ils ne sont pas nuls.
Partager les clĂ©s rend-il les sept tĂȘtes d'un groupe semblables ? J'ai Ă©crit ma prĂ©diction dans le script avant de lancer : peu d'Ă©cart, parce que les requĂȘtes restent propres Ă chaque tĂȘte. Mesure : corrĂ©lation moyenne entre cartes, sur les 24 couches.
+0,027 d'Ă©cart sur un fond de +0,73. Deux tĂȘtes de Qwen se ressemblent dĂ©jĂ beaucoup, qu'elles partagent leurs clĂ©s ou non ; le partage n'ajoute presque rien Ă cette ressemblance. La prĂ©diction tient.
Une rĂ©serve qu'il faut poser : les tĂȘtes d'un mĂȘme groupe sont aussi des voisines par leur numĂ©ro (0 Ă 6, puis 7 Ă 13). Si des tĂȘtes voisines se ressemblaient pour une autre raison, ce test ne saurait pas les distinguer. Vu la taille de l'Ă©cart â 0,027 â la question reste acadĂ©mique ici, mais le protocole ne la tranche pas.
Ce que ça dit du rĂ©glage. La section 7 montrait que le nombre de tĂȘtes n'est pas un levier de qualitĂ©. Le voici de l'autre cĂŽtĂ© : le nombre de tĂȘtes de clĂ©s n'a rien Ă voir avec la qualitĂ© non plus â c'est un budget de mĂ©moire, et il se paie en cache, pas en perte. Qwen a choisi 2 sur 14. Pythia, plus ancien, n'avait pas ce rĂ©glage du tout.
Run-063, 24 secondes, T4 â de l'infĂ©rence pure, qui n'avait aucun besoin de GPU : Kaggle refusait les sessions CPU (« Maximum batch CPU session count of 5 reached ») alors que tous mes kernels Ă©taient terminĂ©s. Les deux pools sont indĂ©pendants, on est passĂ© par l'autre. Tout est dans tetesKV063.json.
Tout le tableau qui suit tient sur une seule mesure. à chaque jeton, le modÚle produit une répartition de pourcentages sur tout son vocabulaire, c'est-à -dire sur la liste de tous les jetons qu'il connaßt. Puis on lui montre le vrai jeton suivant. La perte ne regarde qu'une chose : la part de pourcentage qu'il avait accordée à ce jeton-là .
Petit = grosse part accordée au bon jeton. Grand = part minuscule. La perte ne récompense pas « avoir désigné le bon favori » : elle ignore le classement et ne lit que la part donnée à ce qui est réellement arrivé. On la dit « surprise » par commodité ; il n'y a rien à ressentir là -dedans, c'est un pourcentage transformé en nombre.
Le « nat » est l'unitĂ© dans laquelle ce nombre se compte. Elle vient du logarithme naturel, appliquĂ© Ă cette part â d'oĂč le nom. Une seule chose Ă en retenir : l'Ă©chelle n'est pas linĂ©aire mais multiplicative. Un nat de plus, ce n'est pas « un peu pire », c'est une part plusieurs fois plus petite accordĂ©e au bon jeton.
Et « par jeton » veut dire : divisĂ© par le nombre de jetons. Un texte long accumule mĂ©caniquement plus de perte qu'un texte court, sans que le modĂšle y soit pour rien. On divise donc, et deux passages de longueurs diffĂ©rentes deviennent comparables â c'est ce qui autorise Ă poser 5,81 et 25,62 cĂŽte Ă cĂŽte.
L'Ă©preuve : 32 sĂ©quences, tirĂ©es avec d'autres graines que tout le reste du run. Chacune est faite de 25 jetons tirĂ©s au hasard dans une large tranche du vocabulaire, puis recollĂ©s Ă l'identique derriĂšre eux â 50 jetons en tout. Le jeton en position 25 est le mĂȘme que celui en position 0, le 26 est le 1, et ainsi jusqu'au bout.
Sur la premiĂšre copie, la perte est de 25,62 nats par jeton. Sur la seconde, 5,81. Or ce sont, jeton pour jeton, les mĂȘmes dans le mĂȘme ordre. Aucune propriĂ©tĂ© du texte ne sĂ©pare les deux copies. La seule chose qui les distingue, c'est que la seconde a dĂ©jĂ dĂ©filĂ© une fois.
L'Ă©cart de 19,81 nats ne peut donc venir que de cette rĂ©pĂ©tition : sur la seconde copie, le bon jeton reçoit des parts bien plus grosses, et la seule information disponible en plus est sa premiĂšre occurrence, 25 positions plus tĂŽt. Ce n'est pas une lecture d'image, c'est une soustraction. Reste Ă savoir quoi, dans le modĂšle, exploite cette information â c'est ce que la coupe teste.
Pourquoi 25,62 est un chiffre énorme. Les 25 premiers jetons sont tirés au sort. Rien dans un texte ordinaire ne ressemble à ça : pas de grammaire qui annonce la suite, pas de sujet qui la rende probable. Le modÚle n'a aucun moyen de prévoir le jeton suivant, et il ne le prévoit pas. Ce n'est pas un modÚle qui hésite entre tous les jetons possibles : c'est un modÚle trÚs sûr de lui et systématiquement à cÎté, qui mise sur des suites plausibles en anglais alors que la suite est un tirage au sort. Ce point de départ ne laisse rien d'autre expliquer le 5,81 de la seconde copie.
Une note Ă©levĂ©e ne prouve rien. Elle dit qu'une tĂȘte regarde au bon endroit, pas que la sortie du modĂšle dĂ©pende de ce qu'elle regarde. Un tĂ©moin peut fixer la scĂšne du dĂ©but Ă la fin sans que son tĂ©moignage change le verdict. La seule façon de savoir s'il compte est de rejuger sans lui.
C'est ce qu'on appelle une ablation â en clair : on retire une piĂšce et on regarde ce qui casse. Ici la piĂšce est une tĂȘte, et on ne l'arrache pas. Chaque tĂȘte produit 64 nombres par jeton (par morceau de mot) ; ces 64 nombres sont mis bout Ă bout avec ceux des 11 autres tĂȘtes de la couche, et le tout est recombinĂ© en un seul bloc qui repart dans le modĂšle.
Couper la tĂȘte, c'est mettre ses 64 nombres Ă zĂ©ro juste avant cette recombinaison. Elle calcule toujours, elle rĂ©partit toujours ses pourcentages d'attention. Simplement sa part vaut zĂ©ro dans le bloc qui continue. Rien n'est modifiĂ© dans les poids, les nombres appris pendant l'entraĂźnement : on pose le zĂ©ro le temps d'une mesure, on l'enlĂšve aprĂšs, le modĂšle est intact pour la mesure suivante.
Supposons qu'on ne coupe que les 5 tĂȘtes visĂ©es. La perte sur la 2á” copie passe de 5,81 Ă 13,77. On aurait donc un gros dĂ©gĂąt et une phrase Ă Ă©crire. Laquelle ?
Impossible de trancher entre deux explications : le dĂ©gĂąt vient d'avoir coupĂ© ces tĂȘtes-lĂ , ou simplement d'avoir coupĂ© des tĂȘtes, cinq n'importe lesquelles. Peut-ĂȘtre qu'un modĂšle amputĂ© de 5 de ses 144 tĂȘtes va mal de toute façon. Sans point de comparaison, on ne mesure pas l'induction â la capacitĂ© Ă retrouver oĂč le jeton courant est dĂ©jĂ passĂ© et Ă recopier ce qui venait aprĂšs â, on mesure l'amputation.
D'oĂč la deuxiĂšme colonne : exactement la mĂȘme coupe, exactement 5 tĂȘtes, mais tirĂ©es au hasard parmi les 139 autres, et recommencĂ©e 8 fois pour ne pas dĂ©pendre d'un tirage chanceux. RĂ©sultat : 6,38 au lieu de 13,77. Les tĂȘtes visĂ©es ne sont pas des tĂȘtes comme les autres.
Le rĂ©sultat imaginaire qui aurait tout annulĂ©. Si cette ligne avait rendu 13,77 des deux cĂŽtĂ©s, la conclusion honnĂȘte aurait Ă©tĂ© : « n'importe quelles 5 tĂȘtes font le mĂȘme dĂ©gĂąt ». Le classement d'induction n'aurait alors rien identifiĂ© du tout, et les jolies diagonales des sections prĂ©cĂ©dentes seraient restĂ©es de jolies diagonales. Le contrĂŽle fait partie de la mesure et pas du commentaire d'aprĂšs coup : il tourne sur chaque ligne du tableau, y compris celles oĂč il rend le rĂ©sultat moins net.
| On coupe | Perte, 2á” copie | Ăcart | MĂȘmes tĂȘtes au hasard | Ăcart | 1Êłá” copie (tĂ©moin) |
|---|
Perte en nats par jeton : plus bas = le modĂšle est moins surpris. La 1Êłá” copie est imprĂ©visible par construction (des jetons tirĂ©s au hasard) â c'est le tĂ©moin qui montre que la coupe ne casse pas le modĂšle en gĂ©nĂ©ral. Le nombre de tĂȘtes affichĂ© est celui rĂ©ellement coupĂ©, lu dans le fichier du run.
Chaque sĂ©quence de l'Ă©preuve est faite de jetons tirĂ©s au hasard, puis rĂ©pĂ©tĂ©e. La 1Êłá” moitiĂ© est donc imprĂ©visible par construction : aucune tĂȘte d'induction ne peut y aider, il n'y a rien Ă recopier. Ce que le modĂšle y perd ne doit pas bouger quand on coupe.
rien Ă recopier, le modĂšle devine
le témoin n'a pas bougé
contre 5,81 intact
C'est la partie rassurante. Si couper ces 5 tĂȘtes avait aussi dĂ©gradĂ© la 1Êłá” copie, cela voudrait dire qu'on a abĂźmĂ© le modĂšle en gĂ©nĂ©ral â ses statistiques de vocabulaire, son fonctionnement de base â et le chiffre de la 2á” copie ne dirait plus rien sur la copie. Le tĂ©moin reste plat pendant que la 2á” copie s'effondre. On a retirĂ© une capacitĂ© prĂ©cise, pas de la puissance de calcul.
Aux petits nombres, la deuxiĂšme colonne fait mal elle aussi. Contre 5,81 intact : Ă 1 tĂȘte, la coupe visĂ©e donne 6,19 et le tirage au hasard 6,01 ; Ă 2 tĂȘtes, 7,21 contre 6,57 ; Ă 3 tĂȘtes, 9,28 contre 7,49. Sur ces trois lignes, le tirage au hasard reproduit Ă peu prĂšs la moitiĂ© du dĂ©gĂąt visĂ©.
L'explication tient au modĂšle lui-mĂȘme : l'induction n'est pas portĂ©e par une tĂȘte unique. Le run garde les 8 premiĂšres du classement d'induction â un nombre fixĂ© d'avance dans le code, pas un seuil. Il se trouve que la coupure tombe Ă un endroit oĂč le classement dĂ©croche de toute façon : la 8á” est Ă 0,582, la 9á” Ă 0,514. Couper les 3 premiĂšres en laisse donc 5 en place. Un tirage de 3 tĂȘtes parmi les 141 restantes peut donc tomber sur l'une de ces 5.
Le contrĂŽle ne devient net qu'aux grosses coupes : 13,77 contre 6,38 Ă 5 tĂȘtes, 17,77 contre 6,71 sur la derniĂšre ligne. Ă 5 tĂȘtes coupĂ©es il en reste 3 dans le classement ; sur la derniĂšre ligne il n'en reste aucune, pendant que les tirages continuent de piocher dans une majoritĂ© de tĂȘtes sans rapport. Les lignes 1, 2 et 3 restent affichĂ©es telles quelles : elles sont bruyantes, et les cacher rendrait le rĂ©sultat plus net qu'il ne l'est.
Un dĂ©faut d'Ă©tiquette dans cette derniĂšre ligne, puisqu'il faut le dire. Le tableau l'annonce Ă 10 tĂȘtes coupĂ©es. Le classement d'induction n'en gardait que 8 : la coupe visĂ©e porte en fait sur ces 8 tĂȘtes (17,77), pendant que le tirage au hasard en coupe bien 10 (6,71). La comparaison joue donc contre le cĂŽtĂ© visĂ©, qui coupe moins que son tĂ©moin, et l'Ă©cart tient quand mĂȘme. La ligne Ă 5 tĂȘtes, elle, compare bien 5 contre 5.
La question qui a dĂ©clenchĂ© ce run : « les quatre classements ne dĂ©signent pas les mĂȘmes tĂȘtes â alors laquelle choisir ? » La rĂ©ponse tenait dans une hypothĂšse : aucune, parce qu'elles ne sont pas en concurrence. La tĂȘte « jeton prĂ©cĂ©dent » de la couche 3 marquerait, pour chaque position, quel jeton la prĂ©cĂ©dait ; les tĂȘtes d'induction des couches 4 Ă 8 se serviraient de cette marque. Une chaĂźne, pas un concours.
Jolie histoire, donc suspecte. Elle fait une prĂ©diction risquĂ©e : couper couche 3 tĂȘte 0 â dont la note d'induction vaut exactement 0,000, derniĂšre ex ĂŠquo des 144 â devrait faire s'effondrer l'induction des autres tĂȘtes. Rien dans le classement ne le laisse prĂ©voir. C'est le genre de prĂ©diction qui peut Ă©chouer bruyamment.
| TĂȘte d'induction | Note, modĂšle intact | AprĂšs la coupe de (3, 0) | TĂ©moin : 1 tĂȘte au hasard |
|---|---|---|---|
| couche 6, tĂȘte 6 | 0,859 | 0,171 | 0,854 |
| couche 4, tĂȘte 8 | 0,851 | 0,039 | 0,851 |
| couche 4, tĂȘte 6 | 0,822 | 0,010 | 0,823 |
| couche 4, tĂȘte 11 | 0,812 | 0,008 | 0,812 |
| couche 8, tĂȘte 2 | 0,765 | 0,379 | 0,757 |
| couche 4, tĂȘte 10 | 0,722 | 0,003 | 0,724 |
| couche 8, tĂȘte 10 | 0,674 | 0,470 | 0,665 |
| couche 5, tĂȘte 6 | 0,577 | 0,151 | 0,577 |
Quatre tĂȘtes tombent sous 0,04 â elles ne recopient plus du tout. Le tĂ©moin, lui, ne bouge pas : couper une autre tĂȘte au hasard (8 tirages) dĂ©place les notes de 0,009 au maximum. Sur l'ensemble des 144, 29 tĂȘtes notĂ©es au-dessus de 0,10 perdent plus de la moitiĂ© de leur note.
| On coupe | Perte, 2á” copie | Ăcart | 1Êłá” copie (tĂ©moin) |
|---|---|---|---|
| rien (modĂšle intact) | 9,21 | â | 29,90 |
| 1 tĂȘte au hasard, 8 tirages | 9,19 | â0,02 | 29,95 |
| la meilleure tĂȘte d'induction (6, 6), note 0,859 | 9,43 | +0,22 | 29,88 |
| la tĂȘte « jeton prĂ©cĂ©dent » (3, 0), note d'induction 0,000 | 19,17 | +9,96 | 29,24 |
Lis les deux derniĂšres lignes ensemble. La tĂȘte la mieux notĂ©e en induction, coupĂ©e seule, coĂ»te +0,22. La tĂȘte notĂ©e zĂ©ro en induction coĂ»te +9,96 â quarante-cinq fois plus.
Ma propre note se trompait de cible. Elle disait de la tĂȘte (3, 0) : « ne participe pas Ă la copie ». C'est faux, et c'est mĂȘme l'inverse : sans elle, personne ne copie. La note ne mesurait pas la participation, elle mesurait une façon prĂ©cise de participer â celle du dernier maillon.
La raison est simple une fois vue : l'induction est portĂ©e par huit tĂȘtes, donc en couper une laisse les sept autres travailler. Le marquage du jeton prĂ©cĂ©dent, lui, est portĂ© par une seule tĂȘte trĂšs en avance sur les autres (0,857 contre 0,555). C'est un goulot d'Ă©tranglement â et un goulot ne se voit pas dans un classement qui note les sorties.
Ce que ça change pour toute cette page. Un classement dit qui fait quoi, pas qui est nĂ©cessaire. Les deux questions sont diffĂ©rentes, et seule la seconde se rĂ©pond en coupant. Sans le run-060, la section 9 aurait laissĂ© croire que « les tĂȘtes d'induction sont les tĂȘtes importantes ». Elles sont les tĂȘtes visibles.
Les chiffres de cette section ne se comparent pas Ă ceux de la section 9 : ce sont d'autres sĂ©quences (24 au lieu de 32, tirĂ©es avec d'autres graines), d'oĂč une perte intacte de 9,21 au lieu de 5,81. Chaque run porte son propre modĂšle intact comme point de rĂ©fĂ©rence â c'est la seule comparaison qui ait un sens. Tout est dans circuit060.json.
La question vient naturellement aprÚs tout ce qui précÚde, et la réponse est on peut classer, on ne peut pas attribuer. Voici pourquoi, mesuré.
Ă chaque jeton, dans une couche, les 12 tĂȘtes travaillent chacune dans son coin, sans se voir. Chacune produit 64 nombres. Les 12 rĂ©sultats sont simplement collĂ©s bout Ă bout â 768 nombres â et ce collage traverse la matrice dense avant d'ĂȘtre rendu au flux principal du modĂšle.
Couper la tĂȘte 6, c'est mettre Ă zĂ©ro ses 64 nombres dans ce collage, juste avant la recombinaison :
x[..., 6*64 : 7*64] = 0.0
La tĂȘte calcule toujours et rĂ©partit toujours ses pourcentages d'attention : simplement, sa voix vaut zĂ©ro dans la suite. Aucun poids n'est modifiĂ© â c'est un crochet posĂ© le temps d'une mesure et retirĂ© juste aprĂšs.
ContrĂŽle. Le run vĂ©rifie que couper par ce crochet donne exactement le mĂȘme rĂ©sultat que mettre Ă zĂ©ro les 64 colonnes correspondantes de dense.weight : Ă©cart nul sur les 50 304 logits, et modĂšle restaurĂ© Ă l'identique aprĂšs la mesure. Ce contrĂŽle Ă©tait faux dans la premiĂšre version du run â voir plus bas.
Sur chaque phrase : on note la probabilitĂ© du jeton attendu, on coupe la tĂȘte n° 1, on remesure, on la remet â et on recommence 144 fois. 580 passages avant en tout.
| Phrase | PrĂ©diction | TĂȘte la plus coĂ»teuse | Chute | TĂȘtes sans effet | Les 8 premiĂšres coupĂ©es ensemble |
|---|---|---|---|---|---|
| La rĂ©pĂ©tition | mat 32,0 % | couche 10, tĂȘte 8 | â17,9 pts | 43 / 144 | 1,9 % |
| Deux prĂ©noms | Mary 28,4 % | couche 5, tĂȘte 3 | â18,1 pts | 41 / 144 | 0,6 % |
| Du français | tap 94,7 % | couche 3, tĂȘte 0 | â86,7 pts | 81 / 144 | 5,0 % |
| Du bruit pur | itarian 83,3 % | couche 3, tĂȘte 0 | â83,3 pts | 64 / 144 | 0,0 % |
Les responsables changent complĂštement selon la phrase. Les deux phrases qui reposent sur la recopie sont Ă©crasĂ©es par la tĂȘte (3, 0) â celle de la section 10, notĂ©e 0,000 en induction. Les deux phrases d'anglais ordinaire ne la citent mĂȘme pas. Il n'y a pas de « tĂȘte importante » dans l'absolu : ça dĂ©pend de ce qu'on demande au modĂšle.
C'est le rĂ©sultat qui tue l'idĂ©e d'attribuer un mot Ă une tĂȘte. On coupe les deux tĂȘtes les plus coĂ»teuses sĂ©parĂ©ment, on additionne leurs dĂ©gĂąts, puis on les coupe ensemble :
| Phrase | chute(A) + chute(B) | chute(A et B ensemble) |
|---|---|---|
| La répétition | 28,8 pts | 23,5 |
| Deux prénoms | 35,6 pts | 21,8 |
| Du français | 139,6 pts | 87,2 |
| Du bruit pur | 165,9 pts | 83,3 |
Regarde la derniĂšre ligne. Sur « Du bruit pur », deux tĂȘtes dĂ©truisent chacune la prĂ©diction Ă elle seule â â83,3 et â82,6 points, sur 83,3 possibles. Les couper ensemble ne fait pas plus de dĂ©gĂąt : il n'y a plus rien Ă dĂ©truire.
On ne peut donc pas Ă©crire « celle-ci compte pour 50 %, celle-lĂ pour 50 % ». La responsabilitĂ© ne se dĂ©coupe pas en parts. Deux tĂȘtes peuvent ĂȘtre chacune indispensable sans qu'aucune ne soit « la » responsable.
Ce qu'on peut affirmer, et rien de plus : sans cette tĂȘte-lĂ , cette prĂ©diction-ci tombe de tant. C'est une mesure de nĂ©cessitĂ©, pas de production. Personne ne « fabrique » le mot mat ; il tient tant qu'un chemin suffisant reste debout.
Le contrĂŽle ratĂ©, puisqu'il faut le dire. La premiĂšre version de ce run vĂ©rifiait bien que les deux façons de couper coĂŻncident â mais en comparant la probabilitĂ© du jeton n° 0, qui vaut ~0 dans les deux cas. L'Ă©galitĂ© Ă©tait vraie et ne prouvait rien. Un contrĂŽle qui passe toujours n'est pas un contrĂŽle. CorrigĂ© : on compare maintenant les 50 304 logits entiers, et on vĂ©rifie que le modĂšle est restaurĂ©. Les rĂ©sultats, eux, n'ont pas bougĂ© d'un chiffre â le run est dĂ©terministe.
Tout est dans attribution061.json : les 144 chutes, pour les 4 phrases.
La premiÚre version de ce run s'est terminée « avec succÚs » et a écrit ses 234 049 octets. Tout y était NaN : la perte, les cinq ablations, les prédictions. La cause : le config.json de Pythia annonce float16, transformers a donc chargé le modÚle en demi-précision, et sur CPU les logits débordent silencieusement.
Le piĂšge est lĂ : les notes des 144 tĂȘtes, elles, Ă©taient sorties plausibles â 0,846 d'induction pour la meilleure. Le softmax de l'attention renormalise et efface le dĂ©bordement. Le run avait l'air d'avoir marchĂ©, la moitiĂ© visible du rĂ©sultat Ă©tait juste, et le tableau des meilleures tĂȘtes aurait Ă©tĂ© publiable tel quel.
La correction n'est pas .float() â ça, c'est le bug. La correction est le garde-fou : le run affiche maintenant sa prĂ©cision au chargement, fait un passage avant de contrĂŽle, et refuse d'Ă©crire le JSON si un seul nombre est NaN. MĂȘme leçon qu'au chapitre du harnais : un run qui finit n'est pas un run qui a marchĂ©.
Les chiffres des deux versions diffĂšrent, d'ailleurs : la meilleure tĂȘte d'induction Ă©tait couche 4 tĂȘte 8 (0,846) en float16, elle est couche 6 tĂȘte 6 (0,850) en float32. Assez proche pour rassurer â assez diffĂ©rent pour que rien de la v1 ne soit publiĂ© ici.
144 tĂȘtes, ce n'est pas 160 millions de poids. On regarde ici les sorties de l'attention, pas les poids eux-mĂȘmes. Les matrices affichĂ©es sont calculĂ©es pour une phrase donnĂ©e ; change la phrase, elles changent. Les poids, eux, ne bougent pas â et personne ne sait les lire directement.
L'attention n'est qu'une partie du modÚle. Entre deux blocs d'attention il y a un réseau dense (ffn) qui porte la majorité des paramÚtres et dont on ne montre rien. Beaucoup de ce que « sait » un modÚle est rangé là , pas dans l'attention.
Une tĂȘte nette n'est pas une explication. Voir une tĂȘte relier deux jetons dit oĂč l'information circule, pas pourquoi la sortie est ce qu'elle est. C'est pour ça que la section 12 existe : tant qu'on n'a pas coupĂ© et comparĂ© Ă un tirage au hasard, on n'a qu'une jolie image.
C'est un petit modĂšle. 160 millions de poids, 12 couches. Les mĂȘmes mesures sur un modĂšle de 70 milliards donneraient des cartes bien plus embrouillĂ©es â c'est justement pour ça que la recherche en interprĂ©tabilitĂ© travaille sur de petits modĂšles entiĂšrement ouverts.
Un modĂšle de langue ne lit pas des mots : il lit un texte dĂ©coupĂ© en jetons, des morceaux de longueur variable. Il les fait passer par une pile d'Ă©tages, appelĂ©s couches. Dans chaque Ă©tage, plusieurs tĂȘtes calculent en parallĂšle, chacune sans voir ce que font les autres. Une tĂȘte ne fait qu'une chose : rĂ©partir 100 % sur les jetons dĂ©jĂ lus.
| Le mot | Ce qu'il désigne |
|---|---|
| jeton | Un morceau de texte, pas un mot : tapis se découpe en tap + is, dort en d + ort. Certains morceaux ne forment aucun mot à eux seuls, comme itarian. La phrase française de cette page, « Le chat dort sur le tapis . Le chat dort sur le », fait 15 jetons. |
| couche | Un étage du modÚle. Pythia 160M en a 12, numérotées de 0 (celle qui voit le texte en premier) à 11. |
| tĂȘte d'attention | Une unitĂ© de calcul parmi douze Ă l'intĂ©rieur d'un Ă©tage. 12 tĂȘtes par couche, 144 en tout, chacune manipulant 64 nombres par jeton. Aucune n'a de rĂŽle inscrit quelque part : son comportement ne se connaĂźt qu'en le mesurant. |
| attention (le pourcentage) | La part qu'une tĂȘte accorde Ă un jeton dĂ©jĂ lu. Pour un jeton donnĂ©, ses parts font toujours 100 % au total ; la façon dont elles se rĂ©partissent est tout ce qu'on observe. Exemple rĂ©el, sur la sĂ©quence « Du bruit pur » : la tĂȘte 6 de la couche 6 place 89,0 % de la part du jeton n° 12 sur le jeton n° 1. |
| carte de chaleur | Ces pourcentages dessinés : une ligne par jeton lu, une colonne par jeton regardé, case d'autant plus vive que la part est grande. 24 lignes sur 24 colonnes pour « Du bruit pur ». Rien au-dessus de la diagonale : aucun jeton ne reçoit de part sur ce qui vient aprÚs lui. |
| note | Un nombre entre 0 et 1 : la moyenne de la part qu'une tĂȘte place sur une case prĂ©cise de sa carte. La couche 6, tĂȘte 6 a une note d'induction de 0,850, c'est-Ă -dire 85,0 % de part en moyenne sur cette case, sur 40 sĂ©quences. Les 144 tĂȘtes reçoivent les mĂȘmes quatre notes, calculĂ©es pareil pour toutes. |
| induction | La case qui compte quand un texte se répÚte : le jeton courant est déjà passé plus tÎt, et la part est placée sur celui qui l'avait suivi cette fois-là . La note d'induction mesure cette seule case. Sur « Du bruit pur », aprÚs les 24 jetons, le modÚle donne 83,3 % au jeton qui vient effectivement ensuite dans la répétition. |
| puits d'attention | Une tĂȘte qui dĂ©pose presque toute sa part sur le jeton n° 0, quel que soit le texte. Sur 8 phrases anglaises ordinaires, la couche 9, tĂȘte 5 y met 100 % en moyenne (note 1,000). Le run mesure ce comportement ; il ne dit pas pourquoi il existe. |
| prĂ©cĂ©dent et soi | Les deux autres notes. « PrĂ©cĂ©dent » : la part placĂ©e sur le jeton juste avant. « Soi » : la part qu'un jeton garde sur lui-mĂȘme. La plus haute note « prĂ©cĂ©dent » est celle de la couche 3, tĂȘte 0 : 0,857. |
| perte | Un nombre calculĂ© jeton par jeton. Il vaut zĂ©ro quand le modĂšle donnait 100 % au jeton qui arrive vraiment, et il monte d'autant plus haut que la probabilitĂ© donnĂ©e Ă©tait petite. Sur 32 sĂ©quences alĂ©atoires rĂ©pĂ©tĂ©es, modĂšle intact : 25,62 sur la 1re copie, 5,81 sur la 2e â mĂȘme contenu, mais la 2e fois il est dĂ©jĂ passĂ©. |
| nat | L'unitĂ© de la perte, comptĂ©e par jeton. Un nat seul ne veut rien dire ; seuls les Ă©carts entre deux chiffres portant sur la mĂȘme Ă©preuve se lisent, comme 5,81 contre 13,77. |
| contexte | Le nombre de jetons que le modÚle peut lire d'un seul tenant. Pythia : 2 048. Mes modÚles maison : 128 et 256. Il n'ajoute aucun poids au modÚle, mais c'est lui qui décide de la mémoire et du calcul à l'usage. |
| cache KV | La clĂ© et la valeur de chaque jeton dĂ©jĂ lu, gardĂ©es de cĂŽtĂ© pour ne pas les recalculer. Sa taille par jeton vaut 2 Ă couches Ă tĂȘtes de clĂ©s Ă taille de tĂȘte Ă octets : 12 288 octets chez Qwen 0.5B, 36 864 chez Pythia â trois fois plus pour un modĂšle trois fois plus petit. |
| rotary (RoPE), base de rotary | Rotary, ou RoPE, est la mĂ©thode qui code la position d'un jeton en faisant tourner les nombres de la tranche d'une tĂȘte, deux par deux, d'un angle proportionnel Ă la position â aucune table, aucun poids appris. La base est le nombre qui rĂšgle la vitesse de ces rotations. 10 000 chez Pythia, 1 000 000 chez Qwen. Plus il est grand, plus le modĂšle distingue des positions lointaines â et il ne coĂ»te aucun poids. |
| bloc dense (FFN) | Le calcul placé aprÚs l'attention dans chaque couche, qui retravaille chaque jeton séparément sans jamais les comparer. C'est le plus gros bloc du modÚle : 34,9 % des poids de Pythia, contre 17,5 % pour toute l'attention. |
| ablation | Couper une tĂȘte : sa contribution est remplacĂ©e par des zĂ©ros avant que l'Ă©tage ne rassemble ses douze tĂȘtes. Elle calcule encore, mais elle ne pĂšse plus sur la suite. Couper les 5 meilleures tĂȘtes d'induction fait passer la perte de la 2e copie de 5,81 Ă 13,77 ; couper 5 tĂȘtes tirĂ©es au hasard la laisse Ă 6,38. |
Les quatre notes â puits, prĂ©cĂ©dent, soi, induction â sont calculĂ©es de la mĂȘme façon pour les 144 tĂȘtes, sans en choisir aucune Ă la main ; « Comment on a trouvĂ© ces tĂȘtes » donne le calcul. Une mĂȘme tĂȘte peut ĂȘtre haute sur deux notes Ă la fois : la couche 4, tĂȘte 6 note 0,987 en puits et 0,815 en induction.