← 返回目录


感知内容的间隔重复

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

54 👍 / 8 💬

间隔重复系统(SRS)功能强大,但它们存在一个根本性的盲点:无法理解你的抽认卡究竟是关于什么内容的。

在你的 SRS 看来,一张问「意大利的首都是什么?」的卡片和另一张问「罗马是哪个国家的首都?」的卡片是两个独立的个体,各自拥有孤立的复习历史。系统完全没有意识到,复习相关联的内容应该能巩固你对整个主题的记忆。

每个 SRS 的核心都是一个记忆模型,它会根据你过往的表现来预测你对每张卡片的记忆能维持多久。如今,大多数模型完全忽略了卡片的内容。而感知内容的记忆模型正为此而生:它们不仅考虑你的复习评分,还考虑了卡片本身的语义。

这绝非仅仅为了提升调度准确性而做的小修小补,而是一项颠覆性的变革。它让构建许多人梦寐以求的那些灵活、智能的学习工具成为可能:从多角度检验理解程度的以想法为中心的记忆系统[1],到由 AI 语音助手担任导师的真正对话式间隔重复

本文将探讨何为感知内容的记忆模型,以及它们能解锁哪些新型的学习体验。

调度器与记忆模型

我发现,将调度器和记忆模型区分开来非常有帮助。刚接触这个领域时,我并未立刻意识到这一点,但后来发现,要想清晰地思考 SRS,这个区分至关重要。下文我将介绍这两个概念,并论证为何将二者分离能够促进各自的独立创新,并通过将用户体验(UX)相关的问题隔离在调度器中,从而简化每个组件的开发。在学术文献中,调度器有时被称为「教师模型」,因为它决定教什么;而记忆模型则被称为「学生模型」,因为它代表了学生掌握的知识。

在 Anki 等间隔重复系统中,调度器是一种算法,负责挑选当天要复习的下一张卡片,它回答的问题是:「根据学生卡片库中每张卡的复习历史,学生在本次学习中应该复习哪些卡片?」。实际上,在构建一个间隔重复系统时,这才是你真正关心的问题。调度器的核心任务是决定今天该展示哪些卡片,而不仅仅是每张卡片理想的复习时间。一张卡片可能已经「到期」需要复习,但调度器可能因每日复习上限而跳过它,或优先处理其他逾期更久的卡片,或基于其他目标将其推迟。

在很长一段时间里,Anki 中唯一的调度器是 SuperMemo SM-2 算法的一个变体[2],该算法可追溯至 1987[3] 年。它虽然简单,却出奇地有效。此后,SuperMemo 不断改进其调度器,如今已更新至 SM-18 版本。最新几代算法能以更少的复习次数达到同等的记忆保留率,并且在复习间隔偏离最优值时(例如,学生中断学习数周后归来)表现得更为稳健。尽管 SuperMemo 的调度器是闭源的,但网上有其工作原理的说明FSRS 则是由 Jarrett Ye 开发的一款开源调度器,其构建原理与现代 SuperMemo 算法相似,并且可以在 Anki 中使用。

记忆模型则负责预测遗忘曲线,它回答的问题是:「根据学生卡片库中每张卡的复习历史,学生在任意时刻记起某张特定卡片的概率是多少?」

我们将可提取性(retrievability)定义为学生在特定时间点记起某张卡片的概率。在实践中,我们通常将其简化为一个二元结果:学生要么记得,要么忘了。一些间隔重复系统允许更细化的评分等级,例如 Anki 就有「重来」、「困难」、「良好」、「简单」四个选项。这些来自复习历史的额外信息有助于提升记忆模型的准确性。

遗忘曲线描绘了可提取性随时间变化的轨迹。记忆模型的任务就是根据学生的复习历史来计算这些曲线。通常,随着时间的推移,可提取性会下降,因为学生忘记卡片的可能性增加了。例如,下图展示了不同记忆模型根据同一份复习历史估算出的遗忘曲线(图片来源我的硕士论文):

