← 返回目录


记忆模型的数学形式化

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

14 👍 / 3 💬

序言

我们在此引入一种针对间隔重复记忆模型的数学形式化定义。记忆模型用于估计你有多大概率能够回忆起 Anki 牌组中每张卡片的答案。这种形式化不仅适用于诸如 SM-2 和 FSRS 等传统模型,也适用于未来基于内容感知(content-aware)的记忆模型。它将作为我们后续发布关于如何评估记忆模型的系列文章的理论基础,那些文章将探讨如何回答诸如「FSRS 到底好不好?」以及「FSRS 究竟比 SM-2 好多少?」等问题。

在《基于内容感知的间隔重复[1]》一文中,我(Giacomo)对间隔重复系统的两个核心组件进行了区分:记忆模型负责预测学生在任何给定时刻记住某张卡片的概率;而复习调度器则在综合考虑记忆模型预测的基础上,为你应当在何时实际去复习每张卡片提供建议。

我们认为,将这两个关注点剥离开来,有助于对它们各自进行更清晰的推理。目前我们的研究重心放在了记忆模型上,因为调度器的性能上限从根本上是由记忆模型的质量所决定的。

一般来说,我们可以将间隔重复系统视为在提取提示(Retrieval Prompts)上运行的系统,学生需要根据这些提示试图回忆起对应的答案(Answers)。大多数系统都采用了抽认卡(flashcard)的比喻,其中每一个(提取提示,答案)对都由一张电子抽认卡来表示。为了简便起见,在下文中我们将统一使用卡片(card)一词来指代这种(提取提示,答案)对。

引言

对于学生牌组中的任何一张卡片记忆模型都要回答这样一个核心问题:考虑到我们对学生所知的一切(包括其历史复习记录),该学生在当下这一刻正确回忆起答案的概率有多大?

我们将这种概率称为一张卡片的可提取性(retrievability):即学生在某个特定时间点成功回忆起答案的概率。其严格的数学形式化目标如下:

\text{retrievability} = \mathbb{P}(G = 1 \mid \text{student, card, history, time})

其中 G \in \{0, 1\} 表示实际的回忆结果(1 代表回忆成功,0 代表遗忘),其服从伯努利分布:G \mid s, c, h, t \sim \text{Bernoulli}(\text{retrievability})。在这种形式化定义下,记忆模型会为每一个(学生、卡片、历史记录、时间)元组输出一个介于 [0, 1] 之间的单一概率值 p

你当然可以把它简单地看作是一个二元分类问题——学生到底能记住还是记不住?——但这会白白丢掉大量有价值的信号。一个分类器只能输出一条僵硬的决策边界:比如当时间流逝到某个临界点 \delta^* 时,预测结果直接从「能记住」瞬间翻转为「记不住」,而下游的调度器只能拿到这么一个干瘪的结论。如果一个调度器想要在卡片的可提取性恰好下降到 90%(或其他任何特定阈值)时安排复习,它是绝对无法从一个二元分类标签中提取出这种信息的。只有经过良好校准的概率估计,才能让调度器在 t > \text{now} 的未来时间轴上进行扫描,并在遗忘曲线的任意一点上读取出精确的可提取性,从而实现更加精细、智能的调度策略。

Anki 提供了四个评分按钮——重来(Again)、困难(Hard)、良好(Good)、简单(Easy)——它们捕获了关于回忆信心程度的更详细信息。在我们的这种形式化中,我们对其进行了二值化处理:对应于 Again(完全遗忘),G = 0;而对应于任何形式的成功回忆(Hard、Good 或 Easy),G = 1。那些细粒度的具体评分会被保留在观察项 o 中,这样,依赖这些细粒度评分的模型依然可以使用它们,而不会将它们与绝对的「是否成功回忆」的二元结果混为一谈。

形式化定义

让我们先来定义一下涉及到的各个数学空间:

一个记忆模型就是一个如下定义的函数:

m: \mathcal{S} \times \mathcal{H} \times \mathcal{C} \to (\mathbb{R}^+ \to [0, 1])

该模型接收一个学生、一段复习历史和一张特定卡片作为输入,并返回一条遗忘曲线:这是一个将「自最近一次复习以来所流逝的时间 \delta \geq 0」映射为「可提取性估计值」的函数。这个输出仅当 \delta \geq 0 时才有意义;复习发生的绝对时间已经被编码在历史记录 h 中了。

通过柯里化(currying),这在数学上等价于一个扁平的函数 m: \mathcal{S} \times \mathcal{H} \times \mathcal{C} \times \mathbb{R}^+ \to [0, 1]。我们之所以使用高阶函数的形式,是为了明确地强调:该模型真正生成的是一条遗忘曲线——「流逝的时间」是对这条曲线发起的一次查询(query),而不是一个与学生、历史记录、卡片处于同等地位的输入变量。

