lf.wtf
Compte rendu de labo 01

Recherche en IA · SmolLM2-135M

Greffes de circuits

Écrit et produit en collaboration avec Claude Opus 5.5

Nous avons greffé un petit circuit dans les neurones d'un modèle de 135M, sans entraînement par gradient. Le modèle est SmolLM2-135M, et aucun de ses poids d'origine n'a changé. Sur des problèmes réservés et scellés, son score en multiplication est passé de 21.3% à 83.1%.

Où se trouve la greffe dans SmolLM2-135MLe texte entre sous forme de tokens, traverse 30 couches de neurones, et la tête de sortie choisit le token suivant. La greffe est un petit circuit ajouté à côté des couches. Elle lit la couche 20 et ajoute sa poussée à la dernière couche, la couche 29, juste avant la tête de sortie. Les neurones d'origine restent inchangés.014202129Couches 0 à 29. Les points sont un échantillon de chaque couche, pas à l'échelle.Tokensen entréeTêtede sortieTokensuivantGreffe25,270 à 121,198poids ajoutés,moins de 0.1%132Neurones d'origine, inchangésGreffe, ajoutée à côté des couches Où se trouve la greffe dans SmolLM2-135MLe texte entre sous forme de tokens, traverse 30 couches de neurones, et la tête de sortie choisit le token suivant. La greffe est un petit circuit ajouté à côté des couches. Elle lit la couche 20 et ajoute sa poussée à la dernière couche, la couche 29, juste avant la tête de sortie. Les neurones d'origine restent inchangés.Tokens en entrée014202129Tête de sortieToken suivantGreffe25,270 à 121,198poids ajoutés,moins de 0.1%132Neurones d'origine, inchangésGreffe, ajoutée à côté des couchesPoints : extrait par couche, pas à l'échelle.
Où se trouve la greffe. SmolLM2-135M compte 30 couches, chacune formée d'un bloc d'attention (9 têtes) suivi d'un bloc MLP, qui travaillent sur un état caché de 576 nombres de large, soit environ 134.5M poids au total. La greffe est un petit circuit ajouté à côté des couches, comme une dérivation. Aucun neurone ni poids d'origine ne change.
  1. La lecture et les deux interrupteurs prélèvent l'état caché à l'entrée du MLP de la couche 20, à la position où le modèle s'apprête à écrire son prochain chiffre de réponse.
  2. La poussée de la greffe est ajoutée à la sortie du MLP de la couche 29, la dernière couche, à cette même position, juste avant que la tête de sortie choisisse le token suivant.
  3. Pour l'addition à trois chiffres, la lecture combine aussi les couches 14 et 21 (1,728 nombres au total). L'écriture se fait toujours dans la dernière couche.
Multiplication, problèmes réservés
21.3% → 83.1%
Poids d'origine modifiés
0
Plus grande greffe, part du modèle
0.09%
Points d'avance sur une greffe par gradient de même taille
+57.9

Le point de départ

Une règle peut servir à de nombreux faits

Je veux savoir jusqu'où on peut pousser un petit modèle ouvert vers le niveau des modèles de pointe en modifiant directement ses poids et en y greffant de nouveaux éléments, sans gros cycle d'entraînement. L'entraînement est la voie habituelle. On fait passer des milliards de questions et de réponses dans un modèle, et la descente de gradient trouve les règles toute seule. Mais on peut aussi ouvrir un modèle, lire ce qu'il contient au milieu d'un problème, et le modifier. Alors, peut-on écrire certaines de ces règles à la main ?

Mon hypothèse de travail, c'est qu'une grande partie du raisonnement repose sur des ensembles de règles, où une seule règle sert à de nombreux faits. Poser la retenue est le cas le plus simple. Personne n'apprend chaque somme par cœur, parce qu'une seule règle de retenue les couvre toutes, à chaque position de chiffre. Dans mes notes, je l'ai formulé ainsi :

Peut-être qu'une règle tirée d'un fait coïnciderait avec la règle d'un autre.

Pour un petit modèle, stocker des faits coûte cher, et les règles coûtent peu. Le premier circuit de multiplication de ce compte rendu est conçu pour tous les problèmes de 2 × 10 à 9 × 99, et il fait 25,270 poids.

Les mêmes conversations ont fait émerger une deuxième idée qui va avec la première : un ensemble de règles d'apprentissage pour acquérir quelque chose de nouveau, à côté de règles logiques pour appliquer ce que l'on sait déjà. Ce compte rendu porte sur le côté logique.

Ce que le modèle a déjà

