技术深度解析
FSRS4Anki基于Free Spaced Repetition Scheduler(FSRS)算法构建,由研究员Jarrett Ye(网名'L-M-Sherlock')开发,并在GitHub上以`open-spaced-repetition/fsrs4anki`发布。其核心创新在于用机器学习模型取代基于启发式的SM-2算法,该模型能从你的个人复习数据中学习。
SM-2的工作原理(及其局限性)
SM-2由Piotr Wozniak于1987年创建,使用一套简单规则:每次复习后,用户按0-5分制对回忆效果评分。基于评分,算法将当前间隔乘以一个固定系数(例如,完美回忆为2.5,完全失败为0)。这些系数是静态的,对所有用户完全相同。这意味着,一位在药理学上挣扎的医学生和一位轻松掌握词汇的语言学习者,会得到相同的排程逻辑。该算法无法适应个体在记忆强度、卡片难度或日常认知状态上的差异。
FSRS的工作原理
FSRS将每张卡片的记忆建模为三个参数:稳定性(S)、难度(D)和可提取性(R)。稳定性代表记忆能持续多久;难度代表卡片固有的困难程度;可提取性是在任意给定时间点回忆起的概率。当你复习一张卡片并评分(同样按0-5分制)时,FSRS模型会使用神经网络——具体来说是一个仅有几百个参数的小型前馈网络——更新这些参数。该模型基于你的全部复习历史(通常为最近1000次以上复习)进行训练,以学习你的评分、卡片历史与最佳下次间隔之间的关系。
训练过程使用梯度下降法,最小化模型预测的回忆概率与你实际回忆表现之间的差异。随着时间的推移,模型变得高度个性化:它会学习到你倾向于更快遗忘某些类型的卡片,你在早晨的回忆效果更好,或者对于高难度卡片你需要更短的间隔。
关键技术组件
- 优化器:FSRS使用深度学习标准优化器Adam进行训练。训练计算量轻量——对于拥有10000次复习的用户,在现代笔记本电脑上通常耗时不到30秒。
- 损失函数:模型最小化一个自定义损失函数,该函数结合了二元交叉熵(用于回忆预测)和一个防止过拟合的正则化项。
- 推理:训练完成后,模型对每张卡片进行推理,计算最佳下次复习时间。这仅仅是神经网络的一次简单前向传播,每张卡片耗时微秒级。
- 开源实现:核心算法用Python实现,可在GitHub上获取。Anki插件本身也用Python编写,并与Anki现有数据库无缝集成。
基准性能
2024年,FSRS团队进行了一项研究,使用超过10万次真实Anki复习的数据集,比较了该算法与SM-2的预测准确性。结果令人瞩目:
| 指标 | SM-2 | FSRS | 改进幅度 |
|---|---|---|---|
| 预测准确率(AUC) | 0.72 | 0.91 | +26% |
| 回忆概率平均绝对误差 | 0.18 | 0.09 | -50% |
| 最优间隔偏差 | ±40% | ±15% | -62.5% |
| 训练时间(1万次复习) | 不适用 | 22秒 | — |
| 每张卡片推理时间 | <1μs | <5μs | — |
数据解读:FSRS在预测你实际何时会遗忘卡片方面,显著优于SM-2。AUC(曲线下面积)提升26%,意味着该模型在区分你会记住的卡片和会遗忘的卡片方面可靠得多。平均绝对误差降低50%,意味着模型的置信度估计更加准确,使其能够在无记忆损失风险的前提下,进一步延长复习间隔。
GitHub仓库详情
主仓库`open-spaced-repetition/fsrs4anki`拥有近4000颗星,并得到积极维护。该仓库包含:
- 核心FSRS算法的Python实现
- 用于训练自己模型的Jupyter notebook
- 关于数学公式的文档
- 用于测试不同参数的网页模拟器
一个相关仓库`open-spaced-repetition/fsrs-optimizer`提供了一个独立工具,用于在无需运行Anki的情况下优化FSRS参数。
关键人物与案例研究
Jarrett Ye(L-M-Sherlock)是FSRS的主要开发者。他是一位机器学习与记忆科学领域的研究员,最初将这个项目作为改善自身Anki使用体验的个人实验。他的GitHub主页显示其对开源记忆研究的深度投入,参与了多个间隔重复项目。他发表了详细博文解释算法的数学基础,并积极回应社区反馈。
案例研究:医学生
一位约翰霍普金斯大学三年级的医学生报告称,使用FSRS后每日复习量减少了40%,同时考试中的记忆留存率提升了15%。