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 つの数値を更新します。

  1. 間隔 (I) — 次の復習までの日数
  2. イーズファクター (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 の式は、評価ごとに次のような扱いやすい数値に収束します。

評価qEF 変化
Again0−0.80
Hard3−0.14
Good40.00
Easy5+0.10

EF は最小値 1.3 で下限を設けています ―― ラプスが何回続いても、これより遅い指数増加にはしません。

動作例

「spacing effect とは何か?」という新しいカードの場合:

復習評価q後の reps後の EF後の I次の復習
1Good412.501 日明日
2Good422.506 日+6 日
3Easy532.6016 日+16 日
4Hard342.4639 日+39 日
5Again001.661 日明日(ラプス)
6Good411.661 日+1 日
7Good421.666 日+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 つの調整を加えています。

  1. Hard 評価でのソフトラプス。 Hard を 3 回連続で付けると、次の間隔を I_prev で頭打ちにします ―― つまり、苦戦し続けるカードは、Good に切り替わるまで伸びを止めます。素の SM-2 は EF で掛け続けて、出現頻度を下げ続けてしまいます。
  2. リーチ検出。 あるカードが累計 8 回ラプスしたら、リーチとしてタグ付けし、ダッシュボードに表示して書き直せるようにします。悪いカードはアルゴリズムの問題ではなく、ワークフローの問題です。
  3. 生成時刻からの決定論的シーディング。 AI が 200 枚のデッキを生成したとき、すべてを 1 日目に出すのではなく、カード ID の決定論的ハッシュを使って、最初の I = 1 復習を次の 5 日間に分散させます。これにより、毎日の復習キューが平らに保たれます。

それ以外 ―― EF の式、1/6 日のランプ、1.3 の下限、ラプスのセマンティクス ―― はすべて 1987 年の論文そのままです。

なぜ FSRS にしないのか?

FSRS は、復習履歴からユーザーごとの保持曲線を学習する、より新しいスケジューラです。約 1000 回の復習を超えると、SM-2 より測定可能なほど優れています。私たちはこれをオプトインのスケジューラとして取り組んでいます ―― リリース状況は Updates でご確認ください。

さらに読む