Машинное обучение
Policy Gradient
ChatGPT обучался не только на текстах - финальный критический шаг назывался RLHF (Reinforcement Learning from Human Feedback), где алгоритм policy gradient (PPO) учился генерировать ответы, которые предпочитают люди. То же семейство алгоритмов учит роботов ходить, дронов летать, а беспилотные автомобили - водить.
- **RLHF для языковых моделей** - PPO дообучает ChatGPT, Claude и другие LLM генерировать ответы, соответствующие человеческим предпочтениям: безопасные, полезные и честные, превращая сырую языковую модель в полезного ассистента
- **Робототехника** - SAC и TD3 обучают роботов-манипуляторов собирать предметы, робособак ходить по неровной поверхности, а хирургических роботов выполнять точные движения в операционной
- **Игры и стратегии** - PPO обучил агентов OpenAI Five побеждать чемпионов мира в Dota 2, AlphaStar от DeepMind - в StarCraft II, демонстрируя сверхчеловеческий уровень в сложных стратегических играх с неполной информацией
Предварительные знания
От REINFORCE до PPO: как policy gradient стал движком RLHF
В 1992 году Рональд Уильямс опубликовал алгоритм REINFORCE, который дал обучению с подкреплением способ напрямую оптимизировать параметризованную политику через трюк с логарифмом вероятности, а не учить таблицы ценностей. Идея была изящной, но страдала от высокой дисперсии, поэтому в поле добавили критика: методы actor-critic оценивали базовую функцию ценности, чтобы снизить шум в градиенте. Следующий скачок случился в 2015 году, когда Джон Шульман с коллегами представил TRPO (Trust Region Policy Optimization), гарантировавший стабильное, почти монотонное улучшение за счёт ограничения каждого шага доверительной областью по KL-дивергенции. TRPO работал, но был тяжёлым в реализации. В 2017 году Шульман с командой в OpenAI опубликовал PPO (Proximal Policy Optimization), заменив жёсткую доверительную область простой обрезкой целевой функции. PPO оказался почти таким же стабильным и гораздо проще в коде, и стал методом по умолчанию в робототехнике, игровых агентах и в итоге в RLHF, том самом шаге, который превратил сырые языковые модели в выровненных ассистентов вроде ChatGPT.
REINFORCE: прямая оптимизация политики
В Q-learning мы учили функцию ценности Q(s, a) и из неё выводили политику (выбирай действие с максимальным Q). **Policy gradient** подходит с другой стороны: мы **напрямую параметризуем политику** pi(a|s; theta) - нейросеть, которая принимает состояние и выдаёт вероятности действий. Цель - подобрать параметры theta так, чтобы политика получала максимальный суммарный reward. Это как разница между тем, чтобы оценивать каждый ресторан по рейтингу (Q-learning) и напрямую учиться выбирать ресторан, который вам понравится (policy gradient).
Ключевая идея REINFORCE - **log-probability trick** (он же score function estimator). Мы не можем напрямую дифференцировать reward по параметрам сети (reward приходит из среды, а не из нашей модели). Но мы можем записать градиент ожидаемого reward через log-вероятность: **grad J(theta) = E[sum_t grad log pi(a_t|s_t; theta) * R_t]**. Интуиция: если эпизод принёс большой reward R, увеличь вероятности всех действий, которые были выбраны в этом эпизоде. Если reward маленький - уменьши их.
**Policy Gradient Theorem (упрощённо):** grad J(theta) = E[ sum_t grad log pi(a_t | s_t; theta) * G_t ] Где: - J(theta) - ожидаемый суммарный reward (то, что мы максимизируем) - pi(a_t | s_t; theta) - вероятность действия a_t в состоянии s_t - G_t - return (суммарный reward от шага t до конца эпизода) - grad log pi - направление, в котором вероятность действия растёт **Алгоритм REINFORCE:** 1. Сыграй полный эпизод, записывая (s_t, a_t, r_t) 2. Для каждого шага t вычисли return G_t = r_t + gamma*r_{t+1} + gamma^2*r_{t+2} + ... 3. Обнови theta: theta += alpha * grad log pi(a_t|s_t) * G_t 4. Повтори
Главная проблема REINFORCE - **высокая дисперсия (variance)**. Поскольку мы используем Monte Carlo оценку (полный эпизод), G_t может сильно варьироваться от эпизода к эпизоду. Один эпизод принёс G=200, другой G=50 - и градиенты скачут хаотично. Простой приём снижения дисперсии - **baseline subtraction**: вычитаем среднее значение return, чтобы хорошие эпизоды получали положительный сигнал, а плохие - отрицательный. Нормализация returns в коде выше - это именно baseline subtraction.
Почему REINFORCE обновляет параметры в направлении grad log pi(a|s) * G, а не просто grad pi(a|s) * G?
Advantage Actor-Critic (A2C)
REINFORCE ждёт конца эпизода, чтобы получить return G_t. Это создаёт два проблематичных свойства: 1. высокая дисперсия (один длинный эпизод может всё испортить) 2. невозможно учиться в задачах без чёткого конца (continuing tasks). **Actor-Critic** решает обе проблемы, разделяя модель на две части: **Actor** (политика pi) выбирает действия, а **Critic** (функция ценности V(s)) оценивает, насколько хорошо текущее состояние.
Ключевое понятие - **Advantage** A(s, a) = Q(s, a) - V(s). Advantage показывает, насколько конкретное действие **лучше среднего** в данном состоянии. Если advantage положительный - действие лучше, чем обычно, нужно увеличить его вероятность. Если отрицательный - хуже среднего, уменьшить. На практике advantage оценивается через TD-ошибку: **A(s, a) = r + gamma * V(s') - V(s)**, где V(s) - выход Critic.
**Почему Advantage снижает дисперсию:** REINFORCE: grad J = E[grad log pi(a|s) * G_t] - G_t включает ВСЕ будущие rewards (сумма от t до конца) - G_t сильно зашумлён (много случайности) Actor-Critic: grad J = E[grad log pi(a|s) * A(s, a)] - A(s, a) = r + gamma * V(s') - V(s) - Использует только ОДИН шаг reward + оценку Critic - V(s) - обученная нейросеть, гладкая оценка - Дисперсия значительно ниже **Компромисс (bias-variance tradeoff):** - REINFORCE: unbiased (нет смещения), high variance - Actor-Critic: biased (Critic может ошибаться), low variance - На практике низкая дисперсия важнее, чем отсутствие смещения
A2C (Advantage Actor-Critic) - это **синхронная** версия алгоритма: несколько параллельных сред собирают данные одновременно, затем все градиенты усредняются и применяются за один шаг. Это эффективнее, чем один агент в одной среде, потому что параллельные среды дают более разнообразный опыт и стабилизируют обучение. A2C - рабочая лошадка policy gradient: простой, понятный и достаточно эффективный для многих задач.
Advantage A(s, a) = Q(s, a) - V(s). Что означает отрицательный advantage для конкретного действия?
PPO - Proximal Policy Optimization
REINFORCE и A2C делают **один шаг обновления** на каждый батч данных и выбрасывают его. Это расточительно - данные собирались долго, а использовались один раз. Хочется делать несколько шагов оптимизации на одном и том же батче. Но если обновить политику слишком сильно, новая политика будет далека от той, что собирала данные, и обновления станут некорректными. **PPO (Proximal Policy Optimization)** решает эту проблему так: ограничивает размер обновления через **clipped objective**.
**Проблема, которую решает PPO:** В policy gradient данные собраны старой политикой pi_old. Мы хотим обновить к новой политике pi_new. Если pi_new слишком далека от pi_old: - Данные нерелевантны (собраны другой политикой) - Обновление может ухудшить модель катастрофически - Обучение нестабильно **TRPO (Trust Region Policy Optimization)** - предшественник: - Добавлял ограничение KL(pi_old || pi_new) < delta - Гарантировал монотонное улучшение - Но сложен в реализации (conjugate gradient, line search) **PPO** - упрощение TRPO: - Вместо жёсткого ограничения - clipping в loss функции - Почти так же стабилен, но гораздо проще - 2017 год, OpenAI - и с тех пор стал стандартом
Идея clipped objective: вычислим отношение вероятностей **r(theta) = pi_new(a|s) / pi_old(a|s)**. Если r = 1 - политика не изменилась. Если r = 2 - новая политика делает это действие в 2 раза вероятнее. PPO обрезает (clips) это отношение в диапазоне [1 - epsilon, 1 + epsilon], обычно epsilon = 0.2. То есть PPO не позволяет изменить вероятность любого действия более чем на 20% за одно обновление.
PPO стал стандартом индустрии по нескольким причинам: 1. прост в реализации - всего несколько строк отличия от обычного policy gradient 2. стабилен - clipping предотвращает катастрофические обновления 3. data-efficient - можно делать несколько эпох на одном батче данных 4. универсален - работает с дискретными и непрерывными действиями. Именно PPO использовался в **RLHF для ChatGPT**: после предварительного обучения на тексте, PPO дообучает модель генерировать ответы, которые предпочитают люди.
Зачем PPO обрезает (clips) отношение вероятностей r(theta) = pi_new(a|s) / pi_old(a|s)?
Actor-Critic архитектуры
Actor-Critic - это не один алгоритм, а целое семейство. Все они разделяют идею: Actor выбирает действия, Critic оценивает их. Но детали реализации сильно различаются: как устроена сеть, как обучается Critic, какие трюки используются для стабильности. Разберём основные варианты и их области применения.
**A3C (Asynchronous Advantage Actor-Critic)** - историческая веха (DeepMind, 2016). Вместо одного агента запускаются N параллельных агентов, каждый в своей копии среды, каждый со своей копией модели. Агенты асинхронно обновляют общую модель. Это было до эпохи PPO и решало проблему коррелированных данных: разные агенты видят разные ситуации. Но A3C уступил A2C (синхронной версии) и PPO, потому что асинхронные обновления вносят шум и усложняют воспроизводимость.
**SAC (Soft Actor-Critic) - для непрерывных действий:** Стандартный Actor-Critic максимизирует reward. SAC максимизирует reward + entropy (случайность) политики. Зачем entropy? - Стимулирует **исследование** (exploration) - Политика не коллапсирует к одному действию - Более робастная к perturbations среды Особенности SAC: - Два Critic (Q1, Q2) - берётся минимум для стабильности - Actor выводит параметры распределения (mean, std) - Действия сэмплируются из Gaussian - Автоматическая настройка коэффициента entropy Где используется: - Робототехника: управление манипуляторами, ходьба - Непрерывное управление: моторы, суставы - Задачи, где exploration критичен
Выбор алгоритма зависит от задачи. **Дискретные действия** (Atari, настольные игры, выбор из набора вариантов): PPO - лучший default. **Непрерывные действия** (робототехника, управление моторами, физические симуляции): SAC или TD3. **Обучение языковых моделей** (RLHF): PPO, но с модификациями (KL penalty относительно базовой модели). Общее правило: начинайте с PPO, переходите к SAC/TD3 только если PPO не справляется с непрерывными действиями.
Все эти алгоритмы - наследники одной идеи: **напрямую оптимизировать политику**. REINFORCE показал, что это возможно. Actor-Critic снизил дисперсию. PPO сделал обучение стабильным. SAC и TD3 адаптировали подход для непрерывных действий. А RLHF применил его к языковым моделям, превратив GPT из генератора текста в полезного ассистента. Policy gradient - один из самых влиятельных фреймворков в современном AI.
Policy gradient всегда лучше Q-learning, потому что он напрямую оптимизирует то, что нам нужно
Q-learning более sample efficient для задач с дискретными действиями, а policy gradient необходим для непрерывных действий и задач, где нужна стохастическая политика
DQN может обучиться на меньшем количестве данных, потому что использует replay buffer и off-policy обучение - каждый опыт используется многократно. Policy gradient методы (кроме SAC) обычно on-policy: данные используются один раз и выбрасываются. Однако Q-learning не масштабируется на непрерывные пространства действий (нужен argmax по всем действиям), и для таких задач policy gradient - единственный практический вариант. Правильный выбор зависит от свойств задачи, а не от принципиального превосходства одного подхода.
Итоги
- **REINFORCE:** напрямую оптимизирует политику через log-probability trick - grad J = E[grad log pi(a|s) * G_t], но страдает от высокой дисперсии из-за Monte Carlo оценки return
- **Actor-Critic (A2C):** Actor выбирает действия, Critic оценивает их через V(s), advantage A = r + gamma*V(s') - V(s) показывает, насколько действие лучше среднего, существенно снижая дисперсию
- **PPO:** clipped objective ограничивает изменение политики в пределах [1-eps, 1+eps], позволяя делать несколько эпох оптимизации на одном батче данных - стандарт индустрии для RLHF и большинства RL задач
- **Семейство Actor-Critic:** SAC для непрерывных действий (робототехника), TD3 с twin critics против overestimation, PPO для дискретных задач и LLM - от REINFORCE до RLHF в ChatGPT, policy gradient прошёл путь от теоретической идеи до технологии, стоящей за самыми впечатляющими AI-системами
Связанные темы
Policy gradient объединяет нейросети, оптимизацию и теорию принятия решений, связывая reinforcement learning с современными LLM:
- Q-Learning — Value-based альтернатива: Q-learning учит функцию ценности действий, policy gradient напрямую учит политику. Q-learning эффективнее по данным для дискретных задач, policy gradient необходим для непрерывных действий
- Введение в RL — Фундамент: MDP, reward, policy, value function - базовые концепции, на которых строится policy gradient. Понимание exploration vs exploitation помогает понять, зачем SAC максимизирует entropy
- Нейронные сети — Policy gradient параметризует политику нейросетью и обучает её через backpropagation. Архитектуры Actor и Critic - это обычные neural networks с softmax (Actor) или линейным (Critic) выходом
- Оптимизация и градиентный спуск — Policy gradient - это градиентный подъём (ascent) в пространстве параметров политики. PPO добавляет ограничения на размер шага, аналогично trust region методам в оптимизации
Вопросы для размышления
- REINFORCE использует полный return G_t (Monte Carlo), а Actor-Critic - одношаговую TD оценку. Между ними есть спектр: n-step returns. Как выбор n влияет на bias-variance tradeoff, и когда какой вариант предпочтительнее?
- PPO ограничивает изменение политики через clipping. Какие проблемы возникли бы, если убрать clipping и делать несколько эпох обычного policy gradient на одном батче данных?
- RLHF использует PPO для дообучения языковых моделей. Почему нельзя просто дообучить модель supervised learning на ответах, которые люди оценили высоко? Что именно PPO добавляет, чего нет в supervised learning?
Связанные уроки
- ml-49-q-learning — Policy-методы контрастируют с value-методами
- ml-48-rl-intro — Строится на основах MDP и наград
- ml-25-neural-networks — Политика - выход нейросети
- ml-09-gradient-descent — Градиентный подъём обновляет политику
- calc-19-gradient — Теорема policy gradient использует градиенты
- aie-47-autonomous-agents