33 Commentaires
Avatar de User
Avatar de Underskore

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.

Avatar de Science étonnante

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

Avatar de Jonathan Desurmont

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

Avatar de Guillaume

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... :) )

Avatar de Science étonnante

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 ?)

Avatar de Samuel

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) ?

Avatar de Science étonnante

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")

Avatar de Elouan

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.

Avatar de Pierre

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.

Avatar de bedecarrats

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!

Avatar de Guillaume

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 !

Avatar de Science étonnante

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

Avatar de CapeItalist

J'ai adoré l'article, j'ai lu cet autre article sortie en début d'année et qui donne une explication au fait que la régularisation L2 permette le grokking. J'ai trouvé ça vraiment interessant car si l'article dit vrai, cela viendrait uniquement d'une erreur de précision au niveau des nombres à virgule flottantes : https://arxiv.org/abs/2501.04697.

Avatar de Science étonnante

Formidable ! Ce papier m'a l'air super intéressant !!

Avatar de Nicolas

Bonjour David, 1 an et demi après, quoi de neuf et aussi étonnant dans le domaine svp?

Merci pour cet article génial... êtes vous devenu encore plus anthropomorphe depuis, surtout avec ChatGPT en mode vocal, étonnant aussi? (Gemini traîne derrière, aussi...étonnamment... bizarre.)

Nous avons enfin un miroir de notre cerveau, si difficile à étudier (malgré le projet européen de cartographique complète, nous n'avons qu'un mm3 de cerveau de souris enfin modélisé avec son fonctionnement à ce jour...): on peut peut-être enfin "jouer" pour, comme un enfant se regardant dans la glace faire ses cabrioles et comprendre ce qu'il ne peut voir, grimaces etc., découvrir comment nous réfléchissons, apprenons, etc. Période fantastique! Encore plus quand ces boîtes seront embarquées dans un robot qui aura une expérience physique proche de la nôtre plutôt que dans un monde irréel qu'est internet. (D'ailleurs je suis surpris et frustré de voir que les ChatGPT et consorts font des codes et apps qu'ils ne voient même pas, donc ne peuvent déboguer si je ne leur dit pas quoi. Pourquoi?)

Il y a 30 ans j'imaginais notre petite cerveau humain comme une boîte noire de réseaux de réseaux de neurones (inter...nets? ;D) où chaque concept est un réseau de neurones interconnectées, connecté lui-même à d'autres concepts-réseaux (roi-homme-femme-reine comme dit ici par exemple), voisins ou parents ou enfants etc. Un énorme graphe de graphes avec propagation d'influx nerveux, et... les influx/input premiers viennent de nos sens. Ces sens amènent des sensations du réel, cohérent, passent par des zones différentes (aires cérébrales du toucher, vue, ouïe, etc.) et se retrouvent "au milieu" en activant le sens, la "simulation" du réel.

Si je vous dit "j'ai mangé une pomme verte" vous avez je-mange-passé-pomme-vert: 5 informations, qui activent d'autres idées, flux neuronaux, questions chez vous: "quand, ce matin ou hier?" par exemple. Mais si je vous dit "Ma mange chaise vole bleu" vous comprenez une construction (sujet verbe complément...) qui semble correcte mais pas le sens... (un peu comme quand vous apprenez une langue étrangère... vous connaissez chaque mot mais l'ensemble vous est inaccessible: une expression locale sans doute?). ça n'a pas de "sens".

Ce genre d'expérience de pensée à la "frontière" intelligible/inintelligible aide à appréhender ce qui marche et ce qui ne marche pas dans notre petite boîte noire crânienne...: effectivement ici, une "chaise" ne vole pas, le réseau de neurones "chaise" n'a jamais eu de lien avec celui "voler" ni "mange. L'influx nerveux perd en cohérence, ça part dans tous les sens, vous ne trouvez pas quoi dire, de suite, de réponse, les flux nerveux n'arrivent pas à se retrouver quelque part pour activer un autre paquet de neurones, graphe, cohérent, aboutissant à une suite, vous êtes perdu. Et pourtant, l'imagination, elle, peut concevoir qu'une chaise vole, et qu'on mange une chaise, mais c'est une création d'un nouveau graphe d'informations, pas une réactivation d'un graphe pré-existant...

