Le Transformer et l'attention¶
Le problème que l'attention résout¶
Pour prédire le jeton suivant, il faut relier des éléments distants :
« Le rapport que Marie a rédigé l'an dernier, malgré les contraintes de temps et l'absence de son collègue, a été publié. »
Pour accorder « a été », il faut retrouver « rapport », 15 mots plus tôt. Un réseau qui ne regarde que les voisins immédiats n'y arrive pas ; un réseau récurrent qui compresse tout le passé dans un état fixe finit par l'oublier.
L'attention résout cela directement : chaque position peut consulter n'importe quelle position précédente, avec un poids calculé à la volée.
Le mécanisme : requêtes, clés, valeurs¶
L'analogie standard est la recherche documentaire :
| Élément | Notation | Rôle |
|---|---|---|
| Requête (query) | \(\mathbf{q}_t\) | Ce que la position \(t\) cherche |
| Clé (key) | \(\mathbf{k}_s\) | Ce que la position \(s\) propose comme étiquette |
| Valeur (value) | \(\mathbf{v}_s\) | L'information que la position \(s\) transmet si elle est sélectionnée |
Chacun est obtenu par une projection linéaire du vecteur de la position : \(\mathbf{q}_t = \mathbf{W}_Q\mathbf{h}_t\), \(\mathbf{k}_t = \mathbf{W}_K\mathbf{h}_t\), \(\mathbf{v}_t = \mathbf{W}_V\mathbf{h}_t\).
Le calcul complet :
Étape par étape, pour une position \(t\) :
- Comparer : calculer \(\mathbf{q}_t \cdot \mathbf{k}_s\) pour toutes les positions \(s \le t\). Grand score = forte pertinence.
- Mettre à l'échelle : diviser par \(\sqrt{d_k}\). Sans cela, les produits scalaires en grande dimension deviennent énormes et le softmax sature.
- Masquer : mettre à \(-\infty\) les scores des positions futures (\(s > t\)). C'est le masque causal, indispensable : un modèle qui verrait le futur n'apprendrait rien d'utile.
- Normaliser : softmax, pour obtenir des poids positifs qui somment à 1.
- Agréger : moyenne pondérée des valeurs, \(\sum_s \alpha_{t,s}\mathbf{v}_s\).
Intuition
L'attention est une table de correspondance floue et apprise. La requête interroge, les clés répondent avec un degré de correspondance, et le résultat est un mélange des valeurs pondéré par ces degrés.
Les têtes multiples¶
Une seule attention ne peut suivre qu'un type de relation à la fois. On en fait donc plusieurs en parallèle, les têtes (heads), chacune avec ses propres matrices \(\mathbf{W}_Q, \mathbf{W}_K, \mathbf{W}_V\). Leurs sorties sont concaténées puis reprojetées.
Chez Kimi K3 : 96 têtes, de dimension 128 chacune
(num_attention_heads: 96, head_dim: 128).
Intuition
Une tête peut se spécialiser dans « retrouver le sujet du verbe », une autre dans « retrouver l'ouverture de parenthèse correspondante », une autre dans « quel est le jeton précédent ». Cette spécialisation n'est pas programmée : elle émerge de l'entraînement.
Le coût quadratique : le problème central¶
Pour une séquence de longueur \(T\) :
- Il faut calculer \(T^2/2\) produits scalaires (la moitié à cause du masque causal).
- Il faut stocker toutes les clés et valeurs pour pouvoir les réutiliser à chaque nouveau jeton : c'est le cache KV, de taille proportionnelle à \(T\).
| Longueur de contexte | Produits scalaires (ordre) | Cache KV (ordre) |
|---|---|---|
| 8 K | \(3{,}2\times10^7\) | 1× |
| 128 K | \(8{,}2\times10^9\) | 16× |
| 1 M | \(5{,}2\times10^{11}\) | 128× |
Limite importante
Passer de 128 K à 1 M de contexte multiplie le calcul d'attention par 64 et le cache KV par 8. C'est la raison pour laquelle Kimi K3 ne peut pas utiliser l'attention softmax classique sur toutes ses couches. Sur 93 couches, seules 24 sont des couches d'attention globale (Gated MLA) ; les 69 autres sont des couches KDA, à coût linéaire.
Deux réductions classiques du cache KV¶
Avant d'en venir à l'attention linéaire, deux techniques réduisent le cache sans changer la nature quadratique du calcul.
GQA — partager les clés entre têtes¶
Grouped-Query Attention : plusieurs têtes de requête partagent une même paire clé/valeur. Le cache est divisé par le facteur de partage. Simple, très répandu.
MLA — compresser en un vecteur latent¶
Multi-head Latent Attention, introduite par DeepSeek-V2 et reprise par la série Kimi : au lieu de stocker les clés et valeurs de toutes les têtes, on stocke un unique vecteur latent compressé \(\mathbf{c}_t = \mathbf{W}_c\mathbf{h}_t\), et on reconstruit les clés et valeurs à la volée par projection montante.
Chez Kimi K3 : kv_lora_rank: 512, contre \(96 \times 256 = 24\,576\) dimensions
qu'il faudrait stocker sans compression. Détail en
Gated MLA et NoPE.
L'encodage de position¶
Le mécanisme d'attention est invariant par permutation : sans information supplémentaire, « le chat mange la souris » et « la souris mange le chat » produisent le même résultat. Il faut donc injecter la position.
| Méthode | Principe | Limite |
|---|---|---|
| Absolue apprise | Un vecteur appris par position | Ne s'étend pas au-delà des positions vues |
| RoPE | Rotation des \(\mathbf{q}\) et \(\mathbf{k}\) d'un angle proportionnel à la position | Extrapole mal ; nécessite un réajustement (YaRN, changement de base) pour allonger le contexte |
| NoPE | Aucun encodage explicite | Ne fonctionne que si la position est encodée ailleurs |
Le choix de Kimi K3
Kimi K3 utilise NoPE sur toutes ses couches MLA (mla_use_nope: true).
L'information de position est portée implicitement par les couches KDA, dont
la récurrence à décroissance est intrinsèquement sensible à l'ordre et à la
récence.
Conséquence pratique majeure : passer de 8 K à 1 M de contexte ne demande aucune modification de l'encodage positionnel — pas de réajustement de base RoPE, pas d'interpolation YaRN. Le modèle extrapole directement. Voir Extension du contexte.
Le bloc Transformer complet¶
┌───────────────────────────────┐
h ──►│ RMSNorm → Attention → porte │──┐
└───────────────────────────────┘ │
h ─────────────────────────────────────►(+)──► h'
│
┌───────────────────────────────┐ │
h'──►│ RMSNorm → FFN / MoE │───┤
└───────────────────────────────┘ │
h' ────────────────────────────────────►(+)──► h''
- Sous-couche 1 : mélange entre jetons — la seule où les positions communiquent.
- Sous-couche 2 : mélange entre canaux — appliqué indépendamment à chaque position.
Cette séparation est reprise telle quelle dans la figure d'architecture de Kimi K3, qui parle de token mixing, channel mixing et — nouveauté — layer mixing pour AttnRes.
Vérification de compréhension¶
Pourquoi diviser par \(\sqrt{d_k}\) et pas par \(d_k\) ?
Si \(\mathbf{q}\) et \(\mathbf{k}\) ont des coordonnées indépendantes de variance 1, leur produit scalaire sur \(d_k\) dimensions a une variance de \(d_k\), donc un écart-type de \(\sqrt{d_k}\). Diviser par \(\sqrt{d_k}\) ramène la variance à 1, ce qui maintient le softmax dans un régime non saturé.
Combien de couches d'attention globale Kimi K3 possède-t-il, et à quelles positions ?
24, aux couches 4, 8, 12, …, 92 et 93. Le motif est « 3 KDA puis
1 MLA », répété 23 fois (92 couches), plus une couche MLA finale
supplémentaire — pour garantir que la dernière opération de mélange de
jetons soit toujours une attention globale. Ces indices sont directement
lisibles dans le champ full_attn_layers de config.json.
Chapitre précédent : Les briques d'un réseau de neurones · Chapitre suivant : Attention linéaire et récurrence