🧑‍🚀

人間のための勉強法:「間隔反復」

2023/11/07に公開

人間のための勉強法:間隔反復

様々な勉強法の効果を比較した2013年の論文[1]で次の勉強法は特に効果が高いとされている:

  • 練習テスト:問題を解き、答え合わせする
  • 分散練習:練習を長期間にわたって分散する

こう言われると、最善の学習方法はやはり定期的に模擬試験で練習することだろう。だが、自分の学びたい内容のための模擬試験などが存在しなければ万事休す。
そこで、今回紹介する「間隔反復」方法は分散練習を活用し、間隔反復ソフトを通して学生に”模擬試験”(フラッシュカードのデッキ)を作らせるため、一部「練習テスト」方法も組み込まれている。

間隔反復とは

間隔反復とは有名なエビングハウスの「忘却曲線」に基づき、学習スケジュールを立てる分散練習である。要は、短い間隔をだんだん伸ばしていくわけだ。同上の論文で述べられているように、特定の時間tまである情報を思い出せたければ、学習の間隔をtまでの時間の10%〜20%にするべきだ。
とすると、学習間隔は10年に達すれば、情報を100年以上思い出せるはずだ。つまり、一生忘れない。

ただし、自分で間隔を計算することはあまりおすすめできない:間隔が10年に達するまでの反復数は8〜12回のため、一個の情報あたりに8〜12回間隔を計算しないといけない。また、それは「8〜12回連続正解すれば」という話で、間違えると今回は間隔を縮めないといけない。そこで、学習したい情報が多ければ、手動スケジューリングはおよそ不可能になるだろう。

結論:間隔反復ソフトウェアを使わない手がない。

Anki

間隔反復ソフトは数多いが、個人的に「Anki」というソフトしか使ったことがないため、Ankiを紹介していきたいと思います。

Ankiとは、デスクトップ、iPhone、AndroidとWebで使える、簡単にカスタマイズできる間隔反復およびフラッシュカードのソフトウェアである。プログラミングが少しでも分かる方に一番カスタマイズ可能なデスクトップ版をおすすめする。

メリット:

  • 学習間隔の幅からフラッシュカードの見た目までカスタマイズ可能。
    • 23.10バージョン(現時点で最新バージョン)にFSRSというアルゴリズムが導入され、AI技術によって自分に最適の学習間隔も自動的に設定してもらえる。
  • コミュニティが大きなため、様々な目的に適したデッキや拡張機能が存在する可能性は高い。

デメリット:

  • デスクトップ版のUIは鬼見づらい。
  • 拡張機能やAnkiのマニュアルは英語を使う(日本語UIはちゃんとある)
    • 旧バージョンのマニュアルの日本語版もある。元バージョンとあまり変わらないのでぜひ参考にしてください。

また、フラッシュカードを使うと必ず発生するデメリットもある:計算機科学における「Garbage in, garbage out」(ゴミ入力=ゴミ出力)みたいに、フラッシュカード上の質問・答えを真面目に書かないと学習が余計に難しくなる。

いいカードの作り方

ピョートル・ウォズニアック博士の「知識を定式化する20個のルール」(英文訳文)の最初の10個のルール、重要度順:

  1. 理解していないものを暗記するな
  2. 学ぶ前に暗記するな
  3. 基礎知識から始めろ
  4. 「最低情報の原則」を徹底せよ:質問をできるだけ短くしましょう
  5. 穴埋め問題を使え(参考:コーディング能力に間隔反復を適用
  6. 画像を使え
  7. 記憶術を使え(語呂合わせ、記憶の宮殿など)
  8. 「画像穴埋め」問題を使え。例:
  9. できるだけ集合問題を避けよ。例:「Pythonの予約語を全部あげてください」
  10. できるだけ列挙問題を避けよ。例:「周期表上の元素を順番に言ってください」見たいな問題

本当にどうしても集合・列挙問題を使いたければ、語呂合わせなどの記憶術を使うか、次の記事(集合問題列挙問題)を参照してください。

おすすめの拡張機能

拡張機能のリスト(英語のみ):

カード設計

UI

  • Custom Background Image and Gear Icon:ただただグレーでしかないAnkiの背景を自分の好きな絵に変えることができる
  • Review Heatmap:過去(と将来)にレビューした(する)カード数のビジュアル化。最後にいつサボったか簡単に確認できる
  • Set Font Size:文字のサイズが調整できる

プログラマ用

コーディング能力に間隔反復を適用

用例として、プログラミングの練習問題を「穴埋め化」し、フラッシュカードを作る。例題はもちろんなんでもいい。

// JavaScriptで nxn の行列式を計算せよ
function determinant (m) {
  // 一つ目と二つ目の穴埋め
  return {{c1::m.length === 1}}
    ? {{c2::m[0][0]}}
    : m[0].reduce((acc,cur,i) => {
      const mMin1 = m.slice(1).map(
        // 三つ目の穴埋め
        r => {{c3::r.filter((_,ei)=> ei !== i)}}
      );
      // 四つ目の穴埋め
      return acc + {{c4::(i & 1 ? -cur : cur) * determinant(mMin1)}};
    }, 0);
}

"{{c1::...}}"などの部分は穴埋めに相当する。これでコードスニペットにおいて自分の一番忘れそうな部分」を「穴埋め化」し、同時に問題の全体像の回想も練習できる。

脚注
  1. ”Improving Students’ Learning With Effective Learning Techniques: Promising Directions From Cognitive and Educational Psychology” ジョン・ダンロスキーなど(PDF要約↩︎

Discussion