← 返回目录


FSRS for Anki 发展史

钻研人类记忆,探索复习算法。改善教育公平,践行自由学习。

252 👍 / 36 💬

背景

我是 FSRS 的作者。我在高中时期使用 Anki 取得了显著成效,这激发了我对间隔重复算法的浓厚兴趣。

2022 年

2022 年 8 月 19 日

一切始于我在 Reddit 上发布的一篇帖子。当时我在墨墨背单词发表的论文被 ACM SIGKDD 会议接收了,然后我在 r/Anki 子版块分享了这一消息:

A Stochastic Shortest Path Algorithm for Optimizing Spaced Repetition Scheduling | Proceedings of the 28th ACM SIGKDD Conference on Knowledge Discovery and Data Mining : r/Anki

然而,一位评论者却不以为然,认为这不过是又一个「纸上谈兵听起来很酷,但最终无人付诸实践」的玩意儿。这条评论着实刺激到了我。于是,我下定决心要证明他是错的,决定亲自在 Anki 中实现 FSRS 算法。

2022 年 8 月 30 日

我很快便遇到了第一个障碍:自定义调度功能不支持直接在卡片中存储记忆状态,而这对于实现 FSRS 而言至关重要。我在 Anki 官方论坛上报告了此问题,Anki 的首席开发者 Dae 随后在 Anki 2.1.55 版本中加入了必要的功能支持。

相关讨论:Some problems in implementing a state-of-the-art SRS scheduler on Anki - Anki / Scheduling - Anki Forums

2022年 9 月 8 日

我迅速实现了墨墨背单词论文中的 DHP 算法的简化版本,并将该调度器的代码以开源形式发布在了 GitHub 上。此举之后,那位最初对我的想法不屑一顾的 Reddit 用户收回了他先前的话。更有趣的是,他后来还成为了 FSRS 社区中最为活跃的贡献者之一。

Implement a new spaced repetition algorithm based on anki custom scheduling. : r/Anki

2022 年 9 月 18 日 (FSRS v1)

我通过 Google Colab 添加了一个优化器,从而创建了 FSRS 的第一个可用版本。

New progress in implementing the custom algorithm. : r/Anki

2022 年 9 月 21 日

我在 Colab 上构建了一个基于 Python 的 FSRS 模拟器,用以测试调度算法的效果。这使我能够观察到经过优化的 FSRS 实际上会如何安排复习计划。

2022 年 9 月 28 日 (FSRS v2)

我对模型进行了改进,增加了更多参数,并采用了我论文中提出的「遗忘后稳定性(post-lapse stability, PLS)」公式。刚好这次更新恰逢 Anki 2.1.55 Beta 测试版的发布。该测试版通过自定义调度脚本功能,实现了在卡片上存储自定义数据的功能。

Anki 2.1.55 Beta is now available. : r/Anki

2022 年 10 月 5 日 (FSRS v3 & 助手插件)

我开发了一个助手插件,用以读取完整的复习日志并准确地重新计算记忆状态。

2022 年 10 月 18 日

我开始面向志愿者收集用于间隔重复系统(SRS)研究的复习数据。

数据收集表单:收集用于 SRS 研究的复习数据。

2022 年 11 月 16 日

FSRS v3 版本发布后,纷至沓来的用户反馈促使我将工作重心放在了实现功能请求和修复 bug 上。在此阶段,我添加了「推荐保留率」功能,其设计目标是最大限度地减少用户的复习工作量。该功能采用了我论文中 SSP-MMC 优化算法的一个简化版本。

New features of FSRS4Anki from v3.0.0 to v3.6.0 : r/Anki

Introduce recent changes of FSRS4Anki, and want to collect some feedback : r/Anki

2023 年

2023 年 1 月 28 日

我使用 SuperMemo 的经验让我深刻体会到其「提前(Advance)」和「推迟(Postpone)」功能的价值。FSRS 算法本身具备智能判断哪些特定卡片最能从提前或延迟复习中获益的能力。因此,我将这两个功能整合进了 FSRS 助手插件中。

Let your review be freer: postpone & advance cards via FSRS4Anki Helper : r/Anki

2023 年 2 月 11 日

部分用户反映他们的每日复习量波动较大,另一些用户则希望减少周末的复习任务。尽管已存在解决此类问题的插件,但它们往往需要较长时间才能生效。然而,FSRS 能够在重新调度时批量修改卡片的到期日期和复习间隔。应几位用户的请求,我将「负载均衡(load balance)」和「休闲日(free days)」这两项功能都集成到了 FSRS 助手插件中。前者有助于平滑每日的复习负荷,后者则允许用户在每周的特定日子安排较少的复习任务。

Load Balance & Free Weekend have been implemented in the FSRS4Anki helper add-on! : r/Anki

2023 年 3 月 16 日

