Обучение с подкреплением

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.

Предварительные знания

  • Actor-Critic: A2C, A3C
  • Policy Gradient: REINFORCE

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
PPO: Proximal Policy Optimization

0

1

Войти