SmartRecall における SM-2 の仕組み
SM-2 間隔反復アルゴリズムの動作例 ―― 初期間隔、イーズファクターの更新、ラプス、そして SmartRecall がどう実装しているか。
4月 29, 2026
SmartRecall における SM-2 の仕組み
SM-2 は、Piotr Wozniak が 1987 年の SuperMemo 論文 で発表した間隔反復アルゴリズムです。Anki や Mnemosyne の中核にも使われています。このページでは、SmartRecall がそれをどのように実装しているのかを ―― 定数からすべての遷移まで、実例付きで ―― 正確にドキュメント化します。
60 秒でわかる概要
復習のたびに、想起の感触を採点します。
- Again (0) — 失敗、思い出せなかった
- Hard (3) — 思い出せたが、かなり苦労した
- Good (4) — 普通の労力で思い出せた
- Easy (5) — 楽に思い出せた
SM-2 はこの採点を使って、カードごとに 2 つの数値を更新します。
- 間隔 (
I) — 次の復習までの日数 - イーズファクター (
EF) — 間隔の伸び率を決める乗数
評価が高いほど → EF が大きく → 間隔がより速く伸びます。評価が低いほど → EF が小さく → 間隔が詰まります。失敗すると間隔はリセットされますが、EF は少し下がるだけです。
SmartRecall が使う厳密なルール
Initial values for a new card:
I = 0 (will be set on first review)
EF = 2.5
reps = 0 (consecutive successful reviews)
On review with quality q (0–5):
if q < 3: // lapse
reps = 0
I = 1 // back to 1 day
// EF still updates below
else: // success
if reps == 0: I = 1
elif reps == 1: I = 6
else: I = round(I_prev * EF)
reps = reps + 1
EF = max(1.3, EF + (0.1 - (5 - q) * (0.08 + (5 - q) * 0.02)))EF の式は、評価ごとに次のような扱いやすい数値に収束します。
| 評価 | q | EF 変化 |
|---|---|---|
| Again | 0 | −0.80 |
| Hard | 3 | −0.14 |
| Good | 4 | 0.00 |
| Easy | 5 | +0.10 |
EF は最小値 1.3 で下限を設けています ―― ラプスが何回続いても、これより遅い指数増加にはしません。
動作例
「spacing effect とは何か?」という新しいカードの場合:
| 復習 | 評価 | q | 後の reps | 後の EF | 後の I | 次の復習 |
|---|---|---|---|---|---|---|
| 1 | Good | 4 | 1 | 2.50 | 1 日 | 明日 |
| 2 | Good | 4 | 2 | 2.50 | 6 日 | +6 日 |
| 3 | Easy | 5 | 3 | 2.60 | 16 日 | +16 日 |
| 4 | Hard | 3 | 4 | 2.46 | 39 日 | +39 日 |
| 5 | Again | 0 | 0 | 1.66 | 1 日 | 明日(ラプス) |
| 6 | Good | 4 | 1 | 1.66 | 1 日 | +1 日 |
| 7 | Good | 4 | 2 | 1.66 | 6 日 | +6 日 |
いくつか注目すべき点があります。
- 最初の 2 つの間隔(1 日 → 6 日)は 固定 で、乗算されません。SM-2 はこれをハードコードしており、新しいカードが高い
EFのせいでいきなり 30 日先まで飛んでいかないようにしています。 - 復習 4 のあとの間隔は
round(16 * EF) = round(16 * 2.46) = 39です。 - 復習 5 はラプスです ――
repsは 0 にリセット、Iも 1 にリセットされますが、EFは 0.80 下がるだけ(2.5 に戻るのではない)です。カードは「負傷」状態であって、消去されたわけではありません。 - ラプス後のスケジュールは 1 → 6 のランプを 繰り返しません。復習 6 が成功だったので、復習 6 以降は
reps = 1から続きます。
SmartRecall が変えていること
SM-2 は床であって、天井ではありません。私たちは実用上 3 つの調整を加えています。
- Hard 評価でのソフトラプス。 Hard を 3 回連続で付けると、次の間隔を
I_prevで頭打ちにします ―― つまり、苦戦し続けるカードは、Good に切り替わるまで伸びを止めます。素の SM-2 はEFで掛け続けて、出現頻度を下げ続けてしまいます。 - リーチ検出。 あるカードが累計 8 回ラプスしたら、リーチとしてタグ付けし、ダッシュボードに表示して書き直せるようにします。悪いカードはアルゴリズムの問題ではなく、ワークフローの問題です。
- 生成時刻からの決定論的シーディング。 AI が 200 枚のデッキを生成したとき、すべてを 1 日目に出すのではなく、カード ID の決定論的ハッシュを使って、最初の
I = 1復習を次の 5 日間に分散させます。これにより、毎日の復習キューが平らに保たれます。
それ以外 ―― EF の式、1/6 日のランプ、1.3 の下限、ラプスのセマンティクス ―― はすべて 1987 年の論文そのままです。
なぜ FSRS にしないのか?
FSRS は、復習履歴からユーザーごとの保持曲線を学習する、より新しいスケジューラです。約 1000 回の復習を超えると、SM-2 より測定可能なほど優れています。私たちはこれをオプトインのスケジューラとして取り組んでいます ―― リリース状況は Updates でご確認ください。
さらに読む
- Wozniak, P. (1990). Optimization of learning. 元の SM-2 仕様。
- Cepeda, N. J., et al. (2006). Distributed practice in verbal recall tasks: A review and quantitative synthesis. Psychological Bulletin. 317 件の実験にわたる spacing effect のメタ解析。
- Karpicke, J. D., & Roediger, H. L. (2008). The critical importance of retrieval for learning. Science. SM-2 が暗黙のうちに依存しているテスト効果の論文。
