Chapitre 05 · Architecture · 14 min

Le Transformer, en entier

Assembler les pièces : multi-head attention, feed-forward, normalisation, connexions résiduelles.

Tout ça pour ça

On a maintenant tous les morceaux du puzzle :

  • Le texte devient des tokens (chapitre 02).
  • Les tokens deviennent des vecteurs dans un espace de sens (chapitre 03).
  • L'attention laisse chaque vecteur regarder les autres et se reconfigurer (chapitre 04).

Reste à savoir comment on assemble ces pièces pour obtenir un modèle complet. La réponse, élégamment minimaliste : on les empile.

Le bloc de base

Un Transformer moderne, c'est un même petit bloc, répété N fois. Ce bloc contient deux sous-modules :

  1. Une couche de multi-head attention, qui permet aux tokens de communiquer entre eux.
  2. Un feed-forward network (FFN) — deux transformations linéaires séparées par une non-linéarité — qui transforme chaque token indépendamment.

Autour de ces deux sous-modules, deux structures fixes :

  • LayerNorm avant chaque sous-module : normalise les vecteurs pour stabiliser l'apprentissage.
  • Connexions résiduelles autour de chaque sous-module : la sortie du bloc est l'entrée plus la transformation, jamais la transformation seule.

Survole les six étages du schéma ci-dessous, dans l'ordre où un token les traverse. À chaque étage, pose-toi une seule question : est-ce que ce sous-module fait communiquer les tokens entre eux, ou est-ce qu'il travaille sur chacun dans son coin ?

Survole un sous-bloc pour voir son rôle : l'attention diffuse l'information entre tokens, le feed-forward la transforme localement, la normalisation et les résiduels stabilisent le tout. Empilés 32 ou 96 fois, ils donnent un GPT-4 ou un Claude.

La réponse : un seul de ces six étages fait circuler l'information entre les tokens — le multi-head attention. Tout le reste travaille position par position, isolément. C'est la division du travail à garder en tête pour la suite du chapitre : l'attention mélange, le feed-forward transforme, la normalisation et les résiduelles stabilisent. Et il n'y a rien d'autre — ce bloc-là répété 12 fois donne un GPT-2 small, répété 96 fois un GPT-3.

Pourquoi les résiduelles changent tout

