Flux résiduels et attention sur la profondeur

Comprendre dilution résiduelle, récupération d’états antérieurs et compromis de checkpoints de profondeur.

Applied AI · advanced · Session 20

Carte du mécanisme

  x₀ ──┬───────────────────────────────────────────┐
        │                                           │ checkpoint
   ┌────▼────┐                                       │
   │  F₀(x)  │──▶ ⊕ ──▶ x₁ = x₀ + F₀(x₀)             │
   └─────────┘                                       │
             … 12 couches d’additions …              │
  x₁₂ ─┬──────────────────────────────────────────┐  │ checkpoint
   ┌───▼─────┐                                    │  │
   │ F₁₂(x)  │──▶ ⊕ ──▶ …                         │  │
   └─────────┘                                    │  │
             … 12 couches d’additions …           │  │
  x₂₄ ─┬───────────────────────────────────────┐  │  │ checkpoint
       │                                       │  │  │
   ┌───▼─────────┐   q₂₄                       ▼  ▼  ▼
   │ COUCHE 24   │──────▶ scores [2 ; 1 ; 0] sur {x₂₄,x₁₂,x₀}
   │  requête    │        softmax [0,67 ; 0,24 ; 0,09]
   └─────────────┘              │
                                ▼
                     y = 0,67·x₂₄ + 0,24·x₁₂ + 0,09·x₀
                                │
                                ▼  ⊕ résiduel → couche 25

Le problème — Connexion résiduelle

Empiler 48 transformations brutes (x → F(x)) multiplie 48 jacobiennes : le gradient s’évanouit ou explose, et une couche ratée détruit tout ce qui précède. Les réseaux profonds « purs » n’apprennent tout simplement pas.

L’idée — Connexion résiduelle

L’addition change tout : x_{l+1} = x_l + F_l(x_l). Chaque couche AJOUTE sa transformation au flux au lieu de le remplacer ; si F ≡ 0, x traverse inchangé — le chemin identité garantit un gradient direct vers chaque couche.

x_{l+1}=x_l+F_l(x_l)

Pourquoi / à quel prix — Connexion résiduelle

Le chemin identité rend l’entraînement profond possible — c’est l’invention qui a débloqué les réseaux à cent couches et plus. Le prix : rien n’est jamais retiré du flux ; tout ce qui a été ajouté y reste, et s’accumule.

Contrôle : Dans x_{l+1} = x_l + F_l(x_l), supposez F_l ≡ 0 sur douze couches. Que vaut x₁₂, et qu’est-ce que cela dit du gradient qui remonte par ce chemin ?

Le problème — Dilution

48 couches ajoutent chacune leur contribution. Que devient l’information posée par x₀ ? Intuition commune : « écrasée ». Si c’était vrai, toute récupération serait impossible — il faut chiffrer avant de conclure.

L’idée — Dilution

Sous l’hypothèse de contributions à peu près orthogonales (‖F_l‖ = 0,5), l’énergie suit ‖x_l‖² ≈ 1 + 0,25·l : la part de x₀ passe de 100 % à 25 % (l = 12), 14,3 % (l = 24), 7,7 % (l = 48). Diluée, jamais effacée — l’addition est conservatrice.

Pourquoi / à quel prix — Dilution

Le diagnostic précis — noyé, pas détruit — est ce qui rend la suite possible. Le prix : l’hypothèse d’orthogonalité fait tout le travail du calcul ; le 7,7 % est un ordre de grandeur de maquette, pas une mesure du modèle réel.

Contrôle : La part d’énergie de x₀ tombe de 100 % à 7,7 % entre la couche 0 et la couche 48. Vérifiez ce 7,7 % avec ‖x_l‖² ≈ 1 + 0,25·l (hypothèse : contributions orthogonales), puis dites si l’information de x₀ a été effacée ou seulement diluée.

Support visuel — Dilution

part de x₀ dans ‖x_l‖²   (hypothèse : contributions orthogonales)

100 % ●
      │
 25 % ┤             ●
14,3 %┤                      ●
 7,7 %┤                               ●   présent, mais noyé
      └────┬────────┬─────────┬───────┬─▶ couche
           0       12        24      48

l’addition n’efface rien : elle enterre

Le problème — États de profondeur

Si la couche 40 a besoin de la représentation d’avant transformation, elle n’a que x₃₉ — la somme de tout. Revenir en arrière est impossible : le flux ne garde aucune photo d’étape.

L’idée — États de profondeur

