简介
FSRS全称是 Free Spaced Repetition Scheduler,可以理解为一种“更聪明的复习时间安排算法”。
它解决的问题很简单:
一张卡片,我下一次到底应该什么时候复习?
传统 Anki 的 SM-2 算法主要靠“间隔倍增”和 ease factor。FSRS 更像是给每张卡片建立一个小小的“记忆模型”,根据你的历史表现估计:你现在还记得它的概率是多少,然后安排下一次复习。
FSRS 的核心直觉
FSRS 认为,每张卡片有两个重要属性:
-
难度 Difficulty,D
表示这张卡对你来说有多难。
越难,之后间隔增长越慢。 -
稳定性 Stability,S
表示这段记忆有多稳。
越稳定,忘得越慢,下一次复习可以隔更久。
还有一个临时计算出来的值:
- 可回忆率 Retrievability,R
表示“现在你还能想起来的概率”。
比如 R = 0.9,大概表示你现在有 90% 概率能答对。
一个简单例子
假设你今天复习一张卡。
FSRS 会看:
- 距离上次复习过了几天
- 这张卡之前的稳定性 S 是多少
- 于是估算你现在还记得的概率 R
然后你按了一个按钮:
Again:忘了Hard:想起来了,但很费劲Good:正常想起来Easy:很轻松
FSRS 就会更新这张卡的 D 和 S。
比如:
- 你按
Again:算法认为这张卡比预期更难,稳定性下降或增长很少 - 你按
Good:算法认为记忆正常增强 - 你按
Easy:算法认为这张卡对你更容易,稳定性增长更多 - 你隔了很久还按
Good/Easy:说明这张记忆比想象中更稳,S 会明显增加
它怎么决定下次间隔?
你可以设置一个目标记忆率,比如 90%。
意思是:
我希望卡片到期时,我大约有 90% 的概率还能答对。
FSRS 会反过来计算:
如果这张卡的稳定性是 S,那么要让下次复习时记忆率大约是 90%,应该隔几天?
所以:
- 目标记忆率越高,比如 95%,复习会更频繁
- 目标记忆率越低,比如 80%,间隔会更长,复习量更少
- 卡片越稳定,间隔越长
- 卡片越难,间隔增长越保守
FSRS 和普通 Anki 算法最大的区别
普通 SM-2 更像规则系统:
答对了,间隔乘一个系数;答错了,重新来。
FSRS 更像预测系统:
根据你的复习历史,估计这张卡现在的遗忘概率,再安排一个能满足目标记忆率的复习时间。
所以 FSRS 通常更个性化。它会通过你的历史数据学习参数,也就是学习“你大概多久会忘”“哪些卡对你更难”“不同评分对你意味着什么”。
一句话版
FSRS 就是:
给每张卡估计“难度”和“记忆稳定性”,用遗忘曲线预测你什么时候快忘了,然后把复习安排在你大概率还记得、但又不太早浪费时间的时候。
如果用做饭打比方,SM-2 像固定菜谱:“每次翻倍加时间”;FSRS 像会观察火候:“这锅熟得快,那锅慢一点,所以时间单独调”。
FSRS v1-v6的区别
不同版本的区别可以理解成:核心思想一直没变,都是用 D/S/R 描述记忆;版本升级主要是在“公式更合理、参数更多、对真实复习行为拟合更好”。
FSRS 的共同骨架是:
D = Difficulty:这张卡对你有多难,范围大致是 1 到 10。S = Stability:这段记忆有多稳。S 越大,能隔越久复习。R = Retrievability:现在还能想起来的概率。G = Grade:你的评分,Again=1、Hard=2、Good=3、Easy=4。官方页也是这样定义这些符号的。来源:The Algorithm
一句话看版本演进
| 版本 | 参数数 | 主要变化 | 小白理解 |
|---|---|---|---|
| FSRS v1 | 7 | 有 S/D/L,其中 L 是忘记次数 |
最早版本,模型还比较粗糙 |
| FSRS v2 | 14 | 去掉/弱化单纯依赖 lapse 次数,开始更系统地建模成功/失败后的稳定性 | 开始像真正的记忆模型 |
| FSRS v3 | 13 | 使用指数遗忘曲线 0.9^(t/S),初始 S/D 公式更规整 |
有了比较清晰的遗忘曲线 |
| FSRS v4 | 17 | 改成新的遗忘曲线,并完善成功/失败后的稳定性更新 | 成为现代 FSRS 的基础形态 |
| FSRS-4.5 | 17 | 主要改遗忘曲线形状 | 更符合“前期忘得快,后期变平缓”的现象 |
| FSRS-5 | 19 | 加入同日复习稳定性公式,改初始难度和难度回归目标 | 更好处理学习阶段/当天多次复习 |
| FSRS-6 | 21 | 同日复习公式进一步改进,并让遗忘曲线的衰减参数可训练 | 当前更灵活、更精细的版本 |
从 v1 到 v3:从粗糙经验公式到 D/S 模型
FSRS v1 还带有 Lapses,也就是“这张卡忘过几次”。忘记后的稳定性主要依赖总遗忘次数。这个思路很直观:忘得越多,说明卡越麻烦。
但它也比较粗糙,因为“忘过几次”不能完整描述一张卡的状态。比如同样忘了一次,有的人是隔 2 天忘,有的人是隔 100 天忘,这两种情况含义完全不同。
v2/v3 开始更清楚地围绕 D 和 S 来建模。v3 使用的遗忘曲线是:
R(t,S) = 0.9^(t/S)
意思是:当经过的时间 t 等于稳定性 S 时,记忆概率刚好是 90%。官方页里 v3 是 13 个参数,并且记忆状态由 S 和 D 表示。来源:FSRS v3
v4:现代 FSRS 的关键版本
FSRS v4 仍然用 D/S,但公式明显成熟了。它有 17 个参数。
它对三件事建模:
- 第一次评分后,这张卡初始稳定性是多少。
- 每次复习后,难度怎么变化。
- 成功回忆或忘记之后,稳定性怎么变化。
v4 的遗忘曲线变成:
R(t,S) = (1 + t / (9S))^-1
同样保证 t = S 时,R = 90%。来源:FSRS v4
小白版理解:
v4 开始不只是“答对就乘一个系数”,而是会看:
- 这张卡难不难
- 现在稳定性高不高
- 你是不是拖了很久才复习
- 你按的是 Hard/Good/Easy/Again
然后综合更新下一次间隔。
FSRS-4.5:主要改遗忘曲线
FSRS-4.5 和 v4 参数数量一样,都是 17 个,但它改了遗忘曲线:
R(t,S) = (1 + FACTOR * t / S)^DECAY
官方页特别说,FSRS-4.5 的新曲线在 S 之前下降更快,在 S 之后更平缓。来源:FSRS-4.5
这是什么意思?
假设一张卡稳定性是 10 天:
- 在 10 天前,记忆可能掉得比较明显。
- 超过 10 天后,不会像旧模型那样简单线性/固定形状地掉下去。
也就是说,4.5 更像真实记忆:刚开始忘得快,后面忘得慢一些。
FSRS-5:更重视“当天复习”和难度更新
FSRS-5 从 17 个参数变成 19 个参数。官方页说它新增/修改了同日复习后的稳定性公式,并改了初始难度公式;同时,难度的均值回归目标从早期版本的 D0(3) 改成了 D0(4)。来源:FSRS-5
小白版理解:
很多卡片不是只隔几天复习一次。新卡学习时,你可能今天就按了好几次:
- 第一次 Again
- 10 分钟后 Good
- 之后 Easy
这些“同一天内的学习步骤”跟长期复习不完全一样。FSRS-5 开始更专门地处理这个问题。
FSRS-6:当前更细的版本
FSRS-6 使用 21 个参数。官方页说它有两个重要变化:
-
同日复习的稳定性公式又改了
新公式让 S 小的时候增长更快,S 大的时候增长更慢。 -
遗忘曲线的 decay 变成可训练参数
也就是遗忘曲线的形状不再固定,而是可以通过数据学习。来源:FSRS-6
这点很重要。因为不同人、不同材料的遗忘速度不一样:
- 背单词
- 背医学知识
- 背数学定理
- 背人名日期
它们的遗忘曲线可能不完全一样。FSRS-6 允许模型更灵活地适配数据。
最重要的区别,其实是这三条
-
遗忘曲线越来越合理
- v3:指数曲线
- v4:新的幂函数曲线
- 4.5:调整曲线形状
- 6:曲线衰减参数可训练
-
参数越来越多
- v1:7 个
- v3:13 个
- v4/4.5:17 个
- v5:19 个
- v6:21 个
参数多不是为了复杂而复杂,而是为了更细地描述:初始难度、初始稳定性、成功回忆、忘记、Hard 惩罚、Easy 奖励、同日复习等情况。
-
对真实 Anki 行为越来越贴近
早期版本更像理论模型;后续版本逐步补上现实中的细节,比如同日学习、难度回归、Hard/Easy 的不同影响、忘记后的稳定性上限等。
该用哪个?
普通用户不用纠结历史版本:用 Anki 当前内置的 FSRS,或者这个项目里的 FSRS-6 系列即可。
历史版本主要适合你理解算法演进:
- 想理解基础:看 v3/v4
- 想理解现代 FSRS:看 FSRS-4.5
- 想看当前更完整模型:看 FSRS-6
一句话总结:
FSRS 各版本的核心都一样:估计你现在还记得的概率,再安排下次复习。版本越新,遗忘曲线越灵活,对新卡、当天复习、不同评分、不同材料的处理越细。
如何通过四个按钮推导出FSRS的所有参数
这里要分清两件事:
四个按钮不是一次性算出所有参数。
FSRS 里的参数主要有两类:
-
模型参数
w
比如 FSRS-6 有 21 个参数。
这些不是你每按一次按钮就现场算出来的,而是通过大量历史复习记录训练/优化出来的。 -
单张卡片的记忆状态
D/S/R
这个才是每次按按钮时更新的。D:这张卡对你有多难S:这张卡记忆有多稳R:这次复习前,算法估计你还记得的概率
四个按钮真正提供的是 反馈信号。
可以把它理解成:
| 你按的按钮 | 算法理解 |
|---|---|
| Again | 失败,没想起来 |
| Hard | 成功了,但很困难 |
| Good | 正常成功 |
| Easy | 很轻松成功 |
所以按钮本身不是“21 个参数”,而是一个观测结果:
这次在间隔了 t 天之后,你的记忆表现如何。
举个简单例子。
假设一张卡上次复习后隔了 10 天才出现。FSRS 估计:
你现在大概有 80% 概率能想起来。
然后你按了:
Again:说明算法高估了你,实际没想起来Good:说明 80% 这个预测还可以Easy:说明算法可能低估了你,你记得比预期牢Hard:说明你虽然想起来了,但边缘得很
大量这样的记录放在一起,就可以反推模型参数。
每条记录大概长这样:
卡片 A,距离上次 3 天,按了 Good
卡片 A,距离上次 8 天,按了 Hard
卡片 A,距离上次 15 天,按了 Again
卡片 B,距离上次 1 天,按了 Easy
卡片 B,距离上次 20 天,按了 Good
...
优化器要做的事情是:
找一组参数 w,使得 FSRS 对这些历史记录的预测,尽量接近真实按钮结果。
比如某组参数预测:
这次应该有 90% 概率想起来
结果你按了 Again,那就是预测错了,参数要调整。
如果预测:
这次只有 40% 概率想起来
结果你按了 Good,也说明参数不太对。
训练过程就是不断试参数,让整体预测误差变小。
这里有个小小的关键点:
FSRS 训练时通常会把按钮先简化成 成功/失败:
Again= 失败Hard / Good / Easy= 成功
然后 Hard/Good/Easy 又会在调度时影响难度和稳定性的增长幅度。
所以四个按钮的信息量其实比看起来大,因为它们和这些信息一起使用:
- 距离上次复习过了多久
- 之前按过什么按钮
- 这张卡之前的稳定性是多少
- 这张卡之前的难度是多少
- 这次是成功还是失败
- 成功得轻松还是困难
类比一下:
你不是只告诉算法“我按了 Good”。
你实际告诉它的是:
这张卡在当前记忆状态下,隔了这么多天之后,我还能正常想起来。
这就很有价值。
一个生活类比
假设你想估计一个人跑步水平。你不能只看他说“轻松/困难”,但如果你知道:
他跑了 5 公里,说轻松
他跑了 10 公里,说困难
他跑了 15 公里,跑不下来
你就能慢慢估计出他的体能水平。
FSRS 也是一样。四个按钮只是反馈,但反馈前面带着“隔了多久、之前状态如何”这些上下文,所以足够训练出参数。
一句话总结:
FSRS 不是靠四个按钮直接算出 21 个参数,而是把大量“间隔时间 + 按钮结果”的历史记录当作训练数据,找出一组最能解释你记忆规律的参数;之后每次按按钮,只是在用这组参数更新单张卡的难度和稳定性。
参考
- open-spaced-repetition/fsrs4anki: A modern Anki custom scheduling based on Free Spaced Repetition Scheduler algorithm
- The Algorithm · open-spaced-repetition/awesome-fsrs Wiki · GitHub
- FSRS 技术详解 | Expertium 博客 — A technical explanation of FSRS | Expertium’s Blog
- A Stochastic Shortest Path Algorithm for Optimizing Spaced Repetition Scheduling | Proceedings of the 28th ACM SIGKDD Conference on Knowledge Discovery and Data Mining