1. Fondations matricielles
Le problème : Vous allez manipuler des mémoires faites de vecteurs et de matrices. Une erreur de forme — multiplier un vecteur de 3 par une matrice 2×2 — ne produit pas un résultat faux : elle n’a aucun sens. Et avec le broadcasting de NumPy, certaines formes fausses s’exécutent quand même et corrompent tout l’aval en silence.
L’idée : Un vecteur est une liste ordonnée de d nombres ; une matrice organise lignes et colonnes (d_k × d_v). Les dimensions dictent les multiplications valides : ici k(2) et v(2) fabriquent S(2×2), et une clé [1;0;2] de dimension 3 est refusée avant tout calcul.
Pourquoi / à quel prix : Le contrôle de forme coûte une ligne et se fait avant le calcul : il transforme une corruption silencieuse en refus immédiat. Le prix de l’ignorer : les sessions 14 à 18 empilent ces objets — une forme fausse au départ y devient introuvable.
Vérification de compréhension
Nommez l’entrée, l’état transformé, la sortie et une hypothèse nécessaire. Comparez ensuite votre chaîne à l’explication ci-dessus.
2. Produit scalaire
Le problème : Une mémoire a besoin d’adresses : à quelle écriture une requête doit-elle s’apparier ? Comparer des vecteurs « à l’œil » ne donne aucun nombre exploitable, et sans mesure d’alignement chiffrée, chaque lecture devrait tout relire.
L’idée : Le produit scalaire résume l’alignement en un nombre : q·k = Σqᵢkᵢ. Ici q=[1,0] contre k=[1,0] donne 1 (aligné) ; contre k=[0,1] il donne 0 (orthogonal). C’est le mécanisme d’adressage : fort = concerné, nul = ignoré.
q·k=Σqᵢkᵢ
Pourquoi / à quel prix : Pourquoi ça marche : le zéro d’orthogonalité isole les adresses — sans lui, chaque requête lirait toutes les écritures. Le prix : l’alignement est continu ; deux clés proches (q·k = 0,9) partagent partiellement leur adresse, et ce partage deviendra l’interférence du dernier beat.
Vérification de compréhension
Nommez l’entrée, l’état transformé, la sortie et une hypothèse nécessaire. Comparez ensuite votre chaîne à l’explication ci-dessus.
3. Produit extérieur
Le problème : Le produit scalaire compare, mais n’écrit rien. Comment ranger la valeur v=[2,3] « à l’adresse » k=[1,0] dans une structure de taille fixe — de façon que la bonne requête la retrouve plus tard ?
L’idée : Le produit extérieur k vᵀ fabrique une matrice : la ligne est sélectionnée par k, le contenu est porté par v. Pour k=[1,0] et v=[2,3] : k vᵀ = [[2,3],[0,0]] — la valeur est rangée sur la ligne 1, la ligne 2 reste vierge. L’écriture s’accumule : S ← S + k vᵀ.
S←S+k vᵀ
Pourquoi / à quel prix : Une écriture associative en une opération O(1), locale à la direction de k : c’est ce qui rend l’état fixe possible. Le prix : l’addition est aveugle — elle ne vérifie jamais si l’adresse est déjà occupée. Écrire deux fois sur k=[1,0] additionne les valeurs au lieu de remplacer.
Vérification de compréhension
Nommez l’entrée, l’état transformé, la sortie et une hypothèse nécessaire. Comparez ensuite votre chaîne à l’explication ci-dessus.
4. Lecture de l’état
Le problème : La mémoire contient maintenant plusieurs écritures superposées dans une seule matrice. Comment une requête récupère-t-elle LA valeur qui la concerne sans parcourir de liste — puisqu’il n’y a plus de liste du tout ?
L’idée : La lecture est une multiplication : y = qᵀS. La requête q=[1,0] sélectionne la ligne 1 et lit [2,3] exactement ; q=[0,1] lit [5,1]. Rien n’est parcouru : une seule opération, quelle que soit la longueur du passé.
y=qᵀS
Pourquoi / à quel prix : Lecture O(1) contre O(n) pour le cache KV : le gain est structurel. Le prix : y est toujours une combinaison de tout ce qui a été écrit, pondérée par q·k. Elle n’est exacte que si les clés sont orthogonales — la lecture ne distingue pas « valeur stockée » et « mélange ».
Vérification de compréhension
Nommez l’entrée, l’état transformé, la sortie et une hypothèse nécessaire. Comparez ensuite votre chaîne à l’explication ci-dessus.
5. Mémoire fixe
Le problème : Un cache KV à 100 000 tokens explose la facture mémoire d’un service — et il croît encore au token suivant. Peut-on servir un long contexte avec une mémoire dont la taille ne dépend pas de la longueur ?
L’idée : S mesure d_k × d_v, point : 1 000 ou 100 000 tokens écrits, la matrice garde la même taille. La croissance O(n) du cache devient une constante — au prix d’un résumé superposé à la place d’une trace exacte.
Pourquoi / à quel prix : Le budget mémoire devient prévisible — précisément ce qui se facture en production. Le prix : la capacité informationnelle est constante elle aussi ; au-delà d’environ d_k directions de clés distinctes, les écritures se superposent. « Taille fixe » signifie aussi « capacité fixe », jamais contexte infini.
Vérification de compréhension
Nommez l’entrée, l’état transformé, la sortie et une hypothèse nécessaire. Comparez ensuite votre chaîne à l’explication ci-dessus.
6. Interférence
Le problème : Troisième écriture : k=[1,0] resservi avec v=[9,9]. La lecture q=[1,0] rend [11,12] — ni l’ancienne valeur ni la nouvelle. Qui a écrasé quoi ? Personne : les deux écritures cohabitent, fusionnées. Que faire d’une mémoire qui ne sait plus distinguer ?
L’idée : L’interférence est arithmétique, pas aléatoire : la ligne 1 de S contient [2,3] + [9,9] = [11,12], et la lecture restitue exactement cette somme. Des clés proches écrivent dans des directions partagées ; leurs valeurs se mélangent au prorata de l’alignement.
Pourquoi / à quel prix : La voir comme une somme la rend prévisible et mesurable — un test de rappel contrôlé suffit à la détecter. Le prix demeure : sans correction ni oubli, une mémoire additive dérive avec la longueur. C’est exactement le problème que la règle delta de la session 14 attaque.
Vérification de compréhension
Nommez l’entrée, l’état transformé, la sortie et une hypothèse nécessaire. Comparez ensuite votre chaîne à l’explication ci-dessus.
Développement depuis la source de cours
Chapitre 8 — Attention linéaire et mémoire matricielle de taille fixe
8.0 Les matrices depuis le début
But : comprendre les petits outils mathématiques utilisés à partir de ce chapitre. Un scalaire est un seul nombre, par exemple 3. Un vecteur est une liste ordonnée, par exemple [2, 5]. Une matrice est une grille rectangulaire de nombres. Sa forme s’écrit lignes × colonnes.
Imagine un vecteur comme le bulletin d’un élève et une matrice comme le registre de toute la classe. Les lignes peuvent représenter les élèves et les colonnes les matières.
Étape par étape
-
A = [[1, 2, 3], [4, 5, 6]] possède 2 lignes et 3 colonnes : sa forme est donc 2 × 3.
-
La transposée échange lignes et colonnes : transposer [2, 5] transforme une ligne en colonne.
-
Un produit scalaire multiplie les éléments correspondants puis les additionne : [2, 3] · [4, 5] = 2×4 + 3×5 = 23.
-
Un produit extérieur fabrique une grille : colonne [2, 3] × ligne [4, 5] = [[8, 10], [12, 15]].
-
La multiplication matricielle répète des produits scalaires. Les formes doivent s’emboîter : (2 × 3)(3 × 4) donne (2 × 4).
Exemple détaillé : x = [2, 1] et W = [[3, 0], [4, 5]]. Alors xW = [2×3 + 1×4, 2×0 + 1×5] = [10, 5]. La matrice a mélangé les deux coordonnées d’entrée pour produire deux nouvelles coordonnées.
Pourquoi c’est important : Ces opérations sont la grammaire des réseaux neuronaux. Nous préciserons toujours ce que stocke une matrice et vérifierons sa forme.
Vérification rapide : quelle est la forme d’une grille de 4 lignes et 7 colonnes ? Réponse : 4 × 7.
8.1 D’un carnet qui grandit à un résumé de taille fixe
But : comprendre pourquoi l’attention ordinaire devient coûteuse. L’attention causale exacte conserve une clé et une valeur pour chaque jeton précédent. Pendant la génération, le cache clés-valeurs grandit donc avec la conversation.
L’attention exacte ressemble à la conservation de chaque ticket de caisse. L’attention linéaire essaie plutôt de maintenir un seul tableau comptable mis à jour.
Étape par étape
-
Transformer chaque clé k avec une fonction de caractéristiques φ(k). Cette fonction change simplement les coordonnées avant la comparaison.
-
Écrire l’association clé-valeur dans une matrice d’état S avec un produit extérieur : S ← S + φ(k) vᵀ.
-
Lire avec une requête q : sortie ≈ φ(q)ᵀS. Un terme de normalisation peut aussi être utilisé.
-
Les dimensions de S dépendent de la largeur de représentation, pas du nombre de jetons.
Exemple détaillé : partons de S = [[0,0],[0,0]]. Soit k = [1,0] et v = [3,4]. Le produit extérieur vaut [[3,4],[0,0]], donc le nouvel état S vaut [[3,4],[0,0]]. La requête q = [1,0] lit qᵀS = [3,4]. La requête [0,1] lit [0,0].
Pourquoi c’est important : La mémoire garde la même taille même après de nombreux jetons. Cela peut réduire la croissance de la mémoire et rendre le décodage récurrent efficace.
Vérification rapide : une mémoire de taille fixe signifie-t-elle une mémoire parfaite et illimitée ? Réponse : non. De nombreuses associations doivent partager la même grille limitée.
8.2 Interférence
But : comprendre la faiblesse principale d’une mémoire additive simple. Si deux clés pointent dans des directions proches, leurs écritures se chevauchent dans S. Une requête ultérieure peut récupérer un mélange.
Imagine plusieurs réponses écrites dans la même petite case d’un tableau blanc. L’encre se superpose.
Étape par étape
-
Écrire k₁ = [1,0], v₁ = [1,0].
-
Écrire k₂ = [1,1], v₂ = [0,1].
-
L’état devient [[1,1],[0,1]].
-
Lire avec q = [1,0] renvoie [1,1], et non la valeur originale [1,0]. La deuxième écriture a contaminé la première lecture.
Exemple détaillé : Ce petit exemple montre la diaphonie. Les vrais modèles utilisent des projections apprises, des portes, une normalisation et des règles de correction, mais une mémoire finie impose toujours des compromis.
Pourquoi c’est important : Nous avons besoin d’une règle d’écriture capable de corriger ce qu’une clé mémorise déjà, au lieu d’additionner sans fin.
Vérification rapide : pourquoi deux souvenirs peuvent-ils interférer ? Réponse : leurs directions de clé ne sont pas parfaitement séparées ; leurs écritures matricielles se chevauchent.
Cas guidé complet
Avec S nul, k=[1,0] et v=[2,3], l’écriture donne [[2,3],[0,0]]. Une requête q=[1,0] lit [2,3]. Tenter d’ajouter une clé [1,0,2] de dimension 3 révèle aussi pourquoi les contrôles de forme sont obligatoires.
Méthode de lecture: écrire les données, annoncer la forme de chaque objet, effectuer une seule transformation, puis interpréter le résultat avant de continuer.