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

Policy Gradient: REINFORCE

ChatGPT работает потому, что языковую модель выровняли с человеческими предпочтениями через RLHF - Reinforcement Learning from Human Feedback. Сердце RLHF - Policy Gradient, а REINFORCE - его простейшая форма. Понять REINFORCE значит понять, как GPT-4 стал полезным ассистентом, а не просто предсказателем следующего токена.

  • **OpenAI ChatGPT (InstructGPT)**: RLHF использует Policy Gradient для обновления языковой модели на основе human preference data - именно это делает модели послушными и полезными.
  • **AlphaGo**: комбинация Policy Gradient (для обучения SL-политики) и Monte Carlo Tree Search - Policy Network обучался именно REINFORCE-подобным методом на миллионах партий.
  • **Управление роботами**: OpenAI Dactyl обучил роботическую руку решать кубик Рубика - Policy Gradient на непрерывных действиях (углы моторов), что невозможно с DQN.

Уильямс и алгоритм REINFORCE

В 1992 году Рональд Дж. Уильямс опубликовал работу «Simple statistical gradient-following algorithms for connectionist reinforcement learning», представив семейство policy gradient методов REINFORCE. Само название - акроним: REward Increment = Nonnegative Factor times Offset Reinforcement times Characteristic Eligibility. Уильямс показал, что log-derivative trick даёт несмещённую оценку градиента ожидаемой награды, и политику можно оптимизировать напрямую без value function. Строгое обоснование пришло с policy gradient theorem (Sutton, McAllester, Singh, Mansour, 2000), на котором держатся все современные policy gradient алгоритмы от A3C до PPO.

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

  • Deep Q-Network (DQN)
  • TD Learning и Q-Learning

REINFORCE Algorithm

DQN учит Q-функцию и выводит политику через `argmax`. REINFORCE идёт напрямую: параметризует политику `π(a|s; θ)` нейросетью и оптимизирует её градиентным подъёмом. Цель - максимизировать ожидаемый суммарный reward `J(θ) = E[∑ γt * rt]`.

**Policy Gradient Theorem** даёт градиент: `∇J(θ) = E[∇ log π(a|s; θ) * G]`, где G - суммарный return с текущего шага. Интуиция: если действие принесло высокий return, увеличиваем его вероятность (`log π` вверх). Если низкий - уменьшаем.

REINFORCE - Monte Carlo метод: он использует полный эпизод для оценки G. Это значит нельзя обновляться на каждом шаге - нужно дождаться конца эпизода. Для длинных эпизодов (часы игры) это проблема.

Чему равен градиент цели J(θ) в алгоритме REINFORCE согласно Policy Gradient Theorem?

Baseline для снижения дисперсии

Главная проблема REINFORCE - огромная дисперсия градиентов. В CartPole: один эпизод даёт G=200 (отлично), другой G=50 (плохо). Но разница только в случайном начальном состоянии, а не в качестве политики. Обновления прыгают, обучение медленное.

**Baseline** b(s) - произвольная функция состояния (но не действий). Вычитание baseline не добавляет смещения: `E[∇ log π * (G - b)] = E[∇ log π * G] - b * E[∇ log π] = E[∇ log π * G]`, поскольку `E[∇ log π] = 0`. Но дисперсия падает, если b ≈ E[G|s].

Оптимальный baseline минимизирует дисперсию: `b*(s) = E[G²|s] / E[G|s]`. На практике используют V(s) - state value function. Это приводит к Actor-Critic: Actor = политика, Critic = value baseline.

Почему вычитание baseline b(s) из return не добавляет смещения в градиент?

Источники дисперсии и способы борьбы

