Phase 07: Transformers Deep Dive

GPT Modélisation du langage de causalité

Le masque triangulaire est la ligne de code la plus importante de l'IA moderne.

Type: Build

Languages: Python

Prerequisites: Phase 7 · 02 (Self-Attention), Phase 7 · 05 (Full Transformer), Phase 7 · 06 (BERT)

Time: ~75 minutes

Le problème

Un modèle de langage répond à une question: étant donné la première t-1Les jetons, quelle est la répartition de probabilité sur les jetons tTrainer sur ce signal prédiction de jeton suivant et vous obtenez un modèle qui peut générer du texte arbitraire un jeton à la fois.

Pour l'entraîner de bout en bout sur une séquence entière en parallèle, vous devez que la prédiction de chaque position ne dépend que des positions précédentes.

Le masque causale fait ceci.-infLes valeurs ajoutées aux points d'attention avant softmax. Après softmax, ces positions deviennent 0. Chaque position peut se concentrer uniquement sur elle-même et les positions précédentes. Et parce que vous l'appliquez une fois à toute la séquence, vous obtenez N parallèles de prochaine jetons prédictions dans un passage en avant.

GPT-1 (2018), GPT-2 (2019), GPT-3 (2020), GPT-4 (2023), GPT-5 (2025), Claude, Llama, Qwen, Mistral, DeepSeek, Kimi ce sont tous des transformateurs causaux décodeurs uniquement avec la même boucle de base. Ce qui les sépare, ce sont la qualité des données, l'échelle et les raffinements architecturaux, et la post-formation (SFT, RLHF, DPO, et leurs successeurs).

Le concept

!Causal mask creates a triangular attention matrix

Le masque

Compte tenu d' une séquence de longueur N, construire uneN × Nmatrice:

M[i, j] = 0       if j <= i
M[i, j] = -inf    if j > i

Ajouter Mà la note d'attention avant softmax. exp(-inf) = 0Chaque rangée de la matrice d'attention est une répartition de probabilité sur les positions précédentes seulement.

Coût de mise en œuvre: 1 torch.tril()Le temps de calcul: nanosecondes, impact sur le terrain, tout.

D'où vient le triangle

Le masque est généralement présenté comme un patch boulonné sur l'attention.

Stage 1 — prefix average.Le résumé de la suite de causes la plus stupide: positionidevient la moyenne des positions 0…iEn tant que boucle, c'estout[i] = X[:i+1].mean(0)Le même calcul est une matrice multipliée. Prenez une matrice triangulaire inférieure de un, divisez chaque rangée par son nombre, multipliez:

pythonimport numpy as np

A = np.tril(np.ones((n, n)))
A = A / A.sum(axis=1, keepdims=True)
out = A @ X

Régime ide Aest [1/(i+1), …, 1/(i+1), 0, …, 0]Les zéros au-dessus de la diagonale sont la causalité. Rien sur le futur n'a été masqué; le futur n'a jamais été dans la somme.

Stage 2 — learned weights.Une moyenne uniforme traite chaque jeton passé comme étant également pertinent.S. Maintenant, les lignes ne sont plus de la somme à un par construction, donc normaliser chaque ligne avec softmax au lieu de la division par le comptage. Softmax ne produit jamais un zéro exact, ce qui rompt la causalité à moins que les scores futurs entrent comme -inf, parce que exp(-inf) = 0- Le numéro de la liste:

pythondef softmax(x, axis):
    e = np.exp(x - np.max(x, axis=axis, keepdims=True))
    return e / e.sum(axis=axis, keepdims=True)

S = S + np.triu(np.full((n, n), -np.inf), k=1)
A = softmax(S, axis=1)
out = A @ X

Le même triangle, la même matrice de rangée stochastique, le même matmul.-infLe masque n'est pas une nouvelle machine, c'est une entrée zéro de l'étape 1, traduite dans le domaine d'entrée de softmax.

Stage 3 — content-dependent weights.Dans la phase 2, SLa position 7 pèse toujours la position 3 de la même façon, peu importe ce que disent les jetons.S = Q @ K.T / sqrt(d_k)Le masque, le softmax, le matmul sont identiques.

Trois étapes, une invariante: une matrice de rangée-stochastique triangulaire inférieure multipliée par la séquence. moyenne uniforme, poids statiques apprises, poids dépendant du contenu. Le masque n'a jamais été ajouté à l'attention.

Formation parallèle, inférence en série

Formation: faire avancer l'ensemble (N, d_model)une fois la séquence, calculer N pertes d'entropie croisée (une par position), somme, backprop. Parallèlement le long de la séquence. C'est pourquoi les échelles de formation GPT vous traitez 1M jetons dans un lot dans un seul GPU passer.

Inference: vous générez des jetons par jetons.[t1, t2, t3]Je suis là .t4- La nourriture .[t1, t2, t3, t4]Je suis là .t5- La nourriture .[t1, t2, t3, t4, t5]Je suis là .t6Le cache KV (leçon 12) sauve les états cachés de t1…tnDonc, vous ne les recomptez pas à chaque étape. Mais la profondeur sérielle à l'inférence = longueur de sortie. C'est la taxe autorégressive et pourquoi le décoding est le goulot d'étranglement de latence de chaque LLM.

La perte changement par changement

Les jetons donnés [t1, t2, t3, t4]- Le numéro de la liste:

  • Enregistrement: [t1, t2, t3]
  • Objectifs: [t2, t3, t4]

