Comment un modèle s'entraîne avec une mémoire qu'il n'a pas.

SRC·53 Source
Pour apprendre, il doit se souvenir de chaque étape. Voilà le mur.

Pour apprendre, il doit se souvenir de chaque étape. Voilà le mur.

Pour s'améliorer, un modèle propage ton entrée vers l'avant à travers chaque couche — et pour apprendre de son erreur, il doit garder chacun de ces résultats intermédiaires, prêts pour la passe arrière. Le calcul n'a jamais été le problème. C'est la mémoire. Sur un modèle assez profond, tenir toute la passe avant d'un coup, c'est exactement ce qui te met à court de place.
Pourquoi tout garder ? Pour remonter jusqu'au coupable.

Pourquoi tout garder ? Pour remonter jusqu'au coupable.

Mstore==1La=O(L)M_{\text{store}} = \sum_{\ell=1}^{L} a_{\ell} = O(L)
Apprendre pose à chaque couche une question : combien as-tu ajouté à l'erreur ? Y répondre exige la sortie sauvegardée de cette couche, prise à l'aller — alors le modèle les garde toutes. Comme un chef qui laisse chaque bol de mise en place sur le passe : pour trouver quelle étape a tourné la sauce, tu laisses tous les bols dehors, et le plan de travail se remplit avant que le plat soit fini. Une sortie stockée par couche, et la facture de mémoire grimpe au même rythme que la profondeur L.
Alors, ne rien garder ? Là, le travail explose.

Alors, ne rien garder ? Là, le travail explose.

Crecompute==1L=L(L+1)2=O(L2)C_{\text{recompute}} = \sum_{\ell=1}^{L} \ell = \frac{L(L+1)}{2} = O(L^{2})
Il y a une esquive évidente : ne rien garder, et chaque fois que la passe arrière a besoin de la valeur d'une couche, la recalculer depuis l'entrée. La mémoire disparaît — mais le travail explose. Comme redescendre au rez-de-chaussée à chaque fois : pour atteindre le neuvième étage, tu repars d'en bas, encore et encore. Refais chaque couche de zéro et l'effort total croît comme le carré de la profondeur.
La solution : garder quelques repères, refaire le reste.

La solution : garder quelques repères, refaire le reste.

M(k)=Lkwaypoints+kone segmentM(k) = \underbrace{\tfrac{L}{k}}_{\text{waypoints}} + \underbrace{k}_{\text{one segment}}
Aucun extrême ne marche, alors prends le milieu. Sauvegarde les activations à quelques couches seulement et jette le reste ; quand la passe arrière a besoin d'une valeur jetée, ne relance que le court tronçon depuis le point sauvegardé le plus proche. Comme un randonneur qui plante un fanion tous les kilomètres : tu ne mémorises pas chaque pas — pour revenir, tu retournes au dernier fanion et tu refais ce court tronçon. Place un repère toutes les k couches et tu ne tiens que L/k fanions, plus les k pas du tronçon que tu refais.
À quelle distance ? La racine carrée de la profondeur.

À quelle distance ? La racine carrée de la profondeur.

dMdk=Lk2+1=0    k=L,M=2L=O(L)\frac{dM}{dk} = -\frac{L}{k^{2}} + 1 = 0 \;\Rightarrow\; k^{*} = \sqrt{L}, \quad M^{*} = 2\sqrt{L} = O(\sqrt{L})
Espace trop les repères et chaque retour est long ; serre-les trop et tu n'as gagné aucune mémoire. Les deux coûts tirent en sens inverse, et le total est minimal quand ils s'équilibrent. Comme une équipe de relais qui répartit ses passages de témoin : des relais trop longs et chaque coureur s'épuise, trop courts et tu as embauché des coureurs pour rien — l'équipe est la plus rapide quand chaque relais fait la même courte longueur. L'équilibre tombe sur un fanion toutes les √L couches — et la mémoire chute à environ √L.
Le coût ? Une passe en plus. Ça vaut le coup.

Le coût ? Une passe en plus. Ça vaut le coup.

CckptFfwd+Fbwd+Frecompute=F+2F+F=43CfullC_{\text{ckpt}} \approx F_{\text{fwd}} + F_{\text{bwd}} + F_{\text{recompute}} = F + 2F + F = \tfrac{4}{3}\,C_{\text{full}}
Rien n'est gratuit : chaque tronçon jeté est re-parcouru une fois pendant la passe arrière, ce qui revient à refaire tout le trajet aller exactement une fois de plus. Comme louer une petite camionnette et faire deux voyages : tu ne pouvais pas te payer le gros camion, alors tu fais la route deux fois — un peu plus de temps, et tout déménage quand même. Un pas normal, c'est un trajet aller et deux retours ; un aller en plus fait quatre parts là où il y en avait trois — environ un tiers de calcul en plus pour une coupe de mémoire proche de sa racine carrée.
Désormais, la mémoire est un cadran, pas un mur.

Désormais, la mémoire est un cadran, pas un mur.

Voilà toute l'astuce : la mémoire cesse d'être un mur et devient un cadran que tu peux tourner. Dépense un peu plus de temps et tu fais tenir un modèle qui n'aurait jamais dû tenir — entraîne quelque chose de bien plus profond que ce que ton matériel peut contenir, rien qu'en acceptant de reconstruire ce que tu as choisi d'oublier. Comme un bateau construit dans une bouteille : ce qui ne passe pas par le goulot y arrive quand même, assemblé par une méthode patiente et astucieuse. Le travail que tu as jeté n'a jamais été perdu — seulement bon marché à refaire.
🌱 Une mémoire qu'on peut reconstruire est-elle vraiment une mémoire ?

🌱 Une mémoire qu'on peut reconstruire est-elle vraiment une mémoire ?

Il a choisi d'oublier — puis, quand il a eu de nouveau besoin de la pensée, il l'a simplement reconstruite. Nous avons rarement ce choix : notre passé se stocke, il ne se redéduit pas, et ce que nous perdons est en général perdu. Mais si une chose peut toujours recalculer ce qu'elle a oublié, oublier fut-il jamais une perte ? Peut-être que tout retenir est l'habitude coûteuse — et refaire le travail, sans bruit, la façon la moins chère de penser.
touchez →balayez ↑ pour approfondirbalayez ↓ pour quitter