Au-delà de l’auto-attention : comment les petits modèles de langage prédisent le token suivant
(shyam.blog)- Après avoir entraîné un Transformer decoder-only d’environ 10 millions de paramètres sur TinyShakespeare, l’auteur retrace, à l’aide d’états internes et d’expériences, comment les calculs effectués après l’auto-attention se transforment en probabilités du token suivant
- L’hypothèse centrale est que chaque bloc Transformer relie le prompt à un ensemble précis de chaînes du corpus d’entraînement, et que la distribution de fréquence des tokens réellement apparus après ces chaînes est proche de la prédiction du bloc pour le token suivant
- La procédure d’approximation implémentée cherche, pour chaque bloc, des chaînes d’entraînement proches de la sortie du feed-forward network, additionne la distribution des caractères qui les suivent, puis reconstruit la sortie du modèle par somme pondérée bloc par bloc
- Sur 20 000 prompts de longueur 10, la distance de Hellinger moyenne entre la sortie approximée et la sortie réelle du Transformer est d’environ 0,17 ; la distance entre le modèle d’origine et des modèles alternatifs entraînés avec la même architecture mais des seeds différents est d’environ 0,11 ± 0,08
- L’analyse étaye l’idée que la sortie du feed-forward joue un rôle majeur dans la transformation opérée par les blocs et que l’attention mappe le prompt vers la bonne classe de chaînes d’entraînement, mais on ne sait pas si cela se généralise au-delà de ce petit modèle
Le modèle étudié et la question posée
- Un Transformer d’environ 10 millions de paramètres a été implémenté et entraîné en suivant la vidéo d’Andrej Karpathy Let’s build GPT: from scratch, in code, spelled out
- Le code principal du modèle de langage vient du travail de Karpathy ; l’analyse interne et le code auxiliaire sont des contributions séparées
- Le code associé se trouve dans transformer-experiments
- Le modèle est un Transformer decoder-only composé de 6 blocs
- Les données d’entraînement sont TinyShakespeare, qui contient 40 000 lignes de pièces de Shakespeare
- Après environ une heure d’entraînement sur un GPU RTX 4000, il génère un faux texte « shakespearien » structurellement crédible
- Les tokens sont des caractères, pas des mots
- Le vocabulaire comporte 65 éléments, et le modèle prédit la distribution de probabilité du caractère suivant après un prompt donné
- Par exemple, après
'my most gr', il préditaà 0,819,eà 0,081 etià 0,059
- La question centrale ne porte pas sur l’auto-attention elle-même, mais sur la manière dont le résultat obtenu après l’attention devient finalement une probabilité du token suivant
Structure des blocs et poids du feed-forward network
- Chaque bloc Transformer contient une multi-head self-attention et un feed-forward network
- Dans la structure PyTorch, la sortie du bloc prend la forme
x + self.sa(self.ln1(x)), puisx + self.ffwd(self.ln2(x)) - En introduisant une variable intermédiaire, on peut voir la sortie du bloc comme
x + sa_out + ffwd_out
- Dans la structure PyTorch, la sortie du bloc prend la forme
- Dans le modèle analysé, le feed-forward network représente 65,71 % de l’ensemble des paramètres entraînables
- Paramètres du feed-forward : 7 089 408
- Total des paramètres entraînables : 10 788 929
- La sortie du feed-forward network semble être le facteur principal qui transforme l’entrée du bloc en sa sortie
- Dans les expériences suivantes aussi, la sortie du feed-forward influence davantage la distribution de probabilité finale que la seule sortie du self-attention
Retrouver des chaînes à partir de sorties feed-forward similaires
- La procédure d’approximation exploite la similarité des sorties feed-forward entre le prompt et des chaînes du corpus d’entraînement
- Injecter le prompt dans le modèle et enregistrer la sortie du feed-forward network à chaque bloc
- Pour chaque bloc, rechercher dans le corpus d’entraînement des chaînes dont la sortie feed-forward est similaire
- Additionner la distribution de fréquence des tokens qui suivent ces chaînes
- Combiner ces distributions par somme pondérée selon les blocs, puis normaliser pour obtenir une distribution de probabilité
- Sur le prompt de démonstration
'And only l', 94 chaînes de longueur 10 dont la similarité cosinus avec la sortie du feed-forward du bloc 1 était d’au moins 0,95 ont été trouvées- Les chaînes trouvées incluaient
hat only l,\nMy only l,I dearly l,ng Henry l,And only let se terminaient généralement pary louly l - La distribution de fréquence normalisée des caractères qui suivaient ces chaînes ressemblait fortement à la prédiction réelle du modèle pour le caractère suivant
- Les chaînes trouvées incluaient
- Dans l’exemple
'And only l', l’approximation et la prédiction réelle du modèle sont proches- Modèle :
i0,437,o0,204,a0,195,e0,160 - Approximation :
i0,389,o0,250,a0,222,e0,139 - La distance de Hellinger est de 0,0711
- Modèle :
- Un seul bloc peut toutefois échouer
- Sur le prompt
'hing tremb', si l’on n’utilise que le bloc 1, le modèle préditlà 0,999, mais l’approximation donnee0,543 etl0,343, soit une distance de Hellinger de 0,6305 - En tenant compte de l’ensemble des blocs, l’approximation prédit
là 0,997 sur le même exemple, et la distance de Hellinger tombe à 0,0233
- Sur le prompt
Échelle de calcul et réglage manuel
- Pour des raisons d’efficacité, toute l’analyse a été menée principalement sur des chaînes de longueur 10
- Le corpus d’entraînement contient 1 115 394 caractères, dont 858 923 sous-chaînes uniques de longueur 10
- Les sorties feed-forward sont des vecteurs
float32de dimension 384, un par bloc parmi les 6 blocs
- 20 000 chaînes de longueur 10 ont été tirées au hasard et utilisées comme prompts d’expérience
- La similarité cosinus, bloc par bloc, entre chaque prompt et les 858 923 sous-chaînes uniques a été précalculée et stockée sur disque
- Comme aucun appariement d’intérêt n’apparaissait sous une similarité cosinus de 0,7, un préfiltrage à 0,7 ou plus a été appliqué
- Le seuil de similarité pour chaque bloc a été défini par réglage manuel
- Bloc 0 : 0,95
- Bloc 1 : 0,94
- Bloc 2 : 0,85
- Bloc 3 : 0,76
- Bloc 4 : 0,81
- Bloc 5 : 0,89
- Des poids manuels ont aussi été utilisés pour combiner les distributions de fréquence bloc par bloc
- Les poids utilisés étaient
[0.01, 0.01, 0.1, 1.5, 6, 0.01] - Une recherche de poids par approche deep learning a aussi été tentée, sans faire mieux que le réglage manuel
- Les poids utilisés étaient
Évaluation sur 20 000 prompts
- Pour l’ensemble des 20 000 prompts, la distance de Hellinger entre la distribution approximée et la distribution de sortie du modèle a été calculée
- Moyenne : 0,1677
- Écart-type : 0,1215
- Minimum : 0,0013
- Maximum : 0,9994
- La distance de Hellinger mesure le recouvrement entre distributions de probabilité : 0 signifie identiques, 1 signifie aucun recouvrement
- Pour comparer la qualité de l’approximation, la même architecture a été réentraînée 3 fois avec des random seeds différents
- Seed du modèle d’origine : 1337, training loss estimée 0,9334, validation loss 1,5063
- Alternate 1 seed : 1442, training loss 0,9293, validation loss 1,5038
- Alternate 2 seed : 88, training loss 0,9294, validation loss 1,4991
- Alternate 3 seed : 99999, training loss 0,9339, validation loss 1,4941
- La distance de Hellinger moyenne entre le modèle d’origine et les modèles alternatifs est d’environ 0,11 ± 0,08
- Original vs Alternate 1 : 0,1064 ± 0,0823
- Original vs Alternate 2 : 0,1057 ± 0,0817
- Original vs Alternate 3 : 0,1053 ± 0,0828
- La distance moyenne de 0,17 entre l’approximation et le modèle est plus élevée que les 0,11 observés entre modèles alternatifs, mais elle reste dans la plage de l’écart-type, ce qui soutient l’idée que l’approximation est assez bonne
Interprétation du fonctionnement interne du Transformer
- Le modèle peut être vu, après l’embedding, comme une série de transformations spatiales
- Les 6 blocs Transformer transforment l’embedding d’entrée en embedding de sortie dans un espace d’embedding de dimension 384
- Le LayerNorm final et la couche linéaire transforment cet espace d’embedding en un espace de logits de dimension 65, puis le softmax produit les probabilités du token suivant
- La transformation interne à chaque bloc peut être vue comme une addition de vecteurs
- La sortie du bloc est la somme de l’entrée
x, de la sortie du self-attentionsa_outet de la sortie du feed-forwardffwd_out - L’analyse observe que les vecteurs de sortie du feed-forward ont en général une norme plus grande que ceux du self-attention, et que les deux sorties pointent souvent dans des directions similaires selon les blocs
- La sortie du bloc est la somme de l’entrée
- Même en n’ajoutant que les sorties feed-forward, le vecteur de sortie final reste globalement orienté dans une direction proche de la sortie complète
- La sortie fondée uniquement sur le feed-forward a une norme plus faible, mais une direction proche de la sortie originale
- En raison du LayerNorm final, les différences de norme importent peu pour l’entrée de la couche linéaire finale
- Cela ne signifie pas qu’on pourrait supprimer le self-attention
- Le feed-forward network prend en entrée la sortie de l’attention via
ffwd_out = self.ffwd(self.ln2(x + sa_out)); si l’on retire le self-attention, la sortie du feed-forward elle-même change
- Le feed-forward network prend en entrée la sortie de l’attention via
Hypothèse des subspaces de tokens
- Certains embeddings peuvent amener le modèle à prédire un token précis avec une quasi-certitude
- Par exemple, on peut apprendre un embedding à injecter après le LayerNorm et la couche linéaire du dernier bloc afin que la probabilité du token
adevienne presque 1 - Les poids du Transformer restent figés, et seul le tenseur d’embedding est optimisé
- Par exemple, on peut apprendre un embedding à injecter après le LayerNorm et la couche linéaire du dernier bloc afin que la probabilité du token
- Chaque token ne correspond pas à un embedding unique, mais à plusieurs embeddings
- Cela est interprété comme un subspace d’embedding non linéaire et complexe correspondant à chaque token
- Il a été possible d’apprendre facilement des milliers d’embeddings uniques pour chaque token
- Même sans calculer exactement le subspace d’un point de vue mathématique, une approximation linéaire fonctionne bien à l’étape finale
- Pour chaque token, les embeddings appris ont été empilés puis soumis à une SVD
- Le premier vecteur singulier à droite fonctionne bien comme approximation linéaire unidimensionnelle du subspace de ce token
- En combinant linéairement les vecteurs d’approximation de plusieurs tokens, on peut créer des embeddings qui répartissent la probabilité sur plusieurs tokens
- Si l’on additionne les vecteurs d’approximation de
aetb, on obtient une distribution répartissant la probabilité entre ces deux tokens - Cela ne donne toutefois pas une distribution parfaitement 50:50, en raison de l’erreur d’approximation, de la non-orthogonalité des vecteurs de subspace et des différences d’amplitude des logits selon les tokens
- Si l’on additionne les vecteurs d’approximation de
Correspondance entre sorties feed-forward et subspaces de tokens
- La sortie du feed-forward est interprétée comme un ajustement de la sortie du bloc vers le subspace de certains tokens
- Ces tokens correspondent à ceux prédits par la procédure d’approximation, c’est-à-dire ceux apparus après les chaînes d’entraînement produisant des sorties feed-forward similaires
- Dans l’exemple
med me Aut, si l’on ne regarde que le dernier bloc, l’approximation préditocomme token suivant le plus probable, puish- En projetant le même vecteur de sortie feed-forward sur l’approximation des subspaces de tokens, les tokens les plus similaires étaient aussi
o,h,i,u,ydans cet ordre
- En projetant le même vecteur de sortie feed-forward sur l’approximation des subspaces de tokens, les tokens les plus similaires étaient aussi
- Une correspondance similaire apparaît aussi dans l’exemple
if and thy- L’approximation retient comme principales prédictions un espace,
set un saut de ligne - Les subspaces les plus alignés avec la sortie feed-forward étaient également proches de l’espace, de
set du saut de ligne
- L’approximation retient comme principales prédictions un espace,
- Un critère arbitraire a été défini puis agrégé sur l’ensemble des 20 000 prompts
- Le critère est le suivant : « les subspaces des tokens qui représentent 90 % de la masse de probabilité dans la prédiction approximée se situent-ils dans la moitié supérieure du classement par similarité cosinus avec la sortie feed-forward ? »
- Pour le dernier bloc, 16 357 cas, soit 81,78 %, satisfont ce critère
Résultats agrégés par bloc et comparaison avec le hasard
- En utilisant les approximations de subspace apprises à chaque position de bloc, le taux de satisfaction du critère augmente à mesure qu’on avance dans les blocs
- Bloc 6 : 16 357 cas, 81,78 %
- Bloc 5 : 10 142 cas, 50,71 %
- Bloc 4 : 7 760 cas, 38,80 %
- L’application de l’approximation de subspace de l’étape finale à tous les blocs donne de meilleurs résultats
- Bloc 6 : 81,78 %
- Bloc 5 : 68,26 %
- Bloc 4 : 58,15 %
- Bloc 3 : 57,34 %
- Bloc 2 : 52,02 %
- Bloc 1 : 49,71 %
- La probabilité que ce critère soit satisfait par simple hasard avec des similarités cosinus aléatoires a aussi été simulée
- Bloc 6 : 20,76 % ± 0,25 %
- Bloc 5 : 20,55 % ± 0,26 %
- Bloc 4 : 18,37 % ± 0,24 %
- Bloc 3 : 18,20 % ± 0,24 %
- Bloc 2 : 17,04 % ± 0,23 %
- Bloc 1 : 16,31 % ± 0,23 %
- Les résultats sont très supérieurs au hasard, mais, compte tenu du bruit de mesure et des limites de l’approximation des subspaces, il est difficile d’y voir une preuve décisive
Rôle du self-attention
- Dans cette interprétation, une bonne prédiction dépend de la capacité à mapper le prompt vers la bonne classe de chaînes du corpus d’entraînement
- L’axe chargé de ce mapping est le self-attention
- La couche d’attention identifie des motifs entre les tokens du prompt
- Ces motifs peuvent être de simples motifs de chaîne, comme
y len fin de séquence, ou des catégories de tokens plus générales, comme les voyelles ou les majuscules à certaines positions
- Les poids appris par les attention heads déterminent à quels motifs ils réagissent
- Une fois la sortie des attention heads passée dans le feed-forward network, elle devient une représentation dans l’espace d’embedding contenant de l’information sur la distribution des tokens apparus après des chaînes d’entraînement similaires
- Le modèle analysé comporte 6 blocs et 6 attention heads par bloc, ce qui lui permet d’évaluer un même prompt selon plusieurs motifs latents
Conclusion et limites
- Les éléments montrant que la procédure d’approximation et la sortie réelle du Transformer se ressemblent sont solides
- Les preuves que cette procédure correspond aux calculs internes réels du Transformer sont moins nettes, mais suggèrent qu’elle pourrait au moins être partiellement correcte
- On ignore si les résultats obtenus sur un seul petit Transformer se généralisent à des modèles plus grands ou à d’autres jeux de données
- Ce projet consiste à poser des questions au modèle et à concevoir des expériences sur son fonctionnement interne ; plutôt que de réduire la « magie » des modèles de langage à un mécanisme simple, il aide à mieux voir leur complexité
1 commentaires
Commentaires sur Hacker News
Certains thèmes du billet parent ne devraient pas être très surprenants pour quiconque a lu https://people.math.harvard.edu/~ctm/home/text/others/shanno...
Si l’on ne lit pas la littérature fondamentale de son domaine, même des phénomènes qui découlent naturellement de travaux déjà établis peuvent sembler être des mystères inexplicables
Cela dit, l’expérience paraît assez rigoureuse au premier abord, et j’apprécie l’ampleur du travail de détail fourni
Il existe un compromis difficile entre apprendre la théorie existante et tout redériver depuis le début. Sans cadre traditionnel, on peut faire de nouvelles découvertes, mais avec ce cadre, on peut comprendre certains phénomènes plus en profondeur
Dans les commentaires ici, on voit plusieurs personnes s’étonner qu’un modèle qui maximise la log-vraisemblance d’une séquence étant donné des données ne s’écarte pas magiquement de ce comportement à l’inférence. C’est un modèle d’estimation de densité, vous vous attendiez à ce qu’il récite Shakespeare sorti de nulle part ?
Revenir aux bases permettrait de bien mieux comprendre ce type d’expériences. Il existe déjà un fondement mathématique très clair qui explique cela, ainsi que ce qu’on appelle les phénomènes émergents
Plus concrètement, il y a plusieurs niveaux d’analyse, et le traitement des systèmes ergodiques par Shannon est un bon point de départ. Il y a ici un léger décalage, mais la correspondance semble assez proche pour comprendre la dynamique d’ensemble
Il n’est pas rare que des gens très intelligents disent « cette structure mathématique ressemble à cette idée, et si l’on ajoute ou retire quelques structures, tout s’explique ». Mais en réalité, nous ignorons encore beaucoup de choses
Je n’ai jamais vu les théoriciens de ce domaine arriver avec une théorie, construire quelque chose de nouveau ou produire des prédictions utiles. En général, on essaie un peu tout ; si ça marche, on ajoute après coup une explication plausible du pourquoi, et si ça ne marche pas, on enterre ça
Il y a aussi eu récemment un billet présentant les transformers comme un lissage par noyau : https://arxiv.org/abs/1908.11775
Les redécouvertes répétées ne sont pas forcément du gaspillage ; elles peuvent faire partie d’un processus de confirmation et de validation d’une vérité profonde à laquelle on peut accéder par plusieurs voies
De nombreux manuels de théorie de l’information soulignent déjà la nature adressable par le contenu (content-addressable) de ces réseaux[1], et ils sont aussi utilisés pour des applications comme la compression précisément pour cette raison[2][3]
Il n’est donc pas surprenant que, lorsque le NYT a fourni à un modèle d’OpenAI quelques paragraphes de ses articles dans un prompt, celui-ci les ait reproduits presque à l’identique
[1] https://www.inference.org.uk/itprnn/book.pdf
[2] https://bellard.org/nncp/
[3] https://pub.towardsai.net/stable-diffusion-based-image-compr...
En voyant que Google avait signalé qu’on pouvait faire recracher ses données d’entraînement à ChatGPT en lui demandant de répéter le même mot encore et encore[0][1], j’ai eu exactement la même idée. Ravi que quelqu’un l’ait réellement mise en œuvre
Cela soulève deux questions supplémentaires
[0] C’était possible auparavant. OpenAI bloque désormais la génération si l’on remplit la fenêtre de contexte avec un seul mot
[1] https://arxiv.org/abs/2311.17035
Il n’y a pas tant d’étapes que cela à supprimer, et au contraire cela ajoute beaucoup de travail
Même si l’on séparait complètement le corpus d’entraînement du modèle et le corpus servant à rechercher des chaînes d’activations similaires, on obtiendrait probablement presque le même résultat. La partie difficile est justement de faire en sorte que des chaînes ayant des statistiques de token suivant similaires produisent des activations similaires
Avec des poids par couche [0.01, 0.01, 0.1, 1.5, 6, 0.01], la plus importante est l’avant-dernière couche, et à ce stade l’entrée a déjà été fortement transformée. Il ne faut donc pas s’attendre à pouvoir remplacer un transformer par un simple
grepsur les données d’entraînementSi les poids de l’avant-dernière couche sont bien plus élevés que ceux de la couche finale, c’est probablement à cause des induction heads. Comme dans https://transformer-circuits.pub/2021/framework/index.html, il pourrait s’agir d’une structure où l’on implémente la capacité à copier des chaînes répétées de l’entrée, où l’avant-dernière couche décide quoi rechercher et où la couche finale effectue la copie
La contribution de ce texte, comme l’auteur le dit, est de montrer ce point à un lectorat technique qui construit directement des GPT, contrairement aux articles centrés sur le transformer lui-même et sur la question « comment est-ce implémenté ? »
En regardant de près, c’était par exemple des README GitHub inexistants et incohérents, des brochures d’information sans contenu, ou des conversations aléatoires
Pourtant, aspirer l’ensemble d’Internet pour entraîner de tels modèles n’est absolument jamais qualifié d’attaque
Alors, pourquoi ne pas considérer qu’on a aussi des droits sur la distribution de probabilité des caractères à l’intérieur de cette œuvre ?
Dès que j’ai découvert NanoGPT d’Andrej Karpathy, j’ai essayé de l’entraîner sur la version russe de War and Peace, et j’ai trouvé fascinant que, malgré un modèle de seulement 3 Mo, il ait presque saisi la grammaire russe
Le russe a une structure synthétique et flexionnelle complexe. Par exemple, après la préposition « na » (« sur »), il faut un nom à l’accusatif, ce qui se manifeste par -a pour les noms masculins animés, l’absence de terminaison pour les noms inanimés, -ia pour les noms se terminant par une « consonne douce », -u pour les noms féminins, etc.
De plus, le verbe « utiliser » exige l’instrumental lorsque le nom qui suit désigne l’instrument employé
Ce n’était pas parfait et il faisait des erreurs, mais il était fascinant que NanoGPT ait inféré certaines règles complexes en seulement 3 minutes d’entraînement. J’ai cherché les phrases exactes qu’il avait générées dans le texte d’origine, mais je n’ai trouvé aucune correspondance exacte
En revanche, même s’il comprenait dans une certaine mesure la grammaire, sur le plan sémantique c’était un non-sens total
Il existait une bonne visualisation 3D montrant le même système, et je pense qu’elle se marierait bien avec cette lecture
LLM Visualization (https://bbycroft.net/llm)
https://news.ycombinator.com/item?id=38505211
C’est sans doute parce qu’elle essaie de tout montrer d’un coup et ne renvoie pas assez à des concepts abstraits, mais je n’en suis pas certain
Bon projet, mais le modèle analysé est en pratique un modèle jouet, tant par sa taille que par la quantité de données d’entraînement
Ce modèle pourrait donc sans doute être approximé par un modèle plus simple, probablement un modèle de langue n-gram, mais il est difficile de le considérer comme représentatif du fonctionnement de modèles de langue plus grands
Je me demande si l’auteur affirme que le LLM est un générateur de texte par chaîne de Markov.
Autrement dit, cela veut-il dire que la distribution de probabilité du token suivant généré est identique à la probabilité de cette séquence de tokens dans les données d’entraînement ?
Si oui, cela voudrait-il dire qu’en construisant « simplement » une chaîne de Markov à partir des données d’entraînement d’origine, on pourrait obtenir des performances similaires à celles d’un LLM ?
L’état est un vecteur de tokens de la longueur du contexte, et le modèle décrit une matrice de transition. Pour un vecteur de tokens d’une taille égale à celle du contexte donné, il produit la probabilité du vecteur de tokens suivant, de même taille
La partie difficile est cette classification qui consiste à savoir quels textes des données d’entraînement sont « similaires » au texte du prompt.
L’exemple donné dans le billet de blog est le suivant :
Original string: 'And only l'
Similar strings: 'hat only l' 's sickly l' ' as\nthey l' 'r kingly l'
Cela semble vouloir dire qu’il pourrait exister un moyen de contourner le transformer tout en obtenant le même résultat. Je me demande si ce serait plus efficace.
Par exemple, étant donné un modèle de base, il serait peut-être possible d’entraîner autre chose qui tournerait sur un appareil bien plus petit
Il est assez difficile de comprendre exactement ce que l’auteur prétend avoir montré.
J’ai relu plusieurs fois la section « Interpretation: Why Does the Approximation Work? », mais j’ai l’impression d’y voir surtout une explication mécanique des étapes du transformer. Je ne vois pas quelle est la thèse centrale
Je me demande s’il est connu que l’attention et le déplacement FF pointent globalement dans la même direction.
Le simple fait qu’ils soient dans le même espace latent à travers les couches me surprend déjà un peu. Le réseau FF ne pourrait-il pas effectuer une rotation arbitraire ? J’ai l’impression de mal comprendre quelque chose
Forcément, certaines choses disparaissent, et la description exacte d’une rotation arbitraire dans un espace de grande dimension fait partie de ce qui disparaît