随着社区内积极反馈的日益增多,越来越多的 Anki 用户开始使用 FSRS。鉴于此,Anki 的开发者 Dae 考虑将 FSRS 直接集成到 Anki 软件中。对我而言,这无疑是最激动人心的消息,因为它意味着这款最流行的开源间隔重复软件将有可能采用由我研究和开发的算法。这也激励我着手规划对 FSRS 的进一步改进。

Integrate FSRS into Anki as an optional feature · Issue #2443 · ankitects/anki

2023 年 4 月 12 日

为了能够直观地识别 FSRS 算法的潜在缺陷,我将「校准图」引入到了优化器当中。

Feat/Calibration graph by L-M-Sherlock · Pull Request #212 · open-spaced-repetition/fsrs4anki

2023 年 4 月 16 日

校准图成了一个催化剂,极大地推动了社区成员共同改进 FSRS 算法的进程。从那时起,包括我在内的几位活跃贡献者共同提出并测试了数十个改进方案。

与此同时,部分用户反映 FSRS 会将「关联卡片」(即源自同一笔记的不同卡片)的复习安排得过于集中。为此,我在 FSRS 助手插件中实现了「分散关联卡片」功能。

Calibration between actual retention and predicted retention is not great · Issue #215 · open-spaced-repetition/fsrs4anki

Feat/disperse siblings by L-M-Sherlock · Pull Request #61 · open-spaced-repetition/fsrs4anki-helper

2023 年 4 月 30 日

还记得我在文章开头提到的那位评论者吗?正是他引发了这些极具价值的讨论。

[Feature Request] Sharing ideas for further improvement of the algorithm · Issue #239 · open-spaced-repetition/fsrs4anki

[Feature Request] Improving the algorithm, continuation · Issue #282 · open-spaced-repetition/fsrs4anki

几位热心的用户在网上展开了数百轮的激烈讨论,最终碰撞出了一些关键的创意火花,从而显著改进了 FSRS 算法。

2023 年 6 月 9 日

我将优化器重构为一个独立的 Python 软件包,加入了详细的评估功能,并引入了「小批量(mini-batch)」处理支持,从而将训练速度提升了约 10 倍。

Main updates of FSRS4Anki from v3.7.0 to v3.23.0 : r/Anki

2023 年 7 月 13 日 (FSRS v4)

我发布了 FSRS v4 版本,该版本采用了「幂律遗忘曲线(power forgetting curve)」,改进了用于计算难度和记忆稳定性的公式,并加入了「异常值过滤(outlier filtering)」功能。

2023 年 7 月 14 日

FSRS 的难度计算公式相当简陋,因此我们都认为这方面显然存在改进的空间。然而,大多数的尝试都以失败告终。

[Enhancement] Improving the function for calculating difficulty · Issue #352 · open-spaced-repetition/fsrs4anki

2023 年 7 月 29 日 (FSRS-Optimizer)

我将优化器部分的代码拆分到了一个独立的仓库中,并着手定义一套标准的复习日志格式,以便 FSRS 能够被更广泛地采用。

2023 年 8 月 17 日 (FSRS-rs)

我和我的朋友 Asuka Minato 开始着手开发优化器的 Rust 版本。他在 Rust 语言方面拥有坚实的基础,但缺乏机器学习相关的知识;而我则具备机器学习背景,却对 Rust 一无所知。这看起来像是一个完美的组合,因此我们决定联手开发 FSRS 优化器的 Rust 版本,主要目的是为 FSRS 最终集成到 Anki 中做好准备。

2023 年 8 月 23 日

我发现校准图存在被「刻意操纵(gamed)」的可能性。这意味着,仅仅基于校准图得出的评估指标可能会产生误导。自此,「对数损失(Log loss)」成为了评估算法性能的首选黄金标准指标。

Calibration graph can be cheated by the algorithm which always predicts the average. · Issue #1 · open-spaced-repetition/spaced-repetition-algorithm-metric

2023 年 9 月 6 日 (SRS 基准测试)

我利用 66 位志愿者提供的复习数据集合,创建了一个基准测试,用以评估 FSRS 及未来可能出现的其他模型。

2023 年 9 月 8 日

我在修复了一些问题之后,FSRS-rs 实现了完整的优化器功能,并开始着手将其集成到 Anki 之中。

2023 年 9 月 14 日

又一次,社区内展开了数百轮的激烈讨论。

[Feature Request] Ideas to further improve the accuracy of the algorithm · Issue #461 · open-spaced-repetition/fsrs4anki

我无法在此一一概述所有讨论内容,但其关键成果在于调整了遗忘曲线的形状,使其更为平缓。

2023 年 11 月 1 日

Anki 23.10 版本正式发布,这标志着首个内置 FSRS 算法的 Anki 官方版本的诞生。这意味着采用 FSRS 算法的用户数量预计将迅速增长。同时,这也显著提升了 FSRS 在开发者社群中的知名度,促使基于其他编程语言实现的 FSRS 算法库逐渐涌现,并有越来越多的其他间隔重复软件开始采用 FSRS。

Release 23.10 · ankitects/anki

2023 年 11 月 22 日 (源自 Anki 的数据集)

