学习的数学原理
对对对!建立在一个统一的数学框架之上,结合贝叶斯推断、信息论和认知科学。它从根植于中文结构本身的难度量表开始,然后在同一量表上衡量一切:你的知识、你的技能、你的认知负荷。
1. 难度层级
应用中的每个汉字、词语和短语都有一个难度分数:一个告诉系统它有多难的数字。这些分数不是随意的:它们遵循中文本身的组合结构。简单汉字得到低分,当汉字组合成词语和短语时,组合的难度从其组成部分的难度计算得出。这创造了从简单构建块到复杂表达的自然学习进阶。
这个难度量表是系统中其他一切的基础。技能水平为N的用户应该有超过一半的概率掌握了难度分数为N或更低的任何项目。本页描述的每个模型(水平追踪、技能估计、认知负荷、卡片选择)都在这同一个量表上运作。
单个汉字
整个体系的基础。每个汉字都有一个逐条评定的难度分数,而且没有一个是随意的:每个分数都以我们制定的评分准则为衡量标准,准则写明了系统的基本原则。它对每一次定位的核心提问是「学会这个字,能让学习者做到哪些原本做不到的事?」复杂度、实用性和现实频率都在考量之列,但用准则的原话说,「语料频率不等于教学优先级」。示例:
| 汉字 | 拼音 | 含义 | 难度 |
|---|---|---|---|
| 对 | duì | correct | $1$ |
| 一 | yī | one | $2$ |
| 二 | èr | two | $3$ |
| 三 | sān | three | $4$ |
| 你 | nǐ | you | $5$ |
| 好 | hǎo | good | $6$ |
「对」占据第一级,是一个有意为之的选择,而且有两层用意:它是学习者从第一天起就用得上的字之一(表示同意、确认,也是听懂老师反馈的关键),同时它也是我们应用名字的由来!这也恰好提醒我们这条阶梯的本质:它只是众多可能的教学路径之一。是我们设计了它,我们认为它不错,但它并非权威定论,我们会随着对用户真实学习方式的了解不断迭代,更新数据与方法。
多字短语
当汉字组合成短语时,短语的难度总是高于其中最难的字,但又不会像把所有字的难度简单相加那么难。这在直觉上说得通:认识每个字给了你一个起点,但它们如何协同工作仍有额外的东西要学。
形式化地说,一个合成词 $P$ 会分解为片段 $S_1, S_2, \ldots, S_n$:词分解为它的字,更长的短语则分解为它的组成词,层层递归。难度由各片段难度(有修正时采用修正值)的平方和开根后向上取整得出:
$$\text{difficulty}(P) = \left\lceil \sqrt{\sum_{i=1}^{n} \text{difficulty}(S_i)^2} \;\right\rceil$$这个公式有几个理想的性质:
- 严格单调性:短语总比其最难的组成部分更难,由向上取整保证。
- 次可加性:$\text{difficulty}(P) < \sum_i \text{difficulty}(S_i)$:整体比各部分之和容易。
- 部件敏感性:每个组成片段都影响最终难度。
计算示例
| 短语 | 组成片段 | 计算 | 难度 |
|---|---|---|---|
| 你好 (hello) | 你(5), 好(6) | $\lceil\sqrt{25+36}\rceil = \lceil 7.8 \rceil$ | $8$ |
| 很好 (very good) | 很(7), 好(6) | $\lceil\sqrt{49+36}\rceil = \lceil 9.2 \rceil$ | $10$ |
| 不好 (bad) | 不(9), 好(6) | $\lceil\sqrt{81+36}\rceil = \lceil 10.8 \rceil$ | $11$ |
| 好吃 (delicious) | 好(6), 吃(12) | $\lceil\sqrt{36+144}\rceil = \lceil 13.4 \rceil$ | $14$ |
| 你很好 (you're very good) | 你(5), 很好(10) | $\lceil\sqrt{25+100}\rceil = \lceil 11.2 \rceil$ | $12$ |
最后一行展示了递归的作用:「你很好」并不是分解成三个单字,而是分解成「你」和词语片段「很好」,于是「很好」已经算好的难度直接进入求和。
组合规律失灵之处:难度修正
计算分数回答的是一个精确的问题:学习者何时认识了足够的字,能把这一条读出来?这是正确的默认值,我们的评分准则称之为铁律:一个词永远不能排在它最难的字之前,因为在那之前学习者根本读不出它。但语言并非完全服从组合规律,公式会朝两个方向失灵。两种失灵都由合成词记录上的一次难度修正来纠正,修正的依据是同一份准则。
有些合成词比它的部件更难。认识字不等于猜得出词。「个子」由「个」和「子」组成,认识这两个字对词义毫无帮助;「五一」要求你知道五月一日是劳动节;「而去」这样的文言结构用的全是入门级的字,语法却要到高阶才会学。还有一种更隐蔽的失灵,我们称之为「奶」原则:像「奶」和「水」这样的常用字被有意排在很前面,于是公式为它们的每一种组合都算出低分,包括「奶水」,而没有哪个学中文第一周的人需要跟酒店前台讨论这个词。这些都会被向上修正。
少数合成词要先于它的部件学会。向下修正更少见,门槛也更高:问题不是「这个词常用吗」,而是「学习者是否在能读出它的字之前就需要它」。「学生」这样的生存词汇,按部件计算会落在中级区间,却被修正到入门级,因为学习者头几周就要把它当作整体记住。「咖啡」这样的音译词也一样:它的字只是记音符号,解码本来就不是重点。向下修正会有意放宽上文的单调性保证,而这是诚实的选择:学习者确实先会了这个词,后认识它的字。
修正只落在合成词记录上,绝不落在字上,这样每个字的分数始终诚实地反映它独立的学习难度。修正终究是例外:大多数词就是由它的字直接、能产地组合而成,计算分数本身就够用。但例外也谈不上罕见,语言本来就是这样:不到 20% 的词语和 4% 的短语带有修正,其余全部以计算分数为准。
部首
部首是汉字内部反复出现的构建块,就像"水"部首(氵)出现在河(river)、海(ocean)和湖(lake)中。学习部首帮助你识别模式和猜测含义,但它们是抽象概念,只有在你见过足够多的真实汉字后才有意义。所以应用会等到你建立了扎实的汉字基础后才引入它们,确保你有足够的具体例子来锚定每个部首的含义。
部首难度的计算有利于常见部首更早出现:
$$\text{difficulty} = \max\!\Big(500,\; 500 + \frac{d_3}{\sqrt{c}} + \frac{c_{\max} - c}{10}\Big)$$其中 $d_3$ 是包含该部首的第3容易的汉字的难度,$c$ 是引用它的汉字数量,$c_{\max}$ 是被引用最多的部首的计数。常见部首更早出现;稀有的则等待。
2. 贝叶斯水平模型
把每张闪卡想象成有一个隐藏的"知识仪表",介于0%和100%之间。当你第一次遇到一张卡片时,应用真的不知道你会不会答对,你可能在那个范围的任何位置。每次复习,它观察你的表现并相应调整估计:答对了,仪表上升;答错了,它回落。经过多次复习,应用建立起越来越准确的关于你实际知道什么的图景。
数学上,我们将你对每个中文短语的知识建模为一个未知参数 $\theta \in [0,1]$ 的伯努利随机变量,表示你正确回忆它的概率。我们对 $\theta$ 放置一个Beta先验:
$$\theta \sim \text{Beta}(\alpha, \beta)$$Beta分布是伯努利似然的共轭先验,这意味着每次复习都产生一个优雅的封闭形式更新:
$$\theta \mid \text{data} \;\sim\; \text{Beta}(\alpha + s,\; \beta + f)$$其中 $s$ 是成功次数,$f$ 是失败次数。任意时刻的期望水平为:
$$\mathbb{E}[\theta] = \frac{\alpha}{\alpha + \beta}$$这个Beta分布同时携带两条信息,而这个区分对后面的一切都至关重要。它的均值 $\mathbb{E}[\theta]$ 是我们对你回忆这张卡片可能性的信念。它的精度 $\alpha + \beta$ 是我们对这个信念的信心。高均值配低精度意味着"我们认为你会,但不确定",这个状态正是第4节隐含证据模型的核心。
复习评分更新
每次复习后,你告诉应用进展如何:简单、良好、困难或失败。每种回应提供不同量的证据。轻松答对是你掌握材料的强烈信号。点击"困难"是你仍在努力的温和提示。以下是每种结果如何调整模型:
| 结果 | $\Delta\alpha$ | $\Delta\beta$ | 解释 |
|---|---|---|---|
| 简单 (EASY) | $+1.0$ | · | 掌握的强证据 |
| 良好 (GOOD) | $+0.7$ | · | 掌握的中等证据 |
| 困难 (HARD) | · | $+0.3$ | 困难的轻微证据 |
| 失败 (FAIL) | · | $+1.0$ | 未掌握的强证据 |
保守收敛
系统是刻意保守的:它不会在仅一两次正确回答后就判定你已掌握。掌握需要通过持续表现来获得。这意味着幸运猜测不会欺骗系统,但真正的知识总会被认可:
| 经过 $n$ 次简单评分 | 分布 | $\mathbb{E}[\theta]$ |
|---|---|---|
| $n = 0$ | $\text{Beta}(1, 1)$ | $0.50$ |
| $n = 1$ | $\text{Beta}(2, 1)$ | $0.67$ |
| $n = 3$ | $\text{Beta}(4, 1)$ | $0.80$ |
| $n = 10$ | $\text{Beta}(11, 1)$ | $0.92$ |
这种保守性防止了幸运猜测带来的过度自信,同时允许真正的掌握随时间被认可。
3. 组成部分归因
每一种人类语言都是组合式的:更大的意义由更小的部分组装而成。中文之所以特别便于这样建模,是因为它的书写系统把这种结构直接摆在表面:词由可见的汉字组成,汉字又由部首和笔画组成。所以当你成功复习像好吃(delicious)这样的短语时,这不仅告诉我们关于短语的信息,还告诉我们关于组成它的单个汉字好和吃的信息。你显然也认识这些汉字,否则你不可能答对短语。
但微妙之处在于:并非短语中的每个汉字都值得同等的功劳。如果一个汉字比另一个难得多,而你答对了整个短语,那么难的汉字是更令人印象深刻的部分。所以我们给它更多的功劳。
基于难度的加权归因
当一次短语复习被投射到它的组成部分上时,每个组成部分分得的功劳与其难度成正比。对于难度为 $d_i$ 的组成部分 $i$,归一化权重为:
$$w_i = \frac{d_i}{\displaystyle\sum_{j} d_j}$$求和遍历短语的完整广度优先分解(它的组成汉字,以及递归地,它们的部首和笔画),所以每个单独的份额都很小,而更难的组成部分得到更大的切片。让权重与难度成正比(而不是某种更陡的关系),确保有意义的证据能传到每一个组成部分,而不只是唯一一个最难的。每个组成部分收到相同的结果(一个简单的父短语为每个组成部分产生一个简单的隐含信号);只有大小(权重)不同。
对于结果为 $O$ 的复习,每个组成部分收到加权更新:
$$\Delta\alpha_i = w_i \cdot \Delta\alpha(O) \qquad\qquad \Delta\beta_i = w_i \cdot \Delta\beta(O)$$计算示例
假设你在「好吃」上评了 EASY(容易),其中「好」的难度为 6,「吃」的难度为 12。仅看这两个字:
$$w_{\text{好}} = \frac{6}{6 + 12} = \frac{6}{18} \approx 0.33 \qquad\qquad w_{\text{吃}} = \frac{12}{6 + 12} = \frac{12}{18} \approx 0.67$$所以「吃」得到「好」两倍的归因:更难的字得到更多功劳,同时仍与更容易的那个分享真实的证据。在真实系统中,分解会一路向下延伸到部首和笔画,所以每个原始份额只是百分之几的一小部分;下一节解释如何把这些微小的份额转化为有用的证据,而又绝不把它误认为是确证。
4. 直接证据 vs. 隐含证据
组成部分归因引出一个微妙的问题。当你把好吃复习为简单时,你直接证明了你认识这个短语。但你只间接地证明了你认识好和吃。也许你把整个词当作一个单位识别出来,也许是上下文带着你过去的。这种隐含证据是真实而有用的,但绝不应该被误认为是对那些汉字的直接测试。在一百个句子里见到一个汉字应该提高我们对你认识它的信念,但不应该把信心提高到足以宣布它已掌握、不再展示给你的程度。
解决方案是在每个词语背后保留两本独立的账本,每当任何东西变化时就把它们重新组合。
两个桶
- 直接桶 $(\alpha_d, \beta_d)$ 是一个Beta分布,只由对词语本身的全权重直接复习喂养,从 $\text{Beta}(0.5, 0.5)$ 先验开始。这些就是第2节里同样的 $+1.0 / +0.7 / +0.3 / +1.0$ 更新。
- 隐含桶累积来自第3节的微小的、按难度加权的份额,每当词语出现在你复习的短语里就累加一次。因为每个原始份额只是百分之几的一小部分,它会先被一个增益因子(≈ 40)提升到有意义的范围,再被加进去: $$w = \text{归一化权重} \times \text{增益} \qquad (\text{增益} \approx 40 \text{ 把 } \sim0.003 \text{ 提升到 } \sim0.12)$$
融合
存储的、有效的分布在每个事件后从两个桶重新计算。隐含桶的伪计数给出一个隐含均值 $m$,而它的总质量(经过封顶)给出一个隐含强度(精度):
$$m = \frac{a_i}{a_i + b_i} \qquad\qquad \text{strength} = \min(a_i + b_i,\; s_{\text{cap}}) \cdot \gamma(n_d)$$ $$\alpha_{\text{eff}} = \alpha_d + \text{strength} \cdot m \qquad\qquad \beta_{\text{eff}} = \beta_d + \text{strength} \cdot (1 - m)$$ $$\theta = \frac{\alpha_{\text{eff}}}{\alpha_{\text{eff}} + \beta_{\text{eff}}} \qquad\qquad \text{uncertainty} = \frac{1}{\alpha_{\text{eff}} + \beta_{\text{eff}} + 1}$$两个杠杆完成全部工作:
- 封顶 $\min(\cdot,\, s_{\text{cap}})$ 限制了上下文能买到多少精度。上下文可以把 $\theta$ 推高,但不确定性保持高,所以仅靠上下文的词语永远通不过低不确定性的掌握测试。当 $s_{\text{cap}} = 0.8$ 时,一个只在简单上下文中见过的汉字落在 $\theta \approx 0.72$、$\text{uncertainty} \approx 0.36$:被相信认识,刚好在掌握线下方,并且明显不自信。
- 消化因子 $\gamma(n_d) = \dfrac{1}{1 + n_d / k}$ 随着直接复习到来而让隐含桶淡出($n_d$ 是直接复习计数,$k = 3$)。隐含影响在3次直接复习后减半,在9次后变为四分之一。一旦你真正被测试得足够多,你的分数就完全由直接证据驱动,上下文证据不再重要。
三个状态,而非两个
把信念和信心分开,在"主动学习"和"退休"之间创造了第三个状态:一个你大概从上下文认识、但系统尚未确认的词语:
| 状态 | $\theta$(信念) | 不确定性 | 由什么驱动 |
|---|---|---|---|
| 主动 | ~0.5 | 高 | 正在学习 |
| 休眠(暂定认识) | 高 | 仍然高 | 仅上下文 |
| 已确认(退休) | 高 | 低 | 直接复习 |
上下文可以把一个词语从主动 → 休眠,于是它停止增加认知负荷、停止被反复练习,但只有直接证据能把它从休眠 → 已确认。因此任何"你已掌握这个,停止复习"的决定都同时要求 $\theta \geq 0.8$ 和 $\text{uncertainty} < 0.10$。休眠状态通过第一个测试,并刻意未通过第二个,所以一个暂定认识的词语保持为低频确认候选,并在一个相关项目失败的那一刻立即被重新浮现。
无需每夜扫描的遗忘
旧的上下文信号应当淡去:一个你上个月见过几百次的词语,不该让它的均值被远古的相遇牢牢钉住。与其每夜重新触碰每个词语(那会淹没同步),不如只在写入时施加衰减,就在一个事件已经触碰到该词语的那一刻:
$$\text{factor} = 0.5^{\,\Delta\text{days} \,/\, \text{halfLife}} \qquad (\text{halfLife} = 30 \text{ 天})$$隐含计数在新信号加入之前先乘以这个因子。事件之间,存储的值只是一个冻结的快照(正如直接桶本就的行为),所以读取保持为一次普通查找。这让隐含均值对近期表现保持响应。
为什么重要:迁移学习
这个两桶模型带来系统的核心优势(汉字从包含它们的短语中获得水平),同时让这种推断出的知识保持诚实:
- 引导起步:在好被单独练习之前,对好吃、好看、好听的简单复习累积隐含证据,把好提升到休眠状态:被相信认识,尚未确认。
- 更少冗余练习:休眠的组成部分退出主动轮换,所以你的复习花在真正新的东西上,而不是反复证明你已经知道的。
- 自我纠正:因为休眠词语保持高不确定性,一次相关的失败会立即重新浮现它们;上下文被当作假设,而非定论。
| 参数 | 默认值 | 作用 |
|---|---|---|
| $\text{增益}$ | $40$ | 把一次上下文相遇从可忽略(~0.003)提升到有意义(~0.12 个"简单单位") |
| $s_{\text{cap}}$ | $0.8$ | 给隐含精度封顶:约束信心,而非信念 |
| $k$ | $3$ | 消化速率:隐含影响在 $k$ 次直接复习时减半 |
| $\text{halfLife}$ | $30$ 天 | 陈旧上下文信号的写入时衰减半衰期 |
5. 技能水平追踪(卡尔曼式 IRT)
除了追踪单个卡片,应用还维护你整体技能水平的估计:一个代表你大致能处理多难卡片的数字。这个数字与语料库在同一个难度量表上:技能水平100意味着你应该能舒适地处理难度100及以下的汉字和短语。
这个估计是刻意谨慎的:它只在你做出令人惊讶的事情时才移动。答对一张简单卡片不能证明任何新东西,答错一张难卡片是预料之中的。但答对一张难卡片?那是有意义的证据,表明你的技能水平应该提高。
技术上,这是建立在项目反应理论(IRT)之上的卡尔曼滤波式更新。每次有信息量的复习被视为对你真实技能的一次带噪声的高斯观测,更新的大小取决于这次观测实际携带了多少信息。靠近当前估计的干净观测会显著移动指针;远离估计的异常观测则会被适当地打折扣。
双参数模型
你的技能由 $\mu$(当前估计)和 $\sigma$(不确定性)表示:
$$\text{skill} = \big(\mu,\; \sigma\big) \qquad \text{initially} \;(\mu_0 = 0,\;\sigma_0 = 75)$$任意时刻的95%置信区间为:
$$\text{CI}_{95\%} = \mu \pm 1.96\,\sigma$$非对称证据钳制
更新的第一道过滤器是信息量钳制:并非所有复习结果都同样有诊断价值。想象你是一个技能100的学习者,答对了难度5的卡片;当然你会答对,对你来说太简单了。但如果你答对了难度150的卡片,那是真正的新闻。系统只在结果真正令人惊讶时才移动你的技能估计:
| 结果 | 卡片 vs $\mu$ | 有信息量? | 效果 |
|---|---|---|---|
| 成功 | difficulty $> \mu$ | 是 | $\mu$ 向难度移动 |
| 失败 | difficulty $< \mu$ | 是 | $\mu$ 向难度移动 |
| 成功 | difficulty $\leq \mu$ | 否 | $\mu$ 无变化 |
| 失败 | difficulty $\geq \mu$ | 否 | $\mu$ 无变化 |
卡尔曼更新规则
当令人惊讶的结果触发时,我们把卡片难度 $d$ 看作对你真实技能的一次带噪声测量。观测方差取决于卡片离当前估计有多远,以及结果信号有多强:
$$\tau^2 \;=\; \tau_0^{\,2} \cdot \left(1 + \left(\frac{d - \mu}{\text{distanceScale}}\right)^{\!2}\right) \;\big/\; \text{strength}(\text{outcome})$$然后由卡尔曼增益 $K$ 决定我们闭合多少差距:
$$K \;=\; \frac{\sigma^2}{\sigma^2 + \tau^2} \qquad\qquad \mu' \;=\; \mu + K \cdot (d - \mu) \qquad\qquad \sigma'^{\,2} \;=\; (1 - K)\,\sigma^2$$这个公式自然地带来三个性质:
- 远离估计的异常观测几乎不会移动 $\mu$。远离当前估计的卡片会产生很大的 $\tau^2$,从而压缩 $K$,从而压缩更新幅度。当 $\mu=50$ 时一次在 $d=500$ 卡上的成功,会把你从 50 推到约 73,而不是 207。
- 偶然的失误不会拖垮已建立的估计。一旦 $\sigma$ 变小,同样远的观测会产生更小的 $K$。当 $\mu=200$ 时在 $d=50$ 简单卡上的一次 FAIL 几乎不会影响你。
- $\mu$ 更新是凸的。因为 $K \in [0,1]$,$\mu'$ 总是落在你当前的估计和卡片难度之间;它永远不会越过你刚答的那张卡片的难度。
结果强度
强度权重反映了每种结果携带多少信号。EASY 和 FAIL 是干净的"我会"或"我不会"信号;GOOD 稍微嘈杂一些;HARD 最嘈杂,因为它混合了部分成功与部分失败:
| 结果 | strength | 解释 |
|---|---|---|
| EASY | $1.0$ | 干净的成功信号 |
| GOOD | $0.7$ | 略有摩擦的成功 |
| HARD | $0.4$ | 模糊:混合了部分成功与失败 |
| FAIL | $1.0$ | 干净的失败信号 |
会呼吸的不确定性
普通的卡尔曼滤波只会缩小它的不确定性:因为 $\sigma'^2 = (1-K)\sigma^2$,每次更新都让 $\sigma$ 变小、从不变大。当你测量的是一个静止不动的量时这完全正确,但学习者的技能并非固定;它在增长,有时是跳跃式的。如果 $\sigma$ 被允许坍缩,增益 $K$ 也随之坍缩,估计就停止跟踪一个仍在变化的学习者。
修复办法是让 $\sigma$ 呼吸:当模型真正感到惊讶时变宽,当它校准良好时收紧。在每次卡尔曼修正之前,我们按近期预测错得有多离谱来给先验方差充气。关键量是归一化创新:预测误差相对于模型预期的误差有多大。
我们把每个结果按 0–1 量表打分($s$:FAIL 0,HARD 0.3,GOOD 0.85,EASY 1.0),并与模型预测的分数 $p_e$ 比较,预测方差为 $p_v$(两者都来自在卡片难度上求值的四结果分级反应模型):
$$\text{NIS} = \min\!\left(\frac{(s - p_e)^2}{p_v + \text{floor}},\; \text{nisCap}\right) \qquad\qquad \overline{\text{NIS}}' = (1-\lambda)\,\overline{\text{NIS}} + \lambda\,\text{NIS}$$ $$\text{inflation} = 1 + q \cdot \max\!\big(0,\; \overline{\text{NIS}}' - 1\big) \qquad\qquad \text{priorVar} = \sigma^2 \cdot \text{inflation}$$一个完美校准的模型有 $\overline{\text{NIS}} = 1$:它的残差恰好和它预期的一样大。只有当平滑后的 NIS 持续高于 1(意味着 $\mu$ 真的估错了,而不只是你抽到一张天生五五开的卡片),充气因子才超过 1 并重新打开先验。这个充气后的 $\text{priorVar}$ 随后在上面的卡尔曼更新中取代 $\sigma^2$。旋钮 $q$ 控制惊讶把先验重新打开的力度;当 $q = 0$ 时充气关闭,$\sigma$ 只会缩小。
噪声下限。分母包含一个随难度增长的下限 $\text{floor} = 0.08 + 0.30 \cdot (d / 1000)$,由真实复习数据拟合。它吸收难度分数无法捕捉的"诚实的"不可预测性:组成部分简单却意义不简单的非组合性成语(上门、心里过不去),以及技术或专有名词(奥尔特云)。这使得真实的模型噪声不被误认为是估错的技能。
收敛示例
一个新用户按照上升课程复习(难度从 20 爬到 500,真实技能 = 400),共 300 次复习:
| 复习 | 难度 | $\mu$ |
|---|---|---|
| 1 | $20$ | $14$ |
| 30 | $66$ | $49$ |
| 60 | $114$ | $87$ |
| 120 | $210$ | $186$ |
| 180 | $306$ | $283$ |
| 240 | $402$ | $367$ |
| 300 | $498$ | $395$ |
估计跟踪真实技能的误差在约 1% 以内:平滑、无剧烈波动。有了会呼吸的不确定性,$\sigma$ 在陡峭的早期攀升中保持较高(当 $\mu$ 仍在移动时),只有当 $\mu$ 接近真实技能时才收紧,全程是诚实的置信区间。
回报。面对一个第一天真实技能就已约 650 的合成学习者,会呼吸的不确定性只需 25–40 次复习就把 $\mu$ 校准到真实水平,并且因为 $\mu$ 更新是凸的,它做到这一点时从不超过真实技能。
不确定性的上下限
不确定性如今是一个活的量,被靠近 $\mu$ 的有信息量复习往下压,又被令人惊讶的预测误差往上推。这两股力量的平衡设定一个动态稳态,而不是把 $\sigma$ 钉在下限。下限 $\sigma_{\min} = 10$ 只防范病态的过度自信(足够低,让一个真正校准良好的估计能报告一个紧致的区间),而上限 $\sigma_{\max} = 120$ 约束惊讶能把先验重新打开多远,即使在模型失配下也保持数学的良好条件。
6. 认知负荷模型
你有没有一次塞太多新词汇结果一个都没记住?那就是认知过载,它是有效语言学习的最大敌人。对对对!持续监控你正在处理的脑力工作量,并相应调整节奏。当你精力充沛、状态良好时,它引入新材料。当你到达极限时,它放慢速度,专注于巩固已经见过的内容。
系统追踪四个因素来估计你的认知负荷:每张卡片的不确定程度、你对它的掌握程度、它相对于你水平的难度,以及你作为学习者的总容量。
只有活跃卡片(你直接复习过的卡片)贡献认知负荷。处于休眠状态的卡片,即仅通过组成部分归因的隐含证据获知的卡片(第4节),被排除在外。它们代表推断的知识,而非主动学习负担,这正是隐含桶小心地绝不让上下文单独使一张卡片退休的原因:一个休眠词语已经停止消耗你的认知负荷。
注意力需求
一张你从未见过的卡片需要最大注意力,它可能是任何东西。一张你复习过很多次的卡片,无论你掌握得好不好,需要更少的注意力,因为你至少已经在脑中对它进行了分类。系统使用你知识估计的统计不确定性来衡量:
$$\text{Var}[\theta] = \frac{\alpha\beta}{(\alpha+\beta)^2(\alpha+\beta+1)}$$我们将其归一化为注意力分数:
$$\text{attention} = \sqrt{\frac{\text{Var}[\theta]}{0.25}}$$最大注意力出现在 $\text{Beta}(1,1)$(从未见过)。随着证据积累,注意力向零下降,无论卡片是容易还是困难;你只是已经对它进行了分类。
掌握因子
随着你在一张卡片上变得更好,它占用的脑力空间更少。这不是突然的切换,而是一条平滑的曲线,水平的每一小步提升都给你多一点呼吸空间。一张你80%有信心的卡片几乎不会被记录为认知负荷:
$$m(\theta) = \frac{1}{1 + e^{12(\theta - 0.65)}}$$| $\theta$ | $m(\theta)$ | 缓解 |
|---|---|---|
| $0.50$ | $0.95$ | 5%:卡片开始记住了 |
| $0.60$ | $0.73$ | 27%:知识在巩固 |
| $0.70$ | $0.38$ | 62%:基本掌握 |
| $0.80$ | $0.11$ | 89%:完全掌握 |
| $0.90$ | $0.01$ | 99%:自动回忆 |
水平的每一步提升都提供切实的缓解,没有停滞感。
相对难度权重
难度始终是相对的。难度50的卡片对初学者来说是压倒性的,但对中级学习者来说是微不足道的。系统将每张卡片的难度与你当前的技能水平进行比较,所以匹配你水平的卡片总是贡献相同的负荷,无论你是在第一天还是第三百天:
$$r = \sqrt{\frac{\text{difficulty}}{\text{effective\_skill}}} \qquad\text{where}\quad \text{effective\_skill} = \max(\mu, 10)$$在你技能水平上的卡片权重始终 $\approx 1.0$,无论你是初学者(技能10,难度10)还是中级(技能500,难度500)。
认知容量
初学者只能同时处理几张卡片就会感到不堪重负。但随着你学更多中文,你发展出心理捷径、模式识别和上下文锚点,让你能同时处理更多材料。系统建模了这种增长的容量:高级学习者可以舒适地管理比初学者多十倍的活跃卡片:
$$\text{capacity} = \text{effective\_skill}^{\,0.6}$$| 技能水平 | 容量 | ~80%负荷的卡片数 |
|---|---|---|
| 10(初学者) | $4.0$ | ~10 |
| 100 | $15.9$ | ~39 |
| 500(中级) | $41.6$ | ~100 |
| 2000(高级) | $95.6$ | ~235 |
综合负荷
把它们放在一起:每张卡片的认知成本取决于它有多不确定、你掌握得多好、对你水平来说有多难,以及你的总容量。将所有活跃卡片的这些值加起来,你得到一个代表你大脑"满载"程度的数字:
$$\ell_i = \frac{\text{attention}_i \;\cdot\; m(\theta_i) \;\cdot\; r_i}{\text{capacity}}$$总认知负荷是所有活跃卡片的总和:
$$L = \sum_{i \in \text{active}} \ell_i$$容量归一化确保"80%负载"始终意味着"接近你的个人极限",无论那个极限是10张卡片还是235张。
7. 自适应卡片选择
这是所有部分汇聚在一起回答最重要问题的地方:你接下来应该学什么?系统面临一个基本权衡:引入新的令人兴奋的东西,还是回去巩固你仍在学习的东西?太多新材料你会全忘了。太多复习你会感到无聊。答案是把每个选择都路由到一小组专门的池子里。
五池路由器
选择器不再是一次单纯的新-对-复习的抛硬币,而是从五个池子里抽取,每个池子有独特的教学职责:
- 巩固:你正在主动学习的卡片,在它们的水平处于最佳区域(约 $\theta = 0.5$,再看一眼最划算的地方)时浮现。
- 组合(向上构建):当你认识各组成部分时,系统提供它们形成的复合词(好 + 人 → 好人),把已稳固的知识变成新的触及范围。
- 分解(向下拆解):当一个复合词不断绊倒你时,系统练习它底下的各个部件。
- 探索:在你能力前沿的真正新材料,以精心选择的难度引入(见下文)。
- 陈旧:你很久没见过的东西,在遗忘发生之前重新浮现。
每个池子贡献多少,取决于你实时的认知负荷(第6节):当你有余量时,新材料的池子打开;当你接近容量时,路由器转向巩固和陈旧。
难度定位:成功率控制器
新材料应该有多难?直觉答案("你的技能估计 $\mu$,再加一点")其实暗藏危险,因为估计可能自信地错。如果你被喂简单卡片,模型从不感到惊讶,于是 $\sigma$ 坍缩、$\mu$ 停在那里未校准,而基于 $\mu$ 的目标会乐意把你永远停在简单卡片上,确信自己做得对。
所以新材料难度根本不从 $\mu$ 读取。它来自一个独立的探测难度 $P$,在每次前沿复习后由一个追逐目标成功率的简单控制器轻推:
$$P \;\leftarrow\; \max\!\big(0,\; P + \eta \cdot (\text{score} - \text{target})\big) \qquad (\text{仅当 } d \geq P - \text{band})$$其中 $\text{score}$ 是 0–1 量表上的结果(FAIL 0,HARD 0.3,GOOD 0.85,EASY 1.0),$\text{target}$ 是你瞄准的成功率,$\eta \approx 70$ 难度单位是步长。当你轻松答对前沿卡片时,$P$ 上升;当你开始答错它们时,$P$ 下降,所以它从任一方向收敛到你的观测成功率等于目标的那个难度。前沿守卫($d \geq P - \text{band}$,其中 $\text{band} \approx 80$)确保只有真正的新材料移动 $P$;轻松答对一张简单的巩固卡片会被忽略。
因为控制器依据观测到的成功(基本事实)而非模型的预测,它无法被一个自信地错的估计欺骗:只要你不断答对,$P$ 就不断攀升,无论 $\mu$ 和 $\sigma$ 多么确信。这干净地分离了两项工作。你在设置里选的"挑战级别"只是选择目标成功率(更容易的设置让你停在更高的成功率上);$\mu$ 和 $\sigma$ 则被解放出来做它们擅长的事(驱动显示、置信带、认知负荷,以及第5节会呼吸的不确定性数学),而不必同时挑选你的下一张卡片。
8. 如何协同运作
每次你点击按钮(简单、良好、困难或失败),你都在系统的每一层引发连锁反应。你的知识估计更新,你的技能水平调整,你的认知负荷重新校准,下一张卡片被选择。这一切在毫秒内发生,结果是一种感觉像在读你心思的学习体验。
完整的连锁过程:
- 复习事件:更新短语的直接贝叶斯桶,并将微小的、线性加权的隐含更新向下传播到每个组成部分:汉字、部首和笔画。
- 有效分数:重新融合每个受影响词语的直接桶和隐含桶,给上下文能买到的信心封顶,于是新认识的组成部分稳定进入休眠状态。
- 技能更新:按结果有多令人惊讶给不确定性充气,然后,如果结果有信息量,就应用卡尔曼修正,按真实证据成比例地移动 $\mu$ 并重塑 $\sigma$。
- 认知负荷:根据所有活跃卡片的注意力、掌握度、相对难度和容量重新计算 $L$。
- 卡片选择:按认知负荷给五个池子加权,并选择下一张卡片,以成功率控制器已收敛到的难度抽取新材料。
使这个系统健壮的是它能自我纠正。几个自然反馈回路保持一切平衡:
- 过载保护:高 $L$ → 更少新卡片 → $L$ 下降。
- 进度加速:低 $L$ → 更多新卡片 → 持续挑战。
- 难度校准:成功率控制器追逐你的真实表现 → 新材料落在恰当的挑战上,无论估计误差如何。
- 会呼吸的信心:有信息量的复习缩小 $\sigma$;令人惊讶的预测误差重新加宽它 → 报告的信心随着你的变化保持诚实。
- 迁移学习:短语复习为组成部分建立隐含证据 → 更少冗余练习,以高不确定性作为安全网。
结果是一种毫不费力的学习体验,因为数学在每张卡片背后承担了繁重的工作。