Instruction tuning and DPO: from imitation to preferences
How an instruct model differs from a base one, why SFT teaches imitation but not picking the better answer, the DPO formula in plain terms — and DPOTrainer with its usual pitfalls.
Lesson content is currently available in Russian.
What you will learn
- →Объяснять роль SFT-этапа и его встроенный предел: имитация без сравнения ответов.
- →Читать формулу DPO: implicit reward, роль β и референсной модели.
- →Готовить пары chosen/rejected из сэмплов своей модели и запускать DPOTrainer.
База, SFT и предел имитации
Базовая модель — предсказатель следующего токена на интернет-тексте. Попросите её «объясни рекурсию», и она может продолжить ваш вопрос списком похожих вопросов: она не отвечает, она продолжает. Instruction tuning (SFT на парах «инструкция → ответ») учит модель самому жанру диалога: видишь инструкцию — выполняй, держи роль ассистента, соблюдай формат. Именно это отличает Llama-3.1-8B-Instruct от голой Llama-3.1-8B; рецепт восходит к InstructGPT.
Но у SFT есть встроенный предел: это имитация. Каждый пример в датасете модель воспринимает как одинаково идеальный — loss не различает «блестящий ответ» и «приемлемый ответ», он просто повышает вероятность показанных токенов. SFT не может выразить сигнал «этот ответ лучше того»: у него нет механизма сравнения. Отсюда типичные артефакты чисто SFT-моделей: уверенный усреднённый тон, правдоподобные, но поверхностные ответы, отсутствие штрафа за красиво оформленную чушь.
Поэтому пайплайн выравнивания двухэтапный. SFT задаёт формат и базовое поведение — без него модель просто не умеет быть ассистентом. А дальше нужен этап, который учит предпочтениям: из двух корректных по формату ответов выбирать более глубокий, честный и полезный. Классически это был RLHF, сегодня для большинства команд — DPO.
От RLHF к DPO
Классический RLHF из InstructGPT — трёхступенчатая конструкция. Сначала SFT. Затем на парах ответов, отранжированных людьми, обучается отдельная reward-модель — она выдаёт скаляр «насколько ответ хорош». Наконец, политика оптимизируется PPO: модель генерирует ответы, reward-модель их оценивает, а KL-штраф к референсной модели не даёт уйти слишком далеко от SFT-чекпойнта. Это работает — так выровнены флагманские модели, — но тяжело: в памяти одновременно четыре сети (политика, референс, reward, value), обучение нестабильно и капризно к гиперпараметрам, а цикл генерации внутри обучения мучительно медленный.
DPO (Direct Preference Optimization) — наблюдение, что этот огород не обязателен. У RLHF-задачи с KL-ограничением есть аналитическое решение, и его можно развернуть в обратную сторону: оптимальная политика напрямую выражается через предпочтения, без явной reward-модели. Получается простой лосс в духе классификации, который обучается на тех же парах «лучший/худший ответ» обычным градиентным спуском: без PPO, без сэмплирования во время обучения, без value-сети. Нужны только политика и замороженный референс.
Цена простоты — DPO чувствителен к качеству и распределению пар: там, где PPO может выехать за счёт исследования, DPO учится строго на том, что ему показали. Поэтому центр тяжести снова смещается в данные.
Формула DPO на пальцах
Лосс DPO для пары (промпт x, лучший ответ y_w, худший y_l):
loss = -log σ( β · [ (log πθ(y_w|x) - log πref(y_w|x))
- (log πθ(y_l|x) - log πref(y_l|x)) ] )
Разберём на пальцах. Каждая скобка — «насколько сильнее моя модель полюбила этот ответ по сравнению с референсом» (в лог-вероятностях). Это называют implicit reward: неявная награда, равная β·(log πθ − log πref). Лосс требует, чтобы неявная награда лучшего ответа была больше, чем худшего, с запасом: сигмоида превращает разницу в вероятность «модель предпочитает правильный ответ», а -log штрафует, когда она мала.
Роль β — поводок. Большое β (0,3–0,5) сильно штрафует отклонение от референса: модель меняется осторожно. Малое β (0,05–0,1) отпускает поводок: сильнее сдвиг к предпочтениям и выше риск разучиться тому, что умел SFT-чекпойнт. Стартовое значение по умолчанию — 0,1.
Три грабли, на которые наступают все:
- Смещение к длине: если chosen-ответы систематически длиннее rejected, модель выучит «длинно = хорошо» и начнёт лить воду. Балансируйте длины при сборе пар.
- Чужое распределение: пары, сгенерированные другой моделью, учат предпочтениям на текстах, которые ваша модель сама бы не породила. Правильно: сэмплировать несколько ответов из собственного SFT-чекпойнта и ранжировать их.
- Обе вероятности падают: DPO оптимизирует разницу, поэтому лог-вероятность даже chosen-ответов может снижаться. Смотрите в логи на rewards/margins и rewards/accuracies, а не только на loss.
DPOTrainer на практике
Датасет для DPO — три поля на запись: prompt, chosen, rejected. После SFT-этапа запуск выглядит так:
from trl import DPOConfig, DPOTrainer
trainer = DPOTrainer(
model=sft_model, # стартуем с SFT-чекпойнта, не с базы
ref_model=None, # trl сам создаст замороженную копию-референс
train_dataset=pairs, # {"prompt", "chosen", "rejected"}
processing_class=tok,
args=DPOConfig(
beta=0.1,
learning_rate=5e-7,
num_train_epochs=1,
per_device_train_batch_size=2,
gradient_accumulation_steps=8,
),
)
trainer.train()
Обратите внимание на learning rate: 5e-7 — на три порядка ниже, чем у LoRA-SFT. DPO двигает уже выровненную модель, и большой шаг быстро разносит поведение. Одной эпохи почти всегда достаточно.
Мониторинг: rewards/accuracies — доля пар, где implicit reward chosen выше, чем rejected; здоровое обучение выводит её в диапазон 0,6–0,8. Значение около 0,5 означает, что модель не различает пары (шумные данные), а устремление к 1,0 на крошечном датасете — переобучение. rewards/margins должен расти плавно. После обучения обязательно сравните длины генераций до и после: раздувание длины — сигнал смещения пар.
DPO совместим с LoRA: адаптер учится поверх 4-битной базы точно так же, как в SFT-уроке, и весь цикл SFT → DPO проходит на той же одной карте.
Practice
Пары предпочтений и DPO поверх SFT
Сэмплируйте по два ответа вашей SFT-модели на 200–300 промптов, отранжируйте пары по рубрике (LLM-судья плюс ручная проверка каждой десятой), сбалансируйте длины и проведите DPO-прогон с beta 0,1.
Deliverable
Датасет пар, графики rewards/accuracies и rewards/margins, 10 side-by-side сравнений SFT против DPO и вывод: что изменилось в поведении.
Checkpoint
Объясните формулу DPO без математики: что она увеличивает, что сдерживает и зачем нужна референсная модель.
- ✓ Своими словами описан implicit reward и рост зазора между chosen и rejected относительно референса.
- ✓ β объяснена как сила поводка к референсной модели с типичными значениями.
- ✓ Пары взяты из сэмплов собственной SFT-модели, длины chosen и rejected сбалансированы.
Check yourself
Sources