Что такое 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) и состоит из трёх этапов:

  1. Сбор данных предпочтений (preference data). Человек-аннотатор видит пару ответов на один и тот же промпт (например, Answer A и Answer B) и выбирает лучший (chosen) и худший (rejected). Формируются триплеты: (prompt, chosen, rejected).

  2. Обучение модели вознаграждения (Reward Model, RM). Берётся предобученная LLM (или отдельная модель), заменяется головка классификации. На триплетах учим предсказывать, насколько один ответ лучше другого. Обычно используется Bradley-Terry модель (логистическая регрессия на разнице логарифмов вероятностей). Цель: log σ(r(chosen) - r(rejected)), где r(x) — скалярное вознаграждение.

  3. 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

ХарактеристикаDPORLHF
Количество этапов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 (ключевые шаги)

  1. Bradley-Terry модель для предпочтений: P(chosen > rejected) = σ(r(chosen) - r(rejected))
  2. Оптимальная политика в RLHF с KL-регуляризацией: π*(y|x) ∝ π_ref(y|x) * exp(r(y)/β) Отсюда можно выразить r(y) = β * log(π*(y|x) / π_ref(y|x)) + β * Z(x) (Z — нормировочная константа).
  3. Подставить это выражение для chosen и rejected в Bradley-Terry, получим вероятность предпочтения в терминах π и π_ref. Нормировочная константа сокращается.
  4. Минимизируем negative log-likelihood этой вероятности.

Таким образом, DPO не «выкидывает» reward model, а неявно её представляет через логиты модели.


6. Когда выбирать DPO, когда RLHF

СценарийРекомендация
У вас небольшой датасет предпочтений (< 100K триплетов)DPO (проще, стабильнее)
У вас огромный датасет (миллионы) и ресурсыRLHF (потенциально выше качество)
Вы хотите быстро прототипировать alignmentDPO
Вы исследуете влияние 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 для логирования

Шаги:

  1. Выберите подмножество датасета (пара тысяч примеров).
  2. Загрузите предобученную модель (например, gpt2).
  3. Выполните SFT (supervised fine-tuning) на chosen ответах (стандартный LM loss).
  4. Скопируйте модель как ref_model (заморозить).
  5. Настройте DPOTrainer из библиотеки TRL: укажите model, ref_model, dataset (формат: prompt, chosen, rejected), beta.
  6. Обучите 1-2 эпохи.
  7. Оцените: сравните ответы до и после DPO на промптах из тестовой выборки (субъективно или через автоматические метрики вроде reward model).

Ожидаемый результат После DPO модель будет заметно реже отклоняться от запроса, давать более вежливые и безопасные ответы, даже при небольшом количестве данных. Вы увидите снижение loss DPO и рост difference логарифмов chosen vs rejected.


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

ВопросТема
35RLHF и его этапы
37PPO и его роль
38SFT vs preference tuning
39Данные для alignment
40Итерации DPO
41Автоматическая оценка

Навигация