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

Почему DPO (Direct Preference Optimization) проще PPO? В чем разница в формуле потерь и требованиях к памяти?

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

Direct Preference Optimization (DPO) заменяет многоэтапный RL-пайплайн PPO прямым supervised-обучением на парах предпочтений. Вместо отдельной Reward Model и RL-цикла с actor, critic и reference model, DPO выводит аналитическое решение оптимальной политики через ratio вероятностей. Это радикально упрощает формулу потерь (один логарифм сигмоиды вместо surrogate objective + KL penalty + value loss), снижает требования к памяти (не нужны 4 модели) и повышает стабильность обучения.

2. Loss: -log σ(β * log(π_chosen/π_rejected))

Формула потерь DPO для одной пары (x, y_w, y_l):

[ \mathcal{L}{[text](/wiki/text){DPO}}(\theta) = -\log \sigma\left( [beta](/wiki/beta) \left( \log\frac{\pi\theta(y_w|x)}{\pi_{[text](/wiki/text){ref}}(y_w|x)} - \log\frac{\pi_\theta(y_l|x)}{\pi_{[text](/wiki/text){ref}}(y_l|x)} \right) \right) ]

где:

  • σ — сигмоида,
  • β — гиперпараметр, контролирующий силу KL-регуляризации,
  • π_θ — обучаемая политика,
  • π_ref — замороженная reference-модель (обычно SFT-модель).

Сравнение с PPO loss:

КомпонентPPODPO
Surrogate objectiveclipped ratio × advantage—
KL penaltyβ·KL(π_θ
Value function lossMSE(V(s), return)—
Reward model lossотдельный этап—
Итоговая функцияL = L_policy + c1·L_value + c2·KLодна строка

DPO loss не требует оценки advantage и не использует клиппинг. Градиент вычисляется напрямую через сигмоиду, что делает оптимизацию похожей на бинарную классификацию.


3. Память: не нужны 4 модели (actor, ref, critic, RM)

Типичная конфигурация PPO для LLM (например, в TRL или DeepSpeed Chat):

МодельНазначениеПараметры (7B)
Actor (π_θ)генерирует ответы7B
Reference (π_ref)вычисляет KL7B (заморожена)
Critic (V)оценивает value7B
Reward Modelдаёт reward7B (заморожена)
Итого4 модели28B параметров

Плюс буферы для хранения rollouts (логи-вероятности, значения, rewards). Для 7B-модели PPO требует ~60–80 GB GPU памяти (с градиентами и оптимизатором).

DPO требует только две модели:

МодельНазначениеПараметры (7B)
Actor (π_θ)обучается7B
Reference (π_ref)вычисляет ratio7B (заморожена)
Итого2 модели14B параметров

Reference можно заменить на замороженную копию actor (один forward с detach), что ещё больше экономит память. DPO не хранит rollouts — loss считается на статическом датасете предпочтений. Результат: ~30–40 GB GPU для 7B-модели.


4. Стабильность выше

PPO чувствителен к:

  • Clip range (ε) — слишком большое → нестабильность, слишком маленькое → медленное обучение.
  • KL coefficient (β) — требует тюнинга, иначе модель «забывает» язык.
  • Advantage normalization — без неё градиенты зашумлены.
  • Reward scaling — reward model может давать некалиброванные оценки.

DPO:

  • Не имеет clip range — loss всегда гладкий (сигмоида).
  • β — единственный гиперпараметр, и его влияние понятно: больше β → сильнее регуляризация к π_ref.
  • Не нужна нормализация advantage.
  • Обучение на статическом датасете — нет on-policy шума, свойственного PPO.

Эмпирически DPO реже расходится и требует меньше итераций для сходимости. В оригинальной статье DPO показал лучшее или сопоставимое качество с PPO при значительно меньших вычислительных затратах.


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

Задача: реализовать DPO для небольшой модели (GPT-2) на датасете предпочтений Anthropic HH-RLHF и сравнить с PPO (можно использовать готовую реализацию из TRL).

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

  • Python, PyTorch
  • Hugging Face Transformers, Datasets
  • TRL (для baseline PPO)
  • Weights & Biases (логирование)

Шаги:

  1. Загрузить модель GPT-2 и её SFT-версию (или использовать GPT-2 как reference).
  2. Загрузить датасет Anthropic/hh-rlhf (пары chosen/rejected).
  3. Написать класс DPOTrainer:
    • forward: вычислить log-вероятности для chosen и rejected через actor и reference.
    • loss: -log(sigmoid(beta * (log_ratio_chosen - log_ratio_rejected))).
    • backward, step.
  4. Обучить 1 эпоху (batch size 4, learning rate 1e-5, β=0.1).
  5. Оценить: вычислить accuracy предпочтений на валидации, сгенерировать примеры.
  6. Для сравнения запустить PPO из TRL на том же датасете (с обученной reward model или с синтетическим reward).

Ожидаемый результат:

  • DPO сходится за ~2–3 часа на одном GPU (T4).
  • PPO требует ~6–8 часов и больше памяти.
  • Качество ответов (субъективно) сопоставимо, DPO стабильнее при изменении learning rate.

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

ВопросТема
335Подробный разбор PPO, его loss и требований к памяти

Навигация

  • Предыдущий: 987
  • Следующий: 989
  • Индекс: 00. Индекс разборов zation)?|989]]
  • Индекс: 00. Индекс разборов