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

Что такое 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Автоматическая оценка

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 может дать лучшее качество при наличии миллионов примеров, но требует тщательной настройки гиперпараметров и отдельной модели вознаграждения, обученной на русском языке.
АспектDPOPPO (в составе RLHF)
Сложность реализацииНизкая (один этап)Высокая (три этапа)
Чувствительность к качеству данныхВысокая (шум в предпочтениях сильно влияет)Средняя (reward model может сглаживать шум)
Стабильность на русском датасетеХорошая (градиентная оптимизация)Требует тюнинга (PPO может расходиться)
РесурсыКак обычный fine-tuningВыше (reward model + PPO)
Рекомендуемый объём данных< 100K триплетов> 100K триплетов

Для быстрого прототипирования русскоязычного ассистента рекомендуется начинать с DPO, используя датасеты вроде IlyaGusev/ru_sharegpt_cleaned (предварительно преобразовав в формат предпочтений) или собственные аннотации.


Навигация

  • Предыдущий: 35
  • Следующий: 37
  • Индекс: 00. Индекс разборов