Chapitre 04 · Attention · 12 min

Attention is all you need

Le mécanisme qui change tout. Comment chaque token regarde tous les autres pour comprendre le contexte.

Le pronom et le médecin

Reviens un instant sur cette phrase, qu'on a déjà vue :

"Le médecin a renvoyé l'infirmière chez elle parce qu'elle…"

Pour un humain, "elle" se rattache naturellement à l'infirmière. Pour un LLM, ce n'est pas évident : au moment où il traite le token elle, le mot infirmière est huit positions en arrière. Comment fait-il pour relier les deux ?

C'est le rôle de l'attention.

Pourquoi l'attention existe

Avant 2017, les modèles de langage étaient majoritairement récurrents (RNN, LSTM) : ils lisaient le texte token par token, en propageant un "état caché" qui résumait tout ce qu'ils avaient vu jusque-là.

Problème : cet état caché est un goulot d'étranglement. Tout doit transiter par lui. À mesure que la phrase s'allonge, les informations anciennes se diluent. Et l'apprentissage est séquentiel — pour traiter le 100ᵉ mot, il faut avoir traité les 99 précédents, ce qui rend la parallélisation difficile.

Le papier Attention Is All You Need (Vaswani et al., 2017) propose une rupture :

Plus de récurrence. Chaque token regarde directement tous les autres, en parallèle.

C'est le mécanisme qui rend possible les modèles modernes.

L'intuition

À chaque couche du modèle, chaque token effectue trois opérations :

  1. Il pose une question au reste de la phrase (le vecteur Query).
  2. Chaque autre token affiche une étiquette qui résume ce qu'il est (le vecteur Key).
  3. Le token compare sa question à chaque étiquette : là où ça matche, il récupère un peu de contenu (le vecteur Value).

Le résultat : une nouvelle représentation pour chaque token, qui est une somme pondérée des autres, où les poids viennent des correspondances Q-K.

Attention(Q, K, V) = softmax(QKT / √dk) · V

Pas besoin de retenir la formule — retiens l'idée. Chaque token regarde tous les autres et mélange ce qu'il trouve d'intéressant.

D'où sortent Q, K et V exactement ?

Pas du néant. Pour chaque token, on prend son vecteur d'embedding x et on le multiplie par trois matrices apprises pendant l'entraînement :

Q = x · W_Q
K = x · W_K
V = x · W_V

Ces trois matrices W_Q, W_K, W_V sont les paramètres de l'attention. Elles sont les mêmes pour tous les tokens d'une même couche — c'est ce que le modèle ajuste, à coups de gradient, pour que les bonnes "questions" trouvent les bonnes "étiquettes".

Le facteur √d_k dans la formule sert à éviter que les produits scalaires explosent quand la dimension est grande. Sans lui, les valeurs avant softmax deviennent énormes, le softmax sature, et le gradient meurt. Détail technique mais nécessaire.

Plusieurs questions à la fois

Un seul ensemble de questions ne suffit pas. Un token peut avoir besoin de regarder son sujet syntaxique et sa coréférence et le verbe principal en même temps.

D'où le multi-head attention : au lieu d'un seul système Q-K-V, on en fait tourner plusieurs en parallèle (typiquement 8, 16, 32). Chacun apprend à se spécialiser sur un type de relation. Quand on regarde un modèle entraîné, on découvre des heads dédiés à :

  • l'attention locale (chaque token regarde lui-même ou ses voisins immédiats)
  • la liaison sujet-verbe
  • les coréférences (pronoms vers leur référent)
  • les délimiteurs (ponctuation, début/fin de phrase)
  • la rime ou la structure poétique
  • des choses qu'on ne sait pas nommer

Manipule

La visualisation ci-dessous montre, sur deux phrases, à quoi peut ressembler l'attention de différents heads. Les motifs sont stylisés (les vrais poids viennent d'un modèle entraîné), mais chaque head correspond à un comportement réellement observé dans les modèles actuels.

Chaque ligne montre comment un token regarde tous les autres. Les heads suivent parfois la syntaxe (sujet ↔ verbe), parfois la sémantique (référents, antécédents). Aucun n'est programmé manuellement : ces motifs émergent de l'entraînement.

Trois choses à essayer :

  • Sur Le chat dort avec le head "Sujet ↔ verbe", regarde la ligne dort. Le poids le plus fort va à chat. Le verbe a "trouvé" son sujet.
  • Sur Coréférence avec le head "Coréférence", regarde la ligne il. Le poids le plus fort remonte à bébé. C'est exactement le mécanisme qui résout l'énigme du pronom.
  • Sur n'importe quel head, regarde le triangle supérieur droit : il est gris. C'est le masque causal — un token ne peut regarder que les tokens qui le précèdent. C'est ce qui force le modèle à prédire, pas à copier.

Causale ou bidirectionnelle ?

Toutes les attentions ne sont pas égales. Deux régimes existent.

Bidirectionnelle. Chaque token voit tous les autres, en arrière comme en avant. C'est ce qu'utilisent BERT (Google, 2018) ou les encoders de T5. Ces modèles excellent à comprendre une phrase — classification, question-réponse extractive, recherche sémantique — mais ne génèrent pas de texte token par token.

Causale. Chaque token ne voit que les précédents. C'est le masque triangulaire qu'on a observé plus haut. Cette contrainte rend possible la génération autoregressive : pour produire le mot suivant, le modèle a besoin de pouvoir prédire à partir du seul passé.

GPT, Claude, Llama, Gemini, Mistral — tous les LLMs grand public sont des modèles à attention causale. C'est ce masque qui les rend capables de prédire, pas seulement de décrire.

L'attention est chère

Cette élégance a un coût. Pour une séquence de longueur n, calculer la matrice d'attention demande O(n²) opérations. Doubler la taille du contexte quadruple le coût.

C'est pour ça que les fenêtres de contexte étaient limitées à 2 048 tokens dans GPT-2, à 8 192 tokens dans GPT-3.5, et qu'il a fallu des astuces algorithmiques (FlashAttention, sliding window, attention sparse) pour atteindre les 200 000 tokens d'aujourd'hui. On revient sur ces techniques au chapitre 18, où elles sont liées à la mémoire du KV cache.

L'attention est puissante ; elle est aussi le goulot d'étranglement principal des LLMs modernes.

La suite

L'attention seule ne fait pas un modèle de langage. Il faut l'empiler en blocs successifs, ajouter des couches de calcul "feed-forward", des normalisations, des connexions résiduelles. C'est l'architecture Transformer complète — le sujet du chapitre suivant.

Mis à jour le

Attention : le mécanisme qui change tout · Step by Token