Direct Preference Optimization
L’optimisation directe des préférences (DPO) aligne un modèle de langage sur des paires de réponses préférées et rejetées à l’aide d’une seule fonction de perte, sans modèle de récompense ni apprentissage par renforcement.
L’optimisation directe des préférences (DPO) est une méthode qui aligne un grand modèle de langage (LLM) sur les préférences humaines en l’entraînant directement sur des paires de réponses, l’une préférée et l’autre rejetée, à l’aide d’une fonction de perte de type classification. Elle atteint l’objectif de l’apprentissage par renforcement à partir du retour humain (RLHF) sans modèle de récompense distinct ni boucle d’apprentissage par renforcement qui échantillonne les sorties du modèle pendant l’entraînement. Rafael Rafailov, Archit Sharma, Eric Mitchell, Stefano Ermon, Christopher Manning et Chelsea Finn, de Stanford, l’ont présentée en 2023 dans Direct Preference Optimization: Your Language Model is Secretly a Reward Model, présenté à NeurIPS 2023. L’idée clé est que le modèle de langage entraîné définit sa propre récompense implicite, de sorte que le modèle de récompense et la politique sont ajustés en une seule étape.
Fonctionnement de DPO#
Chaque exemple d’entraînement est une invite accompagnée d’une réponse choisie et d’une réponse rejetée, étiquetées par des personnes ou par un autre modèle. L’entraînement part d’un modèle qui a déjà subi un ajustement fin supervisé, généralement un ajustement aux instructions, et en conserve une copie gelée comme référence. Pour chaque réponse, DPO compare sa log-probabilité sous le modèle entraîné à sa log-probabilité sous le modèle de référence. La récompense implicite d’une réponse est égale à β multiplié par ce log-rapport, et la perte est le logarithme négatif de la sigmoïde de la récompense de la réponse choisie moins celle de la réponse rejetée. La minimiser augmente la probabilité de la réponse choisie par rapport à celle de la réponse rejetée, avec des mises à jour plus importantes pour les paires que le modèle classe encore dans le mauvais ordre.
Le coefficient β joue le rôle de pénalité KL dans RLHF. Rafailov et ses collègues ont montré que la maximisation de récompense sous contrainte KL utilisée en RLHF possède une politique optimale sous forme fermée : les probabilités de référence repondérées par l’exponentielle de la récompense divisée par β. Ils ont réarrangé cette formule pour exprimer la récompense à partir de la politique elle-même. Plus β est petit, plus l’entraînement peut éloigner le modèle de la référence.
Cet exemple PyTorch exécute dix étapes DPO sur GPT-2 depuis Transformers de Hugging Face, avec deux paires de préférences pour le service client, puis évalue une troisième paire que le modèle n’a jamais vue pendant l’entraînement :
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}")Il affiche une perte d’entraînement de 0.693 à l’étape 0, soit ln 2, car la politique est encore identique à la référence et les deux réponses ont une récompense implicite nulle. À l’étape 9, la perte est de 0.047 et la marge sur l’exemple non utilisé à l’entraînement est de +7.8 : pour une réclamation qu’il n’avait jamais vue, le modèle a augmenté la log-probabilité de la réponse présentant des excuses par rapport à la référence de 7,8 de plus que celle de la réponse dédaigneuse.
DPO par rapport à RLHF#
Le RLHF classique entraîne un modèle de récompense sur les paires de préférences, puis optimise le modèle de langage à l’aide de l’optimisation de politique proximale (PPO), qui nécessite de nouveaux échantillons du modèle à chaque étape et conserve en mémoire une politique, un modèle de valeur, un modèle de récompense et un modèle de référence. DPO n’a besoin que de la politique et de la référence, et s’entraîne sur un jeu de données fixe comme l’apprentissage supervisé ordinaire ; il est donc plus facile à régler et bien moins coûteux à exécuter. Dans les expériences initiales, DPO a surpassé PPO pour contrôler le sentiment des critiques de films générées, à budget KL identique. Pour le résumé de publications Reddit TL;DR, GPT-4 a jugé les résumés DPO meilleurs que les références rédigées par des humains dans 61 % des cas, à une température d’échantillonnage de 0, contre 57 % pour PPO à sa meilleure température. Sur les données de dialogue utile et inoffensif d’Anthropic, DPO était la seule méthode testée suffisamment efficace sur le plan des calculs pour améliorer les réponses préférées du jeu de données.
Le compromis, c’est que DPO apprend uniquement à partir des paires qui lui sont fournies. Les méthodes de RL en ligne, comme l’optimisation de politique relative de groupe (GRPO), évaluent de nouveaux échantillons du modèle actuel pendant l’entraînement, ce qui explique leur prédominance dans l’apprentissage par renforcement avec récompenses vérifiables (RLVR) pour les mathématiques et le code, où un vérificateur peut noter chaque nouvelle réponse. Les préférences peuvent également être étiquetées par un modèle d’IA guidé par des principes écrits, comme dans l’IA constitutionnelle, et DPO s’entraîne sur ces étiquettes de la même manière.
Utilisations de DPO#
DPO est devenu une étape standard du post-entraînement pour les chatbots à poids ouverts. Zephyr-7B-β de Hugging Face l’a appliqué aux données UltraFeedback classées par IA, et les modèles Llama 3 de Meta ont été alignés par plusieurs cycles d’ajustement fin supervisé, puis par DPO. La bibliothèque TRL fournit un entraîneur DPO prêt à l’emploi. L’interface LLM d’Ultralytics appelle des modèles via n’importe quel point de terminaison compatible avec OpenAI, y compris des serveurs locaux, si bien qu’un modèle ouvert aligné par DPO peut rédiger la partie textuelle d’un pipeline de vision Ultralytics YOLO26.
La méthode s’applique aussi aux images. Diffusion-DPO adapte la perte aux modèles de diffusion et a affiné le modèle de base Stable Diffusion XL sur 851 000 préférences par paires recueillies auprès du public dans le jeu de données Pick-a-Pic, améliorant l’alignement sur les invites et l’attrait visuel de la génération texte-image. Pour les modèles vision-langage (VLM), RLHF-V a recueilli des corrections humaines au niveau des segments de descriptions d’images hallucinées et a utilisé une variante dense de DPO pour l’entraînement. Le taux d’hallucination du modèle de base a ainsi diminué de 34,8 % avec seulement 1 400 échantillons annotés.
Variantes de DPO#
- IPO (optimisation des préférences par identité) : Remplace le log-sigmoïde par une perte quadratique visant une marge fixe, ce qui empêche les récompenses implicites de croître sans limite et le surapprentissage lorsque la même réponse l’emporte systématiquement.
- KTO (optimisation de Kahneman-Tversky) : Apprend à partir de réponses isolées étiquetées comme souhaitables ou indésirables ; les comparaisons par paires ne sont donc pas nécessaires.
- ORPO (optimisation des préférences par rapport de cotes) : Supprime le modèle de référence et ajoute une pénalité de rapport de cotes à la perte d’ajustement fin supervisé, réunissant l’ajustement aux instructions et l’alignement des préférences en une seule étape.
- SimPO (optimisation simple des préférences) : Utilise la log-probabilité moyenne d’une réponse, normalisée par sa longueur, comme récompense, supprime le modèle de référence et impose une marge cible entre les récompenses des réponses choisies et rejetées.










