Aivaro
  • Оглавление
  • Вопросы
  • Практика
  • Вики
  • Материалы сообщества
  • Тесты
  • Поиск
✈Telegram @ai_varo
RUEN中文
…
Оглавление/Вопросы/#986

Как работает PPO (Proximal Policy Optimization) для LLM? Объясните: Actor (LLM), Critic (Value model), Clipping, KL penalty.

Краткий тезис

Proximal Policy Optimization (PPO) — это алгоритм обучения с подкреплением, адаптированный для дообучения больших языковых моделей (LLM) в пайплайне RLHF. В контексте LLM PPO состоит из четырёх ключевых компонентов: Actor (сама LLM, которая порождает ответы как политика), Critic (модель ценности, оценивающая ожидаемую награду состояния), Clipping (механизм, ограничивающий величину обновления политики для стабильности) и KL penalty (штраф, удерживающий обновлённую модель рядом с референсной, чтобы избежать «забывания» языковых навыков). Вместе эти элементы позволяют безопасно оптимизировать LLM под сигнал вознаграждения от Reward Model, не вызывая катастрофической деградации генерации.

2. Critic: модель ценности (value)

Critic (или Value model) — это отдельная нейросеть, которая оценивает ожидаемую сумму будущих наград из данного состояния $V(s_t)$. Для LLM состояние — это промпт и частично сгенерированный ответ. Critic обучается регрессией на фактические награды, полученные в эпизоде (обычно через MC return или GAE).

Функция потерь для Critic: $$ L^{VF}(\theta_v) = \mathbb{E}t \left[ (V{\theta_v}(s_t) - R_t)^2 \right] $$ где $R_t$ — discounted return, $\theta_v$ — параметры Critic.

Critic используется для вычисления advantage: $$ \hat{A}t = \underbrace{R_t - V(s_t)}{[text](/wiki/text){advantage}} $$ или через GAE для снижения дисперсии.

  • Зачем нужен Critic? Без него пришлось бы использовать REINFORCE с высокой дисперсией градиента. PPO с Critic (Actor-Critic) существенно стабилизирует обучение.
  • В контексте RLHF Critic часто инициализируется от той же LLM (например, берётся предпоследний слой и добавляется линейный выход на одно число), чтобы использовать богатые представления языка.

3. Clipping: ограничивает обновление

Клиппинг (clipping) — центральный механизм PPO, предотвращающий слишком большие изменения политики за один шаг. Он реализуется через оператор $\min$ в surrogate loss: $$ L^{CLIP}(\theta) = \mathbb{E}_t \left \min( r_t \hat{A}_t, ; [text{clip}(r_t, 1-[epsilon](/wiki/Epsilon), 1+[epsilon](/wiki/Epsilon)) \hat{A}_t ) \right] $$

  • Когда advantage положителен ($\hat{A}_t > 0$): мы хотим увеличить вероятность действия. Но клиппинг ограничивает рост отношения $r_t$ не выше $1+[epsilon](/wiki/Epsilon)$. Это значит, что даже если модель хотела бы сильно увеличить вероятность токена, она не может сделать это слишком резко.
  • Когда advantage отрицателен ($\hat{A}_t < 0$): мы хотим уменьшить вероятность. Клиппинг ограничивает падение $r_t$ не ниже $1-[epsilon](/wiki/Epsilon)$, предотвращая чрезмерное подавление токена.

Таким образом, PPO оптимизирует политику в пределах «доверительной области» размера $[epsilon](/wiki/Epsilon)$ (например, 0.2), что даёт надёжные монотонные улучшения без сложных вычислений гессиана (как в TRPO).

В LLM-сценарии клиппинг особенно важен, потому что генерация токенов — это огромное пространство действий (десятки тысяч токенов), и без ограничения одно неудачное обновление может разрушить грамматику или фактологию.


4. KL penalty: штраф за удаление от reference

KL penalty — это дополнительный член в функции потерь PPO, который штрафует модель за отклонение распределения вероятностей от reference model (исходная SFT-модель или замороженная копия RL-модели). В RLHF он добавлен, чтобы:

  • Не забывать языковые навыки: без штрафа модель может «переоптимизироваться» под Reward Model, начав генерировать бессмысленные, но высоконаграждаемые последовательности.
  • Сохранять разнообразие: распределение токенов остаётся близким к базовому, что предотвращает коллапс режима (mode collapse).

KL penalty обычно вычисляется как KL-дивергенция от референсной политики на каждом шаге генерации: $$ KL_{[text](/wiki/text){penalty}} = -[beta](/wiki/beta) \cdot \mathbb{E}_{t} \left D_{KL}\big( \pi_{\theta}(\cdot|s_t) \parallel \pi_{[text{ref}}(\cdot|s_t) \big) \right] $$

В некоторых реализациях (например, DeepSpeed Chat) KL penalty добавляется непосредственно в reward на каждом токене: $$ r^{[text](/wiki/text){total}}t = r^{[text](/wiki/text){RM}}t - [beta](/wiki/beta) \cdot \log \frac{\pi{\theta}(a_t|s_t)}{\pi{[text](/wiki/text){ref}}(a_t|s_t)} $$ что эквивалентно добавлению штрафа в advantage при вычислении PPO loss.

  • $[beta](/wiki/beta)$ — коэффициент, который можно адаптивно подстраивать (например, алгоритмы с адаптивным KL, как в adaptive KL).
  • Reference model обычно не обучается и остаётся неизменной на протяжении всего RL-этапа.

5. Пет-проект для закрепления

Задача: Реализовать минимальный PPO для обучения небольшой языковой модели (например, GPT-2 small) на синтетической задаче — генерация коротких ответов с простым сигналом награды (длина ответа, наличие ключевого слова).

Инструменты:

  • Hugging Face Transformers для загрузки GPT-2.
  • TRL (Transformer Reinforcement Learning) — библиотека, включающая PPO для LLM.
  • Weights & Biases для логирования метрик (reward, KL, clip fraction).

Шаги:

  1. Загрузите GPT-2 (actor) и создайте копию как reference model.
  2. Определите простой Reward Model: возвращает +1, если ответ содержит слово «да», иначе 0. Для правдоподобия добавьте штраф за длину (например, -0.01 на токен).
  3. Реализуйте PPO с помощью trl.PPOTrainer: укажите конфиг с cliprange=0.2, kl_penalty=0.05.
  4. Обучите на наборе из 1000 промптов (например, вопросы с ожидаемым ответом «да» или «нет»).
  5. Отслеживайте: средний reward, KL(actor||ref), долю заклиппированных градиентов.

Ожидаемый результат: После обучения модель начнёт генерировать ответы с высокой наградой, но при этом её распределение токенов не должно сильно отличаться от исходного (KL < 0.1). Вы увидите, как clipping предотвращает резкие скачки loss, а KL penalty сохраняет связность текста.


Связь с другими вопросами

ВопросТема
327Какие задачи решает Reward Model в RLHF?

Навигация

  • Предыдущий: 985
  • Следующий: 987
  • Индекс: 00. Индекс разборов