La solution : photographier en route. Conserver quelques x_j choisis — {x₀, x₁₂, x₂₄} — comme points de récupération le long de la profondeur, analogues informationnels des checkpoints d’entraînement.

Pourquoi / à quel prix — États de profondeur

Des points de retour explicites, adressables plus tard. Le prix : chaque photo coûte cher — 32 Mio par checkpoint ici (4 096 tokens × d_model 4096 × BF16) — et le choix des indices est un pari fait à la conception.

Contrôle : On conserve {x₀, x₁₂, x₂₄} et pas les 45 autres états. Sur quel critère choisiriez-vous ces trois indices plutôt que {x₀, x₁, x₂}, et que perdez-vous exactement en ne gardant pas x₂₃ ?

Le problème — Scores sur la profondeur

Trois photos disponibles : laquelle utiliser, et quand ? Un choix figé — toujours x₁₂ ? — serait aveugle au contenu : la bonne photo dépend du token et de la question que la couche se pose.

L’idée — Scores sur la profondeur

Le mécanisme de la session 12, tourné de 90° : une requête de la couche courante score les états conservés — scores [2 ; 1 ; 0] sur {x₂₄ ; x₁₂ ; x₀} → softmax [0,665 ; 0,245 ; 0,090] — puis mélange les valeurs. La récupération se choisit, elle ne se subit plus.

Pourquoi / à quel prix — Scores sur la profondeur

Une attention sur J = 3 états coûte peu (scores [3], poids [3]). Le prix : le module peut dégénérer — des scores plats [1;1;1] donnent une moyenne [0,333…] qui refait, en plus cher, ce que le résiduel offrait gratuitement. Un mécanisme de choix ne vaut que s’il choisit.

Contrôle : Les scores [2 ; 1 ; 0] donnent [0,665 ; 0,245 ; 0,090]. Recalculez le softmax pour [4 ; 1 ; 0] : de combien x₀ recule-t-il, et le module a-t-il pour autant supprimé x₀ du flux ?

Support visuel — Scores sur la profondeur

attention (s.12) : une position lit d’AUTRES TOKENS, même couche
attention (s.20) : une couche lit d’AUTRES PROFONDEURS, même token

   tokens ────────▶                 profondeur ────────▶
   t1   t2   t3   t4                x₀    x₁₂    x₂₄
                   ▲                                ▲
               q (de t4)                    q (de la couche 24)

même mécanique : requête, scores, softmax, mélange

Le problème — Blocage

Stocker les 48 états = 1,5 Gio pour une seule séquence de 4 096 tokens — inacceptable. Mais chaque photo supprimée est une question que les couches suivantes ne pourront plus poser. Où couper ?

L’idée — Blocage

Regrouper : un checkpoint par bloc de 12 couches → 4 états, 128 Mio (÷12). La granularité devient un curseur — 48, 12, 4 ou 1 états : de « quasi redondant » à « plus aucun choix ».

Pourquoi / à quel prix — Blocage

Le blocage rend le mécanisme abordable. Le prix : la récupération devient grossière — entre x₁₂ et x₂₄, plus rien n’est adressable — et le placement des checkpoints n’a pas de réponse canonique, seulement un compromis par tâche.

Contrôle : Passer de 48 checkpoints (1,5 Gio) à 4 (128 Mio) divise le stockage par 12. Quelle question la couche 24 ne peut plus poser une fois qu’elle ne dispose plus que de x₀, x₁₂ et x₂₄ ?

Le problème — Ce que cela ne prouve pas

Le module affiche 0,665 sur x₂₄ — tentation immédiate : « la couche 24 porte le raisonnement ». Les poids sont lisibles, le récit est séduisant… et la conclusion ne suit pas.

L’idée — Ce que cela ne prouve pas

Lecture bornée : 0,665 mesure l’influence de x₂₄ dans CE module, à CETTE couche, pour CE token. Le chemin résiduel transporte x₂₄ de toute façon, et des poids parfaitement lisibles peuvent accompagner un module qui n’explique rien — le cas [0,333…] le prouve.

Pourquoi / à quel prix — Ce que cela ne prouve pas

La discipline d’interprétation évite de vendre un mécanisme comme une explication. Le prix : renoncer aux récits séduisants — toute lecture doit venir avec une expérience qui pourrait la réfuter, sinon c’est de l’interprétabilité décorative.

Contrôle : Le poids 0,665 sur x₂₄ est mesuré, pas interprété. Proposez une observation qui contredirait la lecture « la couche 24 porte le raisonnement », en utilisant le cas dégénéré [0,333 ; 0,333 ; 0,333].

