Алгоритмы REINFORCE и A2C (Advantage Actor–Critic) относятся к классу on-policy алгоритмов: политика обучается только на данных, собранных текущей версией агента. После каждого обновления старые траектории не могут быть повторно использованы. Естественное желание – обучаться более оптимально, выполняя несколько шагов оптимизации на одном и том же наборе траекторий.
Эта идея была реализована в алгоритме TRPO (Trust Region Policy Optimization). Однако, он требует сложной оптимизации второго порядка и плохо масштабируется. Но его идеи легли в основу алгоритма PPO (Proximal Policy Optimization) – более простого с точки зрения реализации и более эффективного на практике. Благодаря этому PPO стал стандартным инструментом для обучения агентов в задачах управления, игровых средах, робототехнике и в RLHF при обучении больших языковых моделей.
Если вы заметите ошибки в формулах или опечатки — буду очень благодарна, если укажете на них 🙈.
Если вдруг формулы покажутся сложными, то отмечу, что главная ценность этой статьи – в объяснении того, откуда эти формулы берутся и что они означают. Однако если какие-то моменты останутся непонятными, то я рада доработать текст, чтобы сделать его более доступным.
В конце-концов будет сформулирован алгоритм PPO в виде псевдокода. Можно попробовать его реализовать в ноутбуке курса Practical RL. Агентом в ноутбуке будет "наполовину гепард", целью которого будет бег вперед (направо) как можно быстрее.

