Все статьи
Артемий Мазаев·· 8 мин чтения

Пост-тренинг LLM: RLHF → DPO → GRPO 🎯🧮

Как LLM учат вести себя хорошо после претрейна — эволюция четырёх алгоритмов за три года: PPO с критик-сетью (InstructGPT, 2022), DPO без RL-петли (2023), GRPO без критика (DeepSeekMath, 2024) и DAPO, который чинит баги ванильного GRPO (2025). Формулы из первоисточников, NumPy-проверенный численный пример.

Ну чё, малютки, вот словосочетание, которое встречается в каждой второй статье этого блога про конкретную модель: «RL post-training». У Kimi K3 — MuonClip и агентский RL. У DeepSeek-R1 — GRPO. Каждый раз мимоходом, каждый раз без объяснения, что там вообще происходит внутри. Пора закрыть эту дыру: как LLM вообще учат «вести себя хорошо» после претрейна, и почему индустрия за три года дошла от PPO с отдельной critic-сетью до GRPO, которому критик вообще не нужен.

🔥Суть за 10 секунд

Пост-тренинг LLM — не одна методика, а эволюция четырёх. PPO (2022, InstructGPT) — классический RL с отдельной critic-сетью, которая оценивает, насколько хорош текущий ответ. DPO (2023) обходит RL-петлю вообще: обычный supervised loss на паре «хороший/плохой» ответ. GRPO (2024, DeepSeekMath) возвращает RL, но убирает критика — baseline считается статистикой по группе из G rollout’ов на один промпт. DAPO (2025, ByteDance) чинит конкретные баги ванильного GRPO: entropy collapse и промпты с нулевым градиентом.

🕰️ Три года эволюции за один взгляд
Каждый следующий алгоритм — прямой ответ на конкретную боль предыдущего.
Март 2022
InstructGPT (RLHF + PPO)
Ouyang et al., arXiv:2203.02155. Канонический рецепт: SFT → reward model → PPO с KL-штрафом против reference-модели.
Май 2023
DPO
Rafailov et al., arXiv:2305.18290. Reward становится implicit — RL-петля и отдельная reward-модель не нужны вовсе, обычный supervised loss на парах предпочтений.
Февраль 2024
GRPO
DeepSeekMath, arXiv:2402.03300. Group-relative advantage без critic-сети: G=64 rollout'ов на промпт, KL-коэффициент β=0.04.
Январь 2025
DeepSeek-R1
arXiv:2501.12948. GRPO на масштабе продакшена: AIME 2024 pass@1 вырос с 15.6% до 71.0% за RL-тренировку.
Март 2025
DAPO
ByteDance, arXiv:2503.14476. Чинит entropy collapse и «нулевой градиент» в ванильном GRPO: 50 против 47 у DeepSeek-R1-Zero-Qwen-32B на AIME 2024, за половину шагов тренировки.
Структурная карта: от одного SFT-чекпоинта — три разных пути к пост-тренингу.

Часть 1: RLHF по классике — PPO и его критик

Классический RLHF-рецепт зафиксировал InstructGPT (Ouyang et al., arXiv:2203.02155): SFT → обучаем отдельную reward-модель на человеческих предпочтениях → гоняем PPO, максимизируя эту награду с KL-штрафом против reference-модели, чтобы политика не улетала слишком далеко от того, с чего начала.

Сердце PPO — клипованный surrogate-объектив (Schulman et al., arXiv:1707.06347):

LCLIP(θ)=Et[min(rt(θ)A^t, clip(rt(θ),1ε,1+ε)A^t)]L^{CLIP}(\theta) = \mathbb{E}_t\left[\min\left(r_t(\theta)\hat{A}_t,\ \operatorname{clip}(r_t(\theta),\, 1-\varepsilon,\, 1+\varepsilon)\hat{A}_t\right)\right] rt(θ)=πθ(atst)πθold(atst),ε=0.2r_t(\theta) = \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\theta_{\text{old}}}(a_t \mid s_t)}, \qquad \varepsilon = 0.2

Клип не даёт одному шагу обновления политики уйти слишком далеко от старой версии — обрезает как чрезмерный рост вероятности удачного действия, так и чрезмерное падение вероятности неудачного. Но вся эта конструкция держится на advantage-оценке A^t\hat{A}_t, а её без критика не посчитать: GAE (generalized advantage estimation) берёт TD-остаток δt=rt+γV(st+1)V(st)\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t) и сглаживает по нескольким шагам. V(s) — это отдельная обучаемая критик-сеть, которая должна предсказывать, «насколько хорошим в среднем окажется состояние», чтобы дать честный baseline для сравнения.