我们之所以使用「流逝的时间」而不是「绝对时间戳」作为遗忘曲线的参数,是因为:遗忘曲线描述的本质,正是记忆是如何从一个参考点(即最后一次复习的那一刻)开始逐渐衰减的,因此「流逝的时间」才是它最自然的横坐标轴。如果使用绝对时间戳,就会把「复习是在何时发生的」与「距离那次复习已经过去了多久」这两件完全不同的事情混为一谈。使用 \delta 可以完美地将这两个关注点隔离开来,同时也让跨不同学生和卡片去推理遗忘曲线变得更加容易,因为无论那次复习发生在什么时候,\delta = 0 永远只代表一个含义:「刚刚复习过」。

在绝大多数实际应用中,我们是在一个特定流逝时间 \delta 下对模型进行查询,从而获得一个标量的可提取性估计值:

\text{retrievability}(\delta) = m(s, h, c)(\delta) = \mathbb{P}(G = 1 \mid s, h, c, \delta)

传统模型 vs. 基于内容感知的模型

这套形式化框架与传统模型有两处根本性的不同。

第一,它打破了局部独立性(local independence)的假设。大多数现有的记忆模型——无论是 DASH 及其变体,还是 Duolingo 的 HLR,抑或是 FSRS——在预测卡片 c 的可提取性时,都局限地只使用卡片 c 本身过往的复习历史:h_c = \{(t, g, o) : \text{卡片 } c \text{ 的复习记录}\}。这确实让建模变得容易处理得多,而且也是一个相当合理的初步近似——毕竟,你对某个特定医学知识点记得有多牢,确实主要取决于你复习这个特定知识点的频率。但其代价是:学生在所有其他卡片上留下的完整的学习历史,被彻底无视了。

在我们的框架中,历史记录 h \in \mathcal{H} 包含了对所有卡片的复习记录。这一点极其重要,因为复习相关的材料,可能会对给定卡片的可提取性产生强化或干扰的交叉效应。同时,这也为新卡片提供了出色的初始估计:一个能够读取卡片具体内容、并且知晓学生在相关知识点上过往学习历史的模型,完全可以在学生第一次复习那张新卡片之前,就给出一个有根据的预测,而不是像传统模型那样只能生硬地套用一个通用的先验参数。

第二,卡片是由其具体内容来表示的,而不是依赖某个分类标识符(ID)。传统系统会为每张卡片分配一个毫无意义的不透明内部 ID;而在这里,\mathcal{C} 代表的是真实的卡片内容空间。这带来了一个显著的实际好处:对卡片身份进行管理变得毫无必要了,而且对卡片的编辑修改也得到了最自然的处理——如果一张卡片的内容被大幅修改,模型就会直接把它当作一张全新的卡片来看待。传统系统必须繁琐地去追踪卡片的每一次修改,并依赖各种经验法则去判断这种修改是否大到需要重置复习调度状态;而在我们这里,这个问题压根就不存在。

稳定性、难度及衍生变量

将模型的输出定义为一条遗忘曲线,而不是某个孤立时间点上的概率,为我们解锁了一系列有用的衍生概念。其中,稳定性(Stability)可以被定义为:

\tau = \min\{\delta \geq 0 : m(s, h, c)(\delta) \leq 0.9\}

也就是说,稳定性就是当可提取性首次跌落至 90% 时所流逝的时间。这完美地兼容并推广了 FSRS 和 SuperMemo 中使用的稳定性概念,而且它的唯一前提要求仅仅是遗忘曲线最终会跌穿 0.9。

在 FSRS 和 SuperMemo 等传统模型中,稳定性与难度(difficulty) d 一起,被显式地设定为核心的隐状态(latent state)变量——难度是一个控制变量,它决定了每一次成功复习后稳定性能够增长多少,它是从复习历史中推导出来并被不断更新的。在我们的形式化框架中,这两个变量都不需要被硬性地显式追踪:模型直接接收完整的历史记录 h 和卡片内容 c 作为输入,它完全可以在内部隐式地还原出它们所蕴含的任何信息。稳定性只不过是从遗忘曲线上直接读取出来的一个衍生计算量;而关于难度,我们并没有做硬性规定——模型既可以将其作为一个显式的隐状态来维护,也可以直接从 hc 中隐式地推导出来。这就使得我们的形式化框架,能够包容地对不同模型在内部表示记忆动态的方式保持不可知(agnostic)——无论它是将其表示为显式的状态变量、神经网络的隐藏状态,还是基于时间窗口的统计计数。

二阶不确定性

可提取性(Retrievability)本质上本身就已经是一种不确定性的度量了:如果它的值是 0.5,意味着模型对于学生到底能不能回想起这张卡片完全没有把握;而如果是 0.9,则意味着模型相当自信他们能想起来。这属于一阶不确定性——是对事件最终结果的不确定性。而所谓的二阶不确定性,则是指对这个概率本身的不确定性:模型对自己给出的 0.9 这个概率估计值,究竟有多大的自信?

