29 Commentaires

Merci pour cet article.

Lorsqu'on parle de "l'ingrédient clé dans cette affaire", (la pénalité qui est appliquée sur les valeurs des poids pendant l’apprentissage), s'agit-il d'un terme de régularisation appliqué à la fonction de coût ?

Si oui, serait-il envisageable de réduire la durée d'apprentissage de la généralisation en jouant avec ce terme de régularisation (pénaliser plus fort dès le début) ?

Expand full comment

Oui en effet c'est une pénalité de type L2 (dans mon code via l'algo AdamW), et on peut jouer avec ce paramètre. Si on y va trop fort au début, le modèle n'arrive pas vraiment à apprendre.

Par contre j'ai un peu essayé de faire l'inverse : ne pas pénaliser trop au début pour le laisser tranquillement "apprendre par coeur", puis peu à peu augmenter la pression pour le forcer à découvrir des solutions plus parcimonieuses et donc plus généralisables.

Mais il faudrait regarder de façon plus systématique !

(Certains papier essayent aussi des pénalités et des taux d'apprentissage différents sur la partie "embedding" et sur la partie "prédicteur")

Expand full comment

En attendant David je me permets de te répondre :

Il y a généralement (à ma connaissance) deux méthodes pour ça. La première et celle que j'ai le plus vue c'est effectivement ajouter une fonction de l'amplitude des poids (leur moyenne, leur somme, ou autre chose) à la fonction de coût (ici une cross-entropy pour du multi-classes). Appeler backward sur cette double loss va bien prendre en compte la taille en poids du réseau. La seconde serait de normaliser systématiquement les poids après chaque époque. Ca se fait peu mais produit parfois de bons résultats.

Pour ta seconde question : au départ le modèle va très fortement se tromper sur ses prédictions, tellement que sa loss va être écrasée par la cross-entropy (l'erreur de prédiction), peu importe la pénalisation que tu mets sur la taille du réseau. Pour compenser la partie "classif", il faudrait vraiment une pénalisation d'amplitude des poids énormes, si grande en fait que probablement le réseau ne pourrait même pas apprendre !

Ca n'est que lorsque le réseau se trompe moins et donc que la partie classif de la loss diminue que la pénalité intervient, d'où le grokking une fois à 100% lorsque le réseau n'est que pénalisé par son poids et qu'il doit se simplifier.

Expand full comment

Merci beaucoup pour cet article, chercher plus que la simple vulgarisation et reproduire le résultat pour mieux le comprendre et l'expliquer/l'expliciter c'est vraiment puissant comme vecteur pédagogique.

Sinon pour le grokking, j'aurai une proposition de traduction, ce serait "déclic". Ça véhicule bien l'idée d'un moment où la compréhension change d'un état incorrect ou incomplet à un état de compréhension plus profonde.

Expand full comment

Ah oui, très bien vu l'idée du déclic !!

Expand full comment

d’un point de vue neurobiologique, c’est un peu la myelinisation !

Expand full comment

C'est passionnant ! Cela dit je me dis que l'exemple présenté contient peut-être un biais:

Si je ne m'abuse, l'addition modulaire est une opération symétrique, donc sélectionner aléatoirement 50% des données pour constituer le jeu d'entraînement revient à sélectionner pas loin de 100% des données à une permutation près.

Il serait peut-être intéressant de voir comment cela se comporte en sélectionnant le jeu d'entraînement pas aléatoirement (par exemple ne jamais avoir de permutation dans les ensembles) pour voir comment cela se comporte (ça permettrait peut-être de faire émerger des choses sur la manière dont le réseau fait émerger un modèle... Après j'y connais rien... :) )

Expand full comment

En effet j'ai pris l'addition pour ne pas me compliquer la vie, mais par exemple dans le papier d'OpenAi dont j'ai montré la courbe, c'est une division modulaire (même si celle-ci a peut-être une symétrie plus subtile ?)

Expand full comment

Très intéressant.