Les chiffres sont là

Avant de construire quoi que ce soit, nous avons regardé ce que SmolLM2 contient au moment où il commence à écrire une réponse. Une lecture linéaire de son état caché à la position de la réponse, ajustée par moindres carrés, extrait les chiffres des deux nombres presque parfaitement. Pour l'addition à trois chiffres, une seule couche ne suffisait pas, mais en combinant les couches 14, 20 et 21, on lit chaque chiffre à 99% sur des problèmes nouveaux.

Où se trouvent les chiffres

Addition à trois chiffres. Part des problèmes nouveaux pour lesquels une lecture linéaire trouve juste les six chiffres des deux nombres, en lisant une couche à la fois, puis les couches 14, 20 et 21 combinées. Chaque lecture est ajustée sur 1,500 problèmes.

76.6% Meilleure couche seule, couche 21

11.8% Dernière couche, couche 29

97.9% Couches 14, 20 et 21 combinées, et 99.2% quand cette lecture est ajustée sur 3,000 problèmes

Les 30 couches sous forme de tableau
CoucheLes six chiffres justes
00.0%
14.3%
226.0%
350.1%
452.2%
547.1%
631.4%
720.4%
818.8%
918.2%
1027.1%
1127.9%
1239.1%
1347.2%
1474.8%
1570.1%
1664.0%
1763.0%
1864.2%
1963.5%
2072.9%
2176.6%
2271.5%
2362.9%
2448.8%
2530.5%
2619.0%
2713.9%
2811.7%
2911.8%

Le modèle a donc bien lu la question. Ce qu'il ne sait pas faire de façon fiable, c'est combiner les chiffres : la retenue, l'emprunt, les tables de multiplication. C'est cette étape de combinaison que nous fournissons.

Comment fonctionne une greffe

Quatre éléments, aucun entraîné par descente de gradient

  1. LectureUne lecture linéaire pour chaque chiffre des deux nombres, tirée de l'état caché du modèle lui-même.
  2. RèglesUne petite table de correspondance pour chaque chiffre de la réponse. Le chiffre des unités vient des deux chiffres des unités ; le chiffre des dizaines vient des chiffres des dizaines plus la retenue, et ainsi de suite.
  3. ÉcritureUne poussée vers le bon token de chiffre, dans la dernière couche du modèle. Le modèle écrit toujours sa propre réponse. La greffe fait seulement pencher la balance sur le chiffre qui vient ensuite.
  4. InterrupteursDeux interrupteurs ajustés décident quand la greffe est active. Ils sont ajustés pour ne se déclencher que pendant que le modèle écrit la réponse à ce type de problème, et pour rester éteints sur les autres maths, les problèmes à énoncé, le code et le texte ordinaire.

Les lectures et les interrupteurs sont ajustés par moindres carrés en forme fermée, et les tables de règles sont écrites par un programme (à la main pour la première greffe de multiplication). Le fichier du modèle de base n'est jamais touché. Chaque greffe est ajoutée à côté.

À l'intérieur de la greffe, pour 38 + 47Lire les chiffres, appliquer les règles, pousser le bon chiffre, et laisser les deux interrupteurs décider quand la poussée est active. La poussée est ajoutée à la couche 29 et le modèle écrit 85.1Lecturepremier nombre : 3, 8second nombre : 4, 7chiffres à écrire : 22Règlesunités : 8 + 7 = 15écrire 5, retenue 1dizaines : 3 + 4 + 1 = 83Écriture1er chiffre de réponse :poussée vers 8chiffre suivant :poussée vers 54Interrupteurspoussée × interrupteursactif : cette réponseinactif : autre texteAjoutée en couche 29. Le modèle écrit 85. À l'intérieur de la greffe, pour 38 + 47Lire les chiffres, appliquer les règles, pousser le bon chiffre, et laisser les deux interrupteurs décider quand la poussée est active. La poussée est ajoutée à la couche 29 et le modèle écrit 85.1Lecturepremier nombre : 3, 8second nombre : 4, 7chiffres à écrire : 22Règlesunités : 8 + 7 = 15écrire 5, retenue 1dizaines : 3 + 4 + 1 = 83Écriture1er chiffre de réponse : poussée vers 8chiffre suivant : poussée vers 54Interrupteurspoussée × interrupteursactif : cette réponseinactif : autre texteAjoutée en couche 29. Le modèle écrit 85.
À l'intérieur de la greffe, avec 38 + 47 comme illustration. La lecture trouve 3, 8, 4 et 7, et qu'il reste deux chiffres de réponse. Les règles donnent 8 + 7 = 15, donc le chiffre des unités est 5 avec une retenue de 1, et le chiffre des dizaines est 3 + 4 + 1 = 8. À la première position de réponse, la greffe pousse le 8, et à la suivante elle pousse le 5. La poussée est mise à l'échelle pour chaque position de chiffre. Deux interrupteurs multiplient la poussée, si bien qu'elle n'est active que pendant que le modèle écrit la réponse à ce type de problème. Le modèle écrit toujours sa propre réponse.