不同系统中,调度器与记忆模型的关系各不相同。调度器不一定需要依赖记忆模型。例如,莱特纳系统(Leitner system)和 SM-2 就不依赖记忆模型来安排复习,它们基于简单的机械规则。相比之下,像 SM-18 和 FSRS 这样的现代调度器则内置了记忆模型(利用稳定性和难度来计算可提取性)。我推荐阅读 Fernando Borretti 关于实现 SM-2FSRS 的文章。值得注意的是,FSRS 在实现层面将调度器和记忆模型耦合在一起,但只要稍作修改,就能轻松地将它们分离开来,从而在系统设计上获得更大的灵活性。此外,还有一些基于无模型强化学习的调度器,它们直接从用户交互中学习调度策略,而无需构建我们正在讨论的这种明确、可供人类理解的遗忘模型。

一旦你有了一个能够估算学生对每张卡片记忆概率的记忆模型,你就可以基于它,采用不同策略来构建各式各样的调度器:

正如这些例子所示,一个精准的记忆模型可以作为基石,支撑起一个多样化的调度器生态系统,每个调度器都可以针对不同的目标和用户体验进行优化。

将记忆模型与调度器区分开来,主要有两大优势:

  1. 独立的创新周期。我们可以独立地对调度器和记忆模型进行创新。调度器的研究可以将记忆模型视为一个黑盒,只需获取其提供的可提取性预测即可。

  2. 与用户体验问题解耦。我们可以专注于打造更优的记忆模型,而无需考虑产品或用户体验的限制。调度器的设计与产品和用户体验的考量紧密相连。例如,调度器可能会确保学生在学习结束前再次尝试答错的卡片,这样做主要的好处可能在于心理层面——让学生获得答对题目的安心感,而不是一个纯粹为优化长期记忆而做出的决定。另一个例子是负载均衡,其主要目的也是为了改善学生的学习体验。

这种架构上的分离并非纸上谈兵,它能带来切实的益处:你可以基于同一个底层记忆模型来 A/B 测试不同的调度策略;可以轻松换上更先进的记忆模型,而无需重构整个系统;还可以让用户根据自己的学习风格选择不同的调度方法,同时底层维持着一致的遗忘预测。

目前大多数 SRS 的实现在设计上混淆了这些不同层面的问题。下一代系统若能将它们视为独立、可组合的组件,必将从中受益。

感知内容的记忆模型

本节将探讨如何利用卡片的文本内容和语义关系来改进记忆模型。

据我所知,现实世界中绝大多数间隔重复系统里的记忆模型都孤立地处理每张卡片。SM-2、SM-18 和 FSRS 仅凭每张卡片的独立复习历史来预测其遗忘曲线。忽略以下因素,意味着我们正在浪费宝贵的信息:

  1. 相关卡片的复习历史。通过卡片的语义,我们可以识别出相互关联的卡片。这使得记忆模型在估算某张特定卡片的可提取性时,能够将所有相关卡片的复习历史都纳入考量。

  2. 卡片自身的文本内容。除了识别相关卡片,语义内容本身也能为记忆模型提供直接信息。例如,模型可以根据卡片的问题或答案文本,在没有任何复习记录的情况下,预估其固有难度。

值得注意的是,「卡片语义」所涵盖的远不止是简单的文本相似性。我们追求的是捕捉卡片的内在质量:问题能否高效地激活记忆通路,引导学生回忆起相关概念。例如,我们需要能检测出问题中可能存在的细微歧义,因为这会增加回答的难度。此外,我们可能需要考察一组卡片的整体语义,而非孤立的单张卡片。比如,要记住一个包含三项内容的清单,你可能需要为每一项都制作一张卡片,然后再额外制作一张整合了整个清单的卡片。如果孤立地看,这张总览性质的卡片质量会很差,若没有另外三张卡片的辅助,将极难记忆。

通俗地讲,这个研究方向建议将记忆模型的关注点从:

 可提取性(t) = f(t; 单张卡片的复习历史)

转变为利用更丰富的上下文信息:

 可提取性(t) = f(t; 所有卡片的复习历史, 所有卡片的内容)

其中,t 指的是距离上次复习的时间,而历史(无论是单张卡片的复习历史还是所有卡片的复习历史)则是一个按时间顺序排列的复习事件序列,通常包含时间戳和学生在该次复习中的评分。

请注意,现有的记忆模型对所有新卡片(即没有任何复习记录的卡片)一视同仁。如果能将文本内容纳入考量,我们就能对卡片的固有难度做出更可靠的初步评估,从而为那些没有或只有少量复习记录的卡片提供比统一默认值更优的调度方案。

