← Журнал
Jiva Studio

Как обмануть кривую забывания

Шлока, выученная сегодня, к следующей неделе почти вся забывается — и дело не в силе воли, а в законе памяти, который впервые измерили в 1885 году. Учи Шлоки не борется с кривой, а строит расписание в обход неё — двумя небольшими планировщиками и алгоритмом полувековой давности.

Учи ШлокиLearningSpaced RepetitionEngineering

Вы садитесь и учите стих. Dharma-kṣetre kuru-kṣetre… — к вечеру он держится крепко, можно прочитать с закрытыми глазами. Через три дня вы к нему возвращаетесь — а на месте третьей строки дыра. Через неделю от стиха остаётся туман, и в нём плавают два знакомых слова.

Так бывает у каждого. А ещё это редкий случай, когда память измерили точно — причём очень давно. Дело не в вас. Просто так устроена задача, с которой имеет дело любое приложение для заучивания, — и весь замысел Учи Шлоки отвечает именно на неё.

Кривая и человек, который её начертил

В 1885 году Герман Эббингауз выпустил Über das GedächtnisПамять: вклад в экспериментальную психологию. Подопытный у него был один — он сам, а знакомый материал не годился. Поэтому он придумал тысячи бессмысленных слогов — WID, ZOF, обрывки вида «согласная — гласная — согласная», где не за что зацепиться. Он заучивал их списками, а потом проверял себя через всё более длинные промежутки и записывал, сколько осталось в памяти. Из этой монотонной работы и вышла кривая забывания: резкий спад сразу после заучивания переходит в длинный пологий хвост. В современной краткой записи —

R=et/SR = e^{-t/S}

где R — извлекаемость, то есть насколько легко воспоминание возвращается; t — время с момента заучивания; Sстабильность памяти: насколько медленно падает R, если ничего не делать. О точной высоте кривой спорят. В 2015 году Мюрре и Дрос повторили опыт и, спустя больше века, получили ту же форму, что и у Эббингауза. А расхожие цифры вроде «за день забывается 80%» к нему на самом деле не восходят, и мы их не повторяем. Честная версия проще и всё равно беспощадна: без повторения свежая память слабеет вдвое за несколько дней. У санскритского стиха хвост ещё короче: родного смысла, за который можно ухватиться, тут нет, а порядок слов нужен точный.

С этим не поспоришь. Но в уравнении можно найти лазейку — она прячется в S.

Лазейка: каждое припоминание поднимает стабильность

Кривая описывает память, которую оставили в покое. Но стоит тронуть воспоминание — именно вспомнить, а не перечитать — перед самым угасанием, и случаются две вещи: R подскакивает к вершине, а стабильность S растёт. Следующее затухание идёт медленнее. Повторите это позже, у самой грани забывания, — и оно замедлится ещё. Это эффект интервала — самый воспроизводимый результат за всю историю изучения памяти. Весь смысл интервального повторения в том, чтобы поймать каждый стих в последний выгодный момент: достаточно поздно, чтобы вспомнить было по-настоящему трудно (лёгкие повторения ничему не учат), и достаточно рано, чтобы вы его ещё не потеряли.

Выбор момента — когда показать карточку — единственное, чем занят планировщик. Всё остальное в приложении работает на это.

Два планировщика — потому что и задач две

Стих, который вы видите впервые, и стих, который вы знаете уже месяц, — это разные задачи. Поэтому Учи Шлоки не берёт для обоих один планировщик. Обучение идёт в три этапа — запоминание, припоминание, повторение, — а под ними спрятано намеренное разделение.

stateDiagram-v2
    [*] --> Memorize: "новый стих"
    Memorize --> Memorize: "круг, хорошо"
    Memorize --> Recall: "выпуск после 4 кругов"
    Recall --> Review: "учебный шаг пройден"
    Review --> Review: "хорошо или трудно"
    Review --> Relearning: "забыл"
    Relearning --> Review: "восстановлено"

Запоминание — это первый планировщик, и планировщик из него почти никакой. Новому стиху нужно просто примелькаться за несколько дней, прежде чем его стоит проверять. Поэтому здесь крутится простой цикл по кругам — в духе Лейтнера, ближе к коробке с карточками, чем к уравнению. Каждый смах «хорошо» двигает карточку на круг вперёд, назавтра она возвращается, а после roundsRequired кругов (по умолчанию четырёх, но число можно поменять) она выпускается. Оценка тут всего одна. Вас пока не проверяют — с вами только знакомятся.

Как только карточка выпускается, начинается второй мир.

Второй планировщик: усечённый SM-2