Comment ça a évolué

D'une greffe à un pipeline

  1. Greffe de neuronesLe premier essai a ajouté 24 nouveaux neurones à la dernière couche pour fournir la retenue de l'addition à deux chiffres. Il a tenu sur des problèmes scellés, +19.7 points. Il fonctionnait en infléchissant légèrement l'arithmétique du modèle lui-même, donc l'étape suivante était de faire le calcul directement.
  2. Circuit câblé à la mainPour la multiplication, nous avons écrit les tables de règles à la main et nous leur avons fourni les lectures de chiffres du modèle lui-même. La première version a obtenu 83.5% sur des problèmes réservés et scellés, contre 21.3% avant. Une deuxième version, avec de meilleurs interrupteurs, a obtenu 83.1%, et sa pire variation sur les autres maths était de −0.75 points.
  3. Règles trouvées par un programmeUn programme chargé de trouver des règles a reçu 340 problèmes résolus, sous forme de chiffres et de réponses. Pour chaque chiffre de la réponse, il a cherché le plus petit ensemble d'entrées qui le détermine. Il a trouvé seul la retenue de l'addition, l'emprunt de la soustraction et la chaîne de retenues de la multiplication. Il a aussi trouvé que le chiffre des dizaines suit la règle des unités, réutilisée sur les chiffres des dizaines, plus une étape de retenue : une seule règle qui sert à plusieurs chiffres, c'est-à-dire l'idée de départ. Son circuit de multiplication a obtenu 82.7% sur problèmes réservés, à moins d'un demi-point de celui câblé à la main.
  4. Même pipeline, nouvelles compétencesLa soustraction et l'addition à deux chiffres sont passées par le même script, avec des réglages copiés de la multiplication et sans ajustement. L'addition à trois chiffres a demandé trois correctifs, chacun testé avant l'ouverture de son jeu réservé : la lecture combinée sur trois couches, un deuxième interrupteur, et une intensité de poussée fixée pour chaque position de chiffre.
Comment fonctionne le chercheur de règles340 problèmes résolus entrent. Pour chaque chiffre de la réponse, le programme trouve le plus petit ensemble d'entrées qui le détermine, trouve que le chiffre des dizaines réutilise la règle des unités plus une retenue, et compile les règles en tables de correspondance.340 problèmes résolus38 + 47 = 8516 + 29 = 4552 + 31 = 83...Entrées minimales par chiffreunités ← les deux unitésdizaines ← les deux dizaines+ retenue des unitésRègle des unités, reprise au rang suivantTables de correspondance8, 7 → 5, retenue 16, 9 → 5, retenue 12, 1 → 3, retenue 0... Comment fonctionne le chercheur de règles340 problèmes résolus entrent. Pour chaque chiffre de la réponse, le programme trouve le plus petit ensemble d'entrées qui le détermine, trouve que le chiffre des dizaines réutilise la règle des unités plus une retenue, et compile les règles en tables de correspondance.340 problèmes résolus38 + 47 = 8516 + 29 = 4552 + 31 = 83...Entrées minimales par chiffreunités ← les deux unitésdizaines ← les deux dizaines+ retenue des unitésRègle des unités, reprise au rang suivantTables de correspondance8, 7 → 5, retenue 16, 9 → 5, retenue 12, 1 → 3, retenue 0...
Le chercheur de règles. Il reçoit 340 problèmes résolus, sous forme de chiffres et de réponses. Pour chaque chiffre de la réponse, il trouve le plus petit ensemble d'entrées qui le détermine : le chiffre des unités ne dépend que des deux chiffres des unités. Il trouve que le chiffre des dizaines réutilise la règle des unités plus une retenue, et compile les règles en tables de correspondance. Les lignes d'exemple servent d'illustration.

Pourquoi ça a marché

Pourquoi le programme a pu trouver les règles

Les règles ne viennent pas du modèle. Un programme séparé les a trouvées, en dehors du modèle, à partir de 340 exemples résolus. Le rôle du modèle est de fournir les nombres, que la greffe lit dans son état caché. Quatre choses l'ont rendu possible.

  1. Découper les problèmes en chiffresEn nombres entiers, 7 × 48 = 336 est un fait parmi 720 problèmes possibles. Découpé en chiffres, un motif apparaît : le dernier chiffre de la réponse ne dépend que du 7 et du 8. C'est le choix le plus important que nous ayons fait, et il convient à SmolLM2, qui stocke chaque chiffre comme un token à part.
  2. Chercher l'explication la plus simplePour chaque chiffre de la réponse, le programme cherche le plus petit ensemble de chiffres d'entrée qui le détermine toujours, et ne garde une règle que si elle tient sur chaque exemple. Une règle fondée sur deux chiffres compte environ 100 entrées possibles, et 340 exemples les remplissent presque toutes, donc elle marche sur de nouveaux problèmes qui reprennent les mêmes paires. Mémoriser reviendrait à se fonder sur tous les chiffres d'entrée, avec bien plus de combinaisons que 340 exemples ne peuvent en couvrir.
  3. Réutiliser ce qu'il avait trouvéPour le chiffre suivant, il réessaie la règle des unités et vérifie si un signal supplémentaire explique ce qui reste. Ce signal s'est révélé être la retenue. Personne n'a donné le mot au programme ; il a trouvé la variable parce que les données en avaient besoin. Refaire la même étape pour le chiffre des centaines donne la chaîne de retenues.
  4. Vérifier sur des problèmes inéditsLes règles ont été testées sur des problèmes qu'elles n'avaient pas vus, puis compilées en tables de correspondance dans la greffe.

L'entraînement par gradient n'a aucune attirance intégrée vers l'explication la plus simple, et avec peu d'exemples il a mémorisé. En multiplication, la greffe par gradient de même taille a obtenu 72.7% sur ses propres problèmes d'entraînement et 25.1% sur les 140 problèmes de développement. Le circuit a obtenu 94.7% sur les problèmes qui ont servi à le construire et 88.7% sur ces mêmes problèmes de développement.

Nous avons fixé le découpage en chiffres, et le programme trouve des règles à l'intérieur. La prochaine étape vers des compétences au-delà de l'arithmétique est un programme qui trouve aussi la bonne façon de découper un problème.

Résultats

Cinq compétences, sur des problèmes jamais utilisés pour ajuster

Les problèmes réservés de chaque compétence ont été mis de côté avant toute construction, et rien n'a été ajusté dessus. Chaque score repose sur deux graines et quatre exécutions par problème, avec les mêmes réglages d'échantillonnage pour le modèle seul et avec la greffe. Le jeu de multiplication a été ouvert une fois pour la première version câblée à la main, puis une fois de plus pour les deux versions finales.

Exactitude sur problèmes réservés, SmolLM2-135M

Part des problèmes avec une réponse exactement juste. 140 problèmes pour la multiplication, 500 pour les autres.

  • SmolLM2 seul
  • Avec la greffe
  • Même greffe, câblage mélangé
Multiplication7 × 48, règles câblées à la main
21.3% → 83.1%+61.8
Multiplication7 × 48, règles trouvées par un programme
21.3% → 82.7%+61.3
Soustraction, deux chiffres83 − 27, règles trouvées par un programme
11.3% → 68.3%+57.1
Addition, deux chiffres38 + 47, règles trouvées par un programme
49.7% → 86.5%+36.8
Addition, trois chiffres347 + 285, règles trouvées par un programme
26.1% → 83.7%+57.6
Les mêmes résultats sous forme de tableau
CompétenceProblèmesSmolLM2 seulAvec la greffeGain, points (borne inférieure à 95%)Câblage mélangéPoids ajoutés
Multiplication, règles câblées à la main7 × 4814021.3%83.1%+61.8 (+56.1)2.4%25,2700.019%
Multiplication, règles trouvées par un programme7 × 4814021.3%82.7%+61.3 (+55.5)6.3%32,5190.024%
Soustraction, deux chiffres83 − 2750011.3%68.3%+57.1 (+54.0)7.8%32,4460.024%
Addition, deux chiffres38 + 4750049.7%86.5%+36.8 (+33.8)16.7%32,4760.024%
Addition, trois chiffres347 + 28550026.1%83.7%+57.6 (+54.6)21.4%121,1980.090%
  • Aucun poids d'origine n'a été modifié, et il n'y a eu aucun entraînement par gradient. Chaque greffe ajoute de 25,270 à 121,198 poids, soit 0.019% à 0.090% du modèle. Le plafond que nous nous étions fixé était de 0.1%.
  • Le contrôle mélangé est la même greffe avec son câblage brassé au hasard. Sur chaque compétence, il a obtenu un score égal ou inférieur à celui du modèle seul, de 2.4% à 21.4%, donc les poids en plus ne font rien sans les bonnes règles.
  • Les trois greffes à deux chiffres (multiplication, soustraction et addition) fonctionnent aussi ensemble dans un seul modèle, 92,496 poids au total. Chacune a conservé son gain sur les problèmes de développement. La pire variation sur les autres maths était de −0.25 points, et 200 prompts sans rapport sur 200 ont donné la même réponse qu'avant.

Les gains sont appariés par problème, avec une borne inférieure bootstrap unilatérale à 95%. Le contrôle des effets secondaires couvre huit autres jeux d'arithmétique et de problèmes à énoncé, plus GSM8K et du code. Les prompts sans rapport sont 200 prompts IFEval, avec des réponses en décodage glouton. Les règles et les prédictions de chaque exécution ont été notées avant son résultat.

Face à l'entraînement par gradient

Trois face-à-face

L'entraînement par gradient est la méthode standard pour ajouter une compétence, nous l'avons donc pris comme concurrent. Chaque greffe par gradient a été ajustée sur une grille de réglages avant son test.

Multiplication, problèmes réservés scellés

140 problèmes, 2 graines, 4 exécutions chacun. Le premier circuit câblé à la main face à deux greffes entraînées par gradient et ajustées.

SmolLM2 seul
21.3%
Greffe par gradient, même taille14 neurones
25.6%
Greffe par gradient au plafond de 0.1%77 neurones
23.7%
Greffe de circuit25,270 poids, sans gradient
83.5%

Le circuit avait 57.9 et 59.8 points d'avance.

Multiplication face au fine-tuning LoRA

140 problèmes de développement, 2 graines, 4 exécutions chacun. LoRA a utilisé le meilleur réglage issu d'une recherche par grille.

SmolLM2 seul
28.5%
Fine-tuning LoRA115,200 poids entraînés
39.4%
Greffe de circuit25,270 poids, sans gradient
88.7%

49.3 points d'avance, avec une borne inférieure à 95% de +42.8, en utilisant moins d'un quart des poids.

Soustraction à deux chiffres

500 problèmes de développement, 2 graines, 4 exécutions chacun. Les réglages du circuit ont été copiés de la multiplication, sans ajustement.

SmolLM2 seul
11.35%
Greffe par gradient, 14 neurones
48.15%
Greffe par gradient, 77 neurones133,056 poids, avec ajustement
65.0%
Greffe de circuit32,446 poids, sans ajustement
64.98%

Égalité avec une greffe par gradient quatre fois plus grande, et environ 17 points d'avance sur celle à 14 neurones.

Les règles de soustraction du circuit viennent de 340 problèmes. Les greffes par gradient se sont entraînées sur 1,500, les mêmes 1,500 sur lesquels les lectures de chiffres du circuit ont été ajustées.

Encore en cours

Transplantations depuis des modèles plus grands

Nous essayons aussi de transférer des compétences depuis des modèles plus grands. Qwen3.5-4B a réussi 300 de ces problèmes de multiplication sur 300 lors de notre vérification, alors nous avons essayé de traduire un ensemble de ses neurones dans SmolLM2. Par ailleurs, nous avons transposé un signal de correction de Qwen3.5-4B vers Qwen3.5-0.8B sur des problèmes à énoncé de niveau école primaire. Aucun des deux n'a encore fonctionné, et les deux pistes restent ouvertes. Jusqu'ici, le grand modèle a surtout servi de guide pour voir où le petit lâche.

Ce qu'est une greffe

Une calculatrice alimentée par la lecture du modèle lui-même

La greffe fait le calcul elle-même, à partir de nombres que le modèle contient déjà. SmolLM2 n'apprend pas à multiplier. La greffe fonctionne sur la forme simple de la question (« Combien font 347 + 285 ? »), et les interrupteurs la gardent éteinte sur les problèmes à énoncé, volontairement. Tout cela ne porte que sur un seul modèle pour l'instant.

La méthode se transpose à de nouvelles compétences. Les règles sont trouvées par un programme à partir de 340 exemples, compilées en tables, puis mises en place avec les mêmes réglages pour chaque compétence. Prochaine étape, le côté apprentissage : amener SmolLM2 à utiliser un fait qu'on lui donne dans le prompt.