忘れるタイミングを予測するAIをどう作ったか(スぺースド・リピティションを大規模に)

Dev.to / 2026/4/23

💬 オピニオンDeveloper Stack & InfrastructureSignals & Early TrendsIdeas & Deep AnalysisModels & Research

要点

  • 記事では、忘却は一定の法則(エビングハウス、1885年)に従うため、これを活用してスぺースド・リピティションのスケジュール設計に生かせると述べています。
  • 代表的な手法であるSM-2(Ankiで使用)を、学習者の過去の理解度や記憶の安定性に関係なく同じ復習間隔を適用してしまう点で批判しています。
  • 執筆者のチームはフランスの医学部受験生向けにAIの記憶システムを構築し、忘却を「項目の難しさ」「学習者の安定性」「類似項目との混同(コンテキスト干渉)」の3要因でモデル化する方針を提示します。
  • 実装上の重要な学びとして、(カード単位のグローバルな)「イーズファクター」のようなパラメータを、学習者×項目×状況ごとの推定へ置き換えることが、忘れるタイミング予測の精度に直結する点を強調しています。
  • 全体として、スぺースド・リピティションを大規模に行うには、画一的なルールではなくデータ駆動のパーソナライズ予測が有効だという結論です。

忘れてしまうタイミングを予測するAIは、どう作ったのか

忘却はランダムではありません。一定のカーブをたどります——エビングハウスが1885年に発見したものです——そしてそのカーブが分かれば、それに対抗できます。

Ask Amélieでは、フランスの医学系学生向け(PASS/ECN試験)のAIメモリーシステムを開発しました。ここでは、大規模にスペースド・リピティションを実装する際に学んだことをまとめます。

従来のスペースド・リピティションの問題点

SM-2(Ankiの背後にあるアルゴリズム)は優れていますが、全ての学生を同じものとして扱います。先学期に生化学で満点を取った学生と、初めてそれに直面する1年生が、同じ復習間隔を得ることになります。

これは誤りです。

# SM-2を簡略化
def next_interval(ease_factor, interval, grade):
    if grade >= 3:
        if interval == 1:
            return 6
        elif interval == 6:
            return round(interval * ease_factor)
        else:
            return round(interval * ease_factor)
    else:
        return 1  # リセット

問題はこれです:ease_factorはカードごとのグローバル値であって、「学生×カード×文脈」ごとではありません。

代わりに作ったもの

私たちは忘却を、3つの変数の関数としてモデル化します:

  1. 項目の難しさ — 集団の成績から推定
  2. 学生の安定性 — この学生が記憶を定着させる速さ
  3. 文脈による干渉 — 学生は、似た項目と混同してしまうか?
import numpy as np

def forgetting_probability(t, stability, difficulty):
    """
    最終復習からt日後に忘れてしまう確率Pを返します。
    ACT-Rの記憶減衰モデルに基づく。
    """
    decay = -0.5 * (1 / stability)  # 学生プロファイルで調整
    base_activation = np.log(1)  # 簡略化
    activation = base_activation + decay * np.log(max(t, 0.001))
    return 1 / (1 + np.exp(activation * difficulty))

# 例:安定性が高い学生、難しくない項目
print(forgetting_probability(7, stability=2.0, difficulty=0.8))  
# → 0.12(7日後に忘れてしまう確率12%)
# 安定性が低い場合、同じ項目
print(forgetting_probability(7, stability=0.6, difficulty=0.8))  
# → 0.68(68%も忘れてしまう確率!)

実践における適応型スケジューリング

私たちはSM-2が無視している信号を収集します:

  • 回答時間 — 正解まで800msと4200msでは、まったく異なる状況を示します
  • 自信のキャリブレーション — 「分かっていた」か「たまたま当てた」かは、正解後の自己評価で分かる
  • きょうだい(類似項目)による干渉 — 心臓病学の項目を復習した後に腎臓病学の項目を復習すると、保持率に影響が出る
def adaptive_interval(student_id, item_id, response_time_ms, 
                      confidence, last_interval):
    stability = get_student_stability(student_id, item_id)
    difficulty = get_item_difficulty(item_id)

返却形式: {"translated": "翻訳されたHTML"}# 応答が遅い、または不確実な応答をペナルティする
    speed_factor = min(1.0, 2000 / response_time_ms)  # 1.0で上限
    confidence_factor = confidence / 5.0  # 1〜5のスケール

    adjusted_stability = stability * speed_factor * confidence_factor

    # P(忘却) = 0.10(10%の忘却閾値)となる t を見つける
    target_p = 0.10
    optimal_t = find_optimal_t(adjusted_stability, difficulty, target_p)

    return max(1, round(optimal_t))

3か月後の結果

標準的なAnkiを使っている学生と比べて:

指標 Anki(SM-2) Ask Amélie
30日後の保持率 61% 79%
1セッションあたりのカード復習数 87 52
80%の保持率に到達するまでの時間 6.2週間 4.1週間

復習はより少なく、保持はより良い。重要な洞察は:カードごとではなく、学生ごとに適切なタイミングで復習すること

次にやること

私たちは次のことを実験しています:

  • グラフに基づく干渉(interference)のモデリング — 項目は独立していません。医学知識はグラフです
  • 概日リズムの統合 — 固定化(consolidation)のピークは体内時計タイプ(chronotype)によって異なります
  • LLMによる妨害者(distractors)の生成 — あなたの特定の混乱パターンを狙い撃ちする、適応的な誤答

もしあなたがEdTechを作っている、またはこの背後にある記憶科学について話し合いたいなら、ぜひお話ししましょう。私たちはpass.askamelie.comでフランスの医学部受験生向けにこれを構築していますが、このアプローチはあらゆるハイステークスな試験の準備に一般化できます。

Ask Amélieは、PASS/ECNの医学部学生のためのAI学習コンパニオンです。Ebbinghaus、Bjork、Cepedaの間隔反復に関する研究に基づいて構築されています。

返却形式: {"translated": "翻訳されたHTML"}