FSRSがレビューをスケジュールする方法
FSRSがレビューをスケジュールする方法
LiankiはFSRS(Free Spaced Repetition System)を使用して、各カードをレビューするタイミングを決定します。この投稿では、FSRSとは何か、古いアルゴリズムと比較した場合の特徴、そしてLiankiにどのように実装されているかを説明します。
なぜSM-2ではないのか?
何十年にもわたって支配的な間隔反復アルゴリズムは、1987年にPiotr WozniakがSuperMemoのために開発したSM-2です。Ankiはその派生を使用しています。SM-2はカードごとの「易度係数」を追跡し、各レビュー後にその係数で前のインターバルを掛けることで動作します。
SM-2には以下のような問題があります:
- 易度係数が低くなりすぎて(「簡単地獄」の問題)、カードが積み上がる可能性がある
- 忘却曲線を正確にモデル化していない — 全員が同じ速度で忘れることを前提としている
- 現在何かを思い出す可能性(retrievability)の概念がない
FSRSはこれらを修正するために設計されました。Jarrett Yeによって開発され、記憶のDSR(Difficulty, Stability, Retrievability)モデルに基づいています。
3つの変数
FSRSはカードごとに3つの要素を追跡します:
難易度(D) — このカードがどれほど難しいか。最初の評価から導かれた値で始まり、繰り返しのパフォーマンスに基づいて徐々に更新されます。常に難しいと感じるカードは、より高い難易度を持ちます。
安定性(S) — 忘れるまでの時間。「良い」レビューの後、安定性は増加し、次のインターバルが長くなります。「再び」である場合、安定性はリセットされます。
回収性(R) — 今すぐにカードを想起できる確率をパーセンテージで表します。これが忘却曲線に沿って時間とともに減少します。FSRSはRが約90%に低下したときにレビューをスケジュールしようとします — 忘れそうになる直前です。
忘却曲線は次の通りです:
ここで、tは経過時間でSは安定性です。安定性が高いほど減少が遅くなります。
4つの評価
Liankiでカードをレビューするとき:
新しいインターバルは、次のレビュー日での回収性が約90%になるように選ばれます。
Liankiがts-fsrsを使用する方法
Liankiはライブラリを使用しています。app/fsrs.tsでのレビューのフローのコアはこちらです:
repeat()呼び出しは4つの可能な次の状態を一度に計算します。Liankiはこれをユーザーに/api/fsrs/optionsエンドポイントを介して表示し、各評価の期限日を返します。レビューUIはこれを"2d 3h"のような人間が読みやすい間隔として表示します。
ユーザーが評価を選ぶと、/api/fsrs/review/:ratingが選択された予定カードをMongoDBに適用します:
カードの状態
FSRSのカードは4つの状態を移動します:
- 新規: 一度もレビューされていない
- 学習: 最近紹介され、短期間の間隔(分から日)
- レビュー: 長期レビュー、間隔は日から月
- 再学習: レビューフェーズ中に忘れ、短期間の間隔に再突入
Liankiはこれらの状態をUIで直接表示しません — あなたは期限日を見て、時が来たらレビューします。
ファズファクター
FSRSはデフォルトで間隔に小さなランダムな変動を加えます。ファズがなければ、同じ日に50枚のカードを追加しすべて「良い」としてレビューすれば、全て同じ将来の日に積み上がってしまいます。ファズはそれらを少しずつ広げてレビューの集中を防ぎます。
デフォルトパラメータ
Liankiはts-fsrsのデフォルトFSRSパラメータを使用しています。FSRS v5はレビュー履歴を使用したユーザーごとのパラメータ最適化をサポートしていますが、Liankiではまだ実装していません — これは計画中の機能です。デフォルトパラメータは大量の実際のフラッシュカードレビューのデータセットでトレーニングされており、ほとんどの人に対してうまく機能します。