Le calcul : pour l'entrée X, calculer Q = X·W_Q, K = X·W_K, V = X·W_V. Puis : Attention(Q,K,V) = softmax(Q·K^T / √d_k) · V. Le softmax(Q·K^T) produit une matrice d'attention N×N où l'entrée (i,j) représente combien le token i porte attention au token j. La mise à l'échelle par √d_k empêche les produits scalaires de devenir trop grands en haute dimension, ce qui pousserait le softmax dans des régions saturées avec des gradients quasi nuls.
Dans les LLM decoder-only (GPT, Claude, Llama), le self-attention est causal : chaque token ne peut porter attention qu'aux tokens précédents (y compris lui-même). Cela est imposé par un masque causal qui met les positions futures à −∞ avant le softmax. Dans les modèles encodeur (BERT), le self-attention est bidirectionnel : chaque token porte attention à tous les autres tokens. La contrainte causale est ce qui rend la génération autorégressive possible — le modèle ne peut pas "tricher" en regardant les tokens futurs.
Le self-attention calcule une matrice d'attention N×N, le rendant O(N²) en temps et en mémoire. Pour un contexte de 128K tokens, cela représente ~16 milliards d'entrées par couche par tête. Cette mise à l'échelle quadratique est la limitation fondamentale qui motive la recherche sur l'attention éparse, l'attention linéaire, Flash Attention (qui réduit la mémoire mais pas le calcul), et les SSM (qui évitent entièrement la matrice N×N). Chaque approche pour la modélisation de contextes longs est fondamentalement une façon de gérer ce coût quadratique.