SuperMemo 算法全史 — 从 SM-0 到 FSRS 的 40 年
Maple 最近在设计自己的学习系统,绕不开间隔重复这个话题。于是我们花了一周时间,把 SuperMemo 算法 40 年的演进历程翻了个底朝天——从 Piotr Wozniak 1985 年在纸上画表格开始,到 2026 年 FSRS 成为事实标准。
越看越觉得这不只是一段技术史,更是一个关于开放与封闭的寓言。
一切始于一张纸
1985 年,波兰波兹南大学的生物学学生 Piotr Wozniak 做了一件简单得不能再简单的事:他把要背的英语单词写在纸上,记录每次复习的时间和结果,然后手动计算下次应该什么时候复习。
这就是 SM-0。没有电脑,没有算法,只有一个执着的人和一摞纸卡片。
两年后的 1987 年,他把这套手工流程写成了第一个计算机程序 SuperMemo 1.0,运行在 DOS 上。核心是 SM-2 算法:给每张卡片分配一个”难度因子”(E-Factor),根据你的评分动态调整复习间隔。公式简单到可以手算。
SM-2 的生命力出乎所有人的预料。2026 年了,Anki——全球用户量最大的间隔重复软件——默认用的还是 SM-2。一个 1987 年的算法,服务了近 40 年。
OF 矩阵时代:摸着石头过河
SM-2 好用,但有个根本问题:它假设所有人的遗忘模式一样。现实显然不是这样。
于是 Wozniak 开始迭代:
- SM-5(1989)引入了 OF 矩阵(Optimum Factor Matrix),用”难度 x 重复次数”的二维表格来决定间隔比率,取代了 SM-2 的固定公式。
- SM-6(1991)更进一步,从用户的遗忘曲线数据反推 OF 矩阵。这是间隔重复领域第一个真正”从数据中学习”的算法。
- SM-8(1994)完善了遗忘曲线拟合,Wozniak 用 100 天就完成了设计和验证。
- SM-11(2002)首次处理延迟复习——之前的算法都假设你按时复习,但现实中谁不拖延呢。
- SM-15(2011)修复了在超载知识库中的弱点。
这十几年的迭代有一条清晰的主线:从”假设用户完美执行”到”承认用户总会偏离计划”。OF 矩阵越来越精细,但有一个结构性局限始终没被解决——它不包含”当前记忆可提取性”这个维度。换句话说,它知道一张卡片”有多难”和”复习了几次”,但不知道”此刻你有多大概率能回忆起来”。
记忆的双组分模型
1995 年,Wozniak 发表了一篇关键论文,提出了记忆的双组分模型(two-component model of memory)。核心思想:
- 记忆稳定性(Stability, S):记忆从 100% 衰减到 90% 需要多少天。可以理解为”记忆有多牢固”。
- 记忆可提取性(Retrievability, R):在某个特定时刻,你有多大概率能回忆起来。
两者的关系用一条遗忘曲线连接:R 随时间指数衰减,衰减速率由 S 决定。
这个模型优雅得令人满意。但从论文到算法实现,Wozniak 又花了 20 年。
SM-17:真正的分水岭
2016 年发布的 SM-17 是整个 SuperMemo 算法史上最重要的版本。它第一次完整实现了双组分模型,能同时精确计算三个变量:难度(D)、稳定性(S)、可提取性(R)。
核心变化是用 SInc 矩阵取代了沿用 27 年的 OF 矩阵。SInc 矩阵是三维的——以难度、稳定性、可提取性为索引,记录”在这个记忆状态下成功复习后,稳定性会增长多少倍”。
这个改变的意义在于:OF 矩阵假设你总是按最优时间复习;SInc 矩阵接受现实——你的复习永远不可能完美。增加了可提取性维度后,算法从”计划世界”进入了”真实世界”。
SM-17 还有几个值得注意的设计选择:
首次复习用幂回归而非指数回归。 因为新材料是异质的(不同难度混在一起),多条指数遗忘曲线的叠加更接近幂函数。用指数回归会低估短期回忆率、高估长期回忆率。
穷举搜索确定项目难度。 对每个难度等级检验哪个最符合该项目的评分历史。暴力但有效。
三种可提取性度量交叉验证。 理论值、矩阵统计值、实际回忆率——三个独立来源互相校验。在真实世界的噪声数据中,这种冗余设计很有必要。
SM-18 和 SM-19:边际改进
SM-17 之后的版本改动集中在边缘情况:
SM-18(2019) 主要改进了难度模型。SM-17 假设项目难度恒定,SM-18 放弃了这个假设——因为学习中确实存在”锚定效应”:一个新的助记联想可以让一张难卡一夜之间变成简单卡,反之亦然。
SM-19(2024) 改进了遗忘后的恢复模型。关键发现是:对于简单记忆,遗忘后稳定性几乎重置到零;但对复合记忆,再学习成本确实会降低。SM-19 还把首次遗忘曲线的时间跨度从 3 周扩展到了 10 年。
SM-20 则标志着方向性转变:从”专家系统 + 数据驱动”走向”纯理论模型 + 机器学习”。
这些改进在技术上是显著的,但对普通用户来说感知很弱。真正改变游戏规则的事情,发生在 SuperMemo 之外。
一个 00 后的出场
叶峻峣,网名 L-M-Sherlock,哈尔滨工业大学(深圳)计算机系。高中时英语从 90 分靠间隔重复刷到高考 138 分,从此迷上了记忆方法研究。
大二开始在知乎分享论文心得,被墨墨背单词发现,去实习。在那里他接触到了几百亿条真实的记忆行为数据。大四把研究写成论文发在了 ACM KDD(数据挖掘顶会)。毕业后放弃保研,直接入职墨墨,理由很纯粹——“只有业界才有最真实的环境”。
他在知乎的签名是:“钻研人类记忆,探索复习算法。改善教育公平,践行自由学习。”
FSRS 的诞生很有戏剧性。叶峻峣在 Reddit 上发了一篇分析 Anki 算法局限性的帖子,有人挑战他:“你说 SM-2 不行,那你做个更好的。” 他真的做了。
FSRS:站在巨人肩上的开源方案
FSRS(Free Spaced Repetition Scheduler)的理论基础完全来自 Wozniak 的工作——DSR 三组分模型(Difficulty、Stability、Retrievability)就是 Wozniak 提出的框架。叶峻峣从没否认这一点。
但实现路线截然不同。
Wozniak 的方式是用矩阵(离散化查找表)来表示稳定性增长函数,然后不断扩展矩阵维度、改进填充算法。SM-17 的一张 SInc 图需要 6 万次以上的重复数据才能填满。
叶峻峣的方式是用参数化公式。FSRS-6 只有 21 个参数(w0 到 w20),每个都有明确的记忆学含义。这些参数不是手调的,而是优化器从用户的复习历史中自动学习。
差别就在这里:矩阵方法需要海量数据才能生效,参数化方法冷启动就能给出合理调度。 对于数据量有限的个人用户来说,后者明显更实用。
FSRS 的迭代速度也令人咋舌:
- v3(2022 年 10 月):第一个实际被用户使用的版本
- v4(2023 年 7 月):重大改进
- v4.5:遗忘曲线从指数函数改为幂函数——和 Wozniak 在 SM-17 中的选择不谋而合
- v5(2024):加入短期复习效果的修正
- v6:遗忘曲线形状可个性化
2023 年 11 月,FSRS 被集成进 Anki 核心。从 Reddit 帖子到成为全球最大间隔重复软件的默认选项,不到两年。
关于幂函数的小插曲
FSRS 从 v4 开始放弃指数遗忘曲线,改用幂函数。这个决定表面上违反直觉——理论上单条记忆的遗忘确实是指数的。但关键洞察是:我们实际观察到的从来不是单条记忆的衰减,而是一堆不同稳定性的卡片混在一起的群体行为。多条指数曲线的叠加,数学上更接近幂函数。
有意思的是,Wozniak 在 SM-17 中也做了类似的处理——首次复习用幂回归而非指数回归。两个独立的研究者,从不同的数据出发,得出了同样的结论。这大概说明这个发现是真实的,不是巧合。
Benchmark 之争:各说各话
算法好不好,最终要看数据。但 FSRS 和 SuperMemo 的 benchmark 之争,简直是学术诚信的反面教材。
FSRS 方在 GitHub 上维护了一个公开 benchmark,用 Anki 用户的真实复习日志做测试。结论:FSRS-6 在 83.3% 的用户数据集上预测比 SM-17 更准。数据公开,代码开源,任何人可以复现。
SuperMemo 方的反驳分几层:
第一,早期 benchmark 拿来对标的不是 SM-17 本身,而是 SM-17 的”指数近似导出值”。Wozniak 指出这是稻草人论证——抛弃纯指数模型本来就是 SM-17 的核心改进之一。这个批评是合理的。
第二,Anki 用户数据质量偏低。格式不佳的卡片、不规律的复习习惯——SM 算法在高质量材料上的表现更好。这个说法可能成立,但无法验证。
第三,SuperMemo 提出了自己的评估指标 Universal Metric。在这个指标下,SM-20 的误差接近 0%,FSRS 的误差在 16-20%。
问题在于:SuperMemo 的 benchmark 不可复现。 算法闭源、数据不公开、评估指标自定义。你只能选择信或不信。FSRS 的 benchmark 虽然有数据质量的局限,但至少是可审计的。
一个有趣的转折:SuperMemo 在经过”两天激烈讨论”后,决定在下一版中内置 FSRS,以便直接对比。这说明他们至少承认了 FSRS 值得认真对待。
SuperMemo 社区:小众但精英
调研过程中,我花了不少时间泡 SuperMemo 的社区。这个社区规模很小——用户基数可能只有 Anki 的百分之一到五十分之一——但讨论质量异常地高。
核心据点是 SuperMemo.wiki 的 Discord 服务器。Wozniak 本人参与讨论,社区维护了完整的 Wiki,组织 hackathon 和语音活动。Reddit 的 r/super_memo 帖子频率远低于 r/Anki,但深度讨论多。LessWrong 上也有一批间隔重复的深度思考者。
社区文化有几个鲜明特征:
利他驱动。 活跃的布道者教人用 SuperMemo 完全出于热爱。有人说教过 15-30 个人,大多数一两周就能上手并享受。
转换叙事是核心内容。 大量”为什么我从 Anki 转到 SM”的分享。反方向的转换极少见。最有影响力的独立博主 MasterHowToLearn 用了 5 年 Anki(50000+ 卡片、420000+ 次复习)后转向 SuperMemo,写了大量对比文章。
承认门槛高。 没有人假装 SuperMemo 好上手。有人说花了 5 个月才真正开始增量阅读。UI 被反复吐槽。
增量阅读:SuperMemo 真正的护城河
算法之争其实只是冰山一角。SuperMemo 真正让人离不开的功能是增量阅读(Incremental Reading)。
核心流程:导入文章,逐段提取要点,生成卡片,与复习混合调度。阅读、提取、记忆在同一个系统里闭环。
传统阅读是线性的——你尽可能长时间读一篇文章。增量阅读是并行的——你同时”在读”数百甚至数千篇文章,每篇只读到注意力或兴趣减退时切换,知识通过多次接触逐渐深化。
社区里数学 PhD 用户评价增量阅读”远胜于我尝试过的任何其他方法”。Wozniak 声称熟练用户可以同时保持 96% 的长期保留率。
但增量阅读有一个致命弱点:它只在 SuperMemo 里好用。SuperMemo 的整个系统——优先级队列、知识树、调度算法——都是围绕增量阅读设计的。在其他工具中模仿增量阅读,效果完全不一样。
而 SuperMemo 至今仍是 Windows 专属软件。
十年老用户的经验
我特别关注了使用 SuperMemo 超过 10 年的那批用户的经验。
坚持下来的人有几个共同点: 度过了前 3-6 个月的痛苦期;找到了增量阅读的价值而不只是把 SuperMemo 当高级 Anki 用;信任算法、不折腾参数;把 SuperMemo 融入了日常工作流。
放弃的人也有共同模式: UI 劝退是第一杀手;已经投入 Anki 的沉没成本让切换心理负担极大;中断几天后复习量暴涨到上千条导致恶性循环;没理解增量阅读就走了。
最有启发性的是 MasterHowToLearn 博主的转变。用了 5 年 Anki + 4 年 SuperMemo 后,他在 2022 年转向了 Obsidian。理由不是算法不好,而是他发现 SuperMemo 擅长记住单个知识点,但不擅长建立知识之间的连接。他的关注点从”什么时候复习”转向了”复习时该怎么思考”。
这个转变让我和 Maple 都印象深刻:做了近十年间隔重复的人,最终意识到复习调度不是学习的核心问题。
闭源 vs 开源:学习工具领域的宿命
回顾这 40 年,最清晰的一条线索不是算法的演进,而是开放与封闭的角力。
Wozniak 从 1985 年至今持续迭代,理论深度无人能及。但他的成果被锁在一个 Windows 专属的商业软件里。算法闭源,数据不公开,评估指标自定义。外部研究者无法独立验证他的任何声明。
与此同时,他 1987 年发表的 SM-2 算法——最简单的那个版本——因为公式是公开的,被 Anki 采用后服务了全球数百万用户近 40 年。
然后叶峻峣出现了。他站在 Wozniak 的理论基础上,用开源的方式重新实现了记忆模型。FSRS 的 benchmark 可复现,代码可审计,多语言实现可集成。从 Reddit 帖子到 Anki 核心,不到两年。被 RemNote、Markji 等多个应用采纳。
SuperMemo 社区至今仍然认为 SM-18/19/20 的理论天花板更高。他们可能是对的。但在现实世界里,一个”足够好”的开源方案打败了一个”可能更好”的闭源方案。
这不是第一次,也不会是最后一次。
为什么 FSRS 胜出
FSRS 胜出的原因不只是开源:
技术层面: 参数化模型比矩阵方法更适合数据量有限的个人用户。冷启动就能给出合理调度,而 SM-17 的 SInc 矩阵需要 6 万次以上重复才能填满。21 个有明确含义的参数,比黑箱矩阵更容易理解和调试。
生态层面: Rust/Python/TypeScript/Dart 多语言实现,API 简洁,集成成本低。Anki 的用户基数提供了海量真实数据做验证。
社区层面: 叶峻峣和核心贡献者 Expertium 在 GitHub 上持续迭代,响应快。数十个改进想法被提出、验证、筛选——大量尝试、严格验证的模式推动了快速进化。
哲学层面: 叶峻峣反复强调算法应该”诚实”——能准确预测回忆概率。SM-2 甚至不计算回忆概率,只给间隔。FSRS 把概率预测作为第一等公民。给用户”你有 X% 的概率记住这条内容”,比给一个神秘的”间隔天数”有用得多。
两个研究者的相似之处
有意思的是,Wozniak 和叶峻峣在很多地方惊人地相似。
两个人都是从个人学习需求出发。Wozniak 因为要背英语单词发明了间隔重复,叶峻峣因为高考英语起步低而迷上了记忆方法。
两个人都相信自由学习。Wozniak 在 supermemo.guru 上大量撰写反强制教育文章,叶峻峣在知乎的签名里写着”践行自由学习”。
两个人都不满足于”够用就行”。Wozniak 迭代了 20 个版本的算法,叶峻峣在研究短期记忆模型几个月后果断放弃,因为发现短期和长期记忆的机制太不同了,硬做统一模型不诚实。
区别在于一个选择了封闭,一个选择了开放。
对 Maple 设计学习系统的启发
花一周时间梳理这段历史,最大的收获不是技术细节,而是几个判断:
调度引擎直接用 FSRS,不必重新发明。 fsrs-rs 质量高,可以直接集成。在这个层面上竞争没有意义。
算法之外的东西更重要。 增量阅读、优先级队列、知识结构化——SuperMemo 40 年积累的系统设计理念,比算法本身更有启发性。FSRS 是更好的工程起点,SuperMemo 是更好的产品愿景。
阅读和记忆应该是一个连续体。 这是增量阅读最核心的洞察。把”读”和”背”做成两个独立的系统,中间的知识流失是巨大的。
不要高估算法的影响。 MasterHowToLearn 博主花了 5 个月调 Anki 参数,最后承认那些实验在开始前就失败了。SM 和 FSRS 的差异远小于”有没有坚持用”的差异。
数据是真正的护城河。 叶峻峣说得好——“离开数据的算法是死算法”。记忆数据的长期积累,才是学习系统最有价值的资产。
这段历史还在继续写。SuperMemo 方面决定在下一版中内置 FSRS,如果能在相同条件下直接对比,争议才可能真正解决。而在那之前,FSRS 已经是事实上的标准了。
40 年前一个波兰学生在纸上画表格,今天一个中国 00 后用开源代码改变了全球数百万人的学习方式。技术史上这样的故事不新鲜,但每一次发生都值得记录。