Direct Preference Optimization
Direct Preference Optimization (DPO) выравнивает языковую модель по парам предпочтительных и отклонённых ответов с помощью одной функции потерь, без модели вознаграждения и RL.
Прямая оптимизация предпочтений (DPO) — это метод согласования большой языковой модели (LLM) с человеческими предпочтениями: модель непосредственно обучается на парах ответов, один из которых предпочтительный, а другой — отвергнутый, с помощью одной функции потерь в стиле классификации. Этот метод достигает цели обучения с подкреплением на основе обратной связи от людей (RLHF) без отдельной модели вознаграждения и без цикла обучения с подкреплением, в котором во время обучения генерируются выборки моделью. Рафаэль Рафаилов, Арчит Шарма, Эрик Митчелл, Стефано Эрмон, Кристофер Мэннинг и Челси Финн из Стэнфордского университета представили этот метод в 2023 году в работе Direct Preference Optimization: Your Language Model is Secretly a Reward Model, опубликованной на NeurIPS 2023. Ключевая идея состоит в том, что обучаемая языковая модель сама задаёт неявное вознаграждение, поэтому модель вознаграждения и политику можно обучить за один шаг.
Как работает DPO#
Каждый обучающий пример состоит из запроса, выбранного ответа и отвергнутого ответа, размеченных людьми или другой моделью. Обучение начинается с модели, которая уже прошла контролируемую тонкую настройку, обычно настройку на инструкции; её замороженная копия используется как эталонная модель. Для каждого ответа DPO сравнивает логарифмическую вероятность, рассчитанную обучаемой моделью, с вероятностью, рассчитанной эталонной моделью. Неявное вознаграждение ответа равно β, умноженному на это отношение логарифмических вероятностей, а функция потерь — это отрицательный логарифм сигмоиды разности вознаграждений выбранного и отвергнутого ответов. Минимизация функции потерь повышает вероятность выбранного ответа относительно отвергнутого; более значительные обновления применяются к парам, которые модель пока ранжирует неправильно.
Коэффициент β выполняет роль штрафа KL в RLHF. Рафаилов и коллеги показали, что оптимизация вознаграждения с ограничением KL, используемая в RLHF, имеет замкнутую форму оптимальной политики: эталонные вероятности перевзвешиваются экспонентой от вознаграждения, делённого на β. Затем они преобразовали эту формулу, чтобы выразить вознаграждение через саму политику. Чем меньше β, тем дальше обучение может увести модель от эталонной.
Этот пример на PyTorch выполняет десять шагов DPO для GPT-2 из Transformers от Hugging Face на двух парах предпочтений из службы поддержки, после чего проверяет третью пару, на которой модель не обучалась:
import copy
import torch
import torch.nn.functional as F
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
policy = AutoModelForCausalLM.from_pretrained("gpt2")
reference = copy.deepcopy(policy).requires_grad_(False) # frozen copy of the starting model
optimizer = torch.optim.Adam(policy.parameters(), lr=1e-5)
# Preference pairs: (prompt, chosen reply, rejected reply)
train = [
("My order arrived broken.", " Sorry about that, we will send a replacement today.", " That is not our problem."),
("I was charged twice.", " Sorry for the trouble, we have refunded the extra charge.", " Check your bank again."),
]
held_out = ("My package is a week late.", " Sorry for the delay, we will track it down for you.", " Be more patient.")
def log_prob(model, prompt, reply):
"""Sum of the log-probabilities the model gives the reply tokens after the prompt."""
ids = tokenizer(f"Customer: {prompt}\nAgent:{reply}", return_tensors="pt").input_ids
token_logps = model(ids).logits[0, :-1].log_softmax(-1).gather(1, ids[0, 1:, None])
return token_logps[-len(tokenizer(reply).input_ids) :].sum()
def margin(prompt, chosen, rejected):
"""Policy-to-reference log-ratio of the chosen reply minus that of the rejected reply."""
chosen_ratio = log_prob(policy, prompt, chosen) - log_prob(reference, prompt, chosen)
return chosen_ratio - (log_prob(policy, prompt, rejected) - log_prob(reference, prompt, rejected))
for step in range(10):
loss = sum(-F.logsigmoid(0.1 * margin(*pair)) for pair in train) / len(train) # DPO loss, beta = 0.1
if step in {0, 9}:
print(f"Step {step}: training loss {loss.item():.3f}")
optimizer.zero_grad()
loss.backward()
optimizer.step()
with torch.no_grad():
print(f"Held-out margin: {margin(*held_out).item():+.1f}")На шаге 0 выводится значение функции потерь 0.693 — ln 2, поскольку политика пока совпадает с эталонной моделью и вознаграждение обоих ответов равно нулю. На шаге 9 функция потерь равна 0.047, а отрыв на отложенной паре — +7.8: в ответ на невиданную ранее жалобу модель увеличила логарифмическую вероятность извиняющегося ответа относительно эталонной модели на 7,8 больше, чем вероятность пренебрежительного ответа.
DPO и RLHF#
В классическом RLHF сначала обучают модель вознаграждения на парах предпочтений, а затем оптимизируют языковую модель с помощью проксимальной оптимизации политики (PPO). Для PPO на каждом шаге нужны новые выборки от модели, а в памяти одновременно хранятся политика, модель ценности, модель вознаграждения и эталонная модель. DPO требует только политику и эталонную модель и обучается на фиксированном наборе данных, как обычное обучение с учителем, поэтому его проще настраивать и гораздо дешевле запускать. В первоначальных экспериментах DPO превзошёл PPO в управлении тональностью сгенерированных рецензий на фильмы при заданном бюджете KL. При суммаризации Reddit TL;DR GPT-4 оценил сводки DPO выше написанных людьми эталонных сводок в 61% случаев при температуре генерации 0, тогда как лучший результат PPO составил 57%. На данных Anthropic с диалогами, оцениваемыми по полезности и безвредности, DPO оказался единственным проверенным вычислительно эффективным методом, который улучшил предпочтительные ответы из набора данных.
Компромисс состоит в том, что DPO учится только на предоставленных ему парах. Методы онлайн-обучения с подкреплением, такие как оптимизация политики относительно группы (GRPO), оценивают новые выборки текущей модели во время обучения, поэтому они преобладают в обучении с подкреплением и проверяемыми вознаграждениями (RLVR) для математики и кода, где проверяющая система может оценить каждый новый ответ. Метки предпочтений также может создавать модель ИИ, руководствующаяся письменными принципами, как в конституционном ИИ; такие метки используются в DPO тем же способом.
Где применяется DPO#
DPO стал стандартным этапом постобучения для чат-ботов с открытыми весами. Zephyr-7B-β от Hugging Face применил его к данным UltraFeedback, оценённым ИИ, а модели Meta Llama 3 согласовывали в несколько этапов контролируемой тонкой настройки с последующим DPO. Библиотека TRL предоставляет готовый тренер DPO. Интерфейс LLM Ultralytics вызывает модели через любую совместимую с OpenAI конечную точку, в том числе локальные серверы, поэтому открытая модель, согласованная с помощью DPO, может генерировать текстовую часть конвейера компьютерного зрения Ultralytics YOLO26.
Метод можно применять и к изображениям. Diffusion-DPO адаптирует функцию потерь для диффузионных моделей и выполняет тонкую настройку базовой модели Stable Diffusion XL на 851 000 собранных у сообщества парных предпочтений из набора данных Pick-a-Pic, улучшая соответствие запросам и визуальную привлекательность при генерации изображений по тексту. Для моделей «зрение — язык» (VLM) в RLHF-V собрали исправления людей для отдельных фрагментов галлюцинированных описаний изображений и провели обучение с плотным вариантом DPO, сократив частоту галлюцинаций базовой модели на 34,8% всего на 1 400 размеченных примерах.
Варианты DPO#
- IPO (оптимизация предпочтений идентичности): Заменяет логарифм сигмоиды квадратичной функцией потерь, стремящейся к фиксированному отступу. Это не позволяет неявным вознаграждениям расти без ограничений и помогает избежать переобучения, когда один и тот же ответ всегда оказывается предпочтительным.
- KTO (оптимизация Канаэмана — Тверски): Обучается на отдельных ответах с метками «желательный» или «нежелательный», поэтому парное сравнение не требуется.
- ORPO (оптимизация предпочтений по отношению шансов): Отказывается от эталонной модели и добавляет штраф за отношение шансов к функции потерь контролируемой тонкой настройки, объединяя настройку на инструкции и согласование с предпочтениями в один этап.
- SimPO (простая оптимизация предпочтений): Использует нормированную по длине среднюю логарифмическую вероятность ответа в качестве вознаграждения, отказывается от эталонной модели и задаёт целевой отступ между вознаграждениями выбранного и отвергнутого ответов.