Мой тг канал: not magic neural networks
Полезные ссылки:
1) Practical_RL/week09_policy_II
2) Policy gradient method
3) A Natural Policy Gradient
4) Метод сопряженных градиентов
5) Trust Region Policy Optimization (TRPO)
6) Proximal Policy Optimization (PPO)
7) DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models
1. Прежде всего вспомним Policy Gradient методы
1.1. Policy Gradient Theorem
Пусть мы имеем траектории , гдe
– состояния,
– действия агента.
Мы хотим максимизировать математическое ожидание дисконтированной суммы наград (objective function):
Траектории приходят из
– распределение над траекториями
при условии политики
:
Заметим, что можно записать как математическое ожидание по состояниям
из
-функции (позже данная запись пригодится):
Мы научились максимизировать функционал с помощью градиентного подъема. Градиент
находим с помощью Монте-Карло оценки с применением logderivative trick
:
Это и есть Policy Gradient Theorem.
Вывод [1.3]
Распишем Монте-Карло оценку:
Перемножим скобки и
между собой (занесем под одну скобку):
Разделим награду на «прошлое» и «будущее» относительно :
где
Почему градиент по "прошлым" состояниям зануляется
Награда к моменту времени
уже произошла и не зависит от того, какое
семплируется. Поэтому
– константа, при фиксированном
.
Рассмотрим часть формулы c
:
Распишем математическое ожидание по определению:
Применим "обратный" logderivative trick:
По определению политики
Таким образом:
Обнулим слагаемое с "прошлой" наградой:
Вынесем из суммы
Согласно равенству :
где – условное математическое ожидание возврата при заданных текущих состоянии
и действии
.
Заметим, что это определение -функции:
. Тогда:
Доказали Policy Gradient Theorem:
Однако, формула имеет большую дисперсию. Для того чтобы ее снизить, решили вычитать некий
из
не зависящий от действий
.
1.2. Baseline и Advantage
Можно доказать, что если брать в качестве использовать
-функцию, то дисперсия Монте-Карло оценки будет падать.
Таким образом:
где – обучаем, а
будем получать из
по формуле
.
называется advantage функция. Она показывает насколько действие
лучше или хуже, чем среднее действие в этом состоянии при политике
. Если
, то действие
лучше среднего выбираемого политикой, иначе - хуже.
Но обычно используют эквивалентную формулу:
Математическое ожидание берётся по данным, сгенерированным самой .
– discounted state-visitation distribution политики. Это распределение состояний, которое показывает как часто политика
посещает состояние
, с учётом дисконтирования по времени.
— вероятность быть в состоянии
на шаге
.
– нормировка, чтобы это было распределение
Описанные выше алгоритмы REINFORCE и A2C (Advantage Actor–Critic) являются on-policy, что делает их неэффективными с точки зрения использования данных (градиент опти��изируемой политики корректно оценивается только на данных, сгенерированных этой же политикой).
При этом, сам градиентный спуск не такой дорогой как сбор данных (траекторий). Естественным образом возникает желание оптимизировать полезность политики , используя данные, собранные старой политикой
. В этом заключается основная цель дальнейших методов (TRPO, PPO и др.)
2. Как оптимизировать новую политику по данным из старой политики
Для этого в формуле надо придумать как брать математическое ожидание и advantage по старой политике
.
Дальше будет много формул по их замене. Если хотите их скипуть (или не поняли что произошло ниже), то прочитайте "скрытый текст" и переходите к разделу 3. Проблема оптимизации
Скрытый текст
В тексте ниже, вместо оптимизации , будет оптимизироваться
.
В новом функционале удастся взять advantage по старой политике, используя трюк с телескопическими суммами. Удастся заменить математическое ожидание по действиям с помощью Importance Sampling трюка. Но математическое ожидание по старой политике взять не получится.
Поэтому, вместо оптимизациибудем "не честно" оптимизировать суррогатную функцию
.
При этом, разница функционаловостается не велика, если разница между политиками
и
ограничена
-дивергенцией.
Так возникает задача максимизации с ограничением
.
Как оптимизировать такую задачу, смотрите в проблемах оптимизации.
2.1. Заменяем advantage
Рассмотрим новый функционал:
Теперь мы хотим чтобы новая политика была как можно лучше старой.
И прежде чем расписывать новый функционал, проделаем "подготовительную" работу:
1) Представим в виде телескопические суммы.
2) Распишем разность .
3) Распишем новый функционал .
2.1.1. Телескопическая сумма
Телескопическая сумма — это сумма вида:
где каждое слагаемое ряда представляется в виде разности и поэтому частичная сумма ряда упрощается.
Название "телескопическая сумма" дано по аналогии с трубой телескопа, который может уменьшить свою длину, сложившись несколько раз.
Мы будем пользоваться телескопической суммой для любой последовательности , такой что
:
По аналогии с формулой выше: для произвольной траектории и произвольной политики
справедливо равенство:
при условии, что .
2.1.2. Распишем разность V-функций
по определению:
Занесем под математическое ожидание:
Запишем в виде телескопической суммы по формуле
:
Вынесем за скобки
В силу равенства , внес��м матожидание по будущим состояниям
, условно на
.
Заметим, что :
по определению advantage функции:
Итоговая формула:
2.1.3. Вернемся к разности функционалов J(new) - J(old)
Вспомним формулу для
:
Распишем новый функционал:
Подставим формулу , получим:
По аналогии с перепишем эквивалентную формулу
:
2.2. Заменяем математическое ожидание
В получившийся формуле остается понять как заменить математические ожидания по новой политике
на математические ожидания по старой политике
.
2.2.1. Importance Sampling Trick / Трюк важностного семплирования
Пусть у нас есть математическое ожидание функции по распределению
:
Теперь мы хотим выразить через другое распределение
. Чтобы это сделать, просто умножаем и делим под интегралом на
.
С помощью данного трюка можно заменить математическое ожидание по действиям в :
2.2.2. Суррогатная функция
Для Importance Sampling трюк сделать не получится. В таком случае, давайте просто заменим
на
и назовем получившийся функционал суррогатной функцией
.
2.3. Теоретическая граница ошибки для нового функционала (theoretic error bound)
В статье Trust Region Policy Optimization (2015) важным результатом является следующая теорема (Theorem 1):
Модуль разницы между желаемым оптимизируемым функцио��алом и суррогатной функцией
ограничен максимумом по состояниям
-дивергенции между старой и новой политикой.
Другими словами, если политики и
близки, то разница
не велика.
Введем вариационную низкую оценку (variational lower bound):
Будем улучшать политику в два шага:
Minorization step: фиксируем текущую политику и строим нижнюю оценку
, совпадающую с истинной целью
в текущей точке.
Maximization step: максимизируем нижнюю вариационную оценку
в надежде, что максимизируется желаемый функционал
будет оценивать усредненным
между двумя политиками по состояниям.
А константу объявим гиперпараметром.
Таким образом, будем оптимизировать с ограничением на разницу между старой и новой политиками.
3. Проблема оптимизации
На недолгое время абстрагируемся, оставим все результаты выше и рассмотрим задачу градиентного спуска как задачу условной оптимизации.
Пусть – оптимизируемая функция. Будем оптимизировать
в ее локальной окрестности. Другими словами, рассмотрим задачу обновления параметров
, начиная с точки
. Мы хотим сделать шаг
, который минимизирует линейную аппроксимацию функции
в окрестности
, но при этом величина шага не должна быть слишком большой.
Приблизим линейной аппроксимацией с помощью разложения в ряд Тейлора:
Поскольку не зависит от параметров
, то константу можно опустить.
Таким образом, будем оптимизировать .
Обозначим расстояние между старыми и новыми параметрами:. Тогда, мы хотим найти
такое что
с квадратичным ограничением
.
Аналитическое решение методом множителей Лагранжа:
Оптимальная дистанция пропорциональна антиградиенту оптимизируемой функции
.
Немного усложним задачу. Будем минимизировать ту же функцию , но ограничим расстояние между старыми и новыми параметрами по неевклидовой метрике
, где
– положительно определённая матрица.
Аналитическое решение для такого ограничения:
Таким образом, пропорционально
3.1. Natural Policy Gradient, NPG (2001)
Статья: A Natural Policy Gradient
Вернемся к задаче обучения с подкреплением.
Пусть имеется политика с параметрами . Хочется найти новые параметры
, которые находились бы в окрестности параметров
.
Квадратичное расстояние между весами , где
будет задавать окружность в пространстве весов. Однако, хотелось бы измерять расстояние между политиками
и
какими-то более умными способами.
Будем использовать расхождение Кульбака-Лейблера (-дивергенцию) между распределениями над действиями в качестве метрики между политиками
и
.
Обозначим как функцию параметров
.
Разложим около точки
в ряд Тейлора до второго порядка производной:
– из определения
-дивергенции.
поскольку
-дивергенция при совпадении распределений достигает своего минимума.
– пренебрежимо мало.
Остается только член второго порядка:

Сформулируем метод Natural Policy Gradient.
Пока что, пользуемся функционалом .
Максимизируем с ограничениями
, где
– матрица вторых производных
-дивергенции.
В таком случае, оптимальный вектор изменения будет пропорционален
.
Обновление политики происходит по формуле:
Однако, обращение матрицы очень дорогая операция, потому данный метод будет работать только на игрушечных средах. Хотелось бы этот метод как-то улучшить.
Заметим, что можно не искать отдельно матрицу , а искать сразу значение выражения
.
Тогда вместо обращения матрицы можно решить линейную систему:
Поскольку матрица положительно определённая, то мы можем воспользоваться эффективным методом решения линейных систем — методом сопряжённых градиентов (conjugate gradients).
В результате получаем вектор изменения весов:
Параметр подбирают линейным поиском шагая от
по направлению
:
Остается обновить политику:

3.2. Trust Region Policy Optimization, TRPO (2015)
Статья: Trust Region Policy Optimization
Вернемся к ранее выведенному функционалу:
Сформулируем задачу оптимизации с ограничениями:
Метод Trust Region Policy Optimization:
Инициализируем политику
Loop:
Генерируем траектории, используя текущую политику
.
Считаем
Цикл по эпохам:
Цикл по батчам:
Считаем градиент суррогатной функции:
Аналитически считаем матрицу вторых производных KL-дивергенции:
Методом сопряженных градиентов ищем направление обновления весов, решая систему
методом сопряжённых градиентов:
Линейным поиском подбираем параметр
, в направлении
с ограничением:
и одновременной проверкой значения:
Обновляем параметры политики
TRPO – стабильный алгоритм, не требующий большого числа итераций для достижения качественных результатов. Однако его реализация нетривиальна, а для аппроксимации матрицы вторых производных требуется огромный объём сэмплов, что делает процесс вычислительно дорогим.
В современных условиях классический TRPO практически не применяется — он слишком требователен к памяти и плохо масштабируется на большие модели. На смену ему пришла его усовершенствованная модификация — PPO (Proximal Policy Optimization).
3.3. Proximal Policy Optimization (PPO), 2017
Proximal Policy Optimization Algorithms
Вместо того чтобы решать задачу оптимизации с ограничениями, со сложной реализацией и вторыми производными, можно просто дополнительно штрафовать модель за сильное изменение политики.
Добавим регуляризацию прям в максимизируемый функционал:
Однако, данный функционал не гарантирует сходимости алгоритма.
не достаточно штрафует за разницу между политиками и выражение
часто уходит либо в беcконечность, либо в ноль и обучение разваливается.
Ограничиваем изменение политики, "подрезая" (clipping) слишком большие значения importance ratio .

Если выходит за границы
, то считаем его равным
.Таким образом, новая политика не сможет выйти за регион
.
Однако процедура "клиппинга" (ограничения) вносит смещение в оценку, нарушая важное теоретическое свойство градиента – монотонность гарантированного улучшения. Для решения этой проблемы на практике используют комбинированный подход: окончательное выражение для целевой функции принимают как минимум из двух вариантов – с применением клиппинга и без него.
В статье PPO были представлены следующие графики. По вертикальной оси находятся значения функции ошибки, а по горизонтальной значение функции .
В красной точке совпадает с
, соответсвенно
.
Допустим , то тогда и
должно увеличиваться, поскольку мы хотим увеличить вероятность этого действия. Однако, когда
доходит до числа
, дальнейшее изменение параметров не имеет смысла с точки зрения функции потерь, даже если бы это было на пользу. В обратной ситуации аналогично, если
, то
должно уменьшаться. Но, при достижении границы
выгода с точки зрения функции потерь теряется.

