FSRS / Anki / SuperMemo 间隔重复算法横向对比
原始 research campaign 输出,来自 may1 all night learningos memory agent source re。这页保留报告结构和运行痕迹,正式文章会在写作区重写。
FSRS / Anki / SuperMemo 间隔重复算法横向对比
研究时间:2026-05-01
研究目标:为自研 LearningOS 的记忆调度模块,评估直接采用、改造或放弃的算法路径
1. 算法族谱概览
1.1 SM-2(1987,Piotr Wozniak)
间隔重复算法的"Hello World"。Anki 默认调度器的基础,也是绝大多数间隔重复应用的起点。
核心机制:
- Ease Factor (EF):初始 2.5,基于用户评分(0-5 分制)动态调整
- 间隔公式:
I(1)=1, I(2)=6, I(n)=I(n-1)×EF(n>2) - EF 更新:
EF' = EF + (0.1 - (5-q) × (0.08 + (5-q) × 0.02)),下限 1.3 - 失败处理:评分 < 3 时重置间隔序列,从 I(1) 重新开始
关键缺陷:
- Ease Hell:EF 一旦被连续低评分拉低,恢复极慢,导致卡片被困在短间隔循环中
- 无个性化:所有用户、所有材料用同一套曲线
- 无记忆模型:只有 EF 一个变量,无法区分"快忘但易学"和"慢忘但难学"
- 任意参数:1/6 天的初始间隔和 EF 公式系数均来自 Wozniak 的个人实验
1.2 SM-17(2016)& SM-18(2019)
SuperMemo 算法的现代版本。首次在商业产品中实现双组分记忆模型。
核心机制:
- 双组分模型 (Two Component Model):用 Retrievability ® 和 Stability (S) 两个变量描述记忆状态
- R:回忆概率,随时间衰减
- S:记忆稳定性,成功复习后增长
- SM-17 是首个完全基于双组分模型的算法,被 Wozniak 称为"间隔重复历史上最大的质变"
- SM-18(2019)改进了难度估计模型,不再假设材料难度恒定
- SM-20(2026)为最新版本
关键限制:
- 闭源且专有:算法实现绑定 SuperMemo 软件,无法被其他应用采用
- 数据不可验证:SuperMemo 声称 SM-19 的 Universal Metric 误差率仅 1-3%,但外部无法复现
- 生态封闭:用户数据锁定在 SuperMemo 平台内
1.3 FSRS(2022-2026,L.M. Sherlock / Jarrett Ye)
开源间隔重复算法的当前最优解。三组分记忆模型 + 机器学习优化器。
核心机制:
- 三组分模型 (DSR Model):
- Difficulty (D):材料难度,1-10 范围,含均值回归机制防止 Ease Hell
- Stability (S):记忆稳定性,定义为 R 从 100% 降至 90% 所需天数
- Retrievability ®:回忆概率,遵循幂函数衰减(非指数函数)
- 21 个可优化参数(FSRS v6),通过梯度下降 + 二元交叉熵损失函数拟合
- 个性化遗忘曲线:v6 新增 w20 参数(范围 0.1-0.8),使曲线形状因人而异
- 短期记忆处理:v5 起支持同日复习的短期记忆效应
版本演进:
| 版本 | 时间 | 参数数 | 关键变化 |
|---|---|---|---|
| v1 | 2022.09 | ~7 | 初版,Google Colab 优化器 |
| v2 | 2022.09 | 14 | 增加 post-lapse stability |
| v3 | 2022.10 | 13 | 重构,FSRS Helper 插件 |
| v4 | 2023.07 | 17 | 幂函数遗忘曲线(关键突破) |
| v4.5 | 2023.12 | 17 | 更平坦的遗忘曲线 |
| v5 | 2024.07 | 19 | 短期记忆效应,预测误差 -4% |
| v5-recency | 2024.12 | 19 | 近因加权优化器,误差再 -4.5% |
| v6 | 2025.05 | 21 | 个性化遗忘曲线 (w20) |
1.4 其他算法(基准测试中的参照)
| 算法 | 来源 | 特点 |
|---|---|---|
| HLR (Half-Life Regression) | Duolingo (2016) | 双组分模型(缺 D),可利用词汇特征(lexeme tag),但公式过简 |
| DASH | 学术界 | 非 DSR 模型 |
| ACT-R | 认知科学 | 认知架构中的记忆模块 |
| GRU-P / LSTM / RWKV | 神经网络 | 预测精度最高,但不可解释、难以工程化 |
| Leitner System | 1972 | 分箱法,概念简单但调度粗糙 |
| Ebisu v2 | 开源 | 贝叶斯方法,beta 分布建模 |
2. 基准测试实证
2.1 数据集
- Anki Revlogs 10k:9,999 个用户集合,~7.27 亿条复习日志,评估涉及 ~3.5 亿条
- 规模是 Maimemo 数据集的 3 倍、Duolingo 数据集的 56 倍
- 采用时间序列分割法(5 段 A-E),防止数据泄漏
2.2 核心指标
| 指标 | 含义 | 方向 |
|---|---|---|
| Log Loss | 预测概率的准确性 | 越低越好 |
| RMSE (bins) | 预测值与实际值的校准偏差 | 越低越好 |
| AUC | 区分"记住"与"忘记"的能力 | 越高越好 |
2.3 关键结论
FSRS-6 vs SM-2:99.6% 优越率(即在 99.6% 的用户集合中,FSRS-6 的 log loss 更低)
FSRS-6 vs SM-17:83.3% 优越率(基于 19 个 SuperMemo 用户的 687,662 条复习记录)
FSRS-6 vs 神经网络:RWKV 在 log loss 上"大幅领先"所有传统算法,但不可解释且难以部署
实际效果:相同保留率下,FSRS 比 SM-2 减少 20-30% 的复习量
2.4 争议
- SuperMemo 的反驳:声称 SM-19 的 Universal Metric 误差率仅 1-3%,FSRS 为 15-20%。但 SuperMemo 的基准方法论未公开、数据不可复现、措辞带有明显竞争偏见(“a scientific meme”、“methodologically flawed”)。证据质量低于 FSRS 社区的开放基准。
- 统计显著性:HN 上有用户质疑置信区间的意义性,认为报告的性能差异可能不具统计显著性。
- 样本偏差:FSRS vs SM-17 仅基于 19 个用户(来自 SuperMemo 的导出数据),样本量偏小。
3. 社区真实反馈汇总
3.1 正面反馈
| 来源 | 反馈要点 |
|---|---|
| HN | “resolved pain points about having to trial-and-error adjust the old SM2 scheduling”,可按 deck 重训权重 |
| Anki Forums | 切换后初始间隔变长(Good ~3-5 天),社区投票"一致认为 FSRS 优于 SM-2" |
| LessWrong | 从怀疑者变为核心贡献者的案例,说明算法说服力强 |
| 博客 (Domenic Denicola) | “复习负担明显减轻”,miss 后不再 ping-pong 回第一天 |
| RemNote | 已集成 FSRS v6,用户迁移平滑 |
3.2 负面反馈与已知问题
| 问题 | 来源 | 严重性 | 详情 |
|---|---|---|---|
| 间隔暴涨 | Anki Forums (2025) | 中 | 中断后恢复使用时,旧复习历史导致 Good=1.4 年。原因:历史数据正常驱动,非 bug,需手动重置 |
| 复习量暴增 | Anki Forums | 中 | 从 SM-2 切换后短期内复习量剧增,因为 FSRS 重新校准了被 SM-2 过度延长的间隔 |
| Difficulty 收敛 | Anki Forums | 低 | 优化后多数卡片的 D 值趋同,原因是优化器将旧版本的 D 视为 ground truth |
| Ease Hell 残留 | Anki Forums (2024) | 低 | 均值回归收敛慢——按 Good 确实能恢复 D,但速度"缓慢且不显著";按 Easy 才能快速恢复,但社区普遍建议不按 Easy |
| Evaluate 功能无用 | GitHub #3926 | 低 | 校准指标不给用户可行动建议,“不知道差在哪里” |
| 不支持增量阅读 | Anki Forums | 限制 | FSRS 设计针对离散 flashcard,IR 卡片需要不同调度逻辑 |
| 插件兼容 | 社区 | 低 | 任何修改间隔的插件与 FSRS 冲突 |
3.3 HN 社区的元讨论
来自多位资深用户的共识:
- “算法是天花板的实现者,不是天花板本身”——卡片质量决定学习上限,算法只帮你更高效地触达上限
- “slightly too easy cards + selective”——一位 35,000+ 次复习的多语言学习者认为,让卡片"稍微太简单"比优化调度参数更重要
- Recognition vs Recall——cloze 删除可能训练的是上下文联想而非真正掌握
4. 开源生态与工程可用性
4.1 FSRS 多语言实现
FSRS 拥有目前间隔重复领域最完善的开源生态:
| 语言 | 包名 | 版本 | Scheduler | Optimizer |
|---|---|---|---|---|
| Python | py-fsrs | v6.3.1 | ✅ | ✅ |
| Rust | fsrs-rs | v6 | ✅ | ✅ |
| TypeScript | ts-fsrs | v6 | ✅ | ✅ (via binding) |
| Go | go-fsrs | v5 | ✅ | ❌ |
| Swift | swift-fsrs | v5 | ✅ | ❌ |
| Kotlin | FSRS-Kotlin | v6 | ✅ | ❌ |
| Dart | dart-fsrs | v4.5 | ✅ | ❌ |
- MIT 许可证,可自由集成
- 核心包(py-fsrs)423 stars,ts-fsrs 645 stars
- 活跃社区:Discord Megathread、GitHub Discussions、Anki Forums 专区
4.2 API 设计模式(以 py-fsrs 为例)
from fsrs import Scheduler, Card, Rating, Optimizer
# 初始化(默认参数即可工作)
scheduler = Scheduler(desired_retention=0.9)
card = Card()
# 复习
card, log = scheduler.review_card(card, Rating.Good)
# 查询可回忆概率
r = scheduler.get_card_retrievability(card)
# 优化器(需积累复习日志)
optimizer = Optimizer(review_logs)
params = optimizer.compute_optimal_parameters()
retention = optimizer.compute_optimal_retention(params)
关键特性:
- 4 级评分(Again / Hard / Good / Easy),比 SM-2 的 6 级更简洁
- JSON 序列化支持
- UTC 时区严格要求
- Fuzzing(间隔随机抖动)可选
- 冷启动:默认参数可直接使用,最少 16 条复习记录即可开始优化
4.3 SM-2 实现
SM-2 极其简单(~50 行代码),各语言都有独立实现。但没有优化器——参数来自 1987 年的人工实验,无法个性化。
4.4 SuperMemo 系列
不可用于自研系统。算法闭源、数据不可导出、专有授权。
5. 横向对比矩阵
| 维度 | SM-2 | SM-17/18/20 | FSRS v6 | HLR | 神经网络 (RWKV/GRU) |
|---|---|---|---|---|---|
| 记忆模型 | 1 变量 (EF) | 2 组分 (R, S) | 3 组分 (D, S, R) | 2 组分 (S, R) | 隐式 |
| 个性化 | ❌ | ✅ | ✅ | 部分 | ✅ |
| 可优化参数 | 0 | 未公开 | 21 | 可变 | 数千+ |
| 优化方法 | 无 | 专有 | 梯度下降 + BCE | 回归 | 反向传播 |
| 冷启动 | 不需要 | 不需要 | 默认参数可用,16 条即可优化 | 需要特征 | 需要大量数据 |
| 预测精度 | 基线 | 高(声称) | 高(已验证) | 中等 | 最高 |
| 可解释性 | 高 | 中 | 中-高 | 中 | 低 |
| 开源 | ✅(原始公式) | ❌ | ✅ (MIT) | ✅ | ✅ |
| 多语言库 | 各自实现 | 无 | 13+ 语言 | Python only | 各自实现 |
| 增量阅读 | ❌ | ✅(SuperMemo 原生) | ❌ | ❌ | ❌ |
| Ease Hell | 严重 | 已解决 | 基本解决(均值回归) | N/A | N/A |
| 社区活跃度 | 维护模式 | Wozniak 个人 | 活跃(Discord + GH) | 停滞 | 学术界 |
6. 自研 LearningOS 的算法路径建议
6.1 推荐路径:直接采用 FSRS v6 核心 + 针对性改造
理由:
- FSRS 是当前开源间隔重复算法的帕累托最优解——在精度、可解释性、工程可用性三者间取得最佳平衡
- MIT 许可证,无法律风险
- 多语言 SDK 完备(Python/TS/Rust/Go),API 设计成熟
- 活跃社区持续迭代,v1→v6 历经 4 年严谨演进
- 默认参数即可冷启动,最少 16 条记录即可个性化
6.2 具体采用/改造/放弃建议
✅ 直接采用
| 模块 | 来源 | 说明 |
|---|---|---|
| DSR 三组分记忆模型 | FSRS | D/S/R 的定义和关系 |
| 幂函数遗忘曲线 | FSRS v4+ | 比指数函数更贴合真实数据 |
| 21 参数优化框架 | FSRS v6 | 梯度下降 + BCE loss |
| 4 级评分 (Again/Hard/Good/Easy) | FSRS | 比 SM-2 的 6 级更实用 |
| 均值回归防 Ease Hell | FSRS | Difficulty 的 mean reversion 机制 |
| 个性化遗忘曲线 (w20) | FSRS v6 | 不同用户不同曲线形状 |
| 冷启动默认参数 | FSRS | 社区验证的初始值 |
🔧 需要改造
| 模块 | 改造方向 | 原因 |
|---|---|---|
| Difficulty 模型 | 引入 Retrievability 依赖 | FSRS 承认 D 理论上应依赖 R,但测试中未能提升精度。LearningOS 可在更大数据集上重试 |
| 增量阅读调度 | 设计独立的 IR 调度器 | FSRS 明确不支持 IR,LearningOS 若需要整合知识管理(非纯 flashcard),需自行设计文档粒度的复习逻辑 |
| 短期记忆窗口 | 参数化学习步骤 | FSRS 的 learning_steps 是固定配置(默认 1min/10min),可考虑让优化器也学习这些参数 |
| 多粒度调度 | 知识点 → 概念 → 主题 | FSRS 按卡片级调度,LearningOS 可能需要层级调度(单卡→关联卡→主题复习) |
| 材料特征注入 | 类似 HLR 的 lexeme tag | FSRS 只用间隔+评分,不利用材料内容。若 LearningOS 有丰富的知识图谱,可注入材料特征提升冷启动精度 |
| 遗忘曲线监控 | 用户可视化 + 可操作反馈 | Anki 的 Evaluate 功能被用户批评"无用",需要设计给用户可理解、可行动的反馈 |
❌ 放弃
| 模块 | 原因 |
|---|---|
| SM-2 算法 | 已过时,FSRS 在 99.6% 的集合中更优。无个性化、有 Ease Hell、参数基于 1987 年个人实验 |
| SuperMemo SM-17/18/19/20 | 闭源专有,无法使用。SuperMemo 的"性能声称"无法独立验证 |
| 纯神经网络调度器 (RWKV/GRU) | 精度最高但不可解释、需大量数据、难以工程化。可作为未来研究方向,不适合 MVP |
| Ebisu v2 | 社区不活跃,被 FSRS 全面超越 |
| 自研遗忘曲线模型 | FSRS 的幂函数模型已有充分验证,自研性价比低 |
6.3 实施路线图建议
Phase 1:基座集成
- 引入 py-fsrs(Python 后端)或 ts-fsrs(TypeScript 后端)
- 使用默认参数冷启动
- 实现基础的卡片创建 → 复习 → 评分流程
- 存储 ReviewLog 为优化器积累数据
Phase 2:个性化优化
- 用户积累 ~100 条复习记录后开启自动优化
- 按学科/材料类型分 preset 独立优化
- 实现可视化的遗忘曲线和复习统计
Phase 3:超越 flashcard
- 设计增量阅读调度器(独立于 FSRS,但复用 R/S 概念)
- 实现知识图谱驱动的多粒度调度
- 探索材料特征注入(利用 LLM 生成的知识结构)
Phase 4:高级探索(可选)
- 在积累足够数据后,测试 D 对 R 的依赖是否能改善 LearningOS 场景的精度
- 对比 FSRS 与小型 RNN 在 LearningOS 数据上的表现
- 贡献改进回 open-spaced-repetition 社区
7. 不确定性声明
| 项目 | 不确定性 | 影响 |
|---|---|---|
| SuperMemo SM-19/20 的真实性能 | 高——声称误差率 1-3%,但无法复现 | 如果属实,说明 FSRS 仍有较大提升空间;但闭源特性使其对 LearningOS 无意义 |
| FSRS vs SM-17 的 83.3% 优越率 | 中——仅基于 19 个用户样本 | 真实优势可能更小或更大 |
| 神经网络方法的工程化可行性 | 中——RWKV 精度领先但无人部署在实际产品中 | 未来可能成为可行路径 |
| D 对 R 的依赖关系 | 中——FSRS 团队多次尝试未果 | 可能是数据问题而非理论问题,在不同场景下有可能成功 |
| 增量阅读的最优调度策略 | 高——无公开研究直接对比不同 IR 调度方法 | LearningOS 的 IR 模块需要大量实验 |
| FSRS 在非 Anki 场景的泛化性 | 低-中——基准数据 100% 来自 Anki 用户 | LearningOS 用户行为可能不同,需持续监控 |
8. 推荐后续工作
- 原型验证:用 py-fsrs 搭建最小可用的复习调度原型,在真实材料上跑通 review → optimize 闭环
- 增量阅读调研:专项研究 SuperMemo 的 IR 模式(虽闭源但设计理念有文档)、ZKMemo 的实现方式、以及学术界对文档级间隔重复的探索
- 知识图谱 × 调度:研究如何利用 LLM 构建的知识图谱为 FSRS 注入材料特征,改善冷启动和难度估计
- 监控 FSRS 社区:跟踪 open-spaced-repetition GitHub Discussions 和 Anki Discord FSRS Megathread,关注 v7 方向
9. 参考来源
一手源(算法定义 & 实现)
- SM-2 原始算法规范
- SM-17 算法
- SM-18 算法
- FSRS 技术详解 (Expertium)
- py-fsrs (Python SDK)
- ts-fsrs (TypeScript SDK)
- fsrs4anki
- awesome-fsrs (完整生态清单)
- Duolingo HLR 论文
基准测试
社区反馈 & 讨论
- FSRS: A modern, efficient spaced repetition algorithm (HN)
- The History of FSRS for Anki (LessWrong)
- Spaced Repetition Systems Have Gotten Way Better (Domenic Denicola)
- Does FSRS solve “ease hell”? (Anki Forums)
- My FSRS Algorithm is Completely Messed Up (Anki Forums)
- FSRS FAQ (Anki)