Обучение с подкреплением
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.
Предварительные знания
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.
- **Causality**: использовать только future returns G_t = r_t + γ*r_{t+1} + ..., а не полный G_0 - убирает нерелевантный шум прошлых наград
- **Advantage**: G_t - V(s_t) вместо G_t - V дает нормализованный сигнал относительно среднего
- **Нормализация**: нормировать advantages в батче к mean=0, std=1 - стабилизирует обучение при разных масштабах reward
- **Батчирование**: усреднять градиент по нескольким эпизодам одновременно - уменьшает монте-карло шум
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 — Градиентный подъём максимизирует ожидаемую награду