一个自然的问题就来了:模型能不能不仅仅只输出一个可提取性的点估计值,而是输出一个关于可提取性的概率分布——以此来同时表达出一个期望均值,以及对这个均值的置信度?在严格的数学层面上,这意味着函数 m 的陪域(codomain),将从在 [0, 1] 范围内取值的遗忘曲线,升级为在 \mathcal{M}([0, 1]) 内取值的遗忘曲线,其中 \mathcal{M}([0, 1]) 代表在 [0, 1] 区间上的概率测度集合:

m: \mathcal{S} \times \mathcal{H} \times \mathcal{C} \to \bigl(\mathbb{R}^+ \to \mathcal{M}([0, 1])\bigr)

那么,可提取性就变成了这个预测分布的期望均值:

\text{retrievability}(\delta) = \mathbb{E}_{p \,\sim\, m(s,\, h,\, c)(\delta)}[p]

Beta 分布 \text{Beta}(\alpha, \beta) 就是一个经典的例子,它的期望均值是 \frac{\alpha}{\alpha + \beta},而它的集中度(concentration) \kappa = \alpha + \beta 恰好编码了对这个均值的置信程度,当然,这种思想完全适用于任何一种概率分布形式。

这对于复习调度系统来说,将具有巨大的实际价值。试想一个学生为了应对即将到来的考试,专门标记了一组重点卡片。卡片 A 具有很高的均值可提取性,但同时有着巨大的不确定性——也就是说模型对自己的高分估计其实很虚,没底气。而卡片 B 完全是一张与考试无关的普通卡片,它的均值可提取性极低,而且不确定性极小——模型自信地认为它马上就要被彻底遗忘了。如果是一个只能看到「点估计值」的瞎子调度器,它一定会优先安排复习卡片 B,因为它的预期可提取性更低。但如果是一个能洞察「二阶不确定性」的智能调度器,它反而会优先安排复习卡片 A:因为极高的不确定性意味着它真实的可提取性极有可能会远低于均值的估算,而「考试重点」这个标签又极大地拉高了犯错的代价。死板的点估计值,根本无法支持这种对风险高度敏感的智能推理。

然而,在实际操作中,想要以一种对模型不可知(model-agnostic)的通用方式,直接从历史复习数据中去估计这种二阶不确定性,存在着一个不可逾越的根本障碍。因为对于任何一个给定的(学生,历史记录,卡片)三元组,在任何时候都永远只有一个单一的二元结果可以被观察到。更要命的是,历史记录 h 在每一次复习之后都会发生改变——对某张卡片的每一次复习,都会在 h 中追加一条观察记录,从而永久性地改变了输入给模型的基础数据。人不可能两次踏入同一条河流。这与通过无数次反复抛掷同一枚硬币来估计其正面概率偏差完全不同,在这里,你的每一次抛掷,都是在面对一枚你永远不可能再抛掷第二次的、全新的硬币。

这就意味着,任何分布形态输出结果的方差,不仅在实际操作中难以估计——而且在数学结构上,它根本就是无法被现有数据所识别的。「总方差定律(law of total variance)」精确地证明了这一点。假设 p 代表(随机的)可提取性,而观察到的二元结果 G \mid p \sim \text{Bernoulli}(p)

\text{Var}(G) = E[\text{Var}(G \mid p)] + \text{Var}(E[G \mid p]) = E[p(1-p)] + \text{Var}(p)

将第一项展开:

= E[p] - E[p^2] + \text{Var}(p) = \mu - \bigl(\text{Var}(p) + \mu^2\bigr) + \text{Var}(p) = \mu(1 - \mu)

你可以清晰地看到,\text{Var}(p) 被完完全全地彻底抵消了!二元观察结果的边际方差永远被死死钉在 \mu(1-\mu) 上,这与 p 的分布到底有多么宽泛或集中毫无关系。这个无情的结论适用于 p \in [0, 1] 上的任何概率分布,绝不仅仅是 Beta 分布——在这个推导过程中根本没有使用任何仅限于 Beta 分布的特性,唯一用到的就是 Y \mid p 服从伯努利分布。这就是说,二元观察数据中根本就不包含任何关于 \text{Var}(p) 的有效信息。如果一个模型试图输出一个带有显式集中度参数的分布形式,它可以随意地去改变这个参数而丝毫不会影响它的似然值(likelihood);这个参数的变动完全是被初始化过程和优化器的动态算法在瞎驱使,根本不是由真实数据里的信号驱动的。而且这不仅仅是似然估计方法本身的缺陷:Bengs et al. (2023) 在一篇严谨的论文中证明了,在只有二元结果的条件下,绝对没有任何一种所谓的「适当评分规则(proper scoring rule)」能够去真正激励出忠实可靠的二阶不确定性量化,这彻底堵死了试图通过寻找替代性训练目标来修补这个漏洞的最后希望。

