Aller au contenu
The loss curve

Guide

Construire un Transformer depuis zéro

Construis un bloc Transformer depuis zéro — attention Q/K/V, multi-têtes, résidus, LayerNorm, feed-forward. Exécutable dans le navigateur, puis en PyTorch.

Un bloc Transformer, c'est six petites opérations empilées dans un ordre précis. La plupart des explications sautent l'assemblage. Ce guide construit chaque pièce isolément — attention, multi-têtes, résidus, LayerNorm, feed-forward — puis les réunit dans un modèle PyTorch fonctionnel. Trois chapitres exécutables soutiennent cette page.

1. Le Transformer en une phrase

Le Transformer est une pile de blocs identiques. Chaque bloc laisse chaque token de la séquence regarder tous les autres (via l'attention), puis traite chaque token indépendamment (via un réseau feed-forward). Les connexions résiduelles et la LayerNorm maintiennent la circulation des gradients quand la pile devient profonde.

2. La tête d'attention

La version la plus simple de l'attention prend trois projections de l'entrée — Query, Key, Value — et calcule une somme pondérée des values. Les poids viennent de la correspondance entre chaque query et chaque key.

La formule exacte :

A = softmax(Q · Kᵀ / √d_k) · V

Le chapitre 8 — une tête d'attention à la main construit cette opération étape par étape, avec des visualisations interactives de la matrice d'attention et du masque causal.

3. L'attention multi-têtes

Une fois qu'on a une tête, le multi-têtes est l'extension évidente : lancer plusieurs têtes en parallèle, chacune avec ses propres projections Q/K/V, puis concaténer leurs sorties et les reprojeter à travers une matrice apprise W_O.

Les têtes se spécialisent. Certaines regardent le token précédent (syntaxe). D'autres regardent un mot précis ailleurs dans la séquence (sémantique). D'autres regardent uniformément (identité). Le modèle n'a pas besoin qu'on lui dise laquelle fait quoi : il apprend le routage par les gradients.

Le chapitre 9 — multi-têtes et résidus déroule la découpe en têtes, la concaténation, et la connexion résiduelle qui rend toute la pile entraînable.

4. Résidus et LayerNorm

Deux pièces de plomberie gardent le Transformer entraînable en profondeur.

  • Les connexions résiduelles : output = input + sublayer(input). Le bloc apporte un delta à l'entrée au lieu de la remplacer. Les gradients traversent l'addition proprement ; la profondeur cesse d'être un goulot d'étranglement.
  • La LayerNorm : elle normalise le vecteur d'activation de chaque token à moyenne 0 et écart-type 1. Elle stabilise l'échelle des activations à mesure que la pile grandit. Les Transformers modernes appliquent la LayerNorm avant l'attention et le feed-forward (la variante « pre-norm »), plus stable que le post-norm de l'article d'origine.

Les deux sont couverts au chapitre 9, avec des visualisations comparant les gradients avant et après entraînement.

5. Le réseau feed-forward

Une fois que l'attention a fait son routage, chaque token est traité indépendamment par un petit MLP — deux couches linéaires séparées par une non-linéarité, en général GELU. C'est là que vit la majorité des paramètres du modèle en pratique : la dimension cachée du FFN vaut typiquement 4 fois la dimension du modèle.

6. Le bloc complet

En rassemblant tout, un bloc Transformer s'écrit :

x = x + Attention(LayerNorm(x))    # résidu d'attention
x = x + FFN(LayerNorm(x))          # résidu feed-forward

C'est tout. Empile N de ces blocs (12 pour GPT-2 small, 96 pour GPT-3) et tu as un Transformer.

Le chapitre 10 — le bloc Transformer complet assemble le bloc de bout en bout et fait tourner une passe avant avec les formes tracées proprement.

7. La suite

Questions fréquentes

Qu'y a-t-il dans un bloc Transformer ?

Six opérations dans un ordre précis. LayerNorm, puis attention multi-têtes, puis une connexion résiduelle qui rajoute l'entrée. Puis LayerNorm, puis un petit MLP feed-forward, puis un second résidu. C'est tout — le reste consiste à répéter ce bloc N fois.

Pourquoi trois vecteurs par token (Q, K, V) dans l'attention ?

Une query dit « ce que je cherche », une key annonce « ce que je représente », et une value porte « ce que j'apporte ». Séparer ces trois rôles permet au modèle de décider les poids d'attention à partir des queries et des keys, pendant que le contenu réel circule par les values.

Qu'apporte le multi-têtes par rapport à une seule tête ?

Une tête apprend un motif d'attention. Le multi-têtes en lance plusieurs en parallèle, chacune avec ses propres projections, ce qui laisse différentes têtes s'occuper de motifs différents (syntaxe, identité, longue portée) avant de combiner les résultats.

Pourquoi la LayerNorm plutôt que la BatchNorm ?

La LayerNorm normalise par token, donc elle fonctionne quelle que soit la taille du batch — ce qui compte pour des séquences de longueur variable et à l'inférence, où le batch peut valoir 1. La BatchNorm coupleraient les tokens à travers le batch, ce qui est le mauvais invariant pour du langage.

Que fait le masque causal ?

Il empêche chaque token de regarder les tokens futurs pendant l'entraînement. On met les scores des positions futures à moins l'infini avant le softmax, donc ils finissent à probabilité zéro. C'est ce qui fait d'un Transformer un décodeur : il ne voit que le passé.