Обучение с подкреплением
PPO: Proximal Policy Optimization
После выхода PPO в 2017 году он быстро стал стандартом де-факто в RL. OpenAI использовала его для обучения роботов, игровых агентов, ChatGPT (через RLHF). Почему? Простая идея - не делай обновления, которые слишком сильно меняют политику - оказалась удивительно эффективной и стабильной.
- **ChatGPT и InstructGPT:** PPO используется в RLHF для alignment языковых моделей
- **OpenAI Dota 2 Five:** обучалась на PPO с 180 годами опыта в день
- **DeepMind AlphaStar:** вариант PPO для StarCraft II
- **Stable-Baselines3:** PPO - один из двух основных алгоритмов в библиотеке
От TRPO к PPO в OpenAI
В 2015 году Джон Шульман с коллегами опубликовали «Trust Region Policy Optimization» (TRPO), дав policy gradient методам гарантию монотонного улучшения за счёт ограничения каждого шага внутри KL trust region. TRPO работал, но требовал оптимизации второго порядка с матрицей Фишера и conjugate gradients, что усложняло реализацию и масштабирование. В 2017 году та же группа в OpenAI опубликовала «Proximal Policy Optimization Algorithms», заменив жёсткое KL-ограничение дешёвым clipped surrogate objective, который оптимизируется first-order методом Adam. PPO эмпирически не уступал TRPO, оставаясь намного проще, и стал стандартным RL алгоритмом, позже обеспечив стадию RLHF в InstructGPT и ChatGPT.
Предварительные знания
Clipped Surrogate Objective
В Actor-Critic ничто не мешает сделать слишком большое обновление политики - если advantage большое, градиент может резко изменить веса. Новая политика будет сильно отличаться от той, на которой собирались данные, и оценки advantage станут неверными. Обучение дестабилизируется.
**PPO** (Schulman et al., 2017) решает это через **clipped surrogate objective**: отношение новой и старой политики r_t(theta) = pi_new(a|s) / pi_old(a|s) ограничивается в диапазоне [1-eps, 1+eps]. Обновления, которые слишком сильно меняют политику, усекаются.
Зачем PPO берёт min(unclipped, clipped) вместо просто clipped?
Trust Region и TRPO
До PPO существовал **TRPO** (Trust Region Policy Optimization, Schulman et al., 2015) - алгоритм с теоретическими гарантиями монотонного улучшения политики. Идея: обновлять политику только внутри «доверительного региона», где аппроксимация objective остаётся точной.
TRPO формулирует это через KL-дивергенцию как ограничение: max L(theta) subject to KL[pi_old || pi_new] <= delta. Это constrained optimization, требующий вычисления матрицы Фишера и conjugate gradient на каждом шаге. Теоретически красиво, практически дорого.
**PPO как приближение TRPO:** clipping неявно ограничивает обновление политики. Если ratio выходит за [1-eps, 1+eps], gradient не даёт стимула идти дальше. Это намного дешевле KL constraint, но менее строго с теоретической точки зрения.
Главный практический недостаток TRPO по сравнению с PPO:
PPO: полная реализация
PPO собирает rollout (батч transitions) с текущей политикой, затем делает K эпох оптимизации на этих данных - в отличие от A2C, который делает только одну. Это повышает sample efficiency. После K эпох данные выбрасываются и собирается новый rollout.
**n_epochs=10** - PPO проходит одни и те же данные 10 раз. Это принципиально отличает его от on-policy методов типа A2C (1 проход). GAE advantages вычисляются один раз на весь rollout, затем используются во всех эпохах.
PPO собирает rollout, затем делает K=10 эпох на этих данных. После K эпох данные:
Стабильность обучения: tricks
PPO - достаточно надёжный алгоритм, но даже он чувствителен к гиперпараметрам и инженерным деталям. Разница между рабочим и нерабочим PPO часто не в архитектуре, а в десятке мелких трюков, которые вошли в стандартную практику.
- **Gradient clipping:** `clip_grad_norm_(params, 0.5)` предотвращает взрывной рост градиентов
- **Advantage normalization:** (adv - mean) / std в каждом mini-batch, не один раз на rollout
- **Value function clipping:** clip(V_new, V_old - eps, V_old + eps) - аналог policy clipping для Critic
- **Observation normalization:** running mean/std для входных наблюдений
- **Reward normalization:** делить награды на running std (не mean!) - сохраняет знак
- **Orthogonal initialization:** для слоев actor/critic, gain=sqrt(2) для скрытых, 0.01 для actor
**Самый важный trick:** нормализация advantages в каждом mini-batch отдельно, а не один раз на весь rollout. Это стабилизирует scale градиентов и одна из немногих мер с консистентным положительным эффектом во всех имплементациях PPO.
Зачем нормализовать advantages отдельно в каждом mini-batch, а не один раз на rollout?
PPO: Proximal Policy Optimization
- Clipped surrogate objective ограничивает ratio r = pi_new/pi_old в диапазоне [1-eps, 1+eps]
- PPO - практичное приближение TRPO без дорогостоящей матрицы Фишера
- K=10 эпох на один rollout -> better sample efficiency чем A2C
- Полная loss = L_CLIP + c_v * L_VF - c_e * H(pi)
- Ключевые tricks: gradient clipping, advantage normalization per mini-batch, early stopping по KL
- PPO - первый выбор для новых RL задач: прост, стабилен, масштабируем
Связанные темы
PPO стал фундаментом для RLHF - обучения языковых моделей с учётом человеческих предпочтений.
- Actor-Critic: A2C, A3C — Фундамент, который PPO улучшает через clipping
- SAC: Soft Actor-Critic — Альтернатива для continuous actions с максимизацией энтропии
- TRPO: Trust Region Policy Optimization — Теоретически строгий предшественник PPO
Вопросы для размышления
- Почему PPO вытеснил TRPO несмотря на то, что TRPO имеет более строгие теоретические гарантии?
- Как clipping ratio влияет на эксплорацию: стимулирует или подавляет её?
- Почему PPO используется в RLHF для языковых моделей, а не DQN или A3C?
Связанные уроки
- rl-09 — PPO - стабилизированный actor-critic с клиппингом
- rl-17 — RLHF использует PPO для дообучения языковых моделей
- ml-50-policy-gradient — То же семейство policy gradient в ML-треке
- calc-20-extrema-multi — Клиппинг задаёт trust-region ограничение на обновления
- ml-08-regularization — Клиппинг ограничивает шаг как регуляризатор
- prob-01-intro