Когда стих уже знаком, встаёт вопрос поинтереснее: сколько дней осталось до грани забывания? Тут Учи Шлоки берёт алгоритм, который отвечает на него уже почти сорок лет. Родословная тянется от карточных коробок Себастьяна Лейтнера 1973 года к SuperMemo SM-2 Петра Возняка (1987) — предку почти всех появившихся позже программ интервального повторения, включая Anki. У каждой карточки есть фактор лёгкости. Новый интервал — это прежний, умноженный на лёгкость, поэтому интервалы растут: день, потом несколько, потом неделя, потом две. А сама лёгкость смещается вслед за вашими ответами.

У нас — SM-2 с намеренно сглаженными углами, и он мал настолько, что прочитывается за один присест. В коде он помечен как sm2-v1, а значения по умолчанию такие:

recall: {
  learningStepsMinutes: [10],     // a brief in-session step before "review"
  graduatingIntervalDays: 1,      // first real interval: tomorrow
  startingEase: 2.0,              // SM-2 ships 2.5; we start gentler
  minimumEase: 1.3,              // the classic floor — nothing drops below it
  easeDeltaGood: 0.05,           // a confident recall slowly earns ease back
  easeDeltaHard: -0.15,          // "that was hard" — shrink the next jump
  easeDeltaForgot: -0.2,         // a lapse costs the most
  hardIntervalMultiplier: 1.2,   // "hard" still grows, just barely
  maxIntervalDays: 180,          // never vanish for longer than half a year
  enabledGrades: ['forgot', 'hard', 'good'],
}

За некоторыми числами стоит осознанный выбор — о нём стоит сказать. Лёгкость мы начинаем с 2.0, а не с 2.5, как в SuperMemo: стихи труднее викторинных мелочей, и пусть лучше первые интервалы будут чуть осторожнее, чем карточка раздуется до двух недель, ещё не став по-настоящему устойчивой. Интервал мы ограничиваем 180 днями. Хрестоматийный SM-2 с радостью отправит зрелую карточку на годы вперёд, но преданному важно держать эти стихи тёплыми, так что дальше полугода уйти нельзя. И оценок мы даём три, а не шестьforgot, hard, good; на шкале качества SM-2 от 0 до 5 это 1, 3 и 4. Стих вы либо не вспомнили, либо вспомнили с трудом, либо выдали чисто. Более тонкие градации, которых просит SuperMemo, на рассвете с телефоном в руке — просто шум.

Оценка делает ровно то, что предсказывает эффект интервала. good при повторении умножает интервал на лёгкость и слегка её поднимает; hard наращивает интервал совсем немного и подрезает лёгкость; forgot — это срыв: карточка возвращается на переучивание, лёгкость теряет больше всего, и стабильность приходится отстраивать заново. Конкретно: стих, который вы всё время вспоминаете верно, проходит примерно так — 1 → 2 → 5 → 11 → 24 дня. Каждое верное припоминание покупает передышку подольше — ровно как и предсказывает кривая.

Чистая функция — чтобы расписание можно было проиграть заново

Одна деталь важнее, чем кажется по размеру. Планировщик — это чистая функция: (предыдущее состояние, оценка) → следующее состояние, без собственных часов и без базы данных под ним. Время и дневную нагрузку передают внутрь; ничего не читается и не пишется.

Отчасти это ради тестов: чистую функцию проверять легко, ей можно подсунуть поддельные часы и промотать карточку на полгода за миллисекунду. Но есть выгода и поглубже. Каждое повторение пишет в review_logs строку: оценку, версию планировщика и JSON-снимок состояния до и после. Поэтому расписание — не изменчивая куча сроков, на которую мы надеемся; это свёртка журнала. Проиграйте оценки заново — и получите точно то же расписание. Выпустим завтра алгоритм получше, sm2-v2, — и старые строки останутся понятными, ведь в каждой записано, какой планировщик её посчитал. Это event sourcing на скромные средства, и благодаря ему год чьей-то практики никогда не превращается в чёрный ящик.

Что приложение делает на самом деле

Отойдите на шаг — и всё сводится к одной мысли. Эббингауз измерил течь; эффект интервала — это заплата; SM-2 — сорокалетний рецепт того, когда её накладывать; а Учи Шлоки — тот самый рецепт, урезанный до стихов и подключённый к смаху. Память от этого лёгкой не станет: труд припоминания шлоки и есть тот самый труд, что закрепляет её, и мы не убрали бы его, даже если бы могли.

Убирает оно пустую трату: стихи, повторённые слишком рано от тревоги; стихи, повторённые слишком поздно и потерянные; глухую панику перед двумя сотнями наполовину выученных шлок, когда непонятно, какая вот-вот ускользнёт. Приложение держит кривую для каждого знакомого вам стиха и каждое утро показывает лишь горстку тех, что стоят у грани. Вспоминаете вы сами. Оно только следит, чтобы вы не вспоминали не то и не вовремя.

В следующей части посмотрим, что будет, когда «горстка у грани» перестанет быть горсткой, — когда математика захочет показать вам шестьдесят карточек во вторник и четыре в среду, и почему мы научили планировщик гнуться.


Часть проекта

Учи Шлоки

Открыть проект