跳到主要内容

本文经 J-Compass 编辑流程调研与事实核查;编辑团队在发布前审核信息来源及准确性。 了解我们的编辑方法 →
本译文仅供参考,以方便阅读。内容以英文版本为准。 阅读英文原文 →

SM-2 与 FSRS 对比:Anki 调度算法原理

SM-2 与 FSRS 对比的核心问题在于:在 Anki 的两套调度算法中,究竟是由哪一套来决定每张卡片下一次回到眼前复习的时间。Anki 同时内置了这两种算法。你的牌组使用哪套算法,将直接决定日语学习者每天面临的复习卡片总量。1

概述​

调度器(Scheduler)是你在对卡片评分后,负责选定每张卡片下一次复习日期的核心引擎。Anki 拥有两套调度器:源自 SuperMemo 2 的传统默认算法 SM-2,以及自由间隔重复调度器(Free Spaced Repetition Scheduler, FSRS)。1

一句话概括两套算法​

SM-2 是一套固定的算术公式,它通过为每张卡片单独计算的“简易度因子”(Ease Factor)来按比例缩放卡片的下一次间隔。其计算过程没有基于底层的人类记忆运作模型。2

FSRS 则是一套记忆模型,其参数通过你的实际复习日志数据训练得出。它能预测你的记忆提取概率,并根据该预测进行排期,而非依赖固定的乘数。34

“FSRS”全称为 Free Spaced Repetition Scheduler(自由间隔重复调度器)。其优化器、基准测试工具与参考实现均在 open-spaced-repetition 组织下完全开源。456

你的牌组当前正在运行哪套算法​

Anki 在 2023 年 10 月 31 日发布的 23.10 版本中加入了对 FSRS 的支持。版本更新说明中写道:“Anki 现已集成对 FSRS 的支持(该算法对 SM-2 提供的调度机制进行了重大改进)。你可以在 Anki 内部直接计算模型权重,无需再使用自定义调度脚本。”7

自 Anki 23.10(2023 年 10 月)起,FSRS 一直是一项由用户自主选择开启(Opt-in)的功能。Anki 常见问题解答针对该版本的情况解释道:“截至 Anki 23.10,Anki 提供了两套可用算法。第一套基于 SuperMemo 2 算法。”换言之,FSRS 是需要用户手动启用的替代方案,而非系统自动替换。17

FSRS 属于全局总开关,不支持按单套牌组单独设置

官方手册明确指出:“FSRS 只能全局启用;你无法在某些预设中启用它而在其他预设中禁用它。”启用 FSRS 是一项由用户控制的单一全局设置,会作用于你的整个卡片集合。8

