卡片复习推荐算法介绍——FRSR(Free Spaced Repetition Scheduler)

简介

FSRS全称是 Free Spaced Repetition Scheduler,可以理解为一种“更聪明的复习时间安排算法”。

它解决的问题很简单:

一张卡片,我下一次到底应该什么时候复习?

传统 Anki 的 SM-2 算法主要靠“间隔倍增”和 ease factor。FSRS 更像是给每张卡片建立一个小小的“记忆模型”,根据你的历史表现估计:你现在还记得它的概率是多少,然后安排下一次复习。

FSRS 的核心直觉
FSRS 认为,每张卡片有两个重要属性:

  1. 难度 Difficulty,D
    表示这张卡对你来说有多难。
    越难,之后间隔增长越慢。

  2. 稳定性 Stability,S
    表示这段记忆有多稳。
    越稳定,忘得越慢,下一次复习可以隔更久。

还有一个临时计算出来的值:

  1. 可回忆率 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=1Hard=2Good=3Easy=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 开始更清楚地围绕 DS 来建模。v3 使用的遗忘曲线是:

R(t,S) = 0.9^(t/S)

意思是:当经过的时间 t 等于稳定性 S 时,记忆概率刚好是 90%。官方页里 v3 是 13 个参数,并且记忆状态由 SD 表示。来源:FSRS v3

v4:现代 FSRS 的关键版本

FSRS v4 仍然用 D/S,但公式明显成熟了。它有 17 个参数。

它对三件事建模:

  1. 第一次评分后,这张卡初始稳定性是多少。
  2. 每次复习后,难度怎么变化。
  3. 成功回忆或忘记之后,稳定性怎么变化。

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 个参数。官方页说它有两个重要变化:

  1. 同日复习的稳定性公式又改了
    新公式让 S 小的时候增长更快,S 大的时候增长更慢。

  2. 遗忘曲线的 decay 变成可训练参数
    也就是遗忘曲线的形状不再固定,而是可以通过数据学习。来源:FSRS-6

这点很重要。因为不同人、不同材料的遗忘速度不一样:

  • 背单词
  • 背医学知识
  • 背数学定理
  • 背人名日期

它们的遗忘曲线可能不完全一样。FSRS-6 允许模型更灵活地适配数据。

最重要的区别,其实是这三条

  1. 遗忘曲线越来越合理

    • v3:指数曲线
    • v4:新的幂函数曲线
    • 4.5:调整曲线形状
    • 6:曲线衰减参数可训练
  2. 参数越来越多

    • v1:7 个
    • v3:13 个
    • v4/4.5:17 个
    • v5:19 个
    • v6:21 个

    参数多不是为了复杂而复杂,而是为了更细地描述:初始难度、初始稳定性、成功回忆、忘记、Hard 惩罚、Easy 奖励、同日复习等情况。

  3. 对真实 Anki 行为越来越贴近
    早期版本更像理论模型;后续版本逐步补上现实中的细节,比如同日学习、难度回归、Hard/Easy 的不同影响、忘记后的稳定性上限等。

该用哪个?

普通用户不用纠结历史版本:用 Anki 当前内置的 FSRS,或者这个项目里的 FSRS-6 系列即可。

历史版本主要适合你理解算法演进:

  • 想理解基础:看 v3/v4
  • 想理解现代 FSRS:看 FSRS-4.5
  • 想看当前更完整模型:看 FSRS-6

一句话总结:

FSRS 各版本的核心都一样:估计你现在还记得的概率,再安排下次复习。版本越新,遗忘曲线越灵活,对新卡、当天复习、不同评分、不同材料的处理越细。

如何通过四个按钮推导出FSRS的所有参数

这里要分清两件事:

四个按钮不是一次性算出所有参数。

FSRS 里的参数主要有两类:

  1. 模型参数 w
    比如 FSRS-6 有 21 个参数。
    这些不是你每按一次按钮就现场算出来的,而是通过大量历史复习记录训练/优化出来的。

  2. 单张卡片的记忆状态 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 个参数,而是把大量“间隔时间 + 按钮结果”的历史记录当作训练数据,找出一组最能解释你记忆规律的参数;之后每次按按钮,只是在用这组参数更新单张卡的难度和稳定性。

参考