L’architecture du transformeur
Assembler un GPT à partir de l’attention : projections multi-têtes, normalisation de couche déroulée à la main, pourquoi les connexions de raccourci sauvent le gradient, l’expansion x4 du réseau à propagation avant, et un décompte de paramètres qui reproduit exactement les 124 millions de GPT-2 small.
Prérequis : L’attention et l’auto-attention, La tokenisation et les plongements
L’attention et l’auto-attention a construit le mécanisme qui permet à chaque position de consulter toutes les autres. Un mécanisme n’est pas un modèle. Entre l’attention et un GPT opérationnel se logent quatre composants de plus, chacun résolvant un problème concret qui surgit quand on empile profondément des couches d’attention, plus une question de câblage.
Cet article assemble le bloc, déroule la normalisation de couche à la main, et finit en comptant les paramètres de GPT-2 small - pour retrouver le chiffre publié.
A. Ce que le bloc doit contenir
Raschka énumère les pièces nécessaires à la construction de l’architecture GPT : l’ossature GPT, la normalisation de couche, l’activation GELU, le réseau à propagation avant, les connexions de raccourci, le bloc de transformeur qui les assemble, et l’architecture finale. L’attention est le mécanisme à l’intérieur du bloc ; le reste est ce qui rend entraînable une pile profonde de ces blocs.
B. L’attention multi-têtes
Une seule opération d’attention produit une pondération sur les positions, exprimant une notion de pertinence. L’attention multi-têtes en exécute plusieurs en parallèle, chacune avec ses propres , puis concatène et projette les résultats.
Les têtes ne reçoivent pas chacune toute la largeur. Dans GPT-2 small la dimension de plongement est 768 et il y a 12 têtes, chaque tête travaille donc en
dimensions. Douze têtes de dimension 64 se concatènent pour redonner 768. Le coût est donc le même que celui d’une tête de dimension 768, tandis que le modèle gagne douze schémas de pertinence indépendants au lieu d’un - différentes têtes peuvent s’intéresser à différentes relations sans se disputer une pondération unique.
C. La normalisation de couche
Les piles profondes sont instables à entraîner lorsque l’échelle des activations dérive d’une couche à l’autre. La normalisation de couche remet chaque vecteur à moyenne nulle et variance unité :
avec un petit qui prémunit contre la division par zéro. Des paramètres appris d’échelle et de décalage suivent, de sorte que la couche peut défaire la normalisation si cela s’avère utile.
Déroulé, sur un vecteur de dimension 8. Prenons
La somme vaut , donc . Les écarts au carré sont , de somme , donc et . En soustrayant la moyenne et en divisant par l’écart type :
Le résultat a une moyenne de et une variance de , comme demandé.
Sur les caractéristiques, non sur le lot. Raschka trace explicitement le contraste avec la normalisation par lots : la batch norm normalise selon la dimension du lot, tandis que la layer norm normalise selon la dimension des caractéristiques. La distinction compte pour les modèles de langue, où les séquences d’un lot diffèrent en longueur et en contenu - la layer norm traite chaque position indépendamment et se moque donc du reste du lot.
Où placer la normalisation est en soi une décision de conception avec une histoire. Raschka note que le Post-LayerNorm, utilisé dans le transformeur originel, applique la normalisation après les sous-couches d’attention et de propagation avant, tandis que le Pre-LayerNorm, adopté dans GPT-2 et les LLM plus récents, l’applique avant - ce qui peut conduire à des dynamiques d’entraînement plus stables.
D. Les connexions de raccourci
Le cadrage de Raschka est direct : les connexions de raccourci - dites aussi connexions de saut ou résiduelles - furent proposées à l’origine pour les réseaux profonds de vision par ordinateur (précisément les réseaux résiduels) afin d’atténuer la disparition des gradients. L’opération est une addition : l’entrée d’une couche est ajoutée à sa sortie, créant un chemin alternatif qui contourne la couche.
L’effet est mesurable, et Raschka le mesure. Dans un réseau à cinq couches il rapporte le gradient absolu moyen à chaque couche, avec et sans raccourcis :
| Couche | Sans raccourcis | Avec raccourcis |
|---|---|---|
| 1 | 0.0002 | 0.22 |
| 2 | 0.0013 | 0.20 |
| 3 | 0.0007 | 0.32 |
| 4 | 0.0001 | 0.26 |
| 5 | 0.0050 | 1.32 |
Sans raccourcis, le gradient qui atteint la couche 1 est d’environ - trois ordres de grandeur plus petit qu’à la couche 5, si bien que les premières couches n’apprennent presque pas. Avec raccourcis les gradients restent comparables de bout en bout. La raison est visible dans la dérivée : dériver donne , et ce est un chemin le long duquel le gradient circule sans atténuation, si petit que devienne .
E. Le réseau à propagation avant
Après que l’attention a mélangé l’information entre positions, un réseau à propagation avant transforme chaque position indépendamment. Sa forme est distinctive : Raschka décrit les entrées se dilatant d’un facteur quatre, de 768 à 3 072 valeurs, une seconde couche recomprimant les 3 072 vers 768.
L’activation entre les deux est GELU plutôt que la ReLU de Qu’est-ce qu’un réseau de neurones ?. Raschka les oppose en notant que la ReLU est une fonction linéaire par morceaux, tandis que GELU est lisse - elle a un gradient non nul pour les entrées négatives au lieu du zéro plat de la ReLU, ce qui évite le mode de défaillance des unités mortes.
Notez l’asymétrie de paramètres que cela crée : le réseau à propagation avant détient environ deux fois plus de paramètres que l’attention qu’il suit, ce qui surprend ceux qui pensent l’attention comme « le » transformeur.
F. Compter GPT-2 small
Raschka passe à l’échelle du plus petit GPT-2, 124 millions de paramètres, et ajoute une correction bibliographique utile : si le rapport original mentionnait 117 millions, ce chiffre fut corrigé par la suite. La table de configuration donne la famille :
| Modèle | emb_dim | n_layers | n_heads |
|---|---|---|---|
| gpt2-small (124M) | 768 | 12 | 12 |
| gpt2-medium (355M) | 1024 | 24 | 16 |
| gpt2-large (774M) | 1280 | 36 | 20 |
| gpt2-xl (1558M) | 1600 | 48 | 25 |
avec vocab_size 50 257 et context_length 1 024.
Nous pouvons vérifier le chiffre phare. Par bloc, avec :
- Attention - quatre projections (, sortie), chacune plus un biais : .
- Propagation avant - en dilatation, en contraction : .
- Deux normalisations de couche - échelle et décalage, chacun : .
Soit par bloc, et blocs donne . Après le dernier bloc se trouve encore une normalisation de couche, la normalisation finale de la section G, avec sa propre échelle et son propre décalage : . En ajoutant les plongements de La tokenisation et les plongements - tokens et positions :
124,4 millions - le chiffre publié, et au paramètre près le décompte du point de contrôle GPT-2 small diffusé. La couche de sortie n’ajoute rien, car GPT-2 y réutilise les poids du plongement de tokens.
S'exécute dans votre navigateur. La première exécution télécharge l'environnement Python (~10 Mo), puis il est mis en cache.
Où vivent réellement les paramètres. Les plongements pèsent 39,4 millions des 124 millions - près d’un tiers - et ce sont une table de consultation, non du calcul. Pendant ce temps les 12 blocs qui font tout le travail en détiennent 85 millions. Ce rapport se déplace nettement avec l’échelle :
emb_dimetn_layerscroissent tous deux dans les modèles plus grands, si bien que les paramètres des blocs croissent à peu près quadratiquement tandis que le plongement de tokens ne croît que linéairement.
Interactif : où vivent les paramètres
Biais comptés, deux normalisations par bloc et une finale, sortie liée au plongement des jetons.
- Largeur de tête d_head
- 64
- Attention, un bloc
- 2,362,368
- Propagation avant, un bloc
- 4,722,432
- Un bloc entier
- 7,087,872
- Part des plongements
- 31.6%
- Paramètres au total
- 124,439,808
Chacune des 12 têtes travaille en 64 dimensions, et ensemble elles coûtent exactement ce que coûterait une seule tête de largeur 768 : déplacez le curseur des têtes et aucun compte ne bouge, car découper en têtes n’est qu’un remodelage des mêmes quatre projections. Le réseau à propagation avant pèse 2.00 fois l’attention voisine dans chaque bloc. Les plongements, une table de consultation et non un calcul, font ici 31.6% du total ; parcourez les préréglages et regardez cette part baisser à mesure que les blocs, qui croissent comme le carré de la largeur, prennent le dessus. La couche de sortie n’ajoute rien, car elle réutilise le plongement des jetons.
G. Le bloc assemblé
En plaçant les pièces dans l’ordre Pre-LayerNorm, chaque bloc est fait de deux sous-couches, chacune normalisée d’abord et enveloppée dans un raccourci :
La forme ne change jamais : un bloc envoie un tenseur sur un autre exactement de même forme. Cette invariance est ce qui permet aux blocs de s’empiler - douze pour GPT-2 small, quarante-huit pour GPT-2 XL, sans autre changement structurel. Le modèle complet, ce sont les plongements, puis blocs identiques, puis une normalisation finale et une projection vers la taille du vocabulaire, donnant un score par token pour la position suivante.
Parce que l’attention interne est masquée causalement, la position ne peut s’intéresser qu’aux positions : une seule passe avant produit donc une prédiction du token suivant à chaque position à la fois - ce qui est exactement ce qui rend efficace l’objectif d’entraînement de l’article suivant.
À retenir
- L’attention multi-têtes répartit le plongement entre les têtes - par tête dans GPT-2 small - de sorte que plusieurs schémas de pertinence sont appris au coût d’une seule tête.
- La normalisation de couche remet chaque vecteur à moyenne nulle et variance unité selon la dimension des caractéristiques, contrairement à la dimension de lot de la batch norm.
- Le transformeur originel utilisait le Post-LayerNorm ; GPT-2 et les modèles ultérieurs utilisent le Pre-LayerNorm pour un entraînement plus stable.
- Les connexions de raccourci ajoutent l’entrée d’une couche à sa sortie ; la dérivée qui en résulte garde les gradients vivants - 0,0002 contre 0,22 à la couche 1 dans la mesure de Raschka.
- Le réseau à propagation avant dilate et détient environ deux fois les paramètres de l’attention voisine.
- Le décompte des blocs, de la normalisation finale et des plongements donne 124 439 808 paramètres pour GPT-2 small, conforme aux 124M publiés (les 117M du rapport original ayant été corrigés depuis).
- Un bloc préserve la forme de son entrée, ce qui est précisément pourquoi l’architecture passe à l’échelle par empilement.
La suite
Nous avons une architecture de 124 millions de paramètres initialisés au hasard, qui ne prédit rien. La transformer en un modèle qui écrit un texte fluide, puis en un modèle qui suit des instructions, est le sujet de Le préentraînement et l’affinage.
Références et lectures complémentaires
- Sebastian Raschka, Build a Large Language Model (From Scratch), Manning, 2025· Bibliothèque de référence Kudos AI
Les œuvres protégées par le droit d’auteur sont citées à titre de référence uniquement et ne sont pas hébergées ici ; veuillez consulter l’éditeur pour y accéder.