On peut alors se poser quelques questions:

- qu'est ce qu'un "graphe" minimal, le "neurone"..ou le "synapse"? Comme un "bit", rien au sens "intelligence, juste un support de fonctionnement? Quelle est la taille minimale d'une "information", 10 ou un million de neurones, combien de synapses activées, combien de relation avec d'autres "informations", etc.?

- quand on dort, nos sens sont coupés du réel, il n'y a plus d'influx provenant d'un système cohérent qu'est le réel... que se passe t-il alors? Des influx "libres" continuent ils de se propager anarchiquement, activant et créant divers concepts, informations plus ou moins cohérentes et parfois totalement incohérentes, jusqu'à se retrouver entre elles et faire une seule information, un "rêve", qui semble tellement réel ou au contraire délirant? ==> et... une IA, un LLM, un réseau de neurones rêve t-il donc de même quand on coupe l'input, en lui laissant du jus (courant e-)? Que dit-elle à son réveil, à quoi a t-elle rêvé? Peut-être faut il justement plusieurs inputs , sens, pour qu'ils entrent en incohérence, or nos LLM aujourd'hui n'en ont pas hors notre entrée clavier?... J'attends les robots humanoïdes, on va être étonnés par leurs hallucinations ou rêves... ;-)

Avatar de Olivier Bailleux

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.

Avatar de Alan Bryde

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.

Avatar de Christine Alexander Sax

Merci 🙏 d’avoir pris le temps de tout expliquer pour les néophytes comme moi.

Avatar de Elyas

Ç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.

Avatar de Julien

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.

Avatar de FranklinMaillot

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 !

Avatar de Science étonnante

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

Avatar de Balthazar

Mon père m'a envoyé un lien vers cet article, 15 minutes bien dépensées :)

Avatar de Elouan

Salut !

J'ai refait mon implémentation en suivant les principes du billet et ça fonctionne !

En revanche en regardant ton code je ne vois pas, hormis à l'init du modèle, où tu restreins l'amplitude des poids.

Ca me semblait intuitivement vraiment essentiel pour que ça fonctionne alors je suis un peu surpris, déjà que ça marche quand même et ensuite de ne pas le voir dans ton implémentation. Peux-tu explliquer ?

Merci pour le partage !

Avatar de User
Commentaire supprimé
Sep 11, 2023
Commentaire supprimé
Avatar de Elouan

Salut,

Merci tu as raison !

Intéressant de noter toutefois qu'AdamW de Pytorch n'est pas clair niveau terminologie, en principe weigh decay est différent d'une pénalisation (ou régularisation type L2) dès qu'on sort du SGD vanilla, mais après vérification c'est bien une régularisation L2 qu'implémente AdamW lorsqu'on active "weight decay". Pour ça que je n'avais pas relevé je pense.

Merci beaucoup pour ton aide !

Avatar de Science étonnante

Oui absolument c'est ça !

(je n'ai pas eu le temps de répondre aujourd'hui mais je vois que l'aide communautaire fonctionne !)

Avatar de Alexandre

Complètement fascinant ce phénomène ! A quand du grokking pour nos élèves ? 😉

Et juste une interrogation personnelle (et peut-être hors sujet) David : est-ce que ce phénomène peut être rapproché de la fameuse "règle" des 10000 heures et de la pratique délibérée, pour l'apprentissage humain ?

Avatar de Science étonnante

J'avoue que j'ai envie d'y voir des similarités avec l'apprentissage humain (mais je suis sous influence de ma dernière vidéo sur le sujet), mais je sais aussi qu'il faut se méfier de trop anthropomorphiser