Перейти к содержанию

Модуль 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_\theta J = \mathbb{E}\big[\, \nabla_\theta \log \pi_\theta(a \mid s)\cdot G \,\big]\]

Прочитайте словами: сдвинуть параметры так, чтобы поднять вероятность тех действий, за которыми последовала большая отдача, и опустить вероятность тех, за которыми последовала маленькая. Множитель \(\nabla \log \pi\) — это направление «сделать данное действие более вероятным», а \(G\) — сила и знак этого сдвига. Действие принесло много — усилить его вероятность; принесло мало — ослабить. Это и есть алгоритм REINFORCE.

Нажимайте «Шаг обучения». Политика начинает с равномерного распределения, но действие \(a_2\) в среднем приносит больше награды, и его столбик растёт: каждая проба, в которой награда оказалась выше ожидаемой, немного поднимает вероятность выбранного действия. Кнопка «×25» ускоряет процесс. Через сотню шагов политика уверенно предпочитает лучшее действие — не потому, что ей заранее сказали, какое лучшее, а потому, что она самостоятельно вывела это из получаемых наград.

База и критик

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

В формуле стоит \(G\) — сырая отдача. Однако из неё можно вычесть любую величину \(b\), не зависящую от действия, и градиент в среднем не изменится (вычитаемое в ожидании обнуляется). А вот разброс оценки градиента изменится — и существенно. Хорошая база — это ожидаемая отдача из данного состояния, то есть ценность \(V(s)\):

\[\nabla_\theta J = \mathbb{E}\big[\, \nabla_\theta \log \pi_\theta(a \mid s)\cdot \underbrace{(G - V(s))}_{\text{преимущество } A} \,\big]\]

Разность \(A = G - V(s)\) — это преимущество (advantage): насколько данное действие оказалось лучше среднего ожидания в данном состоянии. И это ровно ошибка \(\delta\) из модуля 13. Теперь у метода две составные части:

Актор политика π Среда Критик ценность V действие награда δ = преимущество: критик оценивает, актор сдвигает вероятность

Актор — это политика, которая выбирает действия. Критик — это оценка ценности, которая судит о качестве действий. Критик вычисляет ошибку \(\delta\), актор по ней сдвигает вероятности действий, и та же \(\delta\) одновременно уточняет самого критика. Дофаминовая ошибка из модуля 13 стала двигателем сразу двух процессов обучения.

PPO: шаг, который не разрушает политику

У policy gradient есть опасное свойство: один чрезмерно большой шаг обновления может увести политику в область, где она собирает некачественные данные, и после этого обучение не восстанавливается. В отличие от обучения с учителем, здесь данные порождаются самой политикой — испортив её, вы испортите и то, на чём учитесь дальше.

PPO (proximal policy optimization) решает эту проблему, запрещая политике меняться слишком резко за одно обновление. Алгоритм анализирует отношение новой вероятности действия к старой и обрезает его: если обновление тянет это отношение за пределы интервала \([1-\varepsilon,\ 1+\varepsilon]\), дальнейший выигрыш обнуляется.

1 1+ε полка цель (при A>0) отношение π_new/π_old

Смысл полки: за перемещение политики слишком далеко от текущей дополнительной награды не выдаётся, и стимул делать разрушительно большой шаг исчезает. SAC решает ту же задачу устойчивости иначе — добавляет в целевую функцию энтропию, поощряя политику не схлопываться в одну точку раньше времени. Разные рецепты одной и той же осторожности.

Воспроизводимость в RL

Теперь то, ради чего написан весь курс, — и в обучении с подкреплением эта проблема стоит острее, чем где-либо ещё.

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

Картина та же, что открывала курс в модуле 1, только теперь это два RL-метода. Их доверительные интервалы перекрываются — и утверждение «наш метод лучше» не является обоснованным. К модулю 14 у вас есть ровно тот инструмент, который для этого нужен: из модуля 1 — IQM и бутстрэп по фиксированным зёрнам, из этого модуля — понимание того, откуда берётся столь большой разброс.

