On suit le calcul complet — tokens, vecteurs, matrices Q/K/V, scores d'attention, softmax, génération — avec de vraies valeurs numériques à chaque étape.
Avant de plonger, voici les 6 étapes que chaque token traverse. Cliquez sur une étape pour y accéder directement.
Le modèle ne lit pas des lettres ni des mots entiers. Il utilise un vocabulaire de ~50 000 sous-mots (BPE — Byte Pair Encoding). Chaque token a un ID entier unique.
Le token spécial [BOS] (Beginning Of Sequence) est ajouté en tête. La séquence finale a T+1 = 7 positions. Le masque causal garantit que le token à la position i ne peut "voir" que les positions ≤ i.
Chaque ID est projeté en un vecteur de dimension d=4 (simplifié ici ; GPT-2 utilise d=768). On additionne ensuite l'encodage positionnel pour que le modèle sache où se trouve chaque token.
La matrice d'embedding E ∈ ℝ^{|V|×d} associe un vecteur à chaque token. On extrait les lignes correspondant à nos 4 premiers tokens (d=4 pour lisibilité) :
Ces valeurs sont apprises pendant l'entraînement. Des tokens sémantiquement proches ont des vecteurs proches dans cet espace.
L'encodage positionnel utilise des sinusoïdes de fréquences variées :
La représentation finale X = E + PE. C'est la matrice d'entrée de chaque bloc Transformer :
Chaque ligne de X est la représentation initiale d'un token. Ces vecteurs sont ensuite raffinés par les couches d'attention.
Chaque token joue simultanément trois rôles : il pose une question (Query), affiche une étiquette (Key), et détient une information (Value). Ces trois représentations sont obtenues par multiplication de X par trois matrices apprisses.
On travaille avec d=4 et dk=4 pour que les matrices soient lisibles. Voici les trois projections pour le token " deux" :
Chaque ligne correspond à un token. La ligne surlignée est le token " deux" (pos 4) — c'est le token dont on va calculer l'attention.
Pour chaque token, on calcule un score d'attention avec tous les tokens précédents (masque causal). Plus le score est élevé, plus ce token va "emprunter" l'information de l'autre.
Chaque ligne = distribution de probabilité sur les tokens précédents (les cases grises sont masquées). Cliquez sur une ligne pour voir le détail.
La température T divise les scores avant softmax. T faible = distribution concentrée, T élevée = distribution plate.
↑ À T=0.1 tout se concentre sur le token le plus probable. À T=3 la distribution s'aplatit presque uniformément.
Après l'attention, chaque position passe par un MLP à 2 couches (expansion ×4) + ReLU. C'est ici que le modèle "stocke" des faits comme 2+2=4. La connexion résiduelle et LayerNorm stabilisent l'entraînement.
On ajoute l'entrée x à la sortie de chaque sous-couche : x_out = x + sublayer(x). Cela permet aux gradients de circuler directement lors de la rétropropagation — sans ça, les modèles profonds n'apprennent plus.
On normalise chaque vecteur indépendamment : y = (x−μ)/σ · γ + β. Contrairement à BatchNorm, LayerNorm opère sur la dimension d, pas sur le batch — crucial pour les séquences de longueurs variables.
La sortie de la dernière couche est projetée via une couche linéaire sur le vocabulaire (~50k tokens). Le softmax final donne une distribution de probabilité. On échantillonne le token suivant, on l'ajoute au contexte, et on recommence.