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
- 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.
Difficulté
À quel point cette page résiste. Entre 1 et 10.
D ∈ [1, 10]Stabilité
Le nombre de jours au bout duquel ton rappel tombe à 90 %.
S ∈ [0,0001 ; 36 500] joursRécupérabilité
La probabilité que tu retrouves la réponse, là, maintenant.
R ∈ ]0, 1]2La courbe d’oubli
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.
3Le bon jour pour revenir
On inverse la courbe : quel t donne le rappel r qu’on vise ?
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.
| Rétention visée | Intervalle |
|---|---|
| 80 % | 3,32 × S |
| 85 % | 1,91 × S |
| 90 % | 1,00 × S |
| 95 % | 0,40 × S |
| 97 % | 0,22 × S |
4La première lecture
G est la note : 1 Encore, 2 Difficile, 3 Correct, 4 Facile.
| Note | S0 | D0 (borné à [1, 10]) |
|---|---|---|
| Encore | 0,21 jour | 6,41 |
| Difficile | 1,29 jour | 5,11 |
| Correct | 2,31 jours | 2,12 |
| Facile | 8,30 jours | 1 (−4,77 avant bornage) |
5Après une bonne réponse
Une page facile gagne plus. À D = 10, le gain est dix fois plus petit qu’à D = 1.
Plus un souvenir est solide, moins chaque lecture l’allonge : la stabilisation sature.
L’effet d’espacement, chiffré : relire quand on a un peu oublié rapporte plus que relire trop tôt.
h = w15 = 0,60 si « Difficile », b = w16 = 1,87 si « Facile », 1 sinon.
6Après un oubli
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é
« 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
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.
| Jour | Rappel | Note | S après | D après |
|---|---|---|---|---|
| J 0 | · | Correct | 2,31 j | 2,11 |
| J+2 | 90,9 % | Correct | 11,0 j | 2,10 |
| J+13 | 90,0 % | Correct | 46,3 j | 2,10 |
| J+59 | 90,0 % | Correct | 163,0 j | 2,09 |
| J+222 | 90,0 % | Correct | 497,9 j | 2,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.
| Paramètre | Par défaut | Rôle |
|---|---|---|
| w0 | 0,212 | Stabilité de départ après « Encore » |
| w1 | 1,2931 | Stabilité de départ après « Difficile » |
| w2 | 2,3065 | Stabilité de départ après « Correct » |
| w3 | 8,2956 | Stabilité de départ après « Facile » |
| w4 | 6,4133 | Difficulté de départ : son niveau |
| w5 | 0,8334 | Difficulté de départ : sa pente selon la note |
| w6 | 3,0194 | Pas de la difficulté à chaque note |
| w7 | 0,001 | Retour de la difficulté vers sa moyenne |
| w8 | 1,8722 | Gain de stabilité : son échelle |
| w9 | 0,1666 | Gain de stabilité : sa saturation avec S |
| w10 | 0,796 | Gain de stabilité : l’effet du rappel |
| w11 | 1,4835 | Après un oubli : l’échelle |
| w12 | 0,0614 | Après un oubli : l’effet de la difficulté |
| w13 | 0,2629 | Après un oubli : l’effet de l’ancienne stabilité |
| w14 | 1,6483 | Après un oubli : l’effet du rappel |
| w15 | 0,6014 | Malus de « Difficile » |
| w16 | 1,8729 | Bonus de « Facile » |
| w17 | 0,5425 | Le jour même : l’échelle |
| w18 | 0,0912 | Le jour même : le décalage |
| w19 | 0,0658 | Le jour même : la saturation |
| w20 | 0,1542 | La courbe d’oubli : son exposant |
11L’optimiseur
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
fsrs6.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 jour tombe dans [I − δ, I + δ] : 30 jours deviennent un jour entre 27 et 33. Les pages apprises ensemble ne reviennent pas toutes ensemble.
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.
- FSRS-6
- FSRS-5
- FSRS-4.5
- HLR
- Ebisu v2
- FSRS-6
- FSRS-5
- FSRS-4.5
- HLR
- Ebisu v2
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
fsrs6.6.2,py-fsrs, et le banc d’essaisrs-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.