Aller au contenu

Memory Engine · FSRS-6

Le moteur, formule par formule.

Trois nombres par page, vingt et un paramètres, une courbe. Voici, sans rien arrondir, ce que Mirandola calcule chaque fois que tu notes une page.

Par l’équipe Mirandola · · pour les curieux

R(t,S)=(1+f⁢tS)−w20
100 %90 %50 %0 %01 sem.1 mois6 mois1 an
S = 1 jour7 jours30 jours180 jours
  • 3variables par page : D, S, R
  • 21paramètres appris
  • 0,3460log loss au banc d’essai public
  • 184 Kode WebAssembly pour l’optimiseur

1Trois nombres par page

FSRS (Free Spaced Repetition Scheduler) décrit chaque souvenir par trois variables, le modèle DSR de Ye, Su et Cao. Chaque page de chaque livre porte les siennes.

D

Difficulté

À quel point cette page résiste. Entre 1 et 10.

D ∈ [1, 10]
S

Stabilité

Le nombre de jours au bout duquel ton rappel tombe à 90 %.

S ∈ [0,0001 ; 36 500] jours
R

Récupérabilité

La probabilité que tu retrouves la réponse, là, maintenant.

R ∈ ]0, 1]

2La courbe d’oubli

R(t,S)=(1+f⁢tS)−w20 f=0,9−1/w20−1≈0,9803⟹R(S,S)=0,9

t est le nombre de jours depuis la dernière lecture, comptés en jours de calendrier, la journée changeant à 4 h comme dans Anki. Le facteur f est choisi pour que le rappel vaille exactement 90 % au bout de S jours : c’est la définition même de la stabilité. Avec les paramètres par défaut, w20 = 0,1542.

100 %90 %50 %0 %0S2S3S4S
FSRS-6Exponentielle passant par le même point

3Le bon jour pour revenir

On inverse la courbe : quel t donne le rappel r qu’on vise ?

I(r,S)=Sf⁢(r−1/w20−1)

Mirandola vise r = 0,90, comme Anki, sans curseur : l’intervalle vaut alors exactement S, arrondi au jour, au moins un jour, au plus 36 500.

×1,00l’intervalle, en multiples de S
Intervalle selon la rétention visée
Rétention viséeIntervalle
80 %3,32 × S
85 %1,91 × S
90 %1,00 × S
95 %0,40 × S
97 %0,22 × S

4La première lecture

S0(G)=wG−1 D0(G)=w4−ew5(G−1)+1

G est la note : 1 Encore, 2 Difficile, 3 Correct, 4 Facile.

Stabilité et difficulté de départ selon la note
NoteS0D0 (borné à [1, 10])
Encore0,21 jour6,41
Difficile1,29 jour5,11
Correct2,31 jours2,12
Facile8,30 jours1 (−4,77 avant bornage)

5Après une bonne réponse

Sr′=S⁢(1+ew8⏟échelle⁢(11−D)⏟difficulté⁢S−w9⏟saturation⁢(ew10(1−R)−1)⏟espacement⁢h⁢b)
(11 − D)

Une page facile gagne plus. À D = 10, le gain est dix fois plus petit qu’à D = 1.

S−w₉

Plus un souvenir est solide, moins chaque lecture l’allonge : la stabilisation sature.

ew₁₀(1−R) − 1

L’effet d’espacement, chiffré : relire quand on a un peu oublié rapporte plus que relire trop tôt.

h, b

h = w15 = 0,60 si « Difficile », b = w16 = 1,87 si « Facile », 1 sinon.

×20×15×10×5×198 %90 %74 %58 %50 %
D = 2D = 5D = 8S′/S pour S = 10 jours, selon le rappel au moment de lire. Calculé par le moteur.

6Après un oubli

Sf′=min(w11⁢D−w12⁢((S+1)w13−1)⁢ew14(1−R),Sew17w18)

Un oubli ne remet pas à zéro : la nouvelle stabilité garde la trace de l’ancienne, (S + 1)w₁₃, et ne peut jamais dépasser ce qu’on avait. La page repasse ensuite par un palier de dix minutes.

7La difficulté

Le pasΔD=−w6⁢(G−3)
L’amortissementD′=D+ΔD⁢10−D9
Le retour à la moyenneD″=w7⁢D0(4)+(1−w7)⁢D′

« Correct » ne bouge rien, « Difficile » ajoute 3,02, « Encore » 6,04, « Facile » retire 3,02, et plus une page est déjà difficile, moins elle peut l’être encore : le facteur (10 − D)/9 l’amortit avant 10. Le retour vers D0(4) est presque nul par défaut (w7 = 0,001), l’optimiseur le règle. Puis D est borné à [1, 10].

8Le jour même

S′=S⁢ew17(G−3+w18)⁢S−w19

Pour G ≥ 2, le facteur ne descend jamais sous 1 : une bonne réponse ne fait jamais perdre de stabilité.

  • 1 min, 10 minles paliers d’une page neuve, comme Anki
  • 10 minle palier d’une page oubliée
  • 4 hl’heure où la journée change : 23 h puis 3 h, c’est le même jour
  • 20pages neuves par jour et par livre, sauf un devoir

9Une page, un an

Calculé à l’instant, dans ton navigateur, par src/fsrs.js : le code même qui choisit l’échéance de chaque page dans l’app. Paramètres par défaut, rétention 90 %, sans flou.