Дисперсия REINFORCE растёт линейно с длиной эпизода: ранние действия получают return G₀ = r₁ + r₂ + ... + rT - огромный шумный сигнал. Но r₁ влияет только на r₁...rT, а не на r₀...r₋₁ - это называется causality trick.

  1. **Causality**: использовать только future returns G_t = r_t + γ*r_{t+1} + ..., а не полный G_0 - убирает нерелевантный шум прошлых наград
  2. **Advantage**: G_t - V(s_t) вместо G_t - V дает нормализованный сигнал относительно среднего
  3. **Нормализация**: нормировать advantages в батче к mean=0, std=1 - стабилизирует обучение при разных масштабах reward
  4. **Батчирование**: усреднять градиент по нескольким эпизодам одновременно - уменьшает монте-карло шум

OpenAI в своём spinup.openai.com показывает: правильное использование causality и нормализации advantage даёт 5-10x улучшение sample efficiency в REINFORCE без изменения алгоритма.

Что такое causality trick в REINFORCE и зачем он нужен?

Log-derivative trick

Как вообще вычислить градиент `∇E[G]` = `∇∫ π(τ) * G(τ) dτ`, если G зависит от среды (не от параметров θ)? Прямое дифференцирование по θ невозможно - reward недифференцируем по параметрам политики.

**Log-derivative trick** (он же REINFORCE trick, он же score function estimator): `∇ π(τ) = π(τ) * ∇ log π(τ)`. Отсюда: `∇E[G] = E[G * ∇ log π(τ)]`. Градиент теперь - математическое ожидание по самой политике - его можно оценить монте-карло: запустить эпизод и вычислить sample.

Log-derivative trick - это частный случай более общего score function estimator. Тот же трюк используется в вариационных автоэнкодерах (REINFORCE estimator для дискретных переменных) и в черноящичной оптимизации.

Policy Gradient и Q-learning оптимизируют одно и то же, просто разными методами

Policy Gradient оптимизирует параметры политики напрямую; Q-learning оптимизирует value function и выводит политику косвенно. Это разные объекты оптимизации с разными компромиссами

Policy Gradient работает с непрерывными действиями (нет argmax), поддерживает стохастические политики и проще комбинируется с RLHF. Q-learning более sample-efficient и лучше работает с дискретными действиями. Actor-Critic объединяет оба подхода.

Зачем в Policy Gradient используется логарифм вероятности log π, а не сама вероятность π?

Ключевые идеи

  • **REINFORCE** напрямую оптимизирует параметры политики `π(a|s; θ)` через градиент `E[∇ log π * G]` - хорошие действия становятся вероятнее, плохие - маловероятнее.
  • **Log-derivative trick** превращает недифференцируемую цель E[G] в оцениваемое монте-карло выражение E[G * ∇ log π].
  • **Baseline** b(s) вычитается из return без смещения градиента, значительно снижая дисперсию - оптимальный baseline это V(s), что приводит к Actor-Critic.
  • **Causality trick и нормализация** advantage - практические техники, дающие 5-10x улучшение без изменения алгоритма.

Связанные темы

REINFORCE - фундамент для всех современных policy gradient методов:

  • PPO (Proximal Policy Optimization) — PPO - это REINFORCE с trust region ограничением и value baseline; используется в ChatGPT RLHF
  • DQN и value-based методы — Альтернативный подход через Q-функцию; Actor-Critic объединяет оба - Policy Gradient для актора и value-estimation как baseline

Вопросы для размышления

  • REINFORCE работает только после полного эпизода. Как это ограничение обходит A3C (Asynchronous Advantage Actor-Critic)?
  • Baseline вычитается из return, чтобы снизить дисперсию. Что произойдёт, если baseline будет систематически завышенным - станет ли алгоритм смещённым?
  • В RLHF reward модель обучается на human preferences, а не на явной reward функции. Как это меняет требования к алгоритму Policy Gradient?

Связанные уроки

  • rl-05 — REINFORCE - фундамент всех policy gradient методов
  • rl-09 — Actor-Critic добавляет baseline для снижения дисперсии REINFORCE
  • ml-50-policy-gradient — Та же теорема policy gradient в ML-треке
  • prob-07-expectation — Градиент - это матожидание по траекториям
  • calc-19-gradient — Градиентный подъём максимизирует ожидаемую награду
Policy Gradient: REINFORCE

0

1

Войти