На графике ниже представлена линейная интерполяция изменения весов. Слева расположена , справа последняя версия
.
Синяя функция показывает изменение
-дивергенции между старой и новой политикой.
Желтая функция – это обычная суррогатная функция без клиппинга. Однако она является лишь приближением целевого функционала
и не гарантирует его улучшения.
Зеленая функция – это клипнутый importance ratio (
). На графике видно, что при опредленном количестве обновлений, она достигает своего плато, что логично из формулы клиппинга.
Красная функция – это минимум из клипнутой функции и обычной суррогатная функции. Видно, что ДО того как функция достигнет значения
, она просто улучшает политику. По достижении
хорошие политики больше не улучшаются и плохие начинают портить красную функцию. Значит отходить дальше от
не имеет смысла.

Сформулируем метод Proximal Policy Optimization:
Инициализируем параметры политики
Loop:
Сохраняем старую политику
Генерируем траектории c
Считаем advantage estimate
Цикл по эпохам:
Цикл по батчам:
Считаем importance ratio:
Считаем clipped importance ratio:
Считаем Сlipped objective:
Обновляем параметры
4. Generalized Advantage Estimation (GAE)
Можно заметить, что в методах TRPO и PPO был упущен момент c подсчетом advantage estimate .
На практике функции и
неизвестны и аппроксимируются по данным. Обычно обучается только value-функция, а advantage оценивается через возвраты.
4.1. Обучение Value-функции
Функцию ценности обычно аппроксимируют нейронной сетью с функцией потерь
где – оценка истинного возврата.
Monte-Carlo возврат несмещённый, но имеет огромную дисперсию.
Поэтому на практике используют усечённую -шаговую оценку:
Из определения
. Следовательно, оценка возврата может быть записана как
Тогда:
Обновление параметров градиентным спуском:
4.2. n-шаговый Advantage
В зависимости от метода оценки -функции, существуют различные оценки для Advantage:
Монте-Карло оценка будет иметь высокий разброс (и низкое смещение).
Можно -функцию оценить одношаговой оценкой из знаний
:
Такая оценка будет иметь высокое смещение (и низкий разброс).
Возникает задача умного подбора шага при оценивании функции
:
Переобозначим функционал (актора):
и функционал критика:
4.3. Generalized Advantage Estimation (GAE)
Вместо того чтобы подбирать количество шагов , можно использовать все
-шаговые оценки Advantage с затухающими весами:
Estimation | ||||
|---|---|---|---|---|
Weight |
Однако, пересчитывать все слишком долго и не оптимально.
Выпишем двушаговый через
.
Из определения
:
Выпишем одношаговый
, но для следующего состояния
и следующего действия
:
Умножим на
:
Добавим и вычтем
из
:
Если обобщить на
шагов, то получится общая формула
-шаговой ошибки через одношаговые:
Подставив получившуюся формулу в
можно доказать, что:
Однако считаем не до конца траектории, а только по сделанным шагам, потому ограничим
до
:
На практике удобнее использовать следующую эквивалентную формулу к :
А функцию ценности обновляем:
Основная проблема классического -шагового возврата заключается в необходимости заранее выбрать конкретный горизонт
. Выбрав маленькое
, оценка возврата будет иметь высокий
. Выбрав большое
, оценка возврата будет с огромной дисперсией. На практике это создаёт трудности: оптимальный горизонт
различается для разных состояний, длины эпизодов непостоянны, а обучение становится нестабильным.
Вместо выбора одного ,
строит смесь всех
-шаговых возвратов. Таким образором, выбирается не конкретный горизонт, а скорость затухания памяти. При
алгоритм имеет короткую память и оценка близка к
(низкая дисперсия, но высокое смещение). При
– долгая память, оценка стремится к полному Монте-Карло возврату (низкое смещение, но высокая дисперсия). Эмпирически для многих задач оптимальный баланс достигается в диапазоне
.
4.4. Вернемся к PPO
Напишем полностью алгоритм Proximal Policy Optimization:
Инициализируем параметры политики
и параметры критика
.
Loop:
Сохраняем политику
Генерируем траектории (rollouts) из политики
, сохраняя логиты
для подсчета importance ratio.
Сохраняем выходы критика
Считаем одношаговые оценки для всех состояний:
if not:
else:
Считаем рекурсивно по формуле
GAE оценки:
for t in (N-2, 0, -1):
if not:
else:
Считаем целевые значения критика:
for epoch in n_epochs:
for batch in batches:
Считаем importance ratio:
Считаем clipping importance ratio
Считаем clipped objective (лосс актора):
Обновляем параметры:
Считаем лосс критика:
Обновляем параметры:
Попробовать реализовать можно тут: https://github.com/yandexdataschool/Practical_RL/blob/master/week09_policy_II/ppo.ipynb
Мою реализацию можно посмотреть тут: https://github.com/anyakangur/Practical_RL/blob/main/week09_policy_II/ppo.ipynb

На GRPO сил не хватило, но будет в следующий раз!
