Когда я учился в университете, то активно изучал английские слова. Тогда ещё не использовал какой-то специальный софт для этого. Я просто записывал слова в тетрадь: в первом столбце — слово на английском, во втором — транскрипция, в третьем — перевод на русский.

Затем закрывал английскую часть листа, смотрел на перевод и пытался вспомнить слово.
Сначала этот способ работал. Но когда количество слов и фраз начало приближаться к тысяче, система сломалась. Чтобы пройти всю тетрадь, приходилось выделять почти час. Это быстро стало утомлять, и удовольствие от изучения языка постепенно исчезло.
Главная проблема была очевидна: одни слова я уже знал очень хорошо, а другие постоянно забывал. Но повторять всё равно приходилось весь список подряд.
Получалось, что я тратил большую часть времени на уже знакомые слова вместо того, чтобы сосредоточиться на новых и сложных.
Именно эту проблему решают интервальные повторения.
Кривая забывания Эббингауза
Ещё в XIX веке немецкий психолог Герман Эббингауз решил выяснить, как человек забывает новую информацию.
Он хотел исследовать память в максимально чистом виде, без влияния смысла, личного опыта и знакомых ассоциаций. Поэтому вместо настоящих слов использовал бессмысленные слоги вроде "бов", "гис" и "лоч". Эббингауз заучивал их, а затем через разные промежутки времени проверял, сколько сможет вспомнить.
Результаты своих исследований он опубликовал в 1885 году. На их основе появился график, который позже стали называть кривой забывания.

Оказалось, что мы забываем информацию неравномерно. Быстрее всего она исчезает из памяти вскоре после изучения. Затем скорость забывания постепенно снижается.
Это хорошо объясняет знакомую ситуацию: сегодня новое английское слово кажется очевидным, а через несколько дней ты смотришь на него так, будто никогда раньше не видел.
При этом повторение укрепляет воспоминание. Если периодически возвращаться к материалу, он забывается медленнее. А значит, нет необходимости каждый день повторять абсолютно всё. Достаточно возвращаться к информации через постепенно увеличивающиеся промежутки времени.
Знания о кривой забывания легли в основу системы интервальных повторений
Очевидно, что знания о кривой забывания очень легко ложатся на специальный алгоритм, который можно использовать в приложениях для изучения иностранных слов.
Вместо того чтобы каждый раз проходить весь список с самого начала, приложение пытается показать слово примерно тогда, когда оно начинает забываться.
Сложные слова появляются чаще. Хорошо знакомые постепенно откладываются на недели, месяцы, а иногда и годы.
Благодаря этому человек тратит время не на бесконечное повторение уже выученного, а прежде всего на слова, которые рискуют выпасть из памяти.
Один из самых простых примеров такого подхода — система Лейтнера. В ней карточки распределяются по нескольким ящикам.
Если человек отвечает правильно, карточка переходит в следующий ящик и показывается реже. Если ошибается, карточка возвращается назад и снова начинает появляться чаще.

В приложении похожая система может выглядеть так:
сначала слово повторяется на следующий день;
затем через два дня;
потом через четыре;
через восемь;
через шестнадцать;
и так далее.
Чем больше правильных ответов, тем длиннее становится интервал.
Это уже намного эффективнее обычной тетради. Но у такого подхода есть проблема: разные слова могут двигаться по одной и той же схеме, хотя запоминаются они совершенно по-разному.
Например, слово cat один человек запомнит после первого повторения. А какое-нибудь thorough будет забывать снова и снова.
Поэтому более продвинутые алгоритмы учитывают не только правильность ответа, но и историю изучения конкретной карточки.
Как работает FSRS в Anki
Один из современных алгоритмов интервального повторения — FSRS (Free Spaced Repetition Scheduler). Он используется в Anki и пытается предсказать, насколько вероятно, что пользователь вспомнит конкретную карточку в определённый день.
FSRS анализирует историю повторений: когда человек видел карточку, как отвечал и сколько времени прошло с предыдущего занятия.
Упрощённо алгоритм оценивает три характеристики:
сложность — насколько тяжело пользователю даётся карточка;
стабильность — насколько прочно информация закрепилась в памяти;
воспроизводимость — вероятность вспомнить карточку прямо сейчас.
После успешного повторения вероятность вспомнить слово высокая. Со временем она постепенно снижается. Задача алгоритма — выбрать подходящий момент для следующего показа.
В Anki после просмотра ответа пользователь должен сам оценить, насколько хорошо он вспомнил карточку:

Снова — не вспомнил;
Трудно — вспомнил с трудом;
Хорошо — дал нормальный правильный ответ;
Легко — ответил почти сразу.
После каждого ответа FSRS обновляет свои оценки.
Если пользователь нажимает Снова, карточку нужно показать раньше. После Трудно интервал увеличится незначительно. После Хорошо карточка получит обычный интервал, а после Легко — более длинный.
С точки зрения эффективности это разумный подход. Но лично мне не нравится, что часть ответственности за работу алгоритма перекладывается на пользователя.

После каждого ответа приходится дополнительно решать, что именно выбрать: Трудно или Хорошо, Хорошо или Легко.
Вместо того чтобы думать о значении слова, контексте и самом языке, пользователь начинает оценивать собственную память и управлять алгоритмом.
Мне кажется, хорошая система должна работать незаметно для пользователя.
Как, на мой взгляд, должна работать хорошая система
Если память можно приблизительно моделировать математически, зачем заставлять человека вручную управлять этой моделью?
В хорошей системе пользователь должен просто учить слова: проходить тренировки, отвечать на вопросы и использовать язык. Всё остальное должно происходить внутри приложения.
Алгоритм может самостоятельно учитывать косвенные сигналы:
соотношение правильных и неправильных ответов;
количество ошибок подряд;
скорость ответа;
использование подсказок;
опечатки;
стабильность правильных ответов на длинных интервалах.
Этих данных достаточно, чтобы приблизительно определить, насколько хорошо человек запомнил слово.
Пользователю не нужно думать о метриках. Ему нужно думать о языке.
Именно такой подход я постарался реализовать в своём приложении.
Как интервальные повторения работают в VibeLing
В VibeLing используется собственный упрощённый алгоритм, построенный на тех же основных идеях: сложные слова нужно показывать чаще, а хорошо знакомые — реже.
Весь процесс разделён на два этапа.
Первый этап: интенсивное изучение
Первые дни после добавления слово находится в режиме интенсивного изучения.
Чтобы перейти к интервальным повторениям, пользователь должен правильно ответить на вопросы с этим словом девять раз. Обычно приложение показывает его три раза в день, причём в разных типах заданий.

Если пользователь ошибается, переход просто откладывается. Важно набрать девять правильных ответов, а не уложиться ровно в три дня.
В идеальном случае процесс выглядит так:
в первый день — три правильных ответа;
во второй день — ещё три;
в третий день — ещё три;
Второй этап: интервальные повторения
После интенсивного изучения слово переходит в режим интервальных повторений. Теперь оно появляется только в дни, когда действительно должно быть повторено.
Базовая последовательность интервалов выглядит примерно так:
1 день → 2 дня → 4 дня → 8 дней → 16 дней → 32 дня → 64 дня → 128 дней → 256 дней → 512 дней.
Теоретически слово никогда не получает статус "выучено навсегда". Оно просто переходит на всё более длинные интервалы — вплоть до нескольких лет.
Но такая ровная последовательность возможна только при идеальных ответах. В реальности интервалы меняются в зависимости от того, как пользователь справляется со словом.
На расписание влияют:
с какой попытки пользователь ответил правильно;
скорость ответа;
использование подсказок;
соотношение неправильных ответов к правильным за последние 10 тренировок.
Изначально коэффициент сложности равен единице. Если пользователь ошибается, долго думает или использует подсказку, коэффициент снижается, а следующий интервал становится короче. Поэтому простые слова довольно быстро переходят на большие интервалы, а сложные появляются чаще.
При этом слово не получает ярлык "сложное" навсегда. Для расчёта используется статистика только по последним десяти ответам. Если пользователь перестал ошибаться, коэффициент постепенно восстанавливается, а интервалы снова начинают расти.
В результате приложение самостоятельно решает, когда показать слово в следующий раз. Пользователю не нужно выбирать между Снова, Трудно и Легко или разбираться в принципах работы алгоритма.
Он просто учит язык, а система подстраивается под его ответы.
Приложение называется VibeLing и доступно на iOS и Android. Буду рад, если попробуете его и поделитесь обратной связью. А я продолжу делать алгоритм ещё лучше и не перекладывать эту работу на пользователей.