即使我们从「单一的点估计」跨越到了「完整的遗忘曲线」,也依然无法破解这个魔咒。因为那条遗忘曲线是针对某一个特定的(学生,历史记录,卡片)三元组而生成的;只要你在这个特定时间点上观察到了一个复习结果,历史记录就不可逆转地改变了,而那条原本你可以在其他流逝时间点上去继续查询的曲线,也就不复存在了——「河流悖论」在这里依然像铁律一样有效。

破解这个死局的唯一出路,就是绝对不能再把 p 当作每一个独立实例都可以随意捏造的自由参数。如果可提取性是作为一个共享参数的确定性函数被计算出来的——比如 p = f(s, h, c, \delta; w),其中 w 是一个跨越所有学生和所有卡片通过海量数据学习出来的坚固的底层参数——那么,在一个全新查询点上对于 p 的不确定性,就纯粹是由我们对于这个底层参数 w 的不确定性引发的,而 w 是可以被海量的完整数据集精确识别出来的。此时那个令人绝望的「抵消」效应就不再生效了,因为我们不再允许 p 在虚无中自由变化;我们改变的只能是 w,而 w 会真实地出现在每一条观察记录的似然方程中。在任何查询点上分布关于 p 的「集中度」,不再是一个可以通过死记硬背拟合出来的垃圾参数——它是从 w 相对于该查询点的后验几何结构中自然地「涌现」出来的。如果一个查询点周围簇拥着海量相似的训练数据,它就会产生紧凑(确信)的不确定性;而如果它是一个孤僻、史无前例的异类,它就会产生宽泛(虚无)的不确定性。

这确实是一条通往二阶不确定性的合理且极具威力的道路,但它必须要付出沉重的代价:你必须彻底绑定并死守一种具体的参数化网络结构——比如那个 f 到底长什么样,「相似」在输入空间里到底该怎么定义,w 到底该如何共享。这些全部都是「依赖于具体模型(model-specific)」的选择。无论是贝叶斯逻辑回归、高斯过程,还是加了蒙特卡洛 Dropout(MC dropout)的神经网络,当它们面对完全相同的输入时,它们都会在不确定性表面上勾勒出截然不同的起伏轮廓。这是由它们各自固有的归纳偏置(inductive biases)强行驱动的,根本不是由我们这里探讨的一般性形式化框架所能决定的。

正因如此,在我们这套极具普适性的形式化框架中,我们依然克制地将可提取性保留为一个绝对的点估计值。二阶不确定性绝非不可实现,但它严重依赖于具体的模型架构。不同的模型家族完全可以根据自身结构假设的合理性,在各自的领地里去大显神通。

总结

一个记忆模型,本质上就是一个接收(学生,完整的复习历史记录,卡片)作为输入,并在未来的时间流逝维度上输出一条遗忘曲线的数学函数。当你在某一个特定的流逝时间点上对它进行查询时,它会返回一个精确的可提取性(retrievability)——即成功回忆起这张卡片的概率。

相较于传统的形式化框架,我们迈出的关键一步在于:我们将输入条件从单张卡片的历史,扩展到了跨越该学生所有卡片的完整复习历史,并且摒弃了死板的 ID,将卡片内容直接表示为项目空间中的向量嵌入(embeddings)。这彻底打破了僵化的「局部独立性假设」,从而让奇妙的「知识迁移」和「跨卡片遗忘模式」成为可能。

在这套极具普适性的通用框架下,稳定性(Stability)从一个必须被硬性规定的一等模型状态(first class model state),退位成了一个可以自然推导出的衍生计算量。而难度(Difficulty)则被彻底从框架级别的核心概念中剔除了,具体的模型既可以保留它,也可以将它无情抛弃。至于二阶不确定性(即关于可提取性本身的概率分布),虽然它是一个自然的进阶扩展,但如果没有依赖于具体模型的结构性假设,它在数学上根本无法从二元的复习数据中被识别出来——因此,我们将它克制地阻挡在了通用形式化框架的门外。

有了这套严密且强大的理论框架作为武装,在接下来的文章中,我们将利用它来制定一套科学严谨的记忆模型横向评测体系:我们将探讨到底该使用哪些严苛的指标,以及为什么非它们不可。


Thoughts Memo 汉化组译制
感谢主要译者 gemini-3.1-pro-preview,校对 Jarrett Ye
原文:Formalizing Memory Models - Blog - AnkiHub Community
作者:Giacomo RandazzoAidan Campbell

参考

1. 感知内容的间隔重复 ./1941069300833190267.html

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


← 返回目录