Ловушка ранней остановки: как я убивал RL-прогоны до того, как они успевали обучиться

Ранняя остановка (early stopping) должна спасать вас от траты вычислительных ресурсов на модель, которая уже закончила обучаться. На протяжении долгого времени именно она и сжигала мои вычислительные ресурсы — убивая хороших агентов до того, как они успевали стать хорошими.

Больше моих прогонов обучения с подкреплением (RL) погибло из-за моего собственного правила ранней остановки, чем из-за плохих идей. Аварийный выключатель, который я построил, чтобы быть дисциплинированным, оказался самой недисциплинированной вещью в системе.

Иллюстративная зашумлённая кривая reward, которая проседает и обрывается ранней остановкой, с пунктирным продолжением, показывающим подъём, которого она так и не достигла Иллюстрация, а не реальные данные о результативности. Агент был остановлен во время обычного проседания — прямо перед тем участком, где он начал бы расти.

Аварийный выключатель, который дал обратный эффект

Я позаимствовал раннюю остановку из обучения с учителем, где она считается непреложной истиной: следишь за validation loss, и когда он перестаёт улучшаться в течение некоторого времени — останавливаешься, ведь дальше начинается только overfitting. Это чисто, это безопасно, и в обучении с учителем это обычно работает.

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

Почему RL нарушает это правило

Кривая валидации в обучении с учителем — это довольно гладкая, в основном монотонная штука. Прогресс агента в обучении с подкреплением — нет. Reward зашумлён по своей природе: он зависит от policy, которая сама постоянно меняется, взаимодействуя со средой, полной дисперсии. Улучшение приходит рывками — длинные ровные участки, внезапные скачки, проседания, которые восстанавливаются. Плато в RL зачастую вовсе не означает конец обучения. Это участок прямо перед ним.

Поэтому patience, настроенный под гладкость обучения с учителем, срабатывает во время совершенно нормальной RL-дисперсии. Вы не ловите модель, которая закончила учиться; вы казните ту, которая вот-вот стала бы интересной. А «экономия» — иллюзия: вы всё равно платите за каждый прогон, который погиб рано и не вернул ничего.

Перестаньте останавливаться рано

Решение было не в более удачном числе. Оно было в инвертировании значения по умолчанию. Ранняя остановка должна быть редкой, а не нетерпеливой — защитой от настоящего, устойчивого overfitting, а не реакцией по малейшему шуму. Это значит ставить планку туда, куда шум реалистично не дотягивается, и судить об ухудшении по окну, достаточно длинному, чтобы заглушить естественную дисперсию прогона, — а не по горстке оценок. Значением по умолчанию должно быть продолжать. Бремя доказательства лежит на остановке, а не на продолжении.

Если говорить прямо: patience — это тоже гиперпараметр (hyperparameter), и большинство новичков — включая меня — задают его так, словно RL — это обучение с учителем. Это не так.

Где человеку всё ещё есть место

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

Главный вывод

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

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


Это часть 2 продолжающегося анонимного журнала о создании торговой системы на обучении с подкреплением. Он о методе и ошибках, а не о сигналах — ничто здесь не является инвестиционной рекомендацией, и никакие детали стратегии не раскрываются.