Comment fonctionne un LLM (5/6) : le Transformer en entier
Qui a écrit cette série ?
Cette série a été pilotée, critiquée et validée par Alex, qui en a fixé le plan, les règles de sources et le ton. Les textes ont été rédigés en co-écriture avec Claude (Anthropic) : Claude a proposé des plans, des calculs, des sources et des formulations, qu’Alex a relus, corrigés ou refusés. Alex est responsable du contenu publié.
Les épisodes précédents ont posé les pièces une à une : le token et la probabilité du token suivant (épisode 1), le vecteur (épisode 2), l’attention qui fait échanger de l’information entre positions (épisode 3), le neurone et les couches (épisode 4). Cet épisode les assemble. Le modèle décrit ici est un décodeur seul : une pile de blocs, sans partie encodeur. C’est la forme que suivent surtout les grands modèles de langage actuels. L’article original de 2017 (Vaswani et al.) était encodeur-décodeur ; il a servi de point de départ.
Ce que vous saurez à la fin
- Décrire un bloc Transformer : une attention multi-têtes, un réseau à deux couches appliqué à chaque position, des additions résiduelles et une normalisation.
- Expliquer pourquoi l’on empile des dizaines de blocs, et ce que l’empilement change.
- Dire comment la sortie du modèle devient un score par token, puis des probabilités (rappel de l’épisode 1).
- Expliquer pourquoi l’attention seule ne voit pas l’ordre des mots, et comment l’encodage de position le corrige.
- Expliquer le masque causal : pourquoi un token ne doit voir que les précédents pour apprendre à prédire le suivant.
1. Un bloc, deux étages
Un bloc reçoit une suite de vecteurs, un par position, et renvoie une suite de même forme. Si l’entrée est une suite de 3 vecteurs de dimension 4 (forme 3 × 4), la sortie est encore de forme 3 × 4. Le bloc ne change pas la forme ; il change le contenu des vecteurs.
Il a deux étages. Le premier est l’attention (épisode 3) : chaque position reçoit un mélange des vecteurs des positions qu’elle peut voir. Le second est un petit réseau à deux couches, appliqué à chaque position séparément (épisode 4). Une normalisation et une addition encadrent chacun de ces deux étages.
Les flèches en pointillés sont les connexions résiduelles (section 4). Le cadre « × N » rappelle qu’on empile plusieurs blocs identiques dans leur forme, avec des poids propres à chacun (section 5).
2. Premier étage : l’attention à plusieurs têtes
L’attention de l’épisode 3 calcule, pour chaque position, un mélange pondéré des autres vecteurs, à partir de requêtes, de clés et de valeurs. Un bloc en fait plusieurs à la fois, en parallèle : ce sont les têtes.
Chaque tête a ses propres matrices, donc travaille sur une version différente des vecteurs. Les sorties des têtes sont concaténées, puis mélangées par une dernière matrice, dite de sortie. Au total, les quatre matrices de l’attention (requête, clé, valeur, sortie) font chacune d × d : soit 4d² paramètres, sans biais.
Dans l’article de 2017, Vaswani et al. utilisent h = 8 têtes sur une dimension de modèle d = 512. Chaque tête travaille donc avec des vecteurs de dimension 512 / 8 = 64 (publié).
On peut supposer que des têtes différentes se spécialisent : c’est une hypothèse, à établir modèle par modèle.
Exemple chiffré : avec d = 4, les quatre matrices d’attention comptent 4 × 4 × 4 = 64 paramètres.
Une tête, ce n’est pas un neurone
Dans l’épisode 4, le mot « neurone » a été présenté comme une métaphore : une unité qui fait une somme pondérée, ajoute un biais et applique une activation. Une tête d’attention est un autre objet : un calcul de mélange entre positions, avec ses matrices de requête, de clé et de valeur. Elle ne reçoit pas une seule entrée pour renvoyer une seule activation.
3. Second étage : un réseau appliqué à chaque position
Le second étage est un réseau à deux couches. Une première matrice fait monter le vecteur de d à une dimension cachée d_ff, une activation non linéaire est appliquée, puis une seconde matrice ramène le vecteur à d. Le même réseau, avec les mêmes poids, est appliqué à chaque position séparément. Il ne mélange rien entre positions : ce rôle revient à l’attention.
Les neurones de ce réseau sont ceux de l’épisode 4 : une somme pondérée, un biais, une activation, empilés en couches. Dans Vaswani et al. (2017), d_ff = 2 048 = 4 × 512 (publié). Le rapport 4 est une taille fréquente, pas une règle : la taille de la couche intermédiaire est une convention. Llama 3 utilise une autre fonction d’activation, SwiGLU (publié, Grattafiori et al., 2024) : le vecteur passe par deux projections, dont l’une est passée par la fonction SiLU, x · sigmoïde(x), puis multipliée par l’autre.
Pourquoi deux étages ?
L’attention mélange l’information entre positions, mais ce mélange ne fait que combiner des vecteurs existants. Le réseau, appliqué à chaque position, transforme chaque vecteur de façon non linéaire. Sans ce second étage, un bloc ne ferait que mélanger des vecteurs, sans rien calculer de nouveau sur chacun d’eux.
4. Additions et normalisation
Deux opérations accompagnent chaque étage (l’ordre de la normalisation varie, voir l’encadré). La première est la connexion résiduelle (He et al., arXiv 1512.03385) : la sortie F(x) d’un étage est additionnée à son entrée x, soit y = x + F(x). L’étage n’a plus à reproduire le signal : il apprend seulement la correction à y apporter. Conséquence : le signal et le gradient de l’épisode 1 peuvent traverser de nombreux blocs sans disparaître aussi vite. Sans ce raccourci, l’entraînement d’un réseau profond est bien plus difficile.
La seconde est la normalisation de couche (Ba, Kiros et Hinton, arXiv 1607.06450). Pour un vecteur, on calcule la moyenne μ et l’écart type σ de ses coordonnées, on retire μ et on divise par σ, puis on applique un gain g et un biais b, appris pendant l’entraînement.
Exemple : x = (1 ; 2 ; 3 ; 6). Moyenne μ = 3 ; variance = (4 + 1 + 0 + 9) / 4 = 3,5 ; σ ≈ 1,87. Sans gain ni biais, le vecteur normalisé vaut (−1,07 ; −0,53 ; 0 ; 1,60).
Avant gain et biais, ce vecteur a une moyenne nulle et une variance égale à 1. Le gain et le biais, appris ensuite, permettent au réseau de retrouver l’échelle qui lui convient.
Post-normalisation ou pré-normalisation ?
L’article de 2017 normalise après l’addition. GPT-3 suit l’architecture de GPT-2, qui normalise avant chaque étage (pré-normalisation, Brown et al., 2020). Le détail varie donc selon les modèles : il faut le lire dans chaque publication.
5. Empiler des dizaines de blocs
La sortie d’un bloc est l’entrée du suivant. Un modèle est donc une pile de blocs de même forme, avec des poids propres à chaque bloc. Chaque bloc reçoit des vecteurs déjà transformés par les précédents et les retransforme. On peut supposer que les premiers blocs captent des régularités locales, et les suivants des relations plus longues : c’est une hypothèse, non démontrée ici, et non une fonction attribuée à chaque bloc.
Les chiffres publiés : GPT-3 (175 milliards de paramètres) a 96 couches, c’est-à-dire 96 blocs (Brown et al., 2020, arXiv 2005.14165). Llama 3 8B en a 32 et Llama 3 405B en a 126 (Grattafiori et al., 2024, arXiv 2407.21783) : publié.
Plus de blocs ne veut pas dire un modèle meilleur à coût égal. Chaque bloc ajoute du calcul pour chaque token, de la mémoire à stocker, et des difficultés d’entraînement. La profondeur est donc un choix d’ingénierie, non une simple promesse de qualité.
Comptage estimé. Un bloc à d_ff = 4d compte environ 12d² paramètres : 4d² pour l’attention et 8d² pour le réseau (deux matrices de d × 4d). Pour GPT-3 : 12 × 12 288² × 96 ≈ 173,9 milliards. La table d’embedding ajoute 50 257 × 12 288 ≈ 0,62 milliard, soit un total estimé de 174,6 milliards. Ce calcul ne compte ni les biais ni les normalisations. À l’arrondi près (174,6 arrondi à 175), il correspond aux 175 milliards publiés (Brown et al., 2020).
Même méthode pour le Transformer de base de 2017 : encodeur, décodeur et table d’embedding partagée de 37 000 tokens (Vaswani et al., 2017, sections 3.4 et 5.1) donnent environ 63 millions de paramètres (estimé). Le papier publie 65 millions (publié). Les deux nombres sont du même ordre, sans être égaux : le calcul ne compte pas les biais des matrices d’attention et quelques détails d’implémentation.
Estimation ou chiffre publié ?
Un chiffre publié vient du fournisseur ou de l’article qui décrit le modèle. Un chiffre estimé vient d’un calcul à partir d’une formule, ici 12d²L. Le second donne un ordre de grandeur ; il ne remplace pas le chiffre publié.
6. De la sortie à une probabilité
Après le dernier bloc, le modèle prend le vecteur de chaque position. Pour la dernière position, il le multiplie par une matrice de taille d × V, où V est la taille du vocabulaire. On obtient un score par token possible : ce score s’appelle un logit.
Les logits ne sont pas des probabilités : ils peuvent être négatifs et ne totalisent pas 1. La softmax les transforme : chaque score est pris en exponentielle, puis divisé par la somme de toutes ces exponentielles. On obtient une probabilité par token, dont le total vaut 1, comme à l’épisode 1.
Exemple inventé. Cinq scores (2,0 ; 1,0 ; 0,1 ; −1,0 ; 0,5) donnent, après softmax, les probabilités (0,559 ; 0,205 ; 0,084 ; 0,028 ; 0,125). Leur total vaut 1 à l’arrondi près.
Le modèle produit donc une distribution sur tout le vocabulaire, et non « un mot ». Le tirage dans cette distribution, qui choisit le token effectivement produit, est une étape distincte, faite par la boucle de génération (épisode 1).
7. L’ordre des mots : pourquoi il faut le donner
L’attention compare les vecteurs deux à deux par des produits scalaires, puis pondère. Sans masque causal, si l’on permute les tokens, chaque sortie est la même, mais permutée. Sans information de position, « le chien mord l’homme » et « l’homme mord le chien » donnent donc le même ensemble de vecteurs, dans un ordre différent. Le sens change, pas le contenu.
La solution consiste à ajouter à chaque vecteur d’entrée un vecteur de position, qui dépend de la place du token. Vaswani et al. (2017, section 3.5) proposent une formule sinusoïdale :
PE(pos, 2i) = sin(pos / 100002i/d) et PE(pos, 2i+1) = cos(pos / 100002i/d).
Pour d = 4, les dimensions 0 et 1 utilisent i = 0, les dimensions 2 et 3 utilisent i = 1. Pour la position 1, on obtient (0,8415 ; 0,5403 ; 0,0100 ; 1,0000) ; pour la position 2, (0,9093 ; −0,4161 ; 0,0200 ; 0,9998) ; pour la position 3, (0,1411 ; −0,9900 ; 0,0300 ; 0,9996). Valeurs arrondies à 4 décimales.
Les coordonnées de rang bas oscillent vite quand la position change ; celles de rang haut oscillent lentement. Chaque position reçoit ainsi une signature unique, qui s’ajoute au vecteur du token.
Llama 3 utilise une autre manière, RoPE (θ = 500 000) : un encodage de position par rotation, où chaque paire de coordonnées du vecteur est tournée d’un angle qui croît avec la position (Grattafiori et al., 2024). Nous ne la développons pas ici.
8. Le masque causal : ne pas regarder la suite
L’épisode 1 pose l’objectif : prédire le token suivant à partir de ceux qui précèdent. Pour l’apprentissage, la position k ne doit donc voir que les positions 1 à k. Si elle voyait la suite, le modèle lirait la réponse au lieu de la prédire.
Le masque agit sur les scores d’attention avant la softmax : les scores vers les positions futures sont mis à −∞, et leur poids devient nul. Vaswani et al. le formulent ainsi : « We need to prevent leftward information flow in the decoder to preserve the auto-regressive property » (section 3.2.3).
Le masque permet donc de calculer en une seule passe toutes les prédictions d’une séquence, dont la perte est additionnée sur toutes les positions, comme à l’épisode 1.
Exemple : pour n = 4 tokens (« Le », « chat », « dort », « . »), le masque garde n(n+1)/2 = 10 cases sur 16 ; 6 paires (requête, clé) sont refusées. La figure 3 les montre.
9. Ordres de grandeur d’un modèle réel
Le tableau rassemble des chiffres publiés, avec leur source. Llama 3 et GPT-3 sont des modèles denses : tous leurs paramètres servent à chaque token. Les modèles fermés (GPT-4 et suivants) ne publient pas leur architecture : leurs cases sont marquées « non publié ».
| Modèle | Blocs (couches) | Dimension du vecteur | Têtes d’attention | Source |
|---|---|---|---|---|
| Vaswani et al. 2017 (base, encodeur-décodeur) | 6 + 6 (encodeur, décodeur) | 512 | 8 | arXiv 1706.03762 |
| GPT-3 175B (décodeur seul) | 96 | 12 288 | 96 | arXiv 2005.14165 |
| Llama 3 8B (décodeur seul) | 32 | 4 096 | 32 | arXiv 2407.21783 |
| Llama 3 405B (décodeur seul) | 126 | 16 384 | 128 | arXiv 2407.21783 |
| GPT-4 et suivants | non publié | non publié | non publié | aucun chiffre d’architecture publié |
Des images pour sentir l’ordre de grandeur
Un tableau de chiffres ne fait pas sentir la taille. Les images suivantes, avec leurs hypothèses écrites, le font.
Le temps : compter les paramètres
Si l’on comptait les paramètres de Llama 3 405B à raison d’un par seconde, sans s’arrêter, il faudrait environ 12 800 ans, soit près de cent trente siècles. Un modèle de 1 000 milliards de paramètres, scénario hypothétique, demanderait environ 31 700 ans.
L’empilement : des pages de chiffres
Imprimés à raison de 1 000 nombres par page, sur des feuilles de 0,1 mm, les 405 milliards de paramètres de Llama 3 405B formeraient une pile de 40,5 km : plus de quatre fois la hauteur de l’Everest. Hypothèse : une feuille par page.
La mémoire : des cartes graphiques
Pour stocker les seuls poids de Llama 3 405B, à 2 octets par paramètre, il faut 810 Go : au moins 11 cartes de 80 Go, avant même de faire tourner le modèle. Hypothèse : cartes de 80 Go, poids seuls, sans le cache de calcul.
Et les modèles fermés, Claude compris
Anthropic ne publie ni la taille ni l’architecture de ses modèles Claude. Les calculs de cette section portent donc sur des modèles dont l’architecture est publiée, comme Llama 3 et GPT-3. Pour un modèle fermé, tout nombre serait une hypothèse : le scénario à 1 000 milliards n’est pas une information sur un modèle existant.
Quatre pièges de lecture
- Le nombre de paramètres mesure la taille du modèle, pas sa qualité : deux modèles de même taille peuvent différer nettement.
- Dans un modèle à mélange d’experts, seule une partie des paramètres sert à chaque token. Le total ne mesure donc pas le calcul par mot.
- Les lois d’échelle donnent des tendances approximatives, pas des formules exactes : on ne déduit pas une taille d’une autre par simple proportion.
- La précision doit suivre la source : un chiffre arrondi pour une estimation, un chiffre exact seulement s’il est publié.
10. À retenir, et la suite
- Un bloc Transformer = attention multi-têtes + réseau à deux couches, avec additions résiduelles et normalisations. Il garde la forme de son entrée.
- On empile des dizaines de blocs. Plus de blocs coûtent plus de calcul et compliquent l’entraînement.
- La sortie devient des scores (logits) par token, puis des probabilités par softmax.
- L’attention ne voit pas l’ordre : l’encodage de position le donne. Le masque causal empêche de lire la suite.
Un modèle ainsi construit sait prolonger un texte, avec des probabilités apprises sur ses données. Mais une question de l’utilisateur n’est pas un début de phrase à compléter. Pourquoi ce qui sort de la machine ressemble-t-il alors à une réponse ? L’épisode 6 y répond, en décrivant ce qui vient après le pré-entraînement.
Pour revoir les pièces assemblées ici : l’épisode 4 (« Comment fonctionne un LLM (4/6) ») pour les neurones et les couches, et l’épisode 1 pour la prédiction du token suivant.
Dans cette série
- 1/6 : C’est quoi, au juste ?
- 2/6 : Les vecteurs, quand le sens devient géométrie
- 3/6 : L’attention
- 4/6 : Du neurone artificiel aux réseaux
- 5/6 : Le Transformer en entier (vous êtes ici)
- 6/6 : De la prédiction à la conversation
- Bonus 1 : La chaîne de raisonnement
- Bonus 2 : Le mélange d’experts
- Bonus 3 : Pourquoi des petits modèles
- Bonus 4 : La distillation, ou apprendre d’un professeur
- Bonus 5 : Et demain ?
- Bonus 6 : Pourquoi les LLM sont si bons avec le code informatique ?
- Bonus 7 : La carte comme langage ?
Mini-glossaire
- Bloc Transformer : attention multi-têtes et réseau à deux couches, avec additions résiduelles et normalisations.
- Tête d’attention : un calcul d’attention parmi plusieurs, avec ses propres matrices.
- Connexion résiduelle : addition de l’entrée d’un étage à sa sortie (y = x + F(x)).
- Normalisation de couche : centrage et réduction d’un vecteur (moyenne 0, variance 1 avant gain et biais).
- Encodage de position : vecteur ajouté à chaque entrée pour donner l’ordre des tokens.
- Masque causal : restriction qui interdit de voir les positions futures.
- Logit : score brut d’un token, avant la softmax.
- Softmax : transformation de scores en probabilités qui totalisent 1.
- Vocabulaire (V) : ensemble des tokens possibles.
Pour aller plus loin
- Vaswani et al., « Attention Is All You Need », 2017 (arXiv 1706.03762), en anglais.
- He et al., « Deep Residual Learning for Image Recognition », 2015 (arXiv 1512.03385), en anglais.
- Ba, Kiros et Hinton, « Layer Normalization », 2016 (arXiv 1607.06450), en anglais.
- Brown et al., « Language Models are Few-Shot Learners », 2020 (arXiv 2005.14165), en anglais.
- Grattafiori et al., « The Llama 3 Herd of Models », 2024 (arXiv 2407.21783), en anglais.