C'est probablement l'astuce architecturale la plus importante de la décennie. Sans connexion résiduelle, empiler 96 blocs successifs revient à faire passer un signal à travers 96 transformations en cascade. Le gradient (le signal d'apprentissage) se dilue à chaque passage. Au bout de quelques couches, il ne reste plus rien à apprendre.

Avec une connexion résiduelle, le bloc apprend une modification plutôt qu'une transformation totale : sortie = entrée + f(entrée). Le signal initial passe toujours intact à travers tout le réseau, et chaque bloc l'enrichit un peu.

Sans résiduel, un Transformer profond ne peut pas s'entraîner. Avec, il peut empiler 100+ couches sans broncher.

Le FFN, la moitié oubliée

On parle beaucoup d'attention. On parle moins du FFN, qui contient pourtant deux fois plus de paramètres.

À chaque couche, après l'attention, chaque token traverse un MLP :

FFN(x) = Linear_2(GELU(Linear_1(x)))

Linear_1 projette le vecteur dans une dimension intermédiaire 4× plus large (typiquement 4 × 768 = 3072 pour GPT-2 small). Linear_2 le ramène à la dimension d'origine. Cette expansion-puis-contraction est l'endroit où le modèle stocke la majorité de ses connaissances factuelles — les noms propres, les associations apprises, les motifs récurrents.

Cette écriture est celle de GPT-2. Les modèles récents remplacent GELU par SwiGLU, qui utilise trois matrices au lieu de deux et une expansion plus proche de 8/3× pour garder le même nombre de paramètres. Le principe, lui, ne change pas : on élargit, puis on resserre.

Quand on parle de "70 milliards de paramètres" dans un modèle, l'écrasante majorité vit dans les FFN.

Position et causalité

Deux détails qu'on n'a pas encore évoqués :

Encodage de position. L'attention est invariante par permutation : si tu mélanges les tokens d'une phrase, l'attention retourne le même résultat (juste mélangé). Ce n'est pas ce qu'on veut. Pour qu'un LLM sache que "Le chat mange le poisson" diffère de "Le poisson mange le chat", on injecte une information de position dans chaque vecteur d'embedding (positional encoding, RoPE, ALiBi…). Aujourd'hui, RoPE (rotary position embedding) est la convention.

Masque causal. Comme on l'a vu au chapitre 4, dans un modèle de génération, chaque token ne peut regarder que ses prédécesseurs. Le masque causal s'applique à la matrice d'attention : les positions futures sont fixées à −∞ avant le softmax. Ça force le modèle à prédire, pas à copier.

Combien de blocs ?

Le squelette est resté le même de GPT-2 à aujourd'hui : des blocs identiques empilés, des connexions résiduelles, une normalisation avant chaque sous-module. Ce qui change le plus, c'est l'échelle :

ModèleBlocsDimensionHeadsParamètres
GPT-2 small1276812117M
GPT-2 XL481600251.5B
GPT-3961228896175B
Llama 3 70B8081926470B

Plus de blocs = plus de raisonnement compositionnel possible (chaque couche peut s'appuyer sur les abstractions de la précédente). Plus de dimensions = plus de capacité par token. Plus de heads = plus de "questions" simultanées.

Attention quand même à la formule "c'est la même architecture" : elle est vraie pour le plan d'ensemble, fausse dans le détail des pièces. Entre 2019 et aujourd'hui, à peu près chaque composant a été remplacé par une version plus efficace : RoPE au lieu des positions apprises, RMSNorm au lieu de LayerNorm, SwiGLU au lieu de GELU, GQA au lieu du multi-head classique — sans compter les variantes Mixture of Experts qu'on voit plus bas. Même plan, pièces différentes.

La sortie : du vecteur à la distribution

À ce stade, le dernier bloc nous donne, pour chaque position, un vecteur de quelques milliers de dimensions. Comment retombe-t-on sur une distribution sur le vocabulaire ?

Une seule étape. On multiplie ce vecteur par une matrice W_out de dimensions (d_model × |vocab|), puis on applique un softmax. Le résultat : pour chaque position, une probabilité sur tous les tokens du vocabulaire — environ 50 000 pour GPT-2, 128 000 pour Llama 3, 200 000 pour GPT-4o. C'est ça, la sortie d'un LLM — une distribution.

Détail élégant : dans beaucoup de petits modèles (GPT-2, Gemma…), W_out partage ses poids avec la matrice d'embedding d'entrée (weight tying). La même transformation qui mappe le token 5234 vers un vecteur, en sens inverse, mappe un vecteur vers la probabilité du token 5234. Économie de paramètres, et meilleure généralisation. Les gros modèles (GPT-3, Llama 70B, Mistral…) séparent au contraire les deux matrices : à cette échelle, le coût en paramètres devient négligeable, et deux matrices libres marchent mieux qu'une seule contrainte.

Mixture of Experts : tous les paramètres ne s'activent pas

Une variante architecturale est devenue dominante dans les modèles récents : Mixture of Experts (MoE). Mixtral, DeepSeek, Qwen, Llama 4 l'utilisent — c'est confirmé, leurs architectures sont publiées. Pour les modèles fermés (GPT-4, Gemini), on n'a que des fuites et des estimations : probable, mais jamais confirmé officiellement. La nuance mérite d'être gardée en tête chaque fois qu'on lit un chiffre sur un modèle propriétaire.

L'idée : au lieu d'un seul FFN par bloc, on en place plusieurs en parallèle (typiquement 8 à 128 experts). À chaque token, un petit réseau de routage (router) en sélectionne deux ou quatre — les plus pertinents pour ce token. Seuls ces experts s'activent.

Conséquence : un modèle peut avoir 400 milliards de paramètres "totaux" mais n'en activer que 50 milliards par token. Capacité d'un grand modèle, coût de calcul d'un petit. C'est ce qui rend Mixtral 8×7B (47 milliards de paramètres) compétitif avec des modèles denses bien plus gros à l'inférence.

Le compromis : la mémoire VRAM doit accueillir tous les experts (sinon il faut les swap), et le routage introduit une couche d'instabilité à l'entraînement. C'est un domaine encore très actif.

Le miracle de la simplicité

Tout l'édifice tient sur un seul motif, répété, normalisé, additionné à lui-même. Pas de structures spécifiques pour la grammaire. Pas de modules séparés pour la sémantique. Pas de règles linguistiques codées.

Un Transformer ne sait rien de la langue. Il sait juste mélanger des vecteurs en regardant qui ressemble à qui.

Toute la complexité émerge de l'entraînement — c'est le sujet du chapitre suivant.

Mis à jour le