Проблема практическая, не концептуальная: критик — это ещё одна модель, обычно сопоставимого размера с самой policy-моделью, которая тренируется параллельно и должна постоянно жить в VRAM.

🧮 Сколько моделей держим в памяти одновременно
Выбери размер policy-модели — увидишь, сколько копий такого же размера нужно держать в VRAM для каждого подхода (только веса, bf16, без оптимайзера и активаций).
PPO (4 модели)56 ГБ
policy + critic + reward model + reference
GRPO + reward model (3 модели)42 ГБ
policy + reward model + reference — критика уже нет
GRPO + rule-based reward (2 модели)28 ГБ
policy + reference — как в DeepSeek-R1-Zero для math/code
Структурная иллюстрация, не точный прод-бюджет: реальный расход VRAM выше (оптимайзер, градиенты, активации, KV-кэш при генерации rollout'ов) и расходится между инженерными источниками — здесь считается только то, что железно известно: сколько копий модели нужно держать одновременно.

Часть 2: DPO — а зачем нам вообще RL

DPO (Rafailov et al., arXiv:2305.18290) заходит с неожиданной стороны: что если вообще не тренировать отдельную reward-модель и не гонять RL-петлю, а свести задачу к обычному supervised loss?

LDPO(πθ;πref)=E(x,yw,yl)D[logσ(βlogπθ(ywx)πref(ywx)βlogπθ(ylx)πref(ylx))]\mathcal{L}_{DPO}(\pi_\theta; \pi_{ref}) = -\,\mathbb{E}_{(x,y_w,y_l)\sim D}\left[\log \sigma\left(\beta \log\frac{\pi_\theta(y_w \mid x)}{\pi_{ref}(y_w \mid x)} - \beta \log\frac{\pi_\theta(y_l \mid x)}{\pi_{ref}(y_l \mid x)}\right)\right]

Фокус в переопределении: если подставить r(x,y)=βlog(πθ(yx)/πref(yx))+βlogZ(x)r(x,y) = \beta \log(\pi_\theta(y|x)/\pi_{ref}(y|x)) + \beta \log Z(x) в модель предпочтений Брэдли-Терри, нормировочная константа Z(x) сокращается в паре, и получается loss, который вообще не требует явной reward-модели — сама политика неявно и есть награда. На датасете из пар «выбранный/отвергнутый» ответ (y_w/y_l) это обучение прямое: никакой генерации во время тренировки, никакого критика, никакой RL-петли.

Что теряется: DPO работает строго на офлайн-данных — какие пары ответов были собраны, такие и обучают. Никакого online-исследования, никакой генерации новых кандидатов во время обучения. Здесь стоит честная оговорка: сам пейпер DPO заявляет только качественно, что метод «стабилен, производителен и вычислительно лёгок» — точных цифр экономии compute/памяти относительно полного RLHF в пейпере нет, несмотря на то, что это заявление часто пересказывают как количественное.


Часть 3: GRPO — RL возвращается, критик — нет

GRPO — детище DeepSeekMath (arXiv:2402.03300), а не DeepSeek-R1 (это частая путаница): именно здесь механизм описан впервые. Идея: вместо того чтобы тренировать критика, который предсказывает baseline для одного rollout’а, сэмплируем сразу G rollout’ов на один и тот же промпт и берём статистику самой группы как baseline.

JGRPO(θ)=E[1Gi=1G1oit=1oi{min[ρi,tA^i,t, clip(ρi,t,1ε,1+ε)A^i,t]βDKL[πθπref]}]J_{GRPO}(\theta) = \mathbb{E}\left[\frac{1}{G}\sum_{i=1}^{G}\frac{1}{|o_i|}\sum_{t=1}^{|o_i|}\left\{\min\left[\rho_{i,t}\hat{A}_{i,t},\ \operatorname{clip}(\rho_{i,t}, 1-\varepsilon, 1+\varepsilon)\hat{A}_{i,t}\right] - \beta D_{KL}[\pi_\theta \,\|\, \pi_{ref}]\right\}\right] A^i=rimean(r1,,rG)std(r1,,rG)\hat{A}_i = \frac{r_i - \operatorname{mean}(r_1,\dots,r_G)}{\operatorname{std}(r_1,\dots,r_G)}

ρi,t\rho_{i,t} — тот же ratio, что и rt(θ)r_t(\theta) в PPO. Разница — в advantage: никакой отдельной сети, только z-score награды внутри своей группы. DeepSeekMath использует G=64 и KL-коэффициент β=0.04.

⚖️ PPO vs GRPO: как считается advantage
Одна и та же группа из 8 rollout'ов на один промпт (1 = верный ответ, 0 = неверный). Переключи режим — увидишь, как разные алгоритмы превращают эти награды в сигнал для градиента.
r=1
+0.77
r=0
-1.29
r=1
+0.77
r=1
+0.77
r=0
-1.29
r=1
+0.77
r=0
-1.29
r=1
+0.77
 = (r − mean) / std = (r − 0.625) / 0.4841
Никакой отдельной сети: baseline — статистика самой группы. Формула и G=64 — из DeepSeekMath (arXiv:2402.03300).
🎲 Размер группы решает разброс оценки
Двигай размер группы G — увидишь, как меняется разброс advantage-оценки для одного и того же «верного» rollout'а между разными случайными группами.
Разброс (std) оценки advantage между группами
0.357
Больше rollout'ов на промпт — стабильнее оценка baseline, но и дороже: G сэмплов нужно сгенерировать и оценить на каждый промпт. DeepSeekMath (arXiv:2402.03300) остановилась на G=64.

DeepSeek-R1 (arXiv:2501.12948) взял ровно этот механизм и прогнал его на масштабе продакшена: AIME 2024 pass@1 у DeepSeek-R1-Zero вырос с 15.6% до 71.0% за RL-тренировку одним GRPO, без единого шага SFT перед этим.

Смежный кейс из того же семейства идей — как эволюционирует не только RL-алгоритм, но и сам оптимизатор вокруг него. В Kimi K2 использовался MuonClip: Muon плюс QK-Clip против взрыва attention-логитов. В Kimi K3 он превращается в Per-Head Muon — тот же принцип, применённый к каждой attention-голове по отдельности (по независимым разборам архитектуры, официально Moonshot это отдельно не расписывает). RL-петля и оптимизатор, который её тренирует, эволюционируют параллельно, не только сам loss.

🎚️ Коэффициент β: насколько туго держим поводок
β — вес KL-штрафа против reference-модели в объективе. Больше β — политика держится ближе к исходной модели (безопаснее, меньше reward hacking, меньше улучшение). Меньше β — больше свободы для улучшения, больше риск переоптимизации под несовершенную награду.
β = 0.04из первоисточника
arXiv:2402.03300
Подтверждено прямой выдержкой из текста пейпера.

Часть 4: DAPO — что было не так в ванильном GRPO

ByteDance (arXiv:2503.14476) нашёл в GRPO два конкретных структурных бага. Первый — entropy collapse: энтропия политики быстро падает, сэмплированные ответы одной группы становятся почти идентичными друг другу. Второй — промпты с нулевым градиентом: если все G ответов на промпт получили одинаковую награду (например, все правильные), то std(r1,,rG)=0\operatorname{std}(r_1,\dots,r_G) = 0, advantage для всей группы равен нулю, и градиент для этого промпта попросту исчезает — впустую потраченный compute.

Фикс называется DAPO — Decoupled Clip and Dynamic Sampling Policy Optimization, но конкретная техника расширения клипа в пейпере называется Clip-Higher, а не «decoupled clip» (это словосочетание — только часть названия акронима): раздельные нижняя и верхняя границы клипа, εlow=0.2\varepsilon_{low}=0.2 и εhigh=0.28\varepsilon_{high}=0.28, вместо одной симметричной ε. Dynamic Sampling — второй фикс, честно названный именно так: пересэмплирует и отфильтровывает промпты, где все ответы получили одинаковую награду (0<{oiis_equivalent(a,oi)}<G0 < |\{o_i \mid \text{is\_equivalent}(a, o_i)\}| < G), поддерживая эффективный размер батча вместо того, чтобы впустую тратить compute на нулевой градиент.

Пейпер добавляет ещё две техники (Token-Level Policy Gradient Loss, Overlong Reward Shaping) — за скобками этой статьи, но вот полная траектория ablation на AIME 2024 (Qwen2.5-32B):

30 → 50AIME 2024, ablation DAPO

Ванильный GRPO — 30. + Overlong Filtering — 36. + Clip-Higher — 38. + Soft Overlong Punishment — 41. + Token-level Loss — 42. + Dynamic Sampling (полный DAPO) — 50. Итог обгоняет DeepSeek-R1-Zero-Qwen-32B (47) при половине шагов тренировки.


Часть 5: Споры

Два свежих пейпера 2026 года ставят под вопрос удобные обобщения из частей выше.

Рейтинг алгоритмов зависит от масштаба. «Do Post-Training Algorithms Actually Differ?» (arXiv:2603.19335, Xiaoyi Li) прогнал ~240 обучающих ранов на 4 масштабах модели (0.5B–7B) и 8 алгоритмах. Находка: на 1.5B лидирует online RL (в терминологии пейпера — SGRPO), на 7B резко вырывается вперёд SimPO (вариант из DPO-семейства) — с 38.7% на 1.5B до 85.8% на 7B на GSM8K. Разложение дисперсии результата: масштаб модели объясняет ≈50 процентных пунктов разброса, тип тренировки (online vs offline) — ≈9–10 п.п., а конкретный вариант лосс-функции — только ≈1 п.п. Это одноавторская, очень свежая работа — не устоявшийся консенсус, а конкретное недавнее исследование, которое стоит воспринимать как есть, а не как окончательный вердикт.

📐 Рейтинг алгоритмов переворачивается с масштабом
GSM8K, из arXiv:2603.19335 (одноавторская работа, 2026, ~240 прогонов обучения на 4 масштабах 0.5B–7B). Переключи масштаб модели.
SGRPO (online RL)
58%
DPO
49.1%
SimPO
38.7%
На 1.5B лидирует online RL (SGRPO) — на 8.9 п.п. выше DPO. SimPO — на последнем месте.
≈50 п.п.
дисперсии объясняет масштаб модели
≈9–10 п.п.
объясняет online vs offline
≈1 п.п.
объясняет конкретный вариант лосса

GRPO — не DPO, но «структурно родственен». «It Takes Two: Your GRPO Is Secretly DPO» (arXiv:2510.00977, актуальная версия — май 2026) заявляет не математическую эквивалентность, а то, что эффективность GRPO объясняется его неявным контрастивным объективом — тем же механизмом снижения дисперсии через control variate, что используют DPO-подобные методы. Практическое следствие — 2-GRPO: минимальный вариант с группой всего из 2 rollout’ов вместо 16, который сохраняет 97.6% качества полного 16-GRPO, потратив только 12.5% rollout’ов и 21% времени тренировки. «Структурно родственен» — точная формулировка; «эквивалентен» была бы преувеличением того, что на самом деле утверждает пейпер.

🧭 Какой алгоритм выбрать
Пара вопросов про твою задачу — получи рекомендацию из PPO/DPO/GRPO/DAPO.
Какая у тебя награда?

TL;DR

1PPO (InstructGPT, arXiv:2203.02155): SFT → reward model → RL с отдельной critic-сетью для advantage (GAE), клип ε=0.2
2DPO (arXiv:2305.18290): reward становится implicit через Bradley-Terry — ни отдельной reward-модели, ни RL-петли, ни критика. Пейпер не даёт количественной оценки экономии compute
3GRPO (DeepSeekMath, arXiv:2402.03300): advantage = z-score награды внутри группы из G=64 rollout'ов, без критика вообще, β=0.04. DeepSeek-R1 поднял AIME 2024 pass@1 с 15.6% до 71.0% этим механизмом
4DAPO (ByteDance, arXiv:2503.14476): чинит entropy collapse и нулевой градиент в GRPO через Clip-Higher (ε_low=0.2/ε_high=0.28) и Dynamic Sampling — 50 против 47 у R1-Zero-Qwen-32B, за половину шагов
5Споры: рейтинг алгоритмов переворачивается с масштабом модели (arXiv:2603.19335); GRPO структурно родственен DPO через control variate, но не буквально эквивалентен (arXiv:2510.00977)

Четыре алгоритма — последовательная охота за одним и тем же: как получить честный сигнал для градиента дешевле и стабильнее, чем в прошлый раз. PPO решил задачу ценой критика. DPO выкинул RL-петлю целиком. GRPO вернул RL, но выкинул критика. DAPO залатал то, что GRPO сломал по пути. Следующий шаг, скорее всего, уже пишется как пейпер прямо сейчас. 🫡


Источники

  1. Proximal Policy Optimization Algorithms — Schulman et al. (arXiv:1707.06347)
  2. Training language models to follow instructions with human feedback — Ouyang et al. (arXiv:2203.02155)
  3. Direct Preference Optimization — Rafailov et al. (arXiv:2305.18290)
  4. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models (arXiv:2402.03300)
  5. DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning (arXiv:2501.12948)
  6. DAPO: An Open-Source LLM Reinforcement Learning System at Scale (arXiv:2503.14476)
  7. Do Post-Training Algorithms Actually Differ? A Controlled Study Across Model Scales Uncovers Scale-Dependent Ranking Inversions (arXiv:2603.19335)
  8. It Takes Two: Your GRPO Is Secretly DPO (arXiv:2510.00977)
  9. Kimi K3: open-weight модель обгоняет Claude Opus 4.8