À la base, l'attention calcule une somme pondérée. Pour chaque token dans une séquence, le mécanisme demande : « À quel point chaque autre token est-il pertinent pour moi en ce moment ? » Il le fait à travers trois projections apprises — requêtes, clés et valeurs (les Q, K, V que vous voyez dans chaque article). La requête d'un token est multipliée scalaire avec les clés de tous les tokens pour produire un ensemble de scores, ces scores passent par un softmax pour devenir des poids, et les poids sont utilisés pour mélanger les valeurs en une représentation tenant compte du contexte. L'opération entière est différentiable, de sorte que le modèle apprend quelles relations comptent pendant l'entraînement. L'attention multi-têtes en exécute plusieurs en parallèle avec des projections différentes, permettant au modèle de prêter attention à différents types de relations simultanément — une tête pourrait suivre la syntaxe tandis qu'une autre suit la coréférence.
La percée pratique de l'auto-attention a été le parallélisme. Les réseaux récurrents comme les LSTM traitaient les tokens un à la fois, ce qui rendait l'entraînement intrinsèquement séquentiel et lent. L'attention traite la séquence entière d'un seul coup, transformant l'entraînement en une multiplication matricielle massive que les GPU dévorent. C'est pourquoi les Transformers ont pu passer à l'échelle de milliards de paramètres et de milliers de milliards de tokens d'entraînement — le matériel était déjà conçu pour exactement ce type de charge de travail. Tous les grands LLM avec lesquels vous interagissez aujourd'hui, de GPT-4 à Claude en passant par Llama 3 et Mistral, doivent leur existence à cet avantage de parallélisme.
Le gros problème, c'est la croissance quadratique. L'attention standard calcule un score pour chaque paire de tokens, donc doubler votre fenêtre de contexte quadruple le calcul et la mémoire. Un modèle à 4K de contexte utilise 16 millions de scores d'attention par couche par tête ; passez à 128K et vous êtes à 16 milliards. C'est pourquoi l'extension des fenêtres de contexte a été un effort d'ingénierie si massif. Flash Attention (par Tri Dao) a attaqué le côté mémoire en restructurant le calcul pour éviter de matérialiser la matrice d'attention complète dans la HBM du GPU, rendant les longs contextes praticables sans changer les mathématiques. Le grouped-query attention (GQA), utilisé dans Llama 2 et les modèles plus récents, partage les têtes clé-valeur entre les têtes de requête pour réduire le KV cache qui s'accumule pendant la génération.
L'attention croisée (cross-attention) est une variante qui vaut la peine d'être comprise séparément. Dans les modèles encodeur-décodeur et dans la génération conditionnelle (comme le texte-vers-image), les requêtes proviennent d'une séquence tandis que les clés et les valeurs proviennent d'une autre. C'est ainsi que Stable Diffusion se conditionne sur votre prompt textuel — les requêtes côté image prêtent attention aux sorties de l'encodeur de texte. C'est aussi la façon dont le Transformer original gérait la traduction : le décodeur prêtait attention aux sorties de l'encodeur pour décider quoi générer ensuite.
Une idée reçue courante est que l'attention est de la « compréhension ». Ce n'est pas le cas. L'attention est un mécanisme de routage — elle décide où l'information circule, mais le traitement réel se produit dans les couches feedforward qui suivent chaque bloc d'attention. Les recherches comme les travaux « Transformer Circuits » d'Anthropic ont montré que les têtes d'attention développent des rôles spécialisés (têtes d'induction, têtes du token précédent), mais ce sont des patterns appris, pas de la logique programmée. Un autre piège pratique : l'attention ne connaît pas intrinsèquement l'ordre des tokens. Sans encodages positionnels (sinusoïdaux, appris, ou rotatifs comme RoPE), elle traite une séquence comme un sac de tokens. Bien choisir l'encodage positionnel s'est avéré crucial pour la performance en contexte long, c'est pourquoi des approches comme ALiBi et RoPE continuent d'évoluer.