Pour chaque poste .i, calcul-log P(target_i | inputs[:i+1])C'est la croisée de l'entropie de toute la séquence.

Tous les transformateurs LM que vous avez entendus trainer sur cette perte.

Stratégies de décoding

Après l'entraînement, les choix d'échantillonnage comptent plus que les gens ne le pensent.

MethodWhat it doesWhen to use
GreedyArgmax every stepDeterministic tasks, code completion
TemperatureDivide logits by T, sampleCreative tasks, higher T = more diversity
Top-kSample from top-k tokens onlyKills low-probability tails
Top-p (nucleus)Sample from smallest set with cumulative prob ≥ p2020+ default; adapts to distribution shape
Min-pKeep tokens with p > min_p * max_p2024+; better at rejecting long tails than top-p
Speculative decodingDraft model proposes N tokens, big model verifies2–3× latency reduction at same quality

En 2026, min-p + température 0,7 est une valeur par défaut raisonnable pour les modèles à poids ouvert.

Qu'est- ce qui a permis au " recette de la GPT " de fonctionner

  1. Decoder-only.Pas de coefficient d'encodage, une attention par couche.
  2. Scaling.124M → 1.5B → 175B → trillions. Les lois de l'échelle de Chinchilla (leçon 13) vous disent comment dépenser l'informatique.
  3. In-context learning.Il est apparu vers 6B13B. Le modèle peut suivre quelques exemples sans ajustement.
  4. RLHF.Une formation post-traînement sur les préférences humaines a transformé le texte brut prétrainé en assistants de chat.
  5. Pre-norm + RoPE + SwiGLU.Une formation stable à l'échelle.

L'architecture de base n'a pas beaucoup changé depuis GPT-2. Tout ce qui est intéressant s'est passé dans les données, l'échelle et la formation post-training.

Faites-le

Étape 1: le masque de causalité

Regardez !code/main.pyUne ligne unique:

pythondef causal_mask(n):
    return [[0.0 if j <= i else float("-inf") for j in range(n)] for i in range(n)]

Ajoutez-le aux notes d'attention avant le softmax.

Étape 2: un modèle GPT à deux couches

Améliorez deux blocs de décodeur (auto-attention masquée + FFN, aucune attention croisée). Ajoutez un embed token, un codage positional et un un déembedding (attaché à la matrice d'embedding token un truc standard depuis GPT-2).

Étape 3: Prédiction du prochain jeton, de bout en bout

Sur un vocabulaire de jouets à 20 jetons, produisez des logites à chaque position. Comptez la perte d'entropie croisée contre la cible de décalage par un. Pas de gradient c'est un contrôle de santé mentale avant-pass.

Étape 4: prélèvement d'échantillons

Implémenter l'avidité, la température, le top-k, le top-p, le min-p. Exécuter chacun sur une demande fixe et comparer les sorties.

Utilisez-le

PyTorch, 2026 - Je suis un homme.

pythonfrom transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-3B-Instruct")
tok = AutoTokenizer.from_pretrained("meta-llama/Llama-3.2-3B-Instruct")

prompt = "Attention is all you need because"
inputs = tok(prompt, return_tensors="pt")
out = model.generate(
    **inputs,
    max_new_tokens=64,
    temperature=0.7,
    top_p=0.9,
    do_sample=True,
)
print(tok.decode(out[0]))

Sous le capot,generate()Il effectue le passage vers l'avant, tire les logits de position finale, échantillonne le jeton suivant, l'apporte et le répète.

GPT vs BERT, one line each:Les prédictions du GPT P(x_t | x_{<t})- BERT prédit .P(x_masked | x_unmasked)La perte détermine si le modèle peut générer.

La faire partir

Regardez !outputs/skill-sampling-tuner.md. La compétence choisit les paramètres d'échantillonnage pour une tâche de nouvelle génération et désigne les décodage déterministique requis.

Exercices

  1. Easy.On court .code/main.pyet vérifier que la matrice d'attention causale est triangulaire inférieure après softmax.
  2. Medium.Comparez la perplexité de la poutre 4 contre la cupidité sur 10 courtes instructions. La poutre gagne-t-elle toujours ? (conseil: généralement pour la traduction, pas pour le chat ouvert).
  3. Hard.Implémenter le décoding spéculatif: utiliser un modèle minuscule de 2 couches comme projet et un modèle de 6 couches comme vérificateur. Mesurer l'accélération de l'horloge murale sur 100 compléments de longueur 64.

Les termes clés

TermWhat people sayWhat it actually means
Causal mask"The triangle"Upper-triangular -inf matrix added to attention scores so position i only sees positions ≤ i.
Next-token prediction"The loss"Cross-entropy of the model's distribution against the true next token at every position.
Autoregressive"Generate one at a time"Feed output back as input; parallelism only during training, not during generation.
Logits"Pre-softmax scores"Raw output of the LM head before softmax; sampling happens on these.
Temperature"Creativity knob"Divide logits by T; T→0 = greedy, T→∞ = uniform.
Top-p"Nucleus sampling"Truncate distribution to smallest set summing to ≥p; sample from what remains.
Min-p"Better than top-p"Keep tokens where p ≥ min_p × max_p; adapts cutoff to sharpness of distribution.
Speculative decoding"Draft + verify"Cheap model proposes N tokens; big model verifies in parallel.
Teacher forcing"Training trick"During training, feed the true previous token, not the model's prediction. Standard for every seq2seq LM.

Pour en savoir plus

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.