Бутстрэп из модуля 1 возвращается здесь буквально. Заявленное улучшение RL-метода проверяется не по одной кривой обучения, а сравнением межквартильных средних по многим зёрнам с бутстрэп-интервалами — тем же кодом из одиннадцати строк, что и в модуле 1. В библиотеке decisionrl обученная политика сравнивается с настроенной классической базовой линией ровно таким образом; в модуле 15 это станет отдельной темой.

Практическая часть

Часть 1. Работа с ноутбуком

Откройте notebooks/14-policy-gradient.ipynb. Только numpy и matplotlib, вычисления занимают секунды.

Что содержится внутри:

  1. REINFORCE с нуля на задаче бандита и короткой цепочке. Политика сходится к лучшему действию.
  2. База против её отсутствия: две кривые обучения на одних и тех же зёрнах. Разброс с базой заметно меньше — тот же эффект, что в интерактивной фигуре.
  3. Актор-критик: \(\delta\) в роли преимущества. Обучение быстрее и стабильнее, чем чистый REINFORCE.
  4. Воспроизводимость: двадцать зёрен одного метода. Кривые расходятся веером, и одно число из одного прогона не имеет значения.
  5. Честное сравнение двух методов: IQM и бутстрэп-интервалы из модуля 1. Перекрываются ли они.

Часть 2. Собственное заявление

Возьмите две настройки одного алгоритма (например, два значения learning rate) в качестве «метода» и «базы».

  1. Прогоните каждую настройку на десяти зёрнах, выбранных заранее.
  2. Постройте IQM и бутстрэп-интервалы для обеих.
  3. Перекрываются ли интервалы? Сформулируйте вывод в формате модуля 1: величина эффекта, условия, базовая линия.
  4. Покажите лучшую и худшую кривую каждого метода рядом. Насколько соблазнительно было бы показать только лучшую?

Задание

  1. Выведите, почему вычитание базы, не зависящей от действия, не меняет градиент политики в среднем. Одна строка с \(\mathbb{E}[\nabla \log \pi] = 0\).
  2. Реализуйте REINFORCE на задаче бандита и постройте, как вероятность лучшего действия возрастает с обновлениями.
  3. Добавьте базу и покажите на числах, во сколько раз уменьшился разброс оценки градиента.
  4. Замените отдачу на преимущество через выученную ценность (актор-критик) и сравните скорость сходимости с чистым REINFORCE.
  5. Прогоните один метод на двадцати зёрнах и постройте веер кривых. Отметьте, где проходит IQM и где — среднее, искажённое расходящимися прогонами.

Проверка усвоения

  1. Чем обучение политики напрямую отличается от извлечения политики из ценности? В каких случаях второй подход не работает?
  2. Прочитайте градиент политики словами, не называя букв.
  3. Зачем нужна база и почему она не вносит смещения в градиент?
  4. Что такое преимущество и как оно связано с ошибкой \(\delta\) из модуля 13?
  5. Кто такие актор и критик и какую роль в каждом из них играет \(\delta\)?
  6. Что именно обрезает PPO и что произойдёт с политикой без обрезки?
  7. Почему в RL воспроизводимость особенно плоха и как проверяется заявленное улучшение?

Что дальше

В модуле 15 обучение с подкреплением встречается с задачами, где у ошибки есть цена в деньгах: управление запасами, ценообразование, очереди, энергетика. И там же — честное сравнение с методами исследования операций: иногда обученная политика выигрывает, а иногда классический метод уже оптимален, и признать второе — часть той же дисциплины проверки.

Policy gradient поднимает вероятность действий, принесших отдачу выше ожидаемой. База, вычитаемая из отдачи, — это критик, а критик — это ошибка \(\delta\) из модуля 13. Всё сходится.


Принцип

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