例如,请看下面这组卡片:

 问:在强化学习中,贝尔曼方程的广义定义是什么?
 答:一个描述了某个状态的价值与其后续状态价值之间基本关系的方程。
 ​
 问:在强化学习中,哪个方程描述了某个状态的价值与其后续状态价值之间的基本关系?
 答:贝尔曼方程。
 ​
 问:在强化学习中,贝尔曼方程的公式是什么?
 答:$$ v_{\pi}(s) = \sum_{a} \pi(a|s) \sum_{s', r} p(s', r|s, a) [r + \gamma v_{\pi}(s')] $$

这三张卡片在语义上都相关联,但前两张互为概念的反向表述,它们之间的联系远比与第三张(侧重于公式)的联系要紧密得多。复习前两张中的任意一张,很可能会让回忆起另一张变得格外容易。第三张卡片或许也有类似效果,但会弱很多。(换个角度看,如果学生成功回忆起前两张中的任意一张,我们就有更强的信心认为他们也能记起另一张)。此外,第三张卡片由于其「非原子性」而天然更具挑战性:学生必须回忆起公式的多个组成部分,这增加了因忘记某个元素而将整张卡片标记为「忘记」的概率。

KARL

这一想法已在学术文献中得到探讨,见 Shu et al., 2024 - KARL: 知识感知的检索与表征有助于学生的记忆保留和学习,作者在文中提出了内容感知调度(content-aware scheduling)这一术语。KARL 中的记忆模型使用 BERT 嵌入来对卡片的文本内容进行编码。

这些嵌入向量具有双重作用:

  1. 它们帮助从用户的学习历史中检索出语义最相似的前 k 张卡片,这些卡片的复习历史随后被送入记忆模型。

  2. 当前卡片及其最相似的前 k 张卡片的嵌入向量本身,也会被作为输入提供给记忆模型。

研究人员在一个包含 123,143 条学习日志的数据集上对 KARL 调度器进行了评估,这些数据来自 543 名用户在一款定制抽认卡应用中对各种百科知识问题的学习记录。它的表现略微超过了 FSRS v4(此后 FSRS 已升级,目前为第 6 版)。这一结果非同凡响,因为 KARL 并未像 FSRS 那样,通过估算难度和稳定性并运用幂律遗忘曲线来显式地对记忆动态进行建模。我不禁好奇,如果一个模型既能像 FSRS-6 一样精准捕捉记忆动态,又能像 KARL 一样充分利用卡片语义,其性能将会如何。

在 Rember 数据上做的小型实验

我自己也进行了一些小型实验,为这一方向的前景提供了更多佐证。在 Rember 中,我们将卡片组织在若干条笔记之下;实验时,我的账户共有 940 张卡片,分属 317 条笔记,总计有 4,447 条复习记录。你可以将笔记理解为一组语义上相似的卡片。

我在 FSRS 的基础上进行了两组实验:

稳定性(stability)代表一张卡片在记忆中维持的时间长度,其定义为该卡片的可提取性下降到 90% 所需的时间间隔。

我比较了以下几种记忆模型:

我按笔记 ID 进行了 4 折交叉验证,并使用了我硕士论文中相同的评估指标来比较这些模型:AUC(衡量区分度,越高越好)、ICI(衡量平均校准误差,越低越好)和 E_max(衡量最大校准误差,越低越好)。

结果汇总如下表:

模型AUCICIE_max
random0.4887±0.01560.4235±0.00550.9193±0.0099
fsrs0.5708±0.01720.0364±0.01200.2720±0.0912
fsrs_optimized0.6294±0.01150.0108±0.00410.1904±0.0689
fsrs_exp_10.5883±0.02480.0281±0.00860.2204±0.0640
fsrs_exp_20.5716±0.01590.0307±0.00790.2355±0.0867
fsrs_optimized_exp_10.6148±0.01280.0070±0.00210.1383±0.0356
fsrs_optimized_exp_20.6386±0.01850.0075±0.00310.1285±0.0522

实验结果虽然基于一个小型数据集,但揭示了一个清晰的趋势:

这些结果虽然因数据集规模有限而尚属初步,但它们有力地支持了整合语义上下文能够增强记忆模型的假设。

其他考量

MathAcademy 提供了一项有趣的间隔重复功能,该功能考虑了卡片间的语义联系。他们手动构建了一棵概念树,其中包含了概念间的依赖关系。其间隔重复调度器在安排卡片复习时,会参考其前置概念的复习情况。你可以在这里[4]进一步了解其调度器的工作原理。引用一段他们的描述:

现有的间隔重复算法局限于处理独立的抽认卡——但这并不适用于像数学这样具有层级结构的知识体系。例如,如果一个学生练习两位数加法,他们实际上也在练习一位数加法!总的来说,对高级主题的复习应该会「渗透」到知识图谱的下层,从而更新那些被间接练习的更简单主题的复习计划。

这项工作非常出色,但其调度器仅限于 MathAcademy 自建的概念树。我们需要的是能够理解卡片语义并具有更广泛适用性的记忆模型。

一个普遍需要考虑的问题是调度器的计算成本。例如,在我的 M2 MacBook Pro 上,FSRS 可以在几毫秒内处理数千次复习的调度,因此可以轻松地在本地设备上的 SRS 软件中运行。而一个需要考虑所有卡片的复习历史和文本内容的记忆模型,其计算密集度可能会高得多,或许无法在不造成明显延迟或大量消耗电池的情况下在设备上本地运行。KARL 通过只考虑语义最相似的前 k 张卡片而非整个卡片库,来应对这一计算挑战。

这类模型很可能需要利用大量间隔重复用户的学习数据进行训练,这意味着:

用户体验的革新

尽管模型准确性的提升本身就很有价值,但更大的影响力在于卡片语义为用户体验(UX)带来的全新可能性。通过打破卡片与其复习历史之间的僵化耦合,感知内容的记忆模型赋予了间隔重复系统设计者前所未有的自由。

现实中这种束缚的一个具体例子是:当我们(在 LLM 时代之前)着手开发 Rember 时,曾考虑构建一个完全基于 Markdown 的 SRS。最终放弃这个想法的主要原因是,你需要为每张卡片分配一个唯一的 ID,以便将卡片与其复习历史关联起来。在 Markdown 文件中维护这些 ID 很快就会变得一团糟,最终会变成这样:

 [card:abcxyz]
 问:意大利的首都是什么?
 答:罗马

这远非理想的解决方案,它非常脆弱,因为用户可能会无意中修改 ID,或者因为复制粘贴卡片而导致 ID 重复。

那些试图摆脱 ID 的方案都走进了死胡同。你不能依赖精确的文本匹配,因为用户可能会编辑卡片内容,而你肯定不希望用户仅仅修正一个错字就导致复习历史被重置。你也不能依赖卡片在文档中的相对位置,因为用户随时可能移动卡片。在 Markdown 之上强制覆盖一个图形界面来管理 ID 倒是可行,但这在某种程度上又违背了使用 Markdown 的初衷。

核心的突破在于,将卡片与其特定的复习历史解耦。记忆模型不再将复习记录与卡片 ID 绑定,而是只考虑一个全局的、基于内容的复习历史,该历史由一个个三元组构成:(评分, 时间戳, 卡片文本内容)。这样一来,就不再需要保证卡片的持久一致性了。从此不再有「某张卡片的复习历史」这个概念,取而代之的是一个贯穿学生整个知识库的统一「复习历史」。

如此一来,调度器便可以评估学生知识库中所有当前卡片(包括新增卡片)的可提取性,而无需依赖任何过往的复习 ID。学生可以随心所欲地编辑卡片,而不会干扰调度算法。记忆模型凭借其语义理解能力,能够区分细微的格式修改(如修正错别字,这不改变核心含义)和对卡片内容的实质性改动(如替换答案,这会显著改变其语义,足以被视为一张全新的卡片)。

这种解耦也为那些能够动态生成卡片的系统扫清了障碍。Andy Matuschak 曾探索过将想法(ideas)而非卡片作为系统核心的理念。在这种系统中,卡片是在每次复习时动态生成的,用于从多个角度检验某个想法,并且随着你对该想法越来越熟悉,卡片也会随之演变(详见他的 Patreon 文章 《灵活的记忆实践产生流畅的理解》[5] 或他的公开笔记[1])。感知内容的记忆模型让这种方法变得更加可行。现有的调度器假定每张卡片都有一份独立的复习历史,这对于动态生成的卡片来说,会带来一个两难的窘境:要么将每一种独特的卡片变体都当作一张新卡片,但这会切断它与核心想法的联系;要么在想法的层面上进行粗略的分组,但这又可能导致对单张卡片的复习不足。而感知内容的记忆模型则能自然地处理好这个灰色地带。

更进一步,我们可以设计出这样一种 SRS:用与 AI 语音助手的对话来取代传统的抽认卡复习。AI 助手可以提出问题,或引导一场开放式讨论。这是 David Bieber 所探索的对话式间隔重复理念的一部分。AI agent 可以追踪学生在对话中涉及的关键想法或概念,并以某种方式判断用户是否记住了它们。感知内容的记忆模型应该能够处理这些非结构化的复习记录,即使它们无法直接对应到传统的问答卡片。

其他好处还包括:

尽管这种方法可能会让用户失去一些对单张卡片历史的直接控制权(例如手动重置某张卡的复习计划),但我相信我们可以找到缓解方案,并且这种新方法带来的益处将远超其弊端。

总而言之,我预言感知内容的记忆模型将极大地简化新型记忆系统的界面设计与构建工作,消除那些长期困扰 SRS 开发者的恼人障碍。

数据难题

构建感知内容的记忆模型,其主要挑战在于数据匮乏。据我所知,目前没有任何公开可用的数据集同时包含真实的用户使用数据、卡片文本内容以及复习历史。

前文提到的 KARL,其训练数据是通过付费让用户在一款定制应用上复习百科知识抽认卡而收集的。对于我自己的间隔重复实践,我不太愿意依赖一个纯粹基于人工数据训练出来的记忆模型。FSRS 的训练数据源自 anki-revlogs-10k,这是一个庞大的数据集,包含了来自 1 万个 Anki 用户集合的超过 2 亿条复习记录。然而,该数据集只包含卡片、笔记和牌组的 ID,并未包含文本内容,这是因为 Anki 的隐私政策规定:

为研究和产品开发之目的,我们可能会使用您的复习历史和选项(但不包括卡片上的文本或媒体内容)进行统计分析,例如计算所有用户的平均通过率。

尽管也存在其他复习数据集,但其中一个关键的缺失环节,就是一个同时满足以下条件的大型数据集:

  1. 非商业性质,可用于研究目的
  2. 包含复习历史
  3. 包含卡片的文本内容
  4. 覆盖广泛的主题领域(例如,不局限于语言学习)

借鉴 Nate Meyvis 的见解,我还要补充第五点要求(下文将解释其重要性):

5. 有一小部分复习是随机安排的,以提供无偏的数据点

来自间隔重复系统的数据本身就存在一些挑战:

尽管存在上述挑战,但像 FSRS 和 SM-18 这样的当代调度器所取得的优异成果,有力地证明了数据中确实存在着宝贵的信号,并且这些信号可以从噪声中被成功地分离出来。

一个潜在的出路是建立一个开源的、由社区贡献的数据集。用户可以自愿分享他们的 Anki 及其他 SRS 数据,并辅以工具来过滤敏感内容,最终形成用于评估记忆模型的标准化基准。如果你有兴趣贡献数据,或有构建社区驱动数据集的经验,或对此方法有任何想法,我非常希望与你交流


我们正在为一款利用 AI 生成抽认卡的新工作流寻找测试者,如果你感兴趣,欢迎访问 rember.com 注册加入等候名单。了解我工作的最新动态,最好的方式是关注我的 x dot com



Thoughts Memo 汉化组译制
感谢主要译者 gemini-2.5-pro,校对 Jarrett Ye
原文:Content-aware Spaced Repetition
作者:Giacomo Randazzo
发布日期:2025-08-04

参考

1. 以想法为中心的记忆系统 ./1660865898.html
2. Anki 使用什么间隔重复算法? https://open-spaced-repetition.github.io/anki-faqs-zh-CN/what-spaced-repetition-algorithm
3. 04 1987 SuperMemo 1.0: 日志 ./97887756.html
4. Math Academy 的 AI 是如何工作? ./1907408881207976645.html
5. 灵活的记忆实践产生流畅的理解 ./646929920.html

专栏:间隔重复 & 注意力管理


← 返回目录