Support visuel — Ce que cela ne prouve pas

ce que 0,665 sur x₂₄ DIT           ce qu’il NE DIT PAS
─────────────────────────          ─────────────────────────
influence de x₂₄ dans CE           ce que la couche 24
module, cette couche,              calcule réellement
ce token
                                   que le raisonnement
poids re-mesurable,                « habite » la couche 24
expérience reproductible
                                   test : poids plats [0,333…]
                                   → lisibles, zéro explication

Cas guidé — trace complète

Scores de profondeur [2;1;0] sur {x₂₄;x₁₂;x₀} donnent softmax ≈ [0,67;0,24;0,09]. Le mélange privilégie x₂₄, le checkpoint le plus récent, tandis que les deux autres conservent ensemble 33 %.

RÈGLE : x_{l+1} = x_l + F_l(x_l)

DILUTION (contributions approximativement orthogonales, ‖F_l‖ = 0,5)
  ‖x_l‖² ≈ ‖x₀‖² + l × 0,25   avec ‖x₀‖ = 1
  l = 0   → ‖x‖² = 1     part de x₀ = 100 %
  l = 12  → ‖x‖² = 4     part de x₀ = 25 %
  l = 24  → ‖x‖² = 7     part de x₀ ≈ 14,3 %
  l = 48  → ‖x‖² = 13    part de x₀ ≈ 7,7 %   ← présent, mais noyé

MÉLANGE SUR LA PROFONDEUR, checkpoints {x₂₄, x₁₂, x₀}, scores [2 ; 1 ; 0]
  exp = [7,389 ; 2,718 ; 1,000]   somme = 11,107
  softmax = [0,665 ; 0,245 ; 0,090]                 ✅ somme = 1,000
  y = 0,665·x₂₄ + 0,245·x₁₂ + 0,090·x₀
  x₀ pèse 9 % après le mélange contre 14,3 % de part d’énergie
  résiduelle : la récupération se choisit, elle ne se subit plus.

CAS DÉGÉNÉRÉ : scores [1,0 ; 1,0 ; 1,0]
  softmax = [0,333 ; 0,333 ; 0,333]                 ❌
  y = moyenne des trois checkpoints. Le module ne récupère rien :
  il refait, en plus cher, ce que le résiduel faisait déjà gratuitement.

COÛT DE STOCKAGE (d_model = 4096, 4 096 tokens, BF16)
  1 checkpoint = 4096 × 4096 × 2 = 33 554 432 o = 32 Mio
  48 couches toutes stockées → 48 × 32 Mio = 1 536 Mio = 1,5 Gio  ❌
  blocs de 12 → 4 checkpoints  → 128 Mio                          ✅ ÷12

CONTRÔLE DE FORME : q ∈ R^{4096}, états empilés [J=3, 4096]
  → scores [3] → poids [3] → y ∈ R^{4096}. Passer à J=4 change [3]→[4],
  jamais la dimension de y.

Granularité des checkpoints de profondeur (48 couches, 32 Mio l’unité)

Espacement Stockage Qualité de récupération
Toutes les couches (48) 1,5 Gio la plus fine, scores quasi redondants entre voisines
Tous les 4 (12 états) 384 Mio fine, distingue encore début et fin de bloc
Tous les 12 (4 états) 128 Mio grossière : un seul point par phase de traitement
x₀ seul (1 état) 32 Mio aucun choix : le mélange dégénère en résiduel long

Laboratoire causal

Prédire → modifier une variable → exécuter → expliquer l’écart

/interactives/curriculum/moe-attnres.html?lang=fr

Erreurs fréquentes

« Après 48 couches, l’information de x₀ a été écrasée. »

Rien n’est écrasé : l’addition est conservatrice, x₄₈ contient toujours x₀ intégralement. Ce qui change est le rapport signal/bruit — 7,7 % de l’énergie contre 100 % au départ. C’est précisément pourquoi un mélange sur la profondeur peut le remonter à 9 % de poids explicite : il ne restaure pas une information perdue, il la resélectionne.

« Un poids de 0,665 sur x₂₄ prouve que la couche 24 fait le travail. »

Ce poids décrit l’influence de x₂₄ dans ce module de récupération précis, à cette couche, sur ce token. Il ne dit rien de ce que la couche 24 calcule, ni du chemin résiduel qui transporte x₂₄ de toute façon. Le cas [0,333 ; 0,333 ; 0,333] le montre : des poids parfaitement lisibles peuvent correspondre à un module qui n’explique strictement rien.

