Portfolio
Exploration · Transformer

ChatGPT de A à Z
une seule question, tout décodé

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.

"Combien font deux et deux ?"
Commencer

00 Vue d'ensemble

Le pipeline complet

Avant de plonger, voici les 6 étapes que chaque token traverse. Cliquez sur une étape pour y accéder directement.

① Tokenisation
texte → IDs entiers
② Embedding + PosEnc
ID → vecteur ℝᵈ
③ Projections Q, K, V
3 matrices × vecteur
④ Scores d'attention
QKᵀ / √d → softmax
⑤ Feed-Forward + LayerNorm
MLP par position
⑥ Génération
logits → token suivant

01 Étape 1

Tokenisation :
découper en sous-mots

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.

Entrée brute
"Combien font deux et deux ?"
Tokens détectés par GPT-2 BPE
IDs dans le vocabulaire
Séquence de longueur
T = 6

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.

Séquence : [BOS, "Com", "bien", " font", " deux", " et", " deux", " ?"] IDs : [50256, 7224, 28206, 10128, 1811, 968, 1811, 5633]

02 Étape 2

Embedding + Positional Encoding :
les tokens deviennent des vecteurs

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.

Token Embedding
Positional Encoding
Somme finale

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é) :

E (extrait, 4 tokens × d=4)

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 :

PE(pos, 2i) = sin(pos / 10000^(2i/d)) PE(pos, 2i+1) = cos(pos / 10000^(2i/d))
PE (4 positions × d=4)

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.


03 Étape 3

Projections Q, K, V :
trois rôles pour chaque token

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.

Query — la question
Q = X · WQ
"Qu'est-ce que je cherche ?" Chaque token envoie une requête vers tous les autres tokens de la séquence.
Key — l'étiquette
K = X · WK
"Voici ce que j'offre." Si la Key d'un token correspond à la Query d'un autre, l'attention est forte.
Value — le contenu
V = X · WV
"Voici mon information." Si l'attention Q·K est forte, cette Value est fortement pondérée dans la sortie.
Calcul numérique — token " deux" (pos 4)

On travaille avec d=4 et dk=4 pour que les matrices soient lisibles. Voici les trois projections pour le token " deux" :

Toutes les Queries (matrice Q = X · W_Q)

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.


04 Étape 4

Scores d'attention :
Q · Kᵀ / √d → softmax

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.

Scores bruts : score(i,j) = Q[i] · K[j]ᵀ / √d_k Masque causal : score(i,j) = −∞ si j > i Poids d'attention : α = softmax(scores)
Scores bruts pour le token " deux" (pos 4) — d_k = 4, √d_k ≈ 2
Matrice d'attention complète α (après masque + softmax) — 4 premiers tokens

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.

Température et softmax

La température T divise les scores avant softmax. T faible = distribution concentrée, T élevée = distribution plate.

1.0

↑ À T=0.1 tout se concentre sur le token le plus probable. À T=3 la distribution s'aplatit presque uniformément.


05 Étape 5

Feed-Forward + LayerNorm :
la mémoire factuelle du modèle

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.

z = LayerNorm(x + Attention(x)) ← résidu 1 h = ReLU(z · W₁ + b₁) ← d → 4d out = LayerNorm(z + h · W₂ + b₂) ← résidu 2
Calcul pour le token " deux" — d=4, d_ff=16 (4×4)
Connexion résiduelle

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.

Layer Normalization

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.


06 Étape 6

Génération autoregressive :
un token à la fois

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.

logits = h_last · W_vocab (ℝ^d → ℝ^|V|) probs = softmax(logits / T) token = argmax(probs) ou sample(probs)
Simulation step-by-step — suivez la génération
Combien font deux et deux ?
Top-5 candidats — étape courante
Stratégies de décodage
Greedy
Toujours le token de probabilité maximale. Déterministe mais répétitif.
Top-p (nucleus)
On garde les tokens dont la somme cumulative de probabilité ≤ p (ex: 0.9). Équilibre qualité/diversité.
Beam search
On garde les k meilleures séquences à chaque étape. Plus coûteux mais meilleure cohérence globale.

Récapitulatif

De "Combien font deux et deux ?"
à "Quatre."

← Retour au portfolio