Что такое 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 | Автоматическая оценка |
12. DPO для русского языка: практика
Применение DPO для русскоязычных моделей имеет свои особенности, связанные с культурными нюансами, формальностью и вежливостью. Ниже приведён пример использования библиотеки trl для обучения на русскоязычном датасете предпочтений.
from trl import DPOTrainer
# Датасет: (prompt, chosen, rejected) на русском
dpo_dataset = [
{
'prompt': 'Как приготовить борщ?',
'chosen': 'Сначала сварите бульон...',
'rejected': 'Надо сварить, потом есть...'
}
]
Особенности для русского языка:
- Культурные нюансы в chosen/rejected: в русскоязычных диалогах важно учитывать уровень формальности (ты/Вы), вежливость (пожалуйста, спасибо), а также избегать излишней агрессии или фамильярности. При составлении датасета предпочтений стоит включать примеры, где chosen-ответ демонстрирует уважительный тон, а rejected — грубый или неуместный.
- Сравнение DPO vs PPO на русскоязычных диалогах: на практике DPO часто показывает более стабильные результаты при небольшом объёме данных (до 10–20 тыс. триплетов), что типично для русскоязычных проектов. PPO может дать лучшее качество при наличии миллионов примеров, но требует тщательной настройки гиперпараметров и отдельной модели вознаграждения, обученной на русском языке.
| Аспект | DPO | PPO (в составе RLHF) |
|---|---|---|
| Сложность реализации | Низкая (один этап) | Высокая (три этапа) |
| Чувствительность к качеству данных | Высокая (шум в предпочтениях сильно влияет) | Средняя (reward model может сглаживать шум) |
| Стабильность на русском датасете | Хорошая (градиентная оптимизация) | Требует тюнинга (PPO может расходиться) |
| Ресурсы | Как обычный fine-tuning | Выше (reward model + PPO) |
| Рекомендуемый объём данных | < 100K триплетов | > 100K триплетов |
Для быстрого прототипирования русскоязычного ассистента рекомендуется начинать с DPO, используя датасеты вроде IlyaGusev/ru_sharegpt_cleaned (предварительно преобразовав в формат предпочтений) или собственные аннотации.
Навигация
- Предыдущий: 35
- Следующий: 37
- Индекс: 00. Индекс разборов