Frontière, preuve et sources

AttnRes est présenté comme mécanisme de cours et étude de cas rapportée ; ses détails exacts dans Kimi K3 nécessitent une source primaire.

Statut de preuve : Mixte : mécanismes établis + choix de type Kimi K3 rapportés par la source.

  • Dossier de cours bilingue fourni par le propriétaire, chapitre 15.
  • He et al., “Deep Residual Learning for Image Recognition”, CVPR (2016).
  • Elhage et al., “A Mathematical Framework for Transformer Circuits” (residual-stream view), Anthropic (2021).
  • Dossier source fourni par le propriétaire; les détails sur des produits nommés restent attribués à cette source jusqu’à vérification primaire.

Défi de transfert

Votre budget de checkpoints est de 256 Mio pour 48 couches (32 Mio l’unité).

  1. Choisissez un placement — combien d’états, quels indices — et pré-enregistrez ce que votre choix rend impossible à récupérer.
  2. Incident : la couche 30 aurait eu besoin de l’état de la couche 18. Votre placement s’en sort-il ? Chiffrez l’écart avec la maquette de dilution.
  3. Donnez la mesure qui vous ferait changer de placement.

Synthèse et ticket de sortie

  • Connexion résiduelle
  • Dilution
  • États de profondeur
  • Scores sur la profondeur
  • Blocage
  • Ce que cela ne prouve pas

Ticket : mécanisme · trace · observation · frontière · preuve · prochaine expérience

Notes formateur: Poser le problème avant de nommer le mécanisme. Recueillir une prédiction initiale et la conserver pour le ticket de sortie.

Notes formateur: Faire relier chaque étape à la suivante par un verbe causal. Signaler toute flèche purement décorative.

Notes formateur: Ouvrir par l’histoire d’échec : « avant 2015, au-delà d’environ vingt couches, les réseaux étaient PIRES en entraînement comme en test ». Recueillir des hypothèses ; noter « gradient » au tableau dès qu’il apparaît — le beat le matérialise avec F ≡ 0.

Notes formateur: Faire écrire la formule puis poser F_l ≡ 0 au tableau. Voir x₁₂ = x₀ apparaître fait comprendre le chemin identité plus vite que n’importe quel discours sur les gradients qui s’évanouissent.

Notes formateur: Réponse : x₁₂ = x₀ — le flux traverse inchangé, et le gradient remonte par le chemin identité sans atténuation (jacobienne = I). Erreur attendue : « x₁₂ = 0 », en confondant F ≡ 0 avec x ≡ 0.

Notes formateur: Faire voter avant tout calcul : « après 48 couches, que reste-t-il de x₀ — 0 %, 8 %, 50 % ? ». Le vote majoritaire pour « zéro » est le matériau du beat ; l’afficher pour y revenir après le 7,7 %.

Notes formateur: Faire deviner la part de x₀ à la couche 48 avant de la calculer. La salle annonce presque toujours « zéro » ; le 7,7 % obtenu ensuite installe la distinction dilution / effacement pour le reste de la séance.

Notes formateur: Réponse : ‖x₄₈‖² ≈ 1 + 48 × 0,25 = 13, part de x₀ = 1/13 ≈ 7,7 % — diluée, pas effacée : l’addition conserve tout, c’est le rapport signal/bruit qui chute. Rappeler que le chiffre vaut sous l’hypothèse d’orthogonalité (maquette). Erreur attendue : conclure « effacée » du chiffre faible.

Notes formateur: Confronter la courbe au vote d’ouverture (« zéro ») : le point 7,7 % est bas mais n’est pas zéro, et c’est toute la différence — on peut resélectionner ce qui est enterré, pas ce qui est effacé.

Notes formateur: Analogie d’accroche : un document sans historique de versions. « Comment revenir au brouillon d’origine ? » — impossible, sauf à avoir enregistré des copies en route. C’est exactement ce que le beat installe.

Notes formateur: Demander à chacun de choisir trois indices de checkpoint parmi 48 et de justifier. Les désaccords dans la salle sont l’argument : il n’existe pas de placement canonique, seulement un compromis.

Notes formateur: Réponse : un critère de couverture — {x₀, x₁₂, x₂₄} échantillonne des phases de traitement distinctes ; {x₀, x₁, x₂} stocke trois états quasi identiques. Sans x₂₃, tout adressage fin de la fin du bloc 12-24 disparaît : « juste avant x₂₄ » devient une question impossible. Erreur attendue : « les premières couches comptent le plus ».

