Почему 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:
| Компонент | PPO | DPO |
|---|---|---|
| Surrogate objective | clipped ratio × advantage | — |
| KL penalty | β·KL(π_θ | |
| Value function loss | MSE(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) | вычисляет KL | 7B (заморожена) |
| Critic (V) | оценивает value | 7B |
| Reward Model | даёт reward | 7B (заморожена) |
| Итого | 4 модели | 28B параметров |
Плюс буферы для хранения rollouts (логи-вероятности, значения, rewards). Для 7B-модели PPO требует ~60–80 GB GPU памяти (с градиентами и оптимизатором).
DPO требует только две модели:
| Модель | Назначение | Параметры (7B) |
|---|---|---|
| Actor (π_θ) | обучается | 7B |
| Reference (π_ref) | вычисляет ratio | 7B (заморожена) |
| Итого | 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 (логирование)
Шаги:
- Загрузить модель GPT-2 и её SFT-версию (или использовать GPT-2 как reference).
- Загрузить датасет
Anthropic/hh-rlhf(пары chosen/rejected). - Написать класс
DPOTrainer: - Обучить 1 эпоху (batch size 4, learning rate 1e-5, β=0.1).
- Оценить: вычислить accuracy предпочтений на валидации, сгенерировать примеры.
- Для сравнения запустить PPO из TRL на том же датасете (с обученной reward model или с синтетическим reward).
Ожидаемый результат:
- DPO сходится за ~2–3 часа на одном GPU (T4).
- PPO требует ~6–8 часов и больше памяти.
- Качество ответов (субъективно) сопоставимо, DPO стабильнее при изменении learning rate.
Связь с другими вопросами
Навигация
- Предыдущий: 987
- Следующий: 989
- Индекс: 00. Индекс разборов zation)?|989]]
- Индекс: 00. Индекс разборов