D’un côté c’est passionnant de découvrir de tels phénomènes et ça laisse augurer de nouvelles capacités à découvrir mais de l’autre ça met clairement en évidence le manque criant de théorie sur un sujet qui remue la terre entière. On est un peu frustré que sur un système aussi simple (des non-linéarités, des additions pondérées et de la rétropropagation du gradient ?) on ne puisse pas s’appuyer sur la moindre théorie pour prévoir son comportement. Il faut le découvrir progressivement en l’observant fonctionner comme le myrmécologue qui observe ses fourmis. Il faut espérer que les résultats montrés ici vont dans le sens d’améliorer nos connaissances.

Expand full comment

Fascinant. Le potentiel des réseaux de neurones est aussi fascinant que la manière dont ils le développent. On prend une architecture assez régulière dans laquelle la fonction à "enseigner" peut-être implémentée. Et le processus d'apprentissage réussi à trouver le chemin évolutionnaire conduisant à une implémentation, un câblage de cette fonction. Qui plus est de manière gloutonne, si je puis me permettre de qualifier ainsi la rétro propagation du gradient. Et, cerise sur le gâteau, le processus d'apprentissage comporte une transition de phase.

Ça me donne envie de comparer la complexité de Kolmogorov (CK) de la fonction à apprendre (extrêmement faible), la CK de l'architecture ou du réseau de neurone vierge (faible), et la CK du réseau de neurone instruit (?). Et de me demander si le phénomène se produit aussi lors de l'apprentissage de fonctions dont la CK est beaucoup plus élevée que celle de l'architecture, comme dans ChatGPT.

Nous sommes en train de vire l'avènement d'une nouvelle informatique qui simule un environnement d'apprentissage pour produire des circuits analogiques sans doute irréductibles au sens de Wolfram, incompréhensibles, ayant des capacités de généralisation défiant l'entendement et qu'on étudie comme on étudie des systèmes physiques, tout en entendant dans le poste de radio qu'un informaticien spécialiste d'IA connexionniste vient de se voir attribuer le prix Nobel de physique. Il se passe des choses complètement dingues. J'ai découvert l'informatique en 1983. J'ai vu toutes les évolutions depuis, et je n'en reviens toujours pas.

Expand full comment

merci pour cet article qui m’a permis de ”grokker” ce qu’est un embedding et de découvrir cette capacité étonnante d’auto structuration de votre modèle de neuron imagerie!

c’est fascinant!

Expand full comment

C'est passionnant, vous êtes tellement dévoué à transmettre la science aux autres que mes remerciements n'égaleront jamais la patience et le sens du service que vous manifestez ici ! Un immense merci ! Juste quelques précisions pour ceux qui comme moi ne font pas du ML toute la journée.

Les itérations de bases représentées pas le concept d'époque (Epochs ou Iterations) sont des répétitions d'étapes de l'optimization effectuée pour arriver aux bons paramètres dans les fonctions logit (ou autres représentations lisses de phénomènes décisionnels binaires). Spécifiquement voici la description de ce qui se passe, courtesy of ChatGPT:

Dans le contexte de l'entraînement de modèles de Deep Learning, une "époque" fait référence à un passage complet à travers l'ensemble de données d'entraînement. Lorsque vous optimisez un modèle de Deep Learning, vous effectuez généralement les étapes suivantes à chaque époque :

Diviser l'ensemble de données : Avant le début de l'entraînement, vous divisez généralement votre ensemble de données en au moins deux parties : l'ensemble d'entraînement et l'ensemble de validation. Dans certains cas, vous pouvez également avoir un ensemble de test séparé. Cette division est généralement effectuée une seule fois, pas à chaque époque.

Traitement par Mini-lots : Pendant chaque époque, l'ensemble d'entraînement est divisé en sous-ensembles plus petits appelés mini-lots. La taille de ces mini-lots est un hyperparamètre appelé "taille de lot". Si vous avez un ensemble d'entraînement de 1000 échantillons et une taille de lot de 100, vous aurez 10 mini-lots par époque.

Passage Direct (Forward Pass) : Pour chaque mini-lot, le modèle effectue un passage direct où il calcule les prédictions de sortie en fonction de l'état actuel des paramètres du modèle (poids et biais).