100 %90 %70 %Jour 03 mois6 mois9 mois1 an
Chaque lecture de la page sur un an
JourRappelNoteS aprèsD après
J 0·Correct2,31 j2,11
J+290,9 %Correct11,0 j2,10
J+1390,0 %Correct46,3 j2,10
J+5990,0 %Correct163,0 j2,09
J+22290,0 %Correct497,9 j2,08

5 lectures dans l’année, la première comprise. La suivante : jour 720.

10Les 21 paramètres

Ceux du crate fsrs 6.6.2, ceux d’Anki. Le Memory Engine Lite (Mirandola gratuit) les garde ; le Memory Engine Ultra (Mirandola+, Campus) les réapprend sur ton historique.

Les 21 paramètres de FSRS-6 et leur valeur par défaut
ParamètrePar défautRôle
w00,212Stabilité de départ après « Encore »
w11,2931Stabilité de départ après « Difficile »
w22,3065Stabilité de départ après « Correct »
w38,2956Stabilité de départ après « Facile »
w46,4133Difficulté de départ : son niveau
w50,8334Difficulté de départ : sa pente selon la note
w63,0194Pas de la difficulté à chaque note
w70,001Retour de la difficulté vers sa moyenne
w81,8722Gain de stabilité : son échelle
w90,1666Gain de stabilité : sa saturation avec S
w100,796Gain de stabilité : l’effet du rappel
w111,4835Après un oubli : l’échelle
w120,0614Après un oubli : l’effet de la difficulté
w130,2629Après un oubli : l’effet de l’ancienne stabilité
w141,6483Après un oubli : l’effet du rappel
w150,6014Malus de « Difficile »
w161,8729Bonus de « Facile »
w170,5425Le jour même : l’échelle
w180,0912Le jour même : le décalage
w190,0658Le jour même : la saturation
w200,1542La courbe d’oubli : son exposant

11L’optimiseur

ℒ(w)=−1N∑i=1N[yi⁢ln⁡Ri(w)+(1−yi)⁢ln⁡(1−Ri(w))]

Chaque révision d’un jour différent devient un exemple : tout l’historique de la page jusque-là, et y = 1 si tu as retrouvé la réponse. Le moteur rejoue l’historique, prédit R, et la descente de gradient (Adam) ajuste les 21 paramètres pour que ses prédictions collent à ta mémoire.

  • Sur ton appareille crate fsrs 6.6.2 compilé en WebAssembly, lancé dans un fil à part
  • 184 Koaucun import, aucune bibliothèque, un calcul reproductible
  • 14 joursou 25 % de révisions en plus : il recommence seul
  • 60 sau plus ; au-delà, il attend la prochaine fois

12Le flou et l’équilibreur

Le flou
δ(I)=1+0,15[min(I,7)−2,5]+ +0,1[min(I,20)−7]+ +0,05[I−20]+

Le jour tombe dans [I − δ, I + δ] : 30 jours deviennent un jour entre 27 et 33. Les pages apprises ensemble ne reviennent pas toutes ensemble.

L’équilibreur (Ultra) pj∝(1nj)2,15⁢(1j)3

Dans la fourchette du flou, chaque jour j pèse selon les nj pages qui l’attendent déjà (1 s’il est vide), jusqu’à 90 jours : les journées s’égalisent au lieu de s’empiler. Le tirage vient d’un hachage de la page (FNV-1a) : le délai écrit sous chaque bouton est celui qui arrivera.

13Le banc d’essai

open-spaced-repetition/srs-benchmark : 9 999 collections d’Anki, 349 923 850 révisions, chaque algorithme prédit chaque rappel avant de le voir. Plus c’est bas, mieux il connaît ta mémoire.

  1. FSRS-60,0653
  2. FSRS-50,0742
  3. FSRS-4.50,0764
  4. HLR0,1275
  5. Ebisu v20,1627
Relevé le 4 novembre 2026, révisions du jour même exclues. SM-2 n’y figure pas : il donne un intervalle, jamais une probabilité, et ne se mesure donc pas ainsi.

Questions de curieux

Pourquoi viser 90 % et pas 100 % ?

Parce que le coût explose : à 97 %, l’intervalle tombe à 0,22 fois la stabilité, chaque page revient plus de quatre fois plus tôt qu’à 90 %. 90 % est le réglage par défaut d’Anki et de FSRS, le meilleur rapport entre ce qu’on retient et le temps passé.

Mon historique sert-il à entraîner un modèle commun ?

Non. L’optimiseur tourne sur ton appareil et n’apprend que ta mémoire. Sans assez d’historique, ou en Mirandola gratuit, ce sont les paramètres par défaut, ceux d’Anki.

Mirandola fait-il exactement comme Anki ?

Le même moteur, FSRS-6 du crate fsrs 6.6.2 qu’Anki épingle, les mêmes paramètres par défaut, les mêmes paliers, la même journée qui change à 4 h, le même flou et le même équilibreur. Ce qui change : aucun réglage à faire.

Sources

  • Junyao Ye, Jingyong Su, Yilong Cao, « A Stochastic Shortest Path Algorithm for Optimizing Spaced Repetition Scheduling », KDD 2022.
  • Jingyong Su, Junyao Ye, Liqiang Nie, Yilong Cao, Yongyong Chen, « Optimizing Spaced Repetition Schedule by Capturing the Dynamics of Memory », IEEE TKDE, 2023.
  • open-spaced-repetition : le crate fsrs 6.6.2, py-fsrs, et le banc d’essai srs-benchmark.
  • Anki : l’équilibreur de charge, rslib/src/scheduler/states/load_balancer.rs.

Plus simple ? La répétition espacée, expliquée sans formule.

Ouvre ton premier livre ce soir.

Se connecter

Tu as un code ?