Notes formateur: Rappeler la session 12 en une question : « les trois rôles q, k, v — qui s’en souvient ? ». La rotation tokens → profondeurs tient en une phrase si la base est là ; sinon, 90 secondes de rappel avant le beat.

Notes formateur: Faire calculer le softmax de [2 ; 1 ; 0] à la main, puis remplacer par [1 ; 1 ; 1] sans prévenir. La bascule vers 0,333 doit être vécue comme une panne, pas lue comme un contre-exemple.

Notes formateur: Réponse : softmax([4 ; 1 ; 0]) ≈ [0,936 ; 0,047 ; 0,017] — x₀ tombe de 0,090 à 0,017. Mais non : x₀ reste intégralement dans le flux résiduel ; le module a seulement cessé de le resélectionner. Erreur attendue : « x₀ est supprimé » — la confusion module/flux de l’erreur fréquente 1.

Notes formateur: Faire nommer, pour la version profondeur, ce qui joue le rôle des clés et des valeurs (les états conservés, deux fois). La symétrie avec la session 12 doit être énoncée par un apprenant, pas par le slide.

Notes formateur: Budget en main : « 1,5 Gio de photos pour UNE séquence — qui signe ? ». Personne ne signe. Le blocage arrive alors comme une nécessité comptable, pas comme une astuce d’implémentation.

Notes formateur: Poser la question en ingénieur, budget en main : « 1,5 Gio de checkpoints, ou 128 Mio ? » Faire justifier le choix par la tâche visée, pas par une préférence esthétique pour la finesse.

Notes formateur: Réponse : toute question visant l’intérieur d’un bloc — par exemple « l’état juste avant la couche 20 » : entre x₁₂ et x₂₄, plus rien n’est adressable. Erreur attendue : répondre en Mio (le coût) au lieu de répondre en questions perdues (la granularité).

Notes formateur: Jouer l’avocat de l’excès : présenter le 0,665 comme « la preuve que la couche 24 pense ». Laisser la salle démonter l’argument elle-même ; le beat fournit ensuite le vocabulaire de la lecture bornée.

Notes formateur: Terminer en demandant explicitement : « quelle expérience réfuterait votre interprétation du 0,665 ? » Refuser toute réponse qui ne propose pas une mesure ; c’est le seul garde-fou contre l’interprétabilité décorative.

Notes formateur: Réponse attendue : une mesure du type « sur un jeu contrôlé, les poids restent ≈ [0,333…] ET la performance ne bouge pas quand on retire le module » — des poids lisibles sans effet causal réfutent la lecture. Exiger une mesure ; refuser toute reformulation narrative.

Notes formateur: Faire ajouter une troisième colonne à l’oral : « quelle expérience départagerait ? » (ablation du module, sonde sur x₂₄, comparaison de tâches). Le tableau n’est complet qu’avec cette colonne-là.

Notes formateur: Dérouler ligne par ligne. Une incohérence se localise à la première étape fautive, pas seulement sur la dernière ligne.

Notes formateur: Faire remplir la dernière ligne par les apprenants avant de la révéler : c’est le compromis qui décide en production.

Notes formateur: Conserver les valeurs initiales et finales. Interdire les changements simultanés qui rendent l’écart impossible à attribuer.

Notes formateur: Pour chaque affirmation, faire produire le contre-exemple minimal par le groupe avant de donner la correction.

Notes formateur: Séparer mécanisme vérifiable, choix d’implémentation rapporté et résultat expérimental. La précision de la preuve doit suivre celle de l’affirmation.

Notes formateur: Attendus : 8 états au maximum (256/32). Placement uniforme tous les 6 — x₀, x₆, …, x₄₂ — : la couche 30 lit x₁₈ exactement, l’incident est absorbé. Avec 4 états tous les 12, le plus proche est x₁₂ ou x₂₄ : 6 couches d’écart, soit ≈ 1,5 unité d’énergie ajoutée dans la maquette (0,25 × 6) entre l’état voulu et l’état disponible. Mesure de bascule : une sonde de reconstruction sur les couches réellement demandées, pas une intuition. Idée fausse à récolter : « denser au début » — la dilution rend surtout les PHASES TARDIVES difficiles à adresser. 10 minutes, binômes.

Notes formateur: Faire reconstruire la chaîne sans regarder les slides, puis remplir le ticket en six lignes maximum. Comparer à la prédiction initiale du premier slide et nommer ce qui a réellement changé.