Calcul de la Perte : Après le passage direct, le modèle calcule la perte, qui est une mesure de l'écart entre les prédictions du modèle et les valeurs cibles réelles. La fonction de perte utilisée peut varier en fonction de la tâche spécifique (par exemple, l'erreur quadratique moyenne pour la régression, la perte entropique croisée pour la classification).

Passage Inverse (Rétropropagation) : Le modèle calcule les gradients de la perte par rapport aux paramètres, ce qui indique comment les paramètres doivent être ajustés pour minimiser la perte.

Mise à Jour des Paramètres : En utilisant un algorithme d'optimisation (comme SGD, Adam, etc.), le modèle met à jour ses paramètres dans la direction qui réduit la perte.

Répétition pour Tous les Mini-lots : Les étapes 3 à 6 sont répétées pour chaque mini-lot dans l'ensemble d'entraînement.

Validation : Après avoir traité tous les mini-lots (ce qui complète une époque), le modèle est généralement évalué sur l'ensemble de validation pour vérifier comment il se généralise aux données non vues. Cette étape n'implique pas de mise à jour des paramètres.

Répétition pour Plus d'Époques : L'ensemble du processus (étapes 3-8) est répété pour un nombre prédéfini d'époques, ou jusqu'à ce qu'un critère de convergence soit atteint (comme aucune amélioration dans la perte de validation).

Il est important de noter que les ensembles d'entraînement et de validation restent les mêmes tout au long du processus d'entraînement. Le processus d'optimisation itère sur les données en époques, et non sur la phase qui divise l'ensemble de données. Le but d'itérer sur les époques est de raffiner progressivement les poids du modèle à travers une exposition répétée aux données, lui permettant d'apprendre et de mieux se généraliser à partir des échantillons d'entraînement fournis.

Expand full comment

Fascinant article qui remet un petit peu ta vidéo sur chat gpt en question. Merci pour ton travail.

Expand full comment

Merci David pour toute votre œuvre de vulgarisation !

Ce sujet est fascinant, absolument fascinant ! Je suis très loin d'avoir l'expertise des commentateurs de

ce blog mais ça me permet d'avoir une idée. Mais rassurez-moi, tout cela reste de la "mécanique", de la "mécanique intelligente" certes, mais mécanique !

Expand full comment

Ça rejoint à mon sens ce que nous apprend la théorie de la complexité de Kolmogorov. Grâce à la pénalité le modèle apprend petit à petit une représentation plus simple qui est aussi plus générale. Et ça contredit ce que nous affirment certains experts comme Yann LeCun comme quoi les LLM n'apprennent pas réellement ; ils semble bien qu'au contraire ils apprennent des représentations plus simples, plus abstraites, qui expliquent leur puissance à généraliser leur données d'entraînement - même si la façon dont on leur apprend n'est pas forcément la voie la plus efficace pour que leurs représentations convergent vers de bonnes représentations.

Expand full comment

Excellent article.

J'ai aussi du mal à réconcilier le fait que d'un côté l'apprentissage semble tendre progressivement (au moins sur ce sous ensemble de l'espace des embeddings) vers cette représentation sous forme d'horloge, et de l'autre la perf sur le set de validation ne bouge pas bcp jusqu'au "déclic".

Aussi l'évolution progressive semble effectivement montrer que ce n'est pas juste un "brute force" où l'on finirait par tomber sur "la bonne combinaison" par chance.

Expand full comment

Article fascinant.

Il a bien fait évoluer la vision que j'avais des LLM ou des modèles type transformers en général. Bien que la structure de notre cerveau (des milliards de neurones avec des fonctions relativement simples) a fait émerger des comportements et des raisonnements logiques, je ne voyais pas bien comment reproduire ça concrètement avec des réseaux de neurones.

Maîtriser l'entraînement des modèles pour faire émerger ce genre de logique dans le cadre du langage, couplé avec de grandes tailles de modèles pour permettre un espace vectoriel de "modélisation des concepts" suffisant me semble maintenant une piste prometteuse. L'ingrédient le plus important qui me semble manquer est la possibilité de visualiser ces fameux "modèles mentaux" dans le cadre d'un LLM. La visualisation de votre article est très parlante, mais pour un LLM il faudrait employer des moyens bien + conséquents. Le seul moyen que je vois pour le moment de savoir si le modèle a le bon modèle mental serait de tester ses compétences de façon assez exhaustive pour qu'il ne puisse pas avoir pu apprendre par coeur (ce qui revient à arriver à valider 100% du validation set, donc créer un set exhaustif pour chaque compétence visée)

