Direct Preference Optimization
A Otimização Direta por Preferências (DPO) alinha um modelo de linguagem a pares de respostas preferidas e rejeitadas com uma única função de perda, sem modelo de recompensa ou RL.
A Otimização Direta de Preferências (DPO) é um método para alinhar um modelo de linguagem de grande porte (LLM) às preferências humanas, treinando-o diretamente com pares de respostas — uma preferida e outra rejeitada — por meio de uma única função de perda no estilo de classificação. Ela alcança o objetivo do aprendizado por reforço com feedback humano (RLHF) sem um modelo de recompensa separado nem um ciclo de aprendizado por reforço que gere amostras a partir do modelo durante o treinamento. Rafael Rafailov, Archit Sharma, Eric Mitchell, Stefano Ermon, Christopher Manning e Chelsea Finn, da Universidade de Stanford, introduziram o método em 2023 no artigo Otimização direta de preferências: seu modelo de linguagem é secretamente um modelo de recompensa, apresentado no NeurIPS 2023. A ideia central é que o modelo de linguagem em treinamento define sua própria recompensa implícita, de modo que o modelo de recompensa e a política sejam ajustados em uma única etapa.
Como funciona a DPO#
Cada exemplo de treinamento é um prompt com uma resposta escolhida e outra rejeitada, rotuladas por pessoas ou por outro modelo. O treinamento começa com um modelo que já passou por ajuste fino supervisionado, geralmente um ajuste de instruções, e mantém uma cópia congelada desse modelo como referência. Para cada resposta, DPO compara a log-probabilidade atribuída pelo modelo em treinamento com a log-probabilidade atribuída pelo modelo de referência. A recompensa implícita de uma resposta é β vezes o logaritmo dessa razão, e a perda é o logaritmo negativo da sigmoide aplicada à diferença entre a recompensa da resposta escolhida e a da resposta rejeitada. Minimizar essa perda aumenta a probabilidade da resposta escolhida em relação à da resposta rejeitada, com atualizações maiores para os pares que o modelo ainda ordena incorretamente.
O coeficiente β desempenha o papel da penalização KL no RLHF. Rafailov et al. mostraram que a maximização de recompensa com restrição KL usada no RLHF tem uma política ótima de forma fechada — as probabilidades de referência reponderadas pela exponencial da recompensa dividida por β — e reorganizaram essa fórmula para expressar a recompensa por meio da própria política. Quanto menor for β, mais o treinamento pode afastar o modelo da referência.
Este exemplo em PyTorch executa dez passos de DPO no GPT-2 do Transformers da Hugging Face, usando dois pares de preferências de atendimento ao cliente, e depois verifica um terceiro par que o modelo nunca viu durante o treinamento:
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}")A perda de treinamento impressa no passo 0 é 0.693, ou seja, ln 2, porque a política ainda é igual à referência e ambas as respostas têm recompensa implícita zero. No passo 9, a perda é 0.047, e a margem no exemplo não usado no treinamento é +7.8: diante de uma reclamação que nunca tinha visto, o modelo aumentou a log-probabilidade da resposta apologética em 7,8 a mais do que a da resposta desdenhosa, em relação à referência.
DPO e RLHF#
O RLHF clássico treina um modelo de recompensa com os pares de preferências e depois otimiza o modelo de linguagem com base nele usando a Otimização de Política Proximal (PPO), que precisa de novas amostras do modelo a cada passo e mantém uma política, um modelo de valor, um modelo de recompensa e um modelo de referência na memória. A DPO precisa apenas da política e da referência e treina com um conjunto de dados fixo, como na aprendizagem supervisionada comum, por isso é mais simples de ajustar e muito mais barata de executar. Nas experiências originais, a DPO superou a PPO no controle do sentimento de resenhas de filmes geradas para um determinado orçamento KL. Na tarefa de resumo do Reddit TL;DR, o GPT-4 avaliou os resumos da DPO como melhores do que as referências escritas por humanos em 61% das vezes, com temperatura de amostragem 0, contra 57% da PPO na sua melhor temperatura. Nos dados de diálogo útil e inofensivo da Anthropic, a DPO foi o único método computacionalmente eficiente testado que superou as respostas preferidas no conjunto de dados.
A desvantagem é que a DPO aprende apenas com os pares que recebe. Métodos de RL online, como a Otimização de Política Relativa ao Grupo (GRPO), pontuam novas amostras do modelo atual durante o treinamento, razão pela qual dominam a aprendizagem por reforço com recompensas verificáveis (RLVR) em matemática e código, onde um verificador pode avaliar cada nova resposta. As preferências também podem ser rotuladas por um modelo de IA guiado por princípios escritos, como na IA Constitucional, e a DPO treina com esses rótulos da mesma maneira.
Onde a DPO é usada#
A DPO tornou-se uma etapa padrão de pós-treinamento para chatbots de pesos abertos. O Zephyr-7B-β da Hugging Face aplicou-a aos dados UltraFeedback classificados por IA, e os modelos Llama 3 da Meta foram alinhados com várias rodadas de ajuste fino supervisionado seguidas de DPO. A biblioteca TRL oferece um treinador de DPO pronto a usar. A interface de LLM da Ultralytics chama modelos por meio de qualquer endpoint compatível com OpenAI, incluindo servidores locais, por isso um modelo aberto alinhado com DPO pode gerar o texto de uma pipeline de visão Ultralytics YOLO26.
O método também se aplica a imagens. O Diffusion-DPO reescreve a perda para modelos de difusão e ajustou o modelo base Stable Diffusion XL com 851.000 preferências pareadas e recolhidas por crowdsourcing do conjunto de dados Pick-a-Pic, melhorando o alinhamento com prompts e o apelo visual na geração de texto para imagem. Para modelos de visão e linguagem (VLMs), o RLHF-V recolheu correções humanas ao nível de segmentos de descrições de imagens alucinadas e treinou com uma variante densa de DPO, reduzindo em 34,8% a taxa de alucinações do modelo base com apenas 1.400 amostras anotadas.
Variantes de DPO#
- IPO (Otimização de Preferências por Identidade): Substitui o log-sigmoide por uma perda quadrática que visa uma margem fixa, impedindo que as recompensas implícitas cresçam sem limite e que haja sobreajuste quando a mesma resposta vence sempre.
- KTO (Otimização de Kahneman-Tversky): Aprende com respostas individuais rotuladas como desejáveis ou indesejáveis, sem precisar de comparações pareadas.
- ORPO (Otimização de Preferências por Razão de Chances): Elimina o modelo de referência e acrescenta uma penalização pela razão de chances à perda do ajuste fino supervisionado, combinando o ajuste a instruções e o alinhamento de preferências numa só etapa.
- SimPO (Otimização Simples de Preferências): Usa a log-probabilidade média de uma resposta, normalizada pelo comprimento, como recompensa, elimina o modelo de referência e exige uma margem-alvo entre as recompensas das respostas escolhida e rejeitada.










