Модуль 14. Policy gradient и современные методы¶
Чему вы научитесь в этом модуле
- Объяснять, чем обучение политики напрямую отличается от обучения через ценность.
- Читать градиент политики словами: поднять вероятность действий, которые принесли отдачу выше ожидаемой.
- Объяснять, зачем нужна база (baseline), и связывать её с ошибкой \(\delta\) и критиком из модуля 13.
- Объяснять, что именно обрезает PPO и почему без обрезки один шаг политики может её разрушить.
- Показывать на числах, почему в RL воспроизводимость особенно плоха, и проверять заявленное улучшение бутстрэпом из модуля 1.
Время: около трёх недель. Пререквизиты: модуль 4 (градиент) и модуль 13 (ошибка \(\delta\)).
Ноутбук: открыть в Colab · notebooks/14-policy-gradient.ipynb
Зачем нужен этот модуль¶
Модули 12 и 13 были посвящены обучению ценности — оценке того, насколько хорошо находиться в данном состоянии. Из ценности можно извлечь политику, выбирая в каждом состоянии действие с наибольшим значением \(Q\). Однако у этого подхода два ограничения: он требует перебора всех возможных действий (а их может быть бесконечно много — например, угол поворота руля) и даёт только жёсткий, детерминированный выбор.
Другой путь — обучать саму политику непосредственно: параметризовать распределение \(\pi_\theta(a \mid s)\) и настраивать параметры \(\theta\) напрямую в направлении увеличения отдачи. Это policy gradient, и здесь сходятся два предыдущих модуля: градиент из модуля 4 двигает параметры, а ошибка \(\delta\) из модуля 13 подсказывает направление.
Градиент политики¶
Цель — ожидаемая отдача \(J(\theta) = \mathbb{E}[G]\). Мы хотим её максимизировать, а значит, двигаемся по градиенту, а не против (модуль 4, но со знаком плюс). Проблема: отдача зависит от \(\theta\) через выбор действий, а выбор случаен. Как взять градиент через случайность?
Ответ даёт теорема о градиенте политики. Один результат, и он проще, чем выглядит на первый взгляд:
Прочитайте словами: сдвинуть параметры так, чтобы поднять вероятность тех действий, за которыми последовала большая отдача, и опустить вероятность тех, за которыми последовала маленькая. Множитель \(\nabla \log \pi\) — это направление «сделать данное действие более вероятным», а \(G\) — сила и знак этого сдвига. Действие принесло много — усилить его вероятность; принесло мало — ослабить. Это и есть алгоритм REINFORCE.
Нажимайте «Шаг обучения». Политика начинает с равномерного распределения, но действие \(a_2\) в среднем приносит больше награды, и его столбик растёт: каждая проба, в которой награда оказалась выше ожидаемой, немного поднимает вероятность выбранного действия. Кнопка «×25» ускоряет процесс. Через сотню шагов политика уверенно предпочитает лучшее действие — не потому, что ей заранее сказали, какое лучшее, а потому, что она самостоятельно вывела это из получаемых наград.
База и критик¶
Теперь переключите тумблер «база». Выключите её и погоняйте обучение — вы заметите, что кривая стала значительно более дёрганой. Вот почему это происходит.
В формуле стоит \(G\) — сырая отдача. Однако из неё можно вычесть любую величину \(b\), не зависящую от действия, и градиент в среднем не изменится (вычитаемое в ожидании обнуляется). А вот разброс оценки градиента изменится — и существенно. Хорошая база — это ожидаемая отдача из данного состояния, то есть ценность \(V(s)\):
Разность \(A = G - V(s)\) — это преимущество (advantage): насколько данное действие оказалось лучше среднего ожидания в данном состоянии. И это ровно ошибка \(\delta\) из модуля 13. Теперь у метода две составные части:
Актор — это политика, которая выбирает действия. Критик — это оценка ценности, которая судит о качестве действий. Критик вычисляет ошибку \(\delta\), актор по ней сдвигает вероятности действий, и та же \(\delta\) одновременно уточняет самого критика. Дофаминовая ошибка из модуля 13 стала двигателем сразу двух процессов обучения.
PPO: шаг, который не разрушает политику¶
У policy gradient есть опасное свойство: один чрезмерно большой шаг обновления может увести политику в область, где она собирает некачественные данные, и после этого обучение не восстанавливается. В отличие от обучения с учителем, здесь данные порождаются самой политикой — испортив её, вы испортите и то, на чём учитесь дальше.
PPO (proximal policy optimization) решает эту проблему, запрещая политике меняться слишком резко за одно обновление. Алгоритм анализирует отношение новой вероятности действия к старой и обрезает его: если обновление тянет это отношение за пределы интервала \([1-\varepsilon,\ 1+\varepsilon]\), дальнейший выигрыш обнуляется.
Смысл полки: за перемещение политики слишком далеко от текущей дополнительной награды не выдаётся, и стимул делать разрушительно большой шаг исчезает. SAC решает ту же задачу устойчивости иначе — добавляет в целевую функцию энтропию, поощряя политику не схлопываться в одну точку раньше времени. Разные рецепты одной и той же осторожности.
Воспроизводимость в RL¶
Теперь то, ради чего написан весь курс, — и в обучении с подкреплением эта проблема стоит острее, чем где-либо ещё.
Обучение с подкреплением печально известно своей невоспроизводимостью. Разброс результатов между случайными зёрнами генератора псевдослучайных чисел здесь регулярно превышает разницу между методами: один и тот же алгоритм с другим зерном может сойтись к превосходной политике — или не сойтись вовсе. Источников случайности здесь больше, чем в обучении с учителем: инициализация весов, порядок сбора данных, стохастичность самой политики, стохастичность среды.
Картина та же, что открывала курс в модуле 1, только теперь это два RL-метода. Их доверительные интервалы перекрываются — и утверждение «наш метод лучше» не является обоснованным. К модулю 14 у вас есть ровно тот инструмент, который для этого нужен: из модуля 1 — IQM и бутстрэп по фиксированным зёрнам, из этого модуля — понимание того, откуда берётся столь большой разброс.
Бутстрэп из модуля 1 возвращается здесь буквально. Заявленное улучшение RL-метода проверяется не по одной кривой обучения, а сравнением межквартильных средних по многим зёрнам с бутстрэп-интервалами — тем же кодом из одиннадцати строк, что и в модуле 1. В библиотеке decisionrl обученная политика сравнивается с настроенной классической базовой линией ровно таким образом; в модуле 15 это станет отдельной темой.
Практическая часть¶
Часть 1. Работа с ноутбуком¶
Откройте notebooks/14-policy-gradient.ipynb. Только numpy и matplotlib, вычисления занимают секунды.
Что содержится внутри:
- REINFORCE с нуля на задаче бандита и короткой цепочке. Политика сходится к лучшему действию.
- База против её отсутствия: две кривые обучения на одних и тех же зёрнах. Разброс с базой заметно меньше — тот же эффект, что в интерактивной фигуре.
- Актор-критик: \(\delta\) в роли преимущества. Обучение быстрее и стабильнее, чем чистый REINFORCE.
- Воспроизводимость: двадцать зёрен одного метода. Кривые расходятся веером, и одно число из одного прогона не имеет значения.
- Честное сравнение двух методов: IQM и бутстрэп-интервалы из модуля 1. Перекрываются ли они.
Часть 2. Собственное заявление¶
Возьмите две настройки одного алгоритма (например, два значения learning rate) в качестве «метода» и «базы».
- Прогоните каждую настройку на десяти зёрнах, выбранных заранее.
- Постройте IQM и бутстрэп-интервалы для обеих.
- Перекрываются ли интервалы? Сформулируйте вывод в формате модуля 1: величина эффекта, условия, базовая линия.
- Покажите лучшую и худшую кривую каждого метода рядом. Насколько соблазнительно было бы показать только лучшую?
Задание¶
- Выведите, почему вычитание базы, не зависящей от действия, не меняет градиент политики в среднем. Одна строка с \(\mathbb{E}[\nabla \log \pi] = 0\).
- Реализуйте REINFORCE на задаче бандита и постройте, как вероятность лучшего действия возрастает с обновлениями.
- Добавьте базу и покажите на числах, во сколько раз уменьшился разброс оценки градиента.
- Замените отдачу на преимущество через выученную ценность (актор-критик) и сравните скорость сходимости с чистым REINFORCE.
- Прогоните один метод на двадцати зёрнах и постройте веер кривых. Отметьте, где проходит IQM и где — среднее, искажённое расходящимися прогонами.
Проверка усвоения¶
- Чем обучение политики напрямую отличается от извлечения политики из ценности? В каких случаях второй подход не работает?
- Прочитайте градиент политики словами, не называя букв.
- Зачем нужна база и почему она не вносит смещения в градиент?
- Что такое преимущество и как оно связано с ошибкой \(\delta\) из модуля 13?
- Кто такие актор и критик и какую роль в каждом из них играет \(\delta\)?
- Что именно обрезает PPO и что произойдёт с политикой без обрезки?
- Почему в RL воспроизводимость особенно плоха и как проверяется заявленное улучшение?
Что дальше¶
В модуле 15 обучение с подкреплением встречается с задачами, где у ошибки есть цена в деньгах: управление запасами, ценообразование, очереди, энергетика. И там же — честное сравнение с методами исследования операций: иногда обученная политика выигрывает, а иногда классический метод уже оптимален, и признать второе — часть той же дисциплины проверки.
Policy gradient поднимает вероятность действий, принесших отдачу выше ожидаемой. База, вычитаемая из отдачи, — это критик, а критик — это ошибка \(\delta\) из модуля 13. Всё сходится.
Принцип
Одна кривая обучения в RL — это не результат, а одно наблюдение особенно шумной случайной величины. Прежде чем поверить, что метод лучше, посмотрите на разброс между зёрнами: он здесь обычно превышает само улучшение.