Attention creuse et fenêtre glissante¶
Le problème¶
L'attention complète compare chaque jeton à tous les précédents. Pour une séquence de \(n\) jetons, cela fait \(O(n^2)\) comparaisons. À un million de jetons, c'est \(10^{12}\) produits scalaires par couche et par tête.
Deux observations empiriques permettent d'y échapper :
- la plupart des poids d'attention sont proches de zéro — l'information utile est concentrée sur quelques positions ;
- une grande partie de ces positions utiles sont proches du jeton courant.
Ces deux observations donnent deux familles de solutions, que DeepSeek combine.
La fenêtre glissante¶
L'attention à fenêtre glissante (sliding window attention, SWA) limite chaque jeton aux \(n_{\text{win}}\) jetons qui le précèdent immédiatement.
DeepSeek-V4.1-Flash utilise \(n_{\text{win}} = 128\), dans toutes ses couches.
Ce que cela économise¶
Le cache de fenêtre glissante ne dépend plus de la longueur de la séquence : à tout instant, il ne contient que \(n_{\text{win}}\) entrées par couche. Pour ce modèle :
par séquence, quelle que soit la longueur du contexte. C'est négligeable face au cache global à un million de jetons.
Le champ récepteur empilé¶
Une couche voit 128 jetons en arrière. Deux couches empilées en voient 256, car chaque entrée de la couche 2 dépend déjà de 128 jetons à la couche 1. Sur \(L\) couches, le champ récepteur théorique est \(L \times n_{\text{win}}\) — ici 5 120 jetons.
Théorique n'est pas effectif
Le champ récepteur théorique suppose que l'information se propage intégralement à chaque couche. En pratique elle s'atténue : le champ récepteur effectif est bien plus petit que \(L \times n_{\text{win}}\).
Ce constat, établi par des travaux antérieurs cités dans le rapport technique, est exactement ce qui rend SWA Bounded Replay viable : si l'information au-delà de quelques centaines de jetons ne circule presque plus par la voie locale, on peut se contenter de rejouer \(n_{\text{win}}\) jetons au lieu de \(L \times n_{\text{win}}\).
L'attention creuse sélective¶
La fenêtre glissante seule condamne le modèle à l'oubli : rien de ce qui est à plus de quelques milliers de jetons ne peut plus l'atteindre. Il faut donc une seconde voie, globale, qui puisse aller chercher loin — mais sans tout regarder.
C'est le rôle de l'attention creuse sélective : pour chaque requête, un mécanisme peu coûteux choisit les \(k\) positions les plus prometteuses parmi toutes celles disponibles, et l'attention ne s'exécute que sur celles-là.
DeepSeek-V4.1-Flash sélectionne \(k = 512\) entrées par requête.
L'indexeur¶
Le module qui fait ce choix s'appelle l'indexeur. C'est une petite attention auxiliaire :
- il projette une requête d'indexation de 32 têtes × 128 dimensions ;
- il la compare à une clé d'indexation par position, elle aussi de 128 dimensions ;
- il retient les 512 meilleurs scores.
L'indexeur est bien plus petit que l'attention principale — 128 dimensions contre 512, une clé partagée entre les têtes au lieu d'une par tête — donc son coût de balayage du contexte complet reste supportable. Mais il balaie quand même tout le contexte, ce qui redevient un problème à un million de jetons : c'est ce que l'indexeur hiérarchique résout.
La compression séquentielle¶
Un troisième levier consiste à ne pas garder une entrée par jeton. Avec un ratio de compression \(m\), on agrège \(m\) jetons consécutifs en une seule entrée de cache.
DeepSeek-V4.1-Flash utilise \(m = 2\) dans l'encodeur et \(m = 1\) dans le décodeur. L'agrégation n'est pas une moyenne : c'est une somme pondérée par une porte apprise,
où \(s_i\) est un score produit par une projection dédiée. Le modèle apprend donc lui-même quels jetons d'un groupe méritent de dominer l'entrée compressée.
Le montage combiné¶
Chaque couche de DeepSeek-V4.1-Flash (sauf les deux premières) exécute les deux voies simultanément, et les concatène avant le calcul d'attention :
┌── fenêtre glissante : 128 dernières positions, exactes
requête ────────────┤
└── voie globale : 512 positions choisies par l'indexeur
parmi tout le contexte compressé
La sortie est une seule passe d'attention sur \(128 + 512 = 640\) positions, quel que soit le contexte. C'est ce qui explique la propriété affichée par le rapport technique : le coût de calcul par jeton en décodage est presque constant en fonction de la longueur du contexte. Passer de 4 K à 1 M de jetons — un facteur 256 — n'augmente le nombre d'opérations que d'un quart.
À retenir
- La fenêtre glissante donne un contexte local exact à coût constant.
- L'attention creuse donne un accès approché au contexte lointain à coût quasi constant.
- Le cache global ne concerne que la seconde voie : c'est lui qu'il faut compresser.
Chapitre suivant : Mixture-of-Experts