我非常感谢 Dae。依据 Anki 隐私政策中允许将复习数据用于研究的条款,他向我提供了来自 20,000 名用户牌组集合的原始数据,其中包含了高达 14 亿条的复习日志——这是间隔重复领域同类型数据集中规模最大的一个。

2023 年 12 月 26 日 (FSRS-4.5)

基于早前的多轮讨论和分析结果,社区最终接纳了使遗忘曲线更为平缓的构想,我随之发布了包含此项变更的 FSRS-4.5 版本。

Feat/update to FSRS-4.5 by L-M-Sherlock · Pull Request #568 · open-spaced-repetition/fsrs4anki

2024 年

2024 年 1 月 6 日

我对短期复习效果的研究揭示了一项关键发现:当用户在学习新卡片的当天对其进行多次复习时,历次评分会显著影响该卡片的初始稳定性。这一洞见随后促成了 FSRS-5 版本中利用当日复习数据来更新稳定性的处理方法。

First day's series of ratings may have significant impact on initial stability · Issue #2 · open-spaced-repetition/short-term-memory-research

2024 年 1 月 29 日

我将 FSRS-rs v0.1.0 版本发布到了 crates.io(Rust 语言的官方包注册中心)。

Release v0.1.0 · open-spaced-repetition/fsrs-rs

fsrs - crates.io: Rust Package Registry

2024 年 2 月 23 日

随着 AnkiDroid 2.17.0 版本的发布,FSRS 在所有主流平台——包括桌面端、iOS 端和 Android 端——均已全面实现原生支持。

AnkiDroid Changelog

2024 年 2 月 24 日 (FSRS-Anki-20k 数据集)

为了吸引更多研究人员参与,我公开发布了用于 FSRS 开发的、包含了 20,000 个 Anki 用户牌组集合的数据集,并将其命名为 FSRS-Anki-20k。

open-spaced-repetition/FSRS-Anki-20k · Datasets at Hugging Face

2024 年 3 月 1 日

为了使评估指标更加直观且更难以被人为「操纵」,我重新设计了「分箱均方根误差(RMSE(bins))」这一指标。

2024 年 4 月 6 日

在投入数月时间研究短期记忆模型之后,我最终决定放弃。从尝试运用 FSRS 来预测短期记忆的过程中,我得到的关键启示是:短期记忆与长期记忆的运作机制之间存在着显著的差异。最终,我采取了一种简化的处理方法:利用短期复习的数据来优化关于长期记忆的预测。

2024 年 5 月 17 日

我将初始难度建模为初始评分的指数函数,此举略微提升了 FSRS 算法的准确性。

2024 年 6 月 13 日

我更新了模拟器,通过计算每日复习的平均次数和平均评分,来近似模拟短期复习的效果。

2024 年 7 月 10 日 (FSRS-5)

我发布了 FSRS 5 版本,该版本加入了短期复习效果的考量,并改进了初始难度的模型,从而将预测误差降低了约 4%。

2024 年 9 月 7 日 (FSRS Megathread)

随着关于 FSRS 的讨论日渐频繁,Anki Discord 服务器上创建了 FSRS 集中讨论帖(FSRS Megathread),为这些交流提供了一个集中的平台。此举吸引了更多的贡献者加入,并为改进 FSRS 催生了更多有益的想法。

discord.com/channels/36

2024 年 10 月 11 日

一位贡献者重构了 Rust 版本的模拟器,将其运行速度提升了约 8 倍。

2024 年 10 月 17 日

我对难度的更新机制引入了「阻尼」效应,使得难度值能够更缓慢地趋近其最大值。出乎意料的是,此举将预测误差降低了约 1%。

2024 年 11 月 5 日 (anki-revlogs-10k 数据集)

在 Dae 的帮助下,我们发布了一个全新的 Anki 数据集。该数据集包含 10,000 个用户牌组集合,并附带有笔记、牌组以及预设配置的 ID 信息,以便进行更为细致的分析。

2024 年 11 月 10 日 (学习步骤统计功能)

由于短期记忆模型的开发进展缓慢,我考虑在 FSRS 助手插件中加入针对短期复习的统计分析功能。其目标在于帮助用户量化自身的短期记忆状况,并为他们提供可用于调整学习步骤的数据支持。

Feat/step stats by L-M-Sherlock · Pull Request #487 · open-spaced-repetition/fsrs4anki-helper

New Feature: Quantify Your Short-Term Memory in Detail. : r/Anki

Recommended (re)learning steps powered by FSRS Helper : r/Anki

2024 年 12 月 30 日 (FSRS-5 recency)

我向优化器中添加了「近期加权(recency weighting)」机制,即对 FSRS 在较新的、近期发生的复习上做出的错误预测施以更大的惩罚,而对在较早发生的复习上做出的错误预测则施以较小的惩罚。此举将预测误差降低了约 4.5%。

2025 年

FSRS-6 即将问世,敬请期待。


英文版:The History of FSRS for Anki


专栏:Jarrett Ye的文章


← 返回目录