đ Apprendre Ă un LLM français de 15M Ă penser plus profond â et Ă savoir quand s'arrĂȘter đ«đ·
đ€ Contexte â oĂč on en Ă©tait
Si tu as lu le deuxiĂšme article : un LLM français de 15M paramĂštres, construit from scratch, solo, sur une GTX 1080 Ti. Une semaine entiĂšre de mesurer â corriger â mesurer a prouvĂ© que l'architecture est un seuil, pas un levier â les gains venaient des donnĂ©es (document packing) et du dĂ©codage (repetition_penalty 1.3), pas du modĂšle.
Cet article se terminait sur une promesse : passer Ă 25-30M avec le corpus Ă©tendu. Celui-ci, c'est le dĂ©tour que j'ai pris d'abord â et c'est lĂ que le projet est devenu vraiment intĂ©ressant.
La question que je ne pouvais pas lĂącher : si optimiser ce que le modĂšle voit est Ă©puisĂ©, est-ce que je peux changer comment il apprend ? Et quand ça a Ă©chouĂ© quatre fois de suite â est-ce que je pouvais changer la forme du calcul lui-mĂȘme sans ajouter un seul paramĂštre ?
Le chemin : quatre Ă©checs honnĂȘtes, puis un transformer en boucle (issu de deux papiers) qui bat la baseline sur la perplexitĂ©, puis une combinaison que j'ai assemblĂ©e â arrĂȘt par entropie par token, 0 paramĂštre, appris Ă l'entraĂźnement â qui Ă©change la qualitĂ© in-domain contre la robustesse out-of-domain. VoilĂ le chemin honnĂȘte, Ă©checs et impasses inclus.
â ïž RĂ©sultats prĂ©liminaires â 1 seed, variance non contrĂŽlĂ©e. Chaque nombre ci-dessous est un seul run d'entraĂźnement Ă©valuĂ© une fois (50 prompts Ă 200 tokens, seed d'Ă©chantillonnage fixe). Les Ă©carts sont rĂ©els mais petits, et je n'ai pas encore fait tourner plusieurs seeds. Traite ça comme un carnet de labo, pas un benchmark. La validation multi-seed est la prochaine Ă©tape explicite avant que quoi que ce soit devienne une affirmation.
đ§Ź Ce n'est pas inventĂ© from scratch â et j'ai fait la revue de littĂ©rature pour le prouver. La profondeur adaptative par token, c'est Adaptive Computation Time (ACT, Graves 2016). Boucler un bloc partagĂ©, c'est le Universal Transformer (Dehghani et al. 2018), rĂ©cemment mis Ă l'Ă©chelle en Recurrent-Depth Transformer (Geiping et al. 2025, Huginn-3.5B â le RDT canonique que mes modĂšles suivent). L'arrĂȘt sur confiance/entropie, c'est CALM (Schuster et al., Google 2022) entre couches. Et le travail le plus proche : LoopViT (Shu et al., 2026) combine dĂ©jĂ une sortie par entropie prĂ©dictive sans paramĂštre avec une boucle Ă poids partagĂ©s â deux de mes trois ingrĂ©dients, dans un seul papier. Donc la combinaison entropie + boucle n'est pas nouvelle ; LoopViT l'a fait. Ce qui reste du mien est Ă©troit : LoopViT est vision (ARC-AGI) avec une sortie appliquĂ©e Ă l'infĂ©rence ; moi je fais du langage autorĂ©gressif, avec un arrĂȘt par token, appris pendant l'entraĂźnement. C'est une variante, pas une invention. Je montre ce que j'ai mesurĂ©, Ă toi de juger.
đ§ La campagne "comment il apprend" â quatre Ă©checs honnĂȘtes
Le modĂšle mental en entrant : j'avais franchi le seuil d'architecture, donc les leviers restants concernaient comment les mĂȘmes donnĂ©es se transforment en poids. MĂȘme corpus, mĂȘmes paramĂštres â seule la dynamique d'apprentissage change. ZĂ©ro capacitĂ© ajoutĂ©e, donc impossible de dĂ©passer le plafond des 15M. En thĂ©orie, le dernier levier valable Ă petite Ă©chelle.
J'ai testĂ© rigoureusement â mĂȘme corpus, mĂȘmes epochs, mĂȘme harness d'Ă©val, seed fixe des deux cĂŽtĂ©s. VoilĂ le tableau :
| Levier | Idée | Résultat |
|---|---|---|
| AdamW ÎČ2 = 0.95 | rĂ©agir plus vite aux changements de gradient (style LLaMA/GPT-3) | â neutre sur PPL, cohĂ©rence pire |
| Optimiseur Lion | mises Ă jour par signe, souvent meilleur sur petits modĂšles | â proche mais < AdamW (mĂȘme aprĂšs correction du LR) |
| PrĂ©diction multi-token | 2Ăšme tĂȘte prĂ©dit t+2, reprĂ©sentations plus riches | â nĂ©gatif â self_ppl 9 â 20, il a volĂ© la capacitĂ© Ă t+1 |
| LayerScale | gate apprise par canal, blocs dĂ©marrent quasi-identitĂ© | â sous-fit Ă 2 epochs, val_loss 3.65 vs 3.46 |
Quatre leviers. Quatre pertes. Et un caveat sur Lion qui mĂ©rite d'ĂȘtre dit clairement : mon premier run Lion "a Ă©chouĂ©" Ă lr=1e-4 â mais c'Ă©tait juste un learning rate trop petit (Lion a besoin d'~5Ă moins qu'AdamW). RetestĂ© Ă 2e-4 : toujours perdu, mais lĂ c'est une comparaison honnĂȘte. Un Ă©chec dĂ» Ă un mauvais rĂ©glage n'est pas le mĂȘme qu'un Ă©chec de la mĂ©thode â il faut sĂ©parer les deux avant de conclure, sinon on jette de bonnes idĂ©es pour les mauvaises raisons.
Le verdict aprĂšs quatre : Ă 15M sur un corpus français longue traĂźne, l'optimiseur et l'init ne sont pas le levier. Signal fort que ce qui plafonne le modĂšle n'est pas comment il apprend â c'est la capacitĂ©. Aucune rĂšgle de mise Ă jour ne crĂ©e une capacitĂ© compositionnelle que l'architecture n'a structurellement pas.
Ce qui pointait vers la seule chose que je n'avais pas touchĂ©e : la forme du calcul lui-mĂȘme.
đ Deux papiers, une idĂ©e â penser plus profond, pas plus large
J'ai lu deux papiers en entier (tous deux s'entraĂźnent from scratch, tous deux Ă petite Ă©chelle â mon rĂ©gime, pas du territoire LLM frontier) :
- "Loop, Think, & Generalize" (Kohli et al., Ohio State, COLM 2026) · arXiv:2604.07822
- "Thinking Deeper, Not Longer" (Hung-Hsuan Chen, National Central University â moins d'1M paramĂštres) · arXiv:2603.21676
Les deux s'appuient sur le Recurrent-Depth Transformer (Geiping et al. 2025) â la mĂȘme idĂ©e centrale : le transformer recurrent-depth (ou en boucle). Au lieu d'empiler L couches distinctes, on rĂ©utilise le mĂȘme bloc R fois. La profondeur effective devient L Ă R â sans ajouter de paramĂštres.
Pourquoi c'est l'opposĂ© de chaque Ă©chec prĂ©cĂ©dent : multi-token, LayerScale, tĂȘtes supplĂ©mentaires â ils demandent plus au modĂšle, donc ils saturent le plafond des 15M. La boucle ne demande rien de nouveau. Elle donne aux mĂȘmes poids plus de passes pour composer ce qu'ils savent dĂ©jĂ .
Et ça cible exactement ma maladie. Un transformer vanilla stocke les faits par couche : il rĂ©cupĂšre "l'interprĂšte de Imagine est Lennon" dans une couche peu profonde, puis "la femme de Lennon est Ono" dans une couche plus profonde. Si le deuxiĂšme fait vit dans une couche que le premier ne peut pas atteindre, la chaĂźne se brise. C'est la composition multi-sauts â et c'est prĂ©cisĂ©ment lĂ oĂč les papiers montrent que les transformers vanilla Ă©chouent et les transformers en boucle rĂ©ussissent. La dĂ©rive thĂ©matique de mon modĂšle est le mĂȘme Ă©chec dĂ©guisĂ©.
Contrairement à Mamba ou à une nouvelle attention (qui "ont des limites" seulement à l'échelle frontier), la boucle garde mon bloc GPT-2 exact intact et le passe juste dans un for. Le premier levier architectural qui rentre vraiment dans mon échelle.
đ ïž La construction â trois ingrĂ©dients, deux piĂšges
En lisant les deux papiers complÚtement (les détails sont dans les annexes, pas dans les abstracts), la recette :
- La boucle â appliquer les
n_layerblocsRfois.R=1c'est le modĂšle plain, intact. - Depth embedding â un vecteur appris par itĂ©ration ajoutĂ© avant chaque passe, pour que le bloc partagĂ© puisse distinguer "itĂ©ration 1" de "itĂ©ration 4".
- Zero-init les projections résiduelles (
c_proj,down_proj) â chaque bloc dĂ©marre comme une identitĂ© exacte. Les papiers montrent que sans ça, la boucle est instable et dĂ©pendante du seed.
Ensuite les deux piĂšges que j'ai rencontrĂ©s â du genre qu'on ne trouve qu'en faisant tourner le code, pas en lisant le papier :
PiĂšge 1 : ne jamais combiner zero-init ET LayerScale. Zero-init rend la sortie du sous-bloc exactement
0. LayerScale calculex + γ·0â Îł ne reçoit jamais de gradient, gelĂ© Ă1e-4pour toujours. Les deux tricks "identitĂ© Ă l'init" s'annulent. Le papier 1 utilise zero-init seul ; j'ai suivi. (Bonus : c'est pourquoi mon LayerScale standalone prĂ©cĂ©dent avait Ă©chouĂ© â le trick n'a de sens que dans la boucle pour laquelle il a Ă©tĂ© conçu.)
PiĂšge 2 : le gradient checkpointing plantait avec le dropout.
R=4signifie que le backward pass doit tenir les activations pour 32 passes de blocs (8Ă4) â il saturait 11 Go. Le checkpointing rĂšgle la mĂ©moire, mais son mode non-rĂ©entrant lançaitCheckpointError: 559 vs 32 tensorsparce que le dropout rend le recalcul non-dĂ©terministe. Correction :preserve_rng_state=True(mĂȘme masque de dropout au recalcul â numĂ©riquement correct) +determinism_check="none"(supprimer le garde trop strict).
Le VRAM de pointe est passĂ© de out-of-memory Ă ~5 Go en divisant aussi le batch par deux (16â8) et en doublant l'accumulation (4â8) â mĂȘme batch effectif de 64, maths identiques.
đ Le rĂ©sultat â la rĂ©currence bouge la perplexitĂ©, et peu d'autre chose proprement
Je vais donner des noms aux trois variantes entraßnées, parce que "adaptive-absolute-percentile" devient illisible vite :
- Cadence â la boucle plain
R=4(la rĂ©fĂ©rence : quatre temps rĂ©guliers par token). - Focal â arrĂȘt appris, seuil d'entropie absolu (concentre le calcul ; fort in-domain).
- Nomade â arrĂȘt appris, seuil percentile (invariant Ă la taille ; robuste off-domain).
Cadence d'abord. R=4, mĂȘme protocole 20% Ă 2 epochs que chaque levier ratĂ© prĂ©cĂ©dent, Ă©valuĂ© sur le harness robuste â 50 prompts Ă 200 tokens, seed fixe (auto = vrais prompts de corpus held-out, fixed = prompts gĂ©nĂ©riques Ă©crits Ă la main) :
| Métrique | Baseline (vanilla) | Cadence (loopé R=4) |
|---|---|---|
| val_loss | 3.459 | 3.382 |
| val PPL | 31.2 | 28.9 (â7%) |
| coherence_len (auto) | 35.2 | 39.3 |
| coherence_len (fixed) | 40.7 | 32.5 |
| proper_noun_ratio (auto) â | 0.137 | 0.121 |
AprĂšs quatre Ă©checs d'affilĂ©e, quelque chose a enfin bougĂ© la mĂ©trique dure. val_loss et PPL en baisse (â7%) â aucun autre levier dans tout le projet n'a fait ça, et ça s'aligne avec la loss d'entraĂźnement, donc je lui fais confiance.
Mais soyons honnĂȘtes sur le reste. Sur les prompts in-domain (auto â vrai texte de corpus), la cohĂ©rence monte (+12%) et les noms inventĂ©s baissent. Sur les prompts out-of-domain (fixed â Paris, TCP, photosynthĂšseâŠ), la boucle est en fait pire que la baseline (cohĂ©rence 32.5 vs 40.7). La rĂ©currence approfondit le raisonnement sur ce que le modĂšle a vu et overfitte le registre qu'il connaĂźt ; sur des prompts Ă©loignĂ©s c'est un dĂ©faut, pas un atout. Un seed, donc ne pas sur-lire les magnitudes â mais la direction (in-domain monte, out-of-domain descend) est cohĂ©rente entre les mĂ©triques.
â ïž Une note sur les chiffres prĂ©cĂ©dents. Mon premier eval utilisait 8 prompts Ă 80 tokens et rapportait des Ă©carts dramatiques (cohĂ©rence 45.6, proper_noun â62%). C'Ă©tait du bruit â une moyenne sur 8 prompts, un seed. Les chiffres 50Ă200 ci-dessus remplacent ceux-lĂ . Si tu avais vu les anciennes valeurs, ignore-les.
đïž Ce que les chiffres ne montrent pas â lire les gĂ©nĂ©rations
Les mĂ©triques mentent par omission, donc j'ai lu les sorties cĂŽte Ă cĂŽte, mĂȘmes prompts, mĂȘme sampling, seed fixe.
Prompt : "Au Moyen Ăge, les chevaliersâŠ"
- Baseline : "chevaliers d'Afrique se trouvaient en AlgĂ©rie⊠l'Ovanhah (KaflĂž) river, connue sous le nom de NatĆnoki, appelĂ©e RukikâŠ" â noms inventĂ©s dĂ©lirants, sauts de continent en milieu de phrase.
- Cadence : "chevaliers d'Oldmann et de Cholm⊠le chĂąteau du village se dresse prĂšs de la riviĂšre ; c'est le rez-de-chaussĂ©e de l'ancienne Ă©glise." â invente encore des noms, mais reste dans un registre mĂ©diĂ©val-europĂ©en cohĂ©rent (chĂąteau, Ă©glise). Le taux rĂ©duit de noms inventĂ©s, rendu visible.
Prompt : "La capitale de la France estâŠ"
- Baseline : "une ville emblématique⊠les Pays-Bas septentrionaux⊠l'identité rurale du Cameroun." Salade.
- Cadence : "une ville emblĂ©matique, nichĂ©e dans un riche cadre architectural⊠vestiges mĂ©diĂ©vaux⊠## GĂ©ographie." Aucun des deux ne dit Paris (c'est le plafond de capacitĂ© â aucun trick n'invente des faits), mais Cadence tient un seul registre au lieu de se tĂ©lĂ©porter aux quatre coins du globe.
Conclusion honnĂȘte : les modĂšles rĂ©currents ne savent pas plus de faits â ils restent plus cohĂ©rents et inventent moins de noms farfelus. Ce qui est exactement la thĂ©orie. La rĂ©currence achĂšte de la composition et de la consistance, pas de la connaissance stockĂ©e.
đŹ L'expĂ©rience qui a Ă©chouĂ© â et qui a le plus appris
Les papiers promettent un passage à l'échelle à l'inférence : entraßner une fois, puis augmenter R à la volée à la génération pour "penser plus longtemps" sur des prompts difficiles. Du raisonnement extra gratuit, sans ré-entraßnement. Je devais tester ça.
J'ai chargé le modÚle entraßné R=4 (poids gelés) et changé juste le nombre de boucles à la génération :
| R à la génération | Résultat |
|---|---|
R=2 (en dessous de l'entraĂźnement) |
â rafales de rĂ©pĂ©tition â "Espagnol Allemand Allemand Belge AmĂ©ricainâŠ" â sous-rĂ©flexion |
R=4 (= entraĂźnement) |
â le point optimal |
R=8 (au-dessus de l'entraĂźnement) |
â dĂ©rive vers du charabia typographique â sur-rĂ©flexion |
Ăa a Ă©chouĂ© â et exactement comme le papier 1 dit qu'un R fixe Ă©choue : bloquĂ© Ă sa profondeur d'entraĂźnement, sous-calcule en dessous et sur-rĂ©flĂ©chit au-dessus. Les papiers dĂ©bloquent le scaling R libre seulement avec dynamic-R (en Ă©chantillonnant R par batch pendant l'entraĂźnement), jamais avec un R fixe.
Mais dynamic-R ne vaut que quand "penser plus longtemps" a une profondeur cible â un graphe Ă k sauts = k itĂ©rations, les tĂąches synthĂ©tiques des papiers. Le français libre n'a pas de "nombre de sauts" Ă rĂ©soudre, donc je l'ai mis de cĂŽtĂ© : un run de 5-6h pour un gain qui ne mappe pas Ă ma tĂąche. Un rĂ©sultat nĂ©gatif qui Ă©vite un gaspillage de calcul Ă l'air positif, c'est quand mĂȘme une victoire.
đĄ Combiner des piĂšces connues â profondeur adaptative par token
C'est lĂ que j'ai arrĂȘtĂ© d'appliquer un papier et commencĂ© Ă en combiner plusieurs.
L'intuition est venue directement de mon corpus. Tous les tokens n'ont pas besoin de la mĂȘme quantitĂ© de rĂ©flexion. "le", "de", "et" â trivial, prĂ©dit-les en une passe. Mais un nom rare, un hapax â exactement les tokens qui font halluciner mon modĂšle â ceux-lĂ ont besoin des quatre boucles pour ĂȘtre bien reprĂ©sentĂ©s. Alors pourquoi dĂ©penser R=4 sur chaque token ? Laisse chaque token s'arrĂȘter quand il est confiant, continue de boucler quand il ne l'est pas.
C'est ACT â Adaptive Computation Time (Graves 2016) : profondeur variable par token. La nouveautĂ©, si tant est qu'il y en ait une, est dans comment j'arrĂȘte. ACT apprend une unitĂ© d'arrĂȘt dĂ©diĂ©e avec un "ponder cost" Ă rĂ©gler (paramĂštres supplĂ©mentaires) ; idem PonderNet, le Sparse Universal Transformer, et le rĂ©cent Frey et al. (2026) "Adaptive Loops" â tous utilisent un routeur d'arrĂȘt paramĂ©trique. Ce que je fais, c'est utiliser l'entropie de la distribution de sortie comme signal d'arrĂȘt â une valeur que je calcule dĂ©jĂ , donc zĂ©ro paramĂštre ajoutĂ©.
Et c'est lĂ que la revue de littĂ©rature m'a rattrapĂ© : cette idĂ©e entropie-dans-une-boucle est dĂ©jĂ publiĂ©e. LoopViT (Shu et al., 2026) combine une sortie par entropie prĂ©dictive sans paramĂštre avec une boucle Ă poids partagĂ©s â exactement deux de mes trois ingrĂ©dients. Donc je n'appellerai pas ça une combinaison nouvelle. Ce qui diffĂšre est Ă©troit et je le dis clairement : LoopViT est de la vision (puzzles ARC-AGI) avec la sortie appliquĂ©e Ă l'infĂ©rence ; moi c'est du langage autorĂ©gressif, arrĂȘt par token, et â la seule chose que mon propre Ă©chec expĂ©rimental m'a forcĂ© Ă bien faire â l'arrĂȘt est actif pendant l'entraĂźnement, pour que le modĂšle apprenne Ă ĂȘtre bon Ă la profondeur oĂč il s'arrĂȘte. Une variante dans un domaine diffĂ©rent, pas une invention.
DĂ©tail intĂ©ressant : l'un des deux papiers sources (Chen) a explicitement rejetĂ© l'arrĂȘt par token comme "les probabilitĂ©s d'arrĂȘt par token complexes de ACT et la rĂ©gularisation du ponder cost" et est restĂ© sur un R fixe. J'ai fait l'inverse â gardĂ© l'arrĂȘt par token, mais rendu le critĂšre gratuit.
Tentative A â arrĂȘt Ă l'infĂ©rence (volontairement Ă©chouĂ©)
D'abord j'ai essayé la version cheap : prendre le modÚle R=4 entraßné, et laisser les tokens confiants sortir de la boucle tÎt à la génération. Sans ré-entraßnement.
Ăa a dĂ©gradĂ© â monotonement avec le seuil (val PPL 28.9 â 31.1 â 34.9). Et je savais pourquoi avant mĂȘme de lancer, depuis l'Ă©chec du scaling Ă l'infĂ©rence : le modĂšle n'a Ă©tĂ© entraĂźnĂ© qu'Ă ĂȘtre bon Ă R=4. Un token arrĂȘtĂ© Ă R=2 est sous-calculĂ©, parce que le modĂšle n'a jamais appris Ă produire une bonne rĂ©ponse Ă R=2. MĂȘme maladie.
Mais cet Ă©chec m'a dit la correction. Si l'arrĂȘt Ă l'infĂ©rence sous-calcule, le modĂšle doit apprendre Ă s'arrĂȘter.
Tentative B â arrĂȘt pendant l'entraĂźnement (ça a marchĂ©)
Donc j'ai rendu l'arrĂȘt actif pendant l'entraĂźnement aussi. Maintenant chaque token s'arrĂȘte quand il est confiant pendant que le modĂšle apprend â ce qui force le modĂšle Ă devenir bon Ă la profondeur oĂč chaque token s'arrĂȘte. Les tokens faciles apprennent Ă ĂȘtre justes Ă R=1-2 ; les hapax continuent de boucler jusqu'Ă R=4. Le gradient coule Ă travers l'Ă©tat gelĂ© ; la loss n'est toujours que sur la sortie finale (pensĂ©e silencieuse).
Le rĂ©sultat â mĂȘme protocole 20% Ă 2 epochs, eval robuste (50Ă200, un seed). Focal utilise un seuil d'entropie absolu ; Nomade utilise un seuil percentile (geler les q=30% tokens actifs les moins incertains Ă chaque itĂ©ration â invariant Ă la taille, transfĂ©rable Ă un modĂšle plus grand plus tard) :
| Métrique | Baseline | Cadence (boucle) | Focal (absolu) | Nomade (percentile) |
|---|---|---|---|---|
| val PPL â | 31.2 | 28.9 | 29.1 | 31.0 |
| cohĂ©rence (auto) â | 35.2 | 39.3 | 44.1 | 36.3 |
| cohĂ©rence (fixed) â | 40.7 | 32.5 | 29.1 | 41.8 |
| proper_noun (auto) â | 0.137 | 0.121 | 0.103 | 0.094 |
| prompt_overlap (auto) â | 0.139 | 0.147 | 0.176 | 0.126 |
Pas de gagnant unique â et c'est le rĂ©sultat honnĂȘte. L'arrĂȘt appris pousse la qualitĂ© in-domain plus loin : Focal donne la meilleure cohĂ©rence in-domain (44.1 vs 35.2 baseline) et reste le plus on-topic (prompt_overlap 0.176). Mais ça rend la faiblesse out-of-domain pire, pas meilleure (cohĂ©rence 29.1). Nomade fait l'Ă©change inverse : il rĂ©cupĂšre la cohĂ©rence out-of-domain (41.8, meilleur de tous) et coupe les noms inventĂ©s le plus (0.094), mais rend l'avantage en perplexitĂ© (31.0 â baseline). Tu choisis ton Ă©change ; pas de dĂ©jeuner gratuit Ă un seed.
Tout le rĂ©sultat 50Ă200 en un seul coup d'Ćil â chaque mĂ©trique sur sa propre Ă©chelle (barres depuis zĂ©ro, donc les Ă©carts sont montrĂ©s Ă taille rĂ©elle, qui est modeste). Le gagnant Ă©toilĂ© se dĂ©place de panneau en panneau : cette dispersion est le rĂ©sultat. Cadence prend la perplexitĂ©, Focal les panneaux in-domain, Nomade les panneaux out-of-domain et hallucination. Un seed â lis le pattern, pas les dĂ©cimales.
La surprise que je n'avais pas anticipĂ©e : Ă la gĂ©nĂ©ration, l'arrĂȘt se dĂ©clenche Ă peine â le français libre garde l'entropie au-dessus du seuil, donc les tokens s'arrĂȘtent rarement. J'ai instrumentĂ© les deux modĂšles entraĂźnĂ©s sur du vrai texte français pour voir exactement oĂč les tokens arrĂȘtent de boucler :
Focal (seuil absolu) envoie 86% des tokens Ă pleine profondeur â sur du vrai texte, presque rien n'est assez confiant pour sortir tĂŽt. La rĂšgle percentile de Nomade force une cascade fixe (30% sortis aprĂšs l'itĂ©ration 1, puis 21%, 15%, 34% complets). L'instrumentation est validĂ©e : les logits de la boucle rĂ©pliquĂ©e correspondent exactement au vrai forward pass. (MesurĂ© en relançant la propre boucle d'arrĂȘt du modĂšle et en comptant les gels ; logits identiques confirment que le compte est fidĂšle.)
Donc pour Focal, l'arrĂȘt ne se dĂ©clenche presque jamais Ă l'infĂ©rence â ce qui signifie que le gain vient de l'entraĂźnement avec l'arrĂȘt, pas de son utilisation Ă l'infĂ©rence. Forcer "les tokens faciles n'ont pas besoin de quatre passes" pendant l'entraĂźnement agit comme un rĂ©gulariseur â il remodĂšle les reprĂ©sentations. Je voulais rendre le modĂšle plus rapide sur les tokens faciles ; ce que j'ai en rĂ©alitĂ© obtenu c'est un modĂšle plus cohĂ©rent sur les tokens difficiles. L'intuition pointait dans la bonne direction pour une raison que je n'avais pas prĂ©dite â ce qui est exactement pourquoi on mesure plutĂŽt que de thĂ©oriser.
Par lecture directe, Focal sur "Au Moyen Ăge, les chevaliersâŠ" â "le royaume de Brabant⊠reconstruit vers 1030 par une Ă©glise romaneâŠ" â un registre mĂ©diĂ©val tenu sur plusieurs phrases avec des dates cohĂ©rentes, un cran plus riche que Cadence. Toujours pas de faits (la capacitĂ© est ce qu'elle est) : ça ne peut pas te dire la capitale de la France. Comme levier de qualitĂ© c'est rĂ©el, mais modeste et directionnel Ă un seed â pas un titre.
đ Les courbes
Les chiffres dans un tableau cachent Ă quel point ces runs sont proches. VoilĂ la loss d'entraĂźnement pour les quatre, mĂȘme protocole, mĂȘmes axes :
Les trois variantes rĂ©currentes (Cadence, Focal, Nomade) sont quasi indiscernables Ă l'entraĂźnement â elles optimisent presque identiquement. La baseline (gris, pointillĂ©s) finit un poil plus haut. La falaise au step ~1557 est le dĂ©but de l'epoch 2. Ce quasi-chevauchement est le point : les diffĂ©rences de qualitĂ© entre ces modĂšles n'apparaissent pas dans la courbe de loss â elles n'apparaissent qu'Ă la gĂ©nĂ©ration, ce qui est exactement pourquoi le harness d'eval compte plus que la loss d'entraĂźnement.
PerplexitĂ© de validation, par epoch â lĂ oĂč vit le petit Ă©cart rĂ©el :
Cadence et Focal (la boucle et l'arrĂȘt Ă seuil absolu) font descendre la perplexitĂ© d'~2 points ; Nomade et la baseline restent ensemble. Note que ce sont les chiffres val-PPL du log d'entraĂźnement (ensemble de validation complet) ; les chiffres du harness d'eval ailleurs dans l'article (Ă©chantillon de 200 blocs, ex. Cadence 28.9) diffĂšrent d'une fraction pour la mĂȘme raison que n'importe quels deux sous-Ă©chantillons.
Et le contrĂŽle d'Ă©quitĂ© â chaque run partageait un seul schedule de learning rate, donc rien dans la comparaison n'est un artefact de schedule :
DĂ©croissance cosinus, 7% de warmup, pic 5Ă10â»âŽ â identique pour les quatre runs. Les courbes se superposent exactement, ce qui est le contrĂŽle de sanitĂ© prĂ©vu : mĂȘme optimiseur, mĂȘme schedule, seule l'architecture change.
â Ce qui a marchĂ©
- đ Cadence (loopĂ© R=4) â la seule victoire nette : val_loss/PPL en baisse â7%, et taux de noms inventĂ©s plus bas in-domain. ZĂ©ro paramĂštre ajoutĂ©. (Universal Transformer, appliquĂ© au français Ă 15M.)
- đĄ Focal & Nomade (arrĂȘt entropique 0 paramĂštre, appris) â l'effet de rĂ©gularisation est rĂ©el : Focal â meilleure cohĂ©rence in-domain (44.1) ; Nomade â meilleure cohĂ©rence out-of-domain (41.8) et moins de noms inventĂ©s (0.094). ZĂ©ro paramĂštre ajoutĂ©. IngrĂ©dients d'ACT / CALM / LoopViT ; la variante apprise Ă l'entraĂźnement est ce que j'ai testĂ©.
- đ§± Zero-init rĂ©siduels â rend le dĂ©pliage profond stable ; explique aussi un Ă©chec prĂ©cĂ©dent.
- đ§ź Checkpointing + trick de batch â 11 Go OOM â ~5 Go, maths identiques.
- đ Le harness de l'article 2, correctement lancĂ© (50Ă200) â c'est ce qui a tuĂ© mes propres chiffres gonflĂ©s Ă 8 prompts. La mesure a attrapĂ© l'overclaim avant publication.
â Ce qui n'a pas marchĂ© (et c'est bien â c'est de la recherche)
- đ ÎČ2, Lion, multi-token, LayerScale â quatre leviers "comment il apprend", quatre pertes. La capacitĂ©, pas la dynamique d'apprentissage, est le plafond.
- đ Scaling R Ă l'infĂ©rence & arrĂȘt infĂ©rence uniquement â un modĂšle Ă R fixe est bloquĂ© Ă sa profondeur d'entraĂźnement (sous-pense en dessous, sur-rĂ©flĂ©chit au-dessus). L'arrĂȘt n'aide que s'il est appris.
- đ Un seul "meilleur modĂšle" â il n'existe pas. La rĂ©currence aide in-domain et nuit out-of-domain ; l'arrĂȘt percentile inverse l'Ă©change. Des outils diffĂ©rents, pas un classement.
- đŻ FactualitĂ© â toujours plafonnĂ©e. La rĂ©currence achĂšte de la cohĂ©rence, pas de la connaissance. Aucun trick architectural n'invente des faits.
â ïž Limites (lis ça avant de citer un chiffre)
- Un seed, pas de contrÎle de variance. Chaque chiffre est un seul run évalué une fois. Les écarts sont assez petits pour que des runs multi-seed puissent les réordonner. C'est un carnet de labo, pas un benchmark.
- Les gains sont directionnels et modestes Ă 50Ă200 â rien comme les chiffres dramatiques Ă 8 prompts que j'ai d'abord vus (c'Ă©tait du bruit).
R=4coĂ»te ~4Ă le calcul par step â la profondeur se paye en temps, pas en paramĂštres.- Les papiers sources prouvent la rĂ©currence sur des tĂąches multi-sauts synthĂ©tiques ; le transfert au français libre est partiel.
- Pas nouveau â et j'ai vĂ©rifiĂ©. ACT (2016), Universal Transformer (2018), CALM (2022) prĂ©cĂšdent les piĂšces, et LoopViT (2026) combine dĂ©jĂ une sortie entropique sans paramĂštre avec une boucle Ă poids partagĂ©s. La seule chose spĂ©cifique ici est la variante apprise Ă l'entraĂźnement en langage autorĂ©gressif. J'ai fait la revue de littĂ©rature avant de publier, c'est tout l'intĂ©rĂȘt.
đ RĂ©fĂ©rence rapide
| ParamĂštre | Valeur |
|---|---|
| Changement loopĂ© | blocs n_layer loopĂ©s R=4 â profondeur effective 32, 0 paramĂštre ajoutĂ© |
| Extras | depth embedding par itération + zero-init c_proj/down_proj |
| ArrĂȘt adaptatif (le mien) | geler un token quand l'entropie de sortie < seuil, pendant l'entraĂźnement |
| Eval | 50 prompts à 200 tokens, 1 seed (préliminaire) |
| val_loss / PPL loopĂ© | 3.459 â 3.382 / 31.2 â 28.9 (â7%) |
| CohĂ©rence loopĂ©e (auto / fixed) | 35.2â39.3 / 40.7â32.5 (in-domain monte, out-of-domain descend) |
| Absolu adaptatif (auto coh / prompt_overlap) | 44.1 / 0.176 â meilleur in-domain |
| Percentile adaptatif (fixed coh / proper_noun) | 41.8 / 0.094 â meilleur out-of-domain & moins de noms inventĂ©s |
| Lignée | ACT (2016) + Universal Transformer (2018) + CALM (2022) + LoopViT (2026, le plus proche) |
| Ma variante | entropie+boucle de LoopViT, mais apprise à l'entraßnement, par token, en langage autorégressif |
| Coût | ~4à calcul/step ; batch 8 / accum 8 pour le VRAM |
| PiĂšge 1 | ne jamais combiner zero-init + LayerScale (gĂšle Îł) |
| PiĂšge 2 | checkpointing + dropout â preserve_rng_state + determinism_check="none" |
| PiĂšge 3 | l'arrĂȘt n'aide que s'il est appris â arrĂȘter un modĂšle Ă R fixe Ă l'infĂ©rence sous-calcule |
| Verdict | la rĂ©currence bouge la perplexitĂ© ; l'arrĂȘt Ă©change in-domain vs out-of-domain â pas de gagnant universel, 1 seed |
đ Conclusion
L'article 2 se terminait par une rĂšgle : l'architecture est un seuil, pas un levier. Celui-ci est l'amendement honnĂȘte. Quatre tentatives de changer comment le modĂšle apprend l'ont confirmĂ© â aucune n'a bougĂ© l'aiguille. Mais changer la forme du calcul â boucler le mĂȘme bloc plus profond, zĂ©ro paramĂštre ajoutĂ© â l'a enfin fait.
La nuance compte : le transformer en boucle n'est pas un levier de capacitĂ© (il ne peut toujours pas te dire la capitale de la France). C'est un levier de qualitĂ©, et mĂȘme ça vient avec un hic â ça aide sur les prompts que le modĂšle connaĂźt et nuit sur ceux qu'il ne connaĂźt pas. La rĂ©currence attaque la composition (chaĂźner ce que tu sais dĂ©jĂ ), qui est un vrai trou dans un transformer vanilla â mais Ă 15M, un seed, l'effet est directionnel et modeste, pas un titre.
Puis est venue la partie que j'ai assemblĂ©e moi-mĂȘme : laisser le modĂšle apprendre jusqu'oĂč penser, token par token â l'idĂ©e d'ACT, avec un critĂšre entropique Ă 0 paramĂštre, dans une boucle partagĂ©e, appris Ă l'entraĂźnement. Ăa a Ă©chouĂ© la façon cheap d'abord (arrĂȘt Ă l'infĂ©rence), et l'Ă©chec pointait directement vers la correction (arrĂȘter pendant l'entraĂźnement). Le gain n'Ă©tait pas le speedup attendu mais un effet de rĂ©gularisation, et ça achĂšte un Ă©change â in-domain vs out-of-domain â pas une victoire nette. C'est la forme honnĂȘte.
Ce que je garde vraiment de tout ça n'est pas un "meilleur modĂšle". C'est une mĂ©thode : un test cheap, un nĂ©gatif honnĂȘte, une correction mesurĂ©e â et un harness assez impitoyable pour tuer mes propres chiffres gonflĂ©s Ă 8 prompts avant que je les publie. Le rĂ©sultat est prĂ©liminaire (un seed) ; la validation multi-seed et une vraie revue de littĂ©rature viennent avant que quoi que ce soit soit une affirmation. Prochaine Ă©tape : le passage Ă l'Ă©chelle â en emportant la rĂ©currence et l'arrĂȘt percentile invariant Ă la taille, et cette fois avec des seeds. đ
đ€ Les modĂšles
Les trois sont sur le Hugging Face Hub, from scratch, 15M, Apache-2.0 â mĂȘme tableau 50Ă200 sur chaque carte pour que l'Ă©change soit visible partout :
- đ Cadence-15M-fr â la rĂ©fĂ©rence loopĂ©e R=4 (meilleure perplexitĂ©, 28.9).
- đŻ Focal-15M-fr â arrĂȘt Ă seuil absolu (meilleur in-domain : cohĂ©rence 44.1).
- đ§ Nomade-15M-fr â arrĂȘt percentile, invariant Ă la taille (meilleur out-of-domain : cohĂ©rence 41.8, moins de noms inventĂ©s).
â Q&A
â Une baisse de 0.077 de val_loss (un seed), c'est pas trop petit pour signifier quoi que ce soit ?
Tout seul, oui â traite ça comme un indice, pas une preuve. Ce qui me fait provisoirement lui faire confiance : c'est le seul levier parmi cinq qui a bougĂ© val_loss et PPL ensemble, et ça s'aligne avec la loss d'entraĂźnement. Mais c'est un seed. C'est pourquoi tout l'article est estampillĂ© prĂ©liminaire et pourquoi les runs multi-seed sont la prochaine Ă©tape, pas un tour de victoire.
â Tu n'avais pas d'abord rapportĂ© des gains bien plus grands ?
Si â et c'est l'histoire avec une morale. Mon premier eval (8 prompts Ă 80 tokens) montrait une cohĂ©rence de 58.5 et une baisse de â62% des noms inventĂ©s. RelancĂ© Ă 50 prompts Ă 200 tokens, ça devient 44.1 et â31%, avec le rĂ©sultat out-of-domain qui bascule nĂ©gatif. La version dramatique Ă©tait du bruit sur un petit Ă©chantillon. Je laisse ça dans l'article ouvertement parce que attraper ton propre chiffre gonflĂ©, c'est le job.
â Ton idĂ©e de profondeur adaptative est nouvelle ?
Non â et j'ai fait la revue plutĂŽt que de deviner. La profondeur adaptative par token c'est ACT (Graves 2016) ; la boucle Ă poids partagĂ©s c'est le Universal Transformer (2018) ; la sortie anticipĂ©e par confiance/entropie c'est CALM (Google 2022). Et le rĂ©sultat le plus proche, LoopViT (2026), combine dĂ©jĂ une sortie par entropie prĂ©dictive sans paramĂštre avec une boucle Ă poids partagĂ©s â donc "entropie + boucle" est pris. Ce qui reste du mien est Ă©troit : LoopViT c'est de la vision avec une sortie Ă l'infĂ©rence ; le mien c'est du langage autorĂ©gressif avec un arrĂȘt appris pendant l'entraĂźnement, par token. C'est une variante qui vaut d'ĂȘtre rapportĂ©e, pas une invention. Trouver le papier qui a grillĂ© les deux tiers de ton idĂ©e avant de publier, c'est mieux que de l'apprendre dans les commentaires.
â Si ça ne peut pas dire "Paris", Ă quoi ça sert ?
La factualitĂ© est un problĂšme de capacitĂ© â 15M paramĂštres sur un corpus oĂč chaque fait apparaĂźt une fois. Aucun trick de dĂ©codage ou d'architecture n'invente de la connaissance ; je l'ai montrĂ© sur trois articles maintenant. La rĂ©currence achĂšte de la cohĂ©rence, pas de la connaissance â et mĂȘme ça avec un Ă©change. Levier diffĂ©rent, pĂ©rimĂštre honnĂȘte.
â Ton arrĂȘt adaptatif se dĂ©clenche Ă peine Ă la gĂ©nĂ©ration. Donc qu'est-ce qu'il a vraiment fait ?
C'est la partie la plus intĂ©ressante. Le gain ne vient pas d'Ă©conomiser du calcul Ă l'infĂ©rence â sur du français libre, les tokens deviennent rarement assez confiants pour s'arrĂȘter. Il vient de l'entraĂźnement avec l'arrĂȘt : forcer "les tokens faciles n'ont pas besoin de quatre passes" agit comme un rĂ©gulariseur qui construit des reprĂ©sentations plus robustes. Je voulais rendre le modĂšle plus rapide sur les tokens faciles ; ce que j'ai obtenu c'est un modĂšle plus cohĂ©rent sur les tokens difficiles. L'idĂ©e pointait dans la bonne direction pour une raison que je n'avais pas prĂ©dite â ce qui est exactement pourquoi on mesure plutĂŽt que de thĂ©oriser.
đĄ Le saviez-vous ?
Un transformer Ă profondeur fixe est limitĂ© Ă une classe de complexitĂ© appelĂ©e TCâ° â il ne peut littĂ©ralement pas exprimer certains calculs sĂ©quentiels intrinsĂšques, quelle que soit sa largeur. La profondeur rĂ©currente contourne ça en rendant la profondeur variable : boucler le mĂȘme bloc laisse le calcul effectif grandir avec le problĂšme. C'est la motivation thĂ©orique pour laquelle "penser plus profond" peut aider lĂ oĂč "penser plus large" plafonne â une raison d'essayer la rĂ©currence, ce qui est tout l'objet de cet article : un essai, mesurĂ© honnĂȘtement.
Théo CHARLET
DiplÎmé TSSR (Technicien Supérieur SystÚmes et Réseaux) - Spécialisation IA/ML
Créateur d'AG-BPE (Attention-Guided Byte-Pair Encoding)
đ LinkedIn : https://www.linkedin.com/in/thĂ©o-charlet
đ RDTvlokip Search (mon moteur de recherche) : https://search.rdtvlokip.fr
đ En recherche d'alternance
đ Site : https://rdtvlokip.fr
đ GitHub du projet : https://github.com/RDTvlokip/GPT-2-French-From-Scratch




