Как обмануть кривую забывания
Шлока, выученная сегодня, к следующей неделе почти вся забывается — и дело не в силе воли, а в законе памяти, который впервые измерили в 1885 году. Учи Шлоки не борется с кривой, а строит расписание в обход неё — двумя небольшими планировщиками и алгоритмом полувековой давности.
Вы садитесь и учите стих. Dharma-kṣetre kuru-kṣetre… — к вечеру он держится крепко, можно прочитать с закрытыми глазами. Через три дня вы к нему возвращаетесь — а на месте третьей строки дыра. Через неделю от стиха остаётся туман, и в нём плавают два знакомых слова.
Так бывает у каждого. А ещё это редкий случай, когда память измерили точно — причём очень давно. Дело не в вас. Просто так устроена задача, с которой имеет дело любое приложение для заучивания, — и весь замысел Учи Шлоки отвечает именно на неё.
Кривая и человек, который её начертил
В 1885 году Герман Эббингауз выпустил Über das Gedächtnis — Память: вклад в экспериментальную психологию. Подопытный у него был один — он сам, а знакомый материал не годился. Поэтому он придумал тысячи бессмысленных слогов — WID, ZOF, обрывки вида «согласная — гласная — согласная», где не за что зацепиться. Он заучивал их списками, а потом проверял себя через всё более длинные промежутки и записывал, сколько осталось в памяти. Из этой монотонной работы и вышла кривая забывания: резкий спад сразу после заучивания переходит в длинный пологий хвост. В современной краткой записи —
где 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 — сорокалетний рецепт того, когда её накладывать; а Учи Шлоки — тот самый рецепт, урезанный до стихов и подключённый к смаху. Память от этого лёгкой не станет: труд припоминания шлоки и есть тот самый труд, что закрепляет её, и мы не убрали бы его, даже если бы могли.
Убирает оно пустую трату: стихи, повторённые слишком рано от тревоги; стихи, повторённые слишком поздно и потерянные; глухую панику перед двумя сотнями наполовину выученных шлок, когда непонятно, какая вот-вот ускользнёт. Приложение держит кривую для каждого знакомого вам стиха и каждое утро показывает лишь горстку тех, что стоят у грани. Вспоминаете вы сами. Оно только следит, чтобы вы не вспоминали не то и не вовремя.
В следующей части посмотрим, что будет, когда «горстка у грани» перестанет быть горсткой, — когда математика захочет показать вам шестьдесят карточек во вторник и четыре в среду, и почему мы научили планировщик гнуться.
Часть проекта
Учи Шлоки