English translation is not available yet. Showing Russian content.
Что такое DPO (Direct Preference Optimization) и чем отличается от RLHF?
Краткий тезис
DPO (Direct Preference Optimization) — это метод выравнивания (alignment) LLM по предпочтениям человека, который напрямую оптимизирует политику модели на основе парных предпочтений (chosen vs rejected), полностью обходясь без обучения отдельной модели вознаграждения (reward model) и без сложного PPO (Policy Optimization|Proximal Policy Optimization]]). В отличие от RLHF (Reinforcement Learning from Human Feedback), DPO проще в реализации, стабильнее при обучении и требует меньше вычислительных ресурсов, однако может уступать RLHF по качеству при наличии очень больших объёмов разнообразных данных предпочтений.
1. Контекст: зачем нужно выравнивание (alignment)
Alignment — это процесс дообучения модели так, чтобы её ответы соответствовали ожиданиям человека (полезность, безопасность, этичность). Без выравнивания LLM может генерировать токсичный, неверный или бессмысленный контент.
Два основных подхода:
- RLHF (Reinforcement Learning from Human Feedback) — многоэтапный процесс: сбор предпочтений → обучение reward model → дообучение модели с помощью PPO.
- DPO (Direct Preference Optimization) — одноэтапный подход: напрямую оптимизирует вероятность chosen-ответа выше, чем rejected, через специальную функцию потерь.
2. RLHF: классический подход (подробно)
RLHF был предложен OpenAI (InstructGPT, ChatGPT) и состоит из трёх этапов:
-
Сбор данных предпочтений (preference data). Человек-аннотатор видит пару ответов на один и тот же промпт (например, Answer A и Answer B) и выбирает лучший (chosen) и худший (rejected). Формируются триплеты: (prompt, chosen, rejected).
-
Обучение модели вознаграждения (Reward Model, RM). Берётся предобученная LLM (или отдельная модель), заменяется головка классификации. На триплетах учим предсказывать, насколько один ответ лучше другого. Обычно используется Bradley-Terry модель (логистическая регрессия на разнице логарифмов вероятностей). Цель: log σ(r(chosen) - r(rejected)), где
r(x)— скалярное вознаграждение. -
PPO (Proximal Policy Optimization) с reward сигналом. Замораживаем reward model. Основную модель («политику») обучаем через PPO, максимизируя ожидаемое вознаграждение, но с penalty за отклонение от исходной модели (KL-дивергенция), чтобы не потерять способность к генерации осмысленных ответов.
Плюсы RLHF хорошо изучен, теоретически обоснован, может давать высокое качество при большом объёме разнообразных предпочтений.
Минусы RLHF
- Сложность: нужно обучать и поддерживать reward model (отдельная модель + её обновление)
- PPO неустойчив: требует тюнинга гиперпараметров, может «схлопнуться» в узкий режим
- Дороговизна: три этапа, каждый с вычислительными затратами
- Сложность воспроизведения: зависимость от качества reward model
3. DPO: прямой подход (суть)
DPO (Rafailov et al., 2023) предлагает объединить два этапа (обучение reward model + оптимизацию политики) в одну потерю. Доказано, что оптимальная политика при заданных предпочтениях может быть выражена непосредственно через разницу логарифмов вероятностей chosen и rejected ответов.
Основная идея: вместо того чтобы сначала учить reward, а потом оптимизировать модель через RL, мы учим модель напрямую увеличивать разницу log π(chosen) - log π(rejected), взвешивая её через сигмоиду. В результате не нужна отдельная reward model и не нужен PPO.
Функция потерь DPO (упрощённо для одного триплета):
L = - log σ(β * (log π_θ(chosen) - log π_ref(chosen) - log π_θ(rejected) + log π_ref(rejected)))
где:
π_θ— обучаемая политика (наша модель)π_ref— исходная модель (заморожена, обычно SFT-модель)β— гиперпараметр (температура, регулирует жёсткость выравнивания)σ— сигмоида
Интуиция: мы наказываем модель, если она ставит rejected выше chosen, и награждаем, если наоборот. При этом учитывается отклонение от исходной модели (через log π_ref), что аналогично KL-регуляризации в PPO.
4. Сравнительная таблица DPO vs RLHF
| Характеристика | DPO | RLHF |
|---|---|---|
| Количество этапов | 1 (обучение политики) | 3 (сбор предпочтений, RM, PPO) |
| Необходимость Reward Model | Нет | Да |
| Сложность реализации | Низкая (одна loss-функция) | Высокая (RL-цикл) |
| Стабильность обучения | Высокая (градиентная оптимизация) | Низкая (PPO капризен, требует тюнинга) |
| Требуемые данные | Триплеты (prompt, chosen, rejected) | Триплеты (можно также ранжирования для RM) |
| Вычислительная стоимость | Как обычный fine-tuning | Выше (RM + PPO) |
| Качество при небольшом объёме данных | Хорошее | Посредственное (RM может быть неточной) |
| Качество при очень больших объёмах данных | Отличное | Потенциально лучше (более гибкая модель вознаграждения) |
| Интерпретируемость reward | Скрыта в разнице вероятностей | Явная (можно анализировать reward model) |
| Поддержка in-context данных | Не требует | Можно использовать off-policy данные |
5. Математическая подоплёка DPO (ключевые шаги)
- Bradley-Terry модель для предпочтений:
P(chosen > rejected) = σ(r(chosen) - r(rejected)) - Оптимальная политика в RLHF с KL-регуляризацией:
π*(y|x) ∝ π_ref(y|x) * exp(r(y)/β)Отсюда можно выразитьr(y) = β * log(π*(y|x) / π_ref(y|x)) + β * Z(x)(Z — нормировочная константа). - Подставить это выражение для chosen и rejected в Bradley-Terry, получим вероятность предпочтения в терминах
πиπ_ref. Нормировочная константа сокращается. - Минимизируем negative log-likelihood этой вероятности.
Таким образом, DPO не «выкидывает» reward model, а неявно её представляет через логиты модели.
6. Когда выбирать DPO, когда RLHF
| Сценарий | Рекомендация |
|---|---|
| У вас небольшой датасет предпочтений (< 100K триплетов) | DPO (проще, стабильнее) |
| У вас огромный датасет (миллионы) и ресурсы | RLHF (потенциально выше качество) |
| Вы хотите быстро прототипировать alignment | DPO |
| Вы исследуете влияние reward на поведение | RLHF (можно менять reward model) |
| У вас нет опыта с RL (PPO) | DPO |
| Вам нужна максимальная производительность на бенчмарках | RLHF (при должном тюнинге) |
На практике DPO стал современным стандартом для большинства open-source проектов (Llama 3, Mistral, Qwen, Gemma) именно из-за простоты и стабильности.
7. Пример кода: loss DPO на PyTorch (псевдокод)
import torch
import torch.nn.functional as F
def dpo_loss(pi_logps_chosen, pi_logps_rejected,
ref_logps_chosen, ref_logps_rejected, beta=0.1):
"""
pi_logps_chosen: log π_θ(chosen | prompt), shape (batch,)
pi_logps_rejected: log π_θ(rejected | prompt)
ref_logps_chosen: log π_ref(chosen | prompt)
ref_logps_rejected: log π_ref(rejected | prompt)
"""
# Разница логарифмов (отклонение от ref)
log_ratio_chosen = pi_logps_chosen - ref_logps_chosen
log_ratio_rejected = pi_logps_rejected - ref_logps_rejected
# DPO loss
logits = beta * (log_ratio_chosen - log_ratio_rejected)
loss = -F.logsigmoid(logits).mean()
return loss
Тренировка
- Загружаем SFT-модель как
model(π_θ) и её копию какref_model(π_ref, заморожен) - Для каждого батча триплетов forward на chosen и rejected, собираем логарифмы
- Считаем loss, backward, оптимизируем только
model - Важно: в
ref_modelне обновляем веса, иначе выравнивание сломается
8. Преимущества и ограничения DPO
Преимущества
- Меньше этапов, проще инфраструктура
- Нет проблем с нестабильностью PPO
- Быстрее (одна стадия обучения)
- Легко комбинировать с другими методами (SFT + DPO)
Ограничения
- Предполагает, что reward можно выразить через Bradley-Terry (не всегда верно, например, при не транзитивных предпочтениях)
- Чувствителен к качеству данных предпочтений: если аннотаторы плохо различают, модель может не выучиться
- Не позволяет явно задать reward за другие аспекты (безопасность, тон), всё зашито в предпочтения
- Может переобучаться на выбранные ответы, забывая менее популярные
9. Современные вариации и альтернативы
- KTO (Kahneman-Tversky Optimization) — использует только «хорошие» или «плохие» ответы, без пар
- IPO (Identity Preference Optimization) — улучшение DPO без гиперпараметра β
- ORPO (Odds Ratio Preference Optimization) — объединяет SFT и предпочтения в одну loss
- SimPO (Simple Preference Optimization) — использует среднюю длину ответа для регуляризации
- GRPO (Group Relative Policy Optimization) — как DPO, но с групповым рейтингом (DeepSeek-R1)
Эти методы стремятся уменьшить чувствительность к шуму в данных или улучшить сходимость.
10. Пет-проект для закрепления
Задача Обучить небольшую LM (например, GPT-2 или TinyLlama) следовать инструкциям с помощью DPO на датасете предпочтений (например, Anthropic/hh-rlhf).
Инструменты
- Python, PyTorch, Transformers, TRL (Transformer Reinforcement Learning) — библиотека Hugging Face с реализацией DPO
- Wandb для логирования
Шаги:
- Выберите подмножество датасета (пара тысяч примеров).
- Загрузите предобученную модель (например,
gpt2). - Выполните SFT (supervised fine-tuning) на chosen ответах (стандартный LM loss).
- Скопируйте модель как
ref_model(заморозить). - Настройте
DPOTrainerиз библиотеки TRL: укажите model, ref_model, dataset (формат: prompt, chosen, rejected), beta. - Обучите 1-2 эпохи.
- Оцените: сравните ответы до и после DPO на промптах из тестовой выборки (субъективно или через автоматические метрики вроде reward model).
Ожидаемый результат После DPO модель будет заметно реже отклоняться от запроса, давать более вежливые и безопасные ответы, даже при небольшом количестве данных. Вы увидите снижение loss DPO и рост difference логарифмов chosen vs rejected.
11. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 35 | RLHF и его этапы |
| 37 | PPO и его роль |
| 38 | SFT vs preference tuning |
| 39 | Данные для alignment |
| 40 | Итерации DPO |
| 41 | Автоматическая оценка |
Навигация
- Предыдущий: 35
- Следующий: 37
- Индекс: 00. Индекс разборов