2024 年 12 月 6 日,核心维护者发起了一项提议(Issue #3616),建议为新用户开箱默认启用 FSRS:“在下一个非补丁版本(非 24.11.x)更新中,我认为是时候默认开箱启用 FSRS 了。大家有异议吗?”该提议仍处于开启状态,尚未绑定具体的发布版本,因此目前尚不能确定从哪个具体版本起会默认开启。9

实际的影响显而易见:在启用 FSRS 之前创建的牌组或卡片集合,或者在未更新的老客户端上使用的配置,可能仍在运行传统的 SM-2。18

如何检查​

牌组选项(Deck Options)会显示当前处于激活状态的算法。FSRS 会作为手册“牌组选项”部分所述的开关选项出现在该界面中。8 具体点击步骤属于专门的 Anki 工具指南范畴,此处不再赘述。

SM-2 的工作原理​

SM-2 是 Piotr Wozniak 于 1990 年设计的第二代 SuperMemo 算法。它的诞生比 Anki 早了几十年,也是当今大多数抽认卡应用仍默认采用的“简易度因子”调度器的始祖。2

简易度因子与间隔公式​

SM-2 为每个项目存储一个状态变量,即简易度因子(E-Factor,简称 EF)。它的初始值为 2.5,底限阈值为 1.3。2 复习间隔基于该单一数值递增:

I(1) := 1
I(2) := 6
for n > 2: I(n) := I(n-1) * EF

此处 I(n) 是以天为单位的重复间隔。在经历前两次固定间隔之后,后续每个新间隔都只是前一个间隔乘以该卡片的简易度。2

每次完成评分复习后,简易度因子本身都会根据以下公式更新,其中 q 是 0 到 5 级评分标准下的回答质量:

EF' := EF + (0.1 - (5 - q) * (0.08 + (5 - q) * 0.02))

更新之后,EF' 会被强制限制在不低于 1.3 的底限。2 原始 SM-2 的评分标准从“5 - 完美回答”一直延伸到“0 - 完全遗忘”。它包含诸如“2 - 错误回答;但正确答案似乎很容易回想起来”等档位。2

当回答质量低于 3 时,SM-2 的遗忘规则会将重复计数重置为 I(1),但在该步骤中并不会改变 EF。2

Anki 中的 SM-2 并非原汁原味的教科书级 SM-2

Anki 的具体实现与 1990 年的技术规范存在文献记录上的差异:可自定义的初始学习步骤、四个答案按钮(重来/困难/良好/简单)而非六个数字等级,并加入了额外保护以防止卡片陷入“超低间隔地狱”。1

Anki 中所展示的“简易度”(Ease),正是这个单卡乘数 E-Factor。下一次间隔本质上就是当前间隔乘以简易度。这使得整个调度方案完全依赖乘法公式驱动,对学习者实际回想起卡片的概率没有任何科学预测。21

简易度地狱:为什么 SM-2 会过度复习你已经掌握的卡片​

只要你遗忘了一张卡片,E-Factor 就会下降,而 SM-2 的公式中没有任何机制能让它在下跌后自动回升。2 随着 1.3 底限的存在,一张经历过多次遗忘的卡片可能会长期被死死锁定在最低简易度附近。

这类卡片的间隔增长因此极其缓慢,每次只能乘以一个接近 1.3 的数字,而非 2.5 或更高。即使是一张你现在已经掌握得很好的卡片,也会以极短的间隔频繁浮现。学习者社区将这种系统性缺陷称为“简易度地狱”(Ease Hell)。24

下图对比了单次遗忘在两种算法下的传播与处理方式。这是理解为什么 SM-2 会困住卡片而 FSRS 不会的最直观视角。

FSRS 的工作原理​

FSRS 摒弃了 SM-2 单一的简易度数值,引入了一套通过机器学习拟合你实际复习历史的三组件记忆模型。1 它不再使用单一乘数,而是利用三个相互作用的变量来综合估算卡片何时即将被遗忘。

三个核心变量:难度、稳定性与可提取性​

FSRS 跟踪可提取性、稳定性和难度三个维度,而非 SM-2 的单一简易度数字。1 FSRS 官方基础说明对其进行了严格定义:

变量定义
可提取性(Retrievability, R)“人在特定时刻成功回忆起特定信息的概率。”4
稳定性(Stability, S)“R 从 100% 下降到 90% 所需的时间(以天为单位)。”4
难度(Difficulty, D)“特定信息的内在复杂程度。它表示复习后提升记忆稳定性的难易程度。”4 通俗地说,越难的卡片稳定性增长越慢。

由于该模型拟合了卡片的整个复习历史,下一次间隔综合反映了卡片的全部过去,而不仅仅取决于你上一次按下的按钮。这是它与 SM-2 仅根据上一次评分进行更新的结构性区别。34

“难度”也是解决“简易度地狱”的机制良药。与 SM-2 中只减不增的简易度不同,FSRS 的难度具有合理的边界,并且会向均值回归。因此,卡片绝不会被永久锁定在高难度和短间隔中。4

DSR 概念的生命力超越任何小版本迭代

FSRS 已经推出了多个版本(FSRS-4、FSRS-4.5、FSRS-5)。贯穿始终的“难度/稳定性/可提取性”(DSR)三维模型在这些版本中保持稳定,因此理解这三个核心变量远比追逐具体版本号更有价值。46

目标记忆保留率:SM-2 从未拥有过的调节旋钮​

FSRS 提供了“目标记忆保留率”(Desired Retention)设置:即卡片到期复习时,调度器力求达到的目标回忆概率。8 SM-2 没有任何对应机制。它的间隔由固定的 EF 公式决定,从未给学习者提供调节目标回忆率的旋钮。28

默认值为 90%。官方手册指出,这会调度卡片“使得当卡片再次到期复习时,你有 90% 的几率能记住它们”,并说明该默认值“在保留率和工作量之间提供了良好的平衡”。8

将该数值调得更高会使复习量快速增加。官方手册建议将目标保留率保持在 97% 以下,并警告称:“超过 90% 后工作量会迅速增加,超过 97% 后工作量可能会让人不堪重负”。8

优化器会根据你自己的复习日志训练 FSRS 参数,而不是使用其他人的平均数据。手册指出“优化器需要若干复习记录来微调参数”,并将“复习数量过少(少于几百次)”标注为健康检查的局限之一,不过并未给出硬性门槛数值。8

“减少 20%–30% 复习量”究竟意味着什么​

这一广为流传的核心数据来自项目本身,且原始来源对其有着严谨的界定。《FSRS 入门ABC》(ABC of FSRS)指出:“使用 FSRS,用户在达到相同记忆保留率的前提下,所需完成的复习量比 SM-2 算法少 20% 到 30%。”4

括号内的前提至关重要。该数据是 open-spaced-repetition 项目报告的模拟结果,而非经过独立第三方严格测定的绝对保证。最好将其理解为一种统计趋势,而非不可动摇的承诺。4

Anki 官方 FAQ 对这一下降趋势的表述更为审慎:“借助 FSRS,用户在达到相同保留率的前提下,所要完成的复习量少于 Anki 默认算法。”1 在 Issue #3616 的讨论中,维护者引用了 open-spaced-repetition 的基准测试。该基准报告指出,在默认参数下 FSRS “在 91.9% 的案例中优于 SM-2”,而在优化后表现还会进一步提升。这是基准测试本身的声明,而非独立外部验证。59

“更少的复习量”指的是在相同保留率下的总体复习总量,而不是处处都有统一更长的间隔时间。官方 FAQ 指出:“FSRS 往往会给出比 SM-2 更长的首次复习间隔,但对于成熟卡片而言情况正好相反——FSRS 会更加保守。”3

对于日语牌组而言,在项目模拟测试中,实际收益表现为:在相同的目标保留率下,同一批卡片在 FSRS 调度下生成的每日复习总量应当少于 SM-2。请将其视为能减轻日常负荷的良性趋势,而非固定不变的红利。14

你是否应该切换,以及何时切换​

默认建议​

对于当前版本 Anki 的绝大多数学习者而言,建议启用 FSRS。基准测试结果与算法架构均表明,在相同保留率下它优于 SM-2。目标保留率调节旋钮还赋予了你 SM-2 无法提供的直接掌控权。145

继续留在 SM-2 尚属合理的场景非常窄:若牌组规模极小或刚刚建立,复习日志积累太少,根据“复习数量过少”的限制,FSRS 优化器难以有效微调;又或者你的工作流被迫与早于 FSRS 支持的老旧客户端同步,无法依赖新调度器的存在。18

对于希望享受 FSRS 的高效、却不想亲手制作和维护 Anki 牌组的学习者,Amenokori 开箱即完全基于 FSRS 算法构建。其内置调度器已经采用了本文所推荐的现代算法,无需你自己进行任何 SM-2 到 FSRS 的迁移或参数优化配置。10

切换会改变什么,又不会改变什么​

启用 FSRS 不会删除卡片的历史数据,也不会重置学习进度;它只是根据卡片现有的历史记录重新排定现有卡片的复习日程。83

在数据层面有一个细节值得了解:当 FSRS 对现有卡片重新排期时,手册指出该操作“会为每张卡片追加一条复习记录”。这会导致集合文件体积略有增大,不过你的学习进度和历史依然完好无损。8

根据优化器“需要若干复习记录”的限制,首次运行优化需要积累一定的复习历史才能发挥真正价值。8 切换调度器、运行优化器以及设置目标保留率的精确点击路径,属于专门的 Anki 工具指南内容,在此概念总览中不再展开。

补充要点​

SM-2 中的“2”代表第二代 SuperMemo 算法​

经典的 SM-2 规范由 Piotr Wozniak 于 1990 年作为 Algorithm SM-2 发布。它是 SuperMemo-2 方法,也是各大抽认卡应用至今仍将其作为默认设置的简易度调度器始祖。2

“FSRS”全称为自由间隔重复调度器 (Free Spaced Repetition Scheduler)​

这个名称是名副其实的。其优化器、基准测试与参考实现均在 open-spaced-repetition 组织下的 fsrs4anki、srs-benchmark 和 awesome-fsrs 代码仓库中完全开源。456

为求“稳妥”将目标保留率设为 95% 以上会导致每日复习量激增​

为了追求所谓的安全感而将目标保留率设得远高于默认值是错误的举动。这会成倍激增你的复习负荷,却无法带来相称的收益。除非你有特定理由调整,否则请保持默认的 90%。官方手册警告称:“超过 90% 后工作量会迅速增加,超过 97% 后工作量可能会让人不堪重负”,并建议将设置保持在 97% 以下。8

切勿指望 FSRS 立竿见影​

FSRS 不会在第一天就展现出宣传中的高效率。优化器需要根据你个人的历史日志拟合参数,且“需要若干复习记录来微调”。如果复习数量过少(少于几百次),它还无法发挥全力进行排期。8

切勿预设每个移动端或同步客户端都支持 FSRS​

FSRS 于 2023 年在 Anki 23.10 版本中正式集成,且调度器属于集合层面的设置。极老版本的 AnkiDroid 或 AnkiMobile 构建早于此支持,因此未经更新的客户端可能会表现得像是在运行传统的 SM-2。187

相关阅读​

References​

Footnotes​

  1. Anki FAQs. "What spaced repetition algorithm does Anki use?" AnkiWeb (ankitects). https://faqs.ankiweb.net/what-spaced-repetition-algorithm.html ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13

  2. Wozniak, P. A. "Application of a computer to improve the results obtained in working with the SuperMemo method." Algorithm SM-2. SuperMemo World, 1990. https://super-memory.com/english/ol/sm2.htm ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12

  3. Anki FAQs. "Frequently asked questions about FSRS." AnkiWeb (ankitects). https://faqs.ankiweb.net/frequently-asked-questions-about-fsrs.html ↩ ↩2 ↩3 ↩4

  4. open-spaced-repetition. "ABC of FSRS" (wiki). awesome-fsrs repository. https://github.com/open-spaced-repetition/awesome-fsrs/wiki/ABC-of-FSRS ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14

  5. open-spaced-repetition. srs-benchmark (FSRS vs. other algorithms benchmark). https://github.com/open-spaced-repetition/srs-benchmark ↩ ↩2 ↩3 ↩4

  6. open-spaced-repetition. fsrs4anki (custom-scheduling add-on / FSRS reference implementation). GitHub. https://github.com/open-spaced-repetition/fsrs4anki ↩ ↩2 ↩3

  7. ankitects/anki. Release 23.10 (release notes). GitHub, released 2023-10-31. https://github.com/ankitects/anki/releases/tag/23.10 ↩ ↩2 ↩3

  8. Anki Manual. "Deck Options" (FSRS section: desired retention, optimizer, rescheduling). Damien Elmes / ankitects. https://docs.ankiweb.net/deck-options.html ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15

  9. dae (Damien Elmes). "Make FSRS the default?" Issue #3616, ankitects/anki. GitHub, opened 2024-12-06. https://github.com/ankitects/anki/issues/3616 ↩ ↩2

  10. Amenokori. Product landing page. https://amenokori.com ↩