M Maple 灵枢
← 返回原始报告
rc-69f3894d-296c 2026.04.30 18 KB

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 核心 + 针对性改造

理由

  1. FSRS 是当前开源间隔重复算法的帕累托最优解——在精度、可解释性、工程可用性三者间取得最佳平衡
  2. MIT 许可证,无法律风险
  3. 多语言 SDK 完备(Python/TS/Rust/Go),API 设计成熟
  4. 活跃社区持续迭代,v1→v6 历经 4 年严谨演进
  5. 默认参数即可冷启动,最少 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. 推荐后续工作

  1. 原型验证:用 py-fsrs 搭建最小可用的复习调度原型,在真实材料上跑通 review → optimize 闭环
  2. 增量阅读调研:专项研究 SuperMemo 的 IR 模式(虽闭源但设计理念有文档)、ZKMemo 的实现方式、以及学术界对文档级间隔重复的探索
  3. 知识图谱 × 调度:研究如何利用 LLM 构建的知识图谱为 FSRS 注入材料特征,改善冷启动和难度估计
  4. 监控 FSRS 社区:跟踪 open-spaced-repetition GitHub Discussions 和 Anki Discord FSRS Megathread,关注 v7 方向

9. 参考来源

一手源(算法定义 & 实现)

基准测试

社区反馈 & 讨论

SuperMemo 官方回应