Je n'ai pas les moyens de tester cette hypothèse, mais je pense qu'entraîner un modèle sur plusieurs tâches et plusieurs types de données différentes à la fois (à la manière de GATO par exemple), en choisissant bien les tâches pour imiter les fondamentaux du raisonnement humain, de façon progressive (pour bien "généraliser" chaque nouvelle compétence) et en adaptant les pénalités de façon dynamique en fonction de la difficulté de la nouvelle tâche (je ne sais pas bien comment, si vous avez des références cela pourrait m'intéresser, j'imagine que par le biais des performances sur train/test et leur vitesse d'évolution on pourrait arriver à créer un indicateur pertinent), nous pourrions atteindre un nouveau niveau de performance pour les IA.

Expand full comment

La division modulaire à ma connaissance n'a pas de symétrie, mais ce n'est pas cela que je pointais du doigt. C'est juste que la symétrie permet de le comprendre facilement, vu que cette opération est symétrique et donc qu'une simple permutation permet de le voir pour nos simples cerveau humain.

Mon interrogation est plus sur la capacité à établir un modèle sur un ensemble de résultat incomplet, et comment on génère un ensemble de résultat réellement incomplet et pas uniquement "obfusqué".

Dans le cas de l'addition, utiliser 50% de l'ensemble des résultats choisi aléatoirement implique que le modèle d'entraînement contient tous les cas (ou presque) - mais le réseau de neurones doit réaliser que l'opération est symétrique.

=> est-ce c'est ce qu'il se passe ? => ça peut-être répondu en choisissant les données d'entraînement de tel façon à ne pas embarquer dans le modèle des données symétrique.

Ce que je dis c'est qu'il serait intéressant et voir si le grokking apparaît avant ou après en baisant les données d'entraînement, en particulier sur des opérations simples où l'on est capable de déterminer ce genre de raccourci, et observer les différences dans le modèle en fonction.

En tout cas merci de ce partage !

Expand full comment

Je vois deux manière de tester le truc (je vais essayer) :

- premièrement inspecter le réseau prédicteur pour voir s'il est symétrique. Comme je lui concatène les entrées, on peut voir s'il a "tout seul" décidé de créer des connexions symétriques ou pas.

- entrainer un réseau en ayant viré de l'ensemble d'entrainement des paires symétriques. Donc pour ces paires, le réseau ne peut pas simplement se baser sur symétrie + mémorisation du membre de la paire qu'il a vu dans l'ensemble d'entrainement. Mais je pense que ça devrait marcher puisqu'avec la division modulaire ça marche

Expand full comment

Article que j'ai d'une seule traite ! Merci

Expand full comment

Bonjour,

C'est une bonne introduction au grocking.

Seul petit bémol, je suis convaincu, à l'instar de Yann Le Cun, que ça n'a rien de mental, que ce n'est que de la syntaxe.

C'est autre chose, mais le concept qui y correspond n'a pas encore émergé ou identifié.

On dirait que ça a à voir avec les attracteurs.

Peut-être que je me trompe, mais je ne serais pas le premier.

En revanche, tout le reste était parfait.

Merci beaucoup.

Expand full comment

J'aurais appelé ce phénomène Eureka, plutôt que grokking :)

La description ressemble tellement à des expériences vécues. On se prend la tête pendant des jours sur un problème sans rien y comprendre et on trouve la solution d'un seul coup sous la douche.

D'ailleurs je m'attendais à ce que l'animation montre un mouvement plus brusque pour refléter le saut dans la courbe.

Merci beaucoup de nous faire partager ces découvertes !

Expand full comment

Justement le fait que ce soit progressif est intéressant, ça montre que l'optimisation n'est pas tombée "par hasard" sur la bonne combinaison des poids, mais que le travail de construction des circuits a été progressif

Expand full comment