Guide
DPO : affiner un modèle avec des paires de préférences
La DPO apprend au modèle à préférer une réponse plutôt qu'une autre, sans modèle de récompense. Principe, format des paires, code TRL et réglages.
Mis à jour le
La DPO (Direct Preference Optimization, optimisation directe des préférences) affine un modèle à partir de paires de réponses : pour une même demande, une réponse préférée et une réponse rejetée. Le modèle apprend à creuser l'écart entre les deux. C'est utile quand il est plus facile de dire « celle-ci est meilleure que celle-là » que d'écrire la réponse parfaite, par exemple pour un ton, un niveau de détail ou une façon de refuser.
D'où vient la méthode
Les assistants actuels sont en partie entraînés à partir de préférences humaines. Le glossaire d'Anthropic décrit ainsi le RLHF (apprentissage par renforcement à partir de retours humains) : des personnes classent plusieurs réponses, et l'entraînement pousse le modèle vers les réponses les mieux classées. Cette méthode passe par deux étapes : entraîner d'abord un modèle de récompense, puis affiner le modèle de langage par apprentissage par renforcement.
L'article « Direct Preference Optimization: Your Language Model is Secretly a Reward Model » de Rafael Rafailov et ses coauteurs (déposé le 29/05/2023) supprime ces deux étapes. Il ramène le problème à une simple perte de classification sur les paires de réponses. D'après ses auteurs, la méthode est stable, légère en calcul, ne demande pas de générer des réponses pendant l'entraînement, et donne des résultats équivalents ou meilleurs que les méthodes existantes sur les tâches testées (contrôle du sentiment, résumé, dialogue à un tour).
SFT ou DPO ?
| SFT (affinage supervisé) | DPO | |
|---|---|---|
| Un exemple contient | une demande et la bonne réponse | une demande, une réponse préférée, une réponse rejetée |
| Ce que le modèle apprend | reproduire la réponse | préférer une réponse à une autre |
| Plus facile à constituer quand | vous savez écrire la réponse attendue | vous savez juger entre deux réponses |
| Outil dans TRL | SFTTrainer |
DPOTrainer |
Les deux se combinent : la bibliothèque TRL propose même une perte "sft" parmi les options de DPOTrainer. Le parcours SFT est décrit sur Fine-tuning avec Hugging Face.
Le format des paires
TRL attend un jeu de préférences, avec une demande explicite (format recommandé par la documentation) :
{"prompt": [{"role": "user", "content": "Résumez ce courriel client."}],
"chosen": [{"role": "assistant", "content": "Le client demande un avoir sur la facture de mars."}],
"rejected": [{"role": "assistant", "content": "Bonjour, voici un résumé détaillé de ce courriel..."}]}
Sur un jeu conversationnel, le gabarit de conversation du modèle est appliqué automatiquement. Les deux réponses doivent répondre à la même demande, et la différence entre elles doit porter sur ce que vous voulez enseigner, pas sur un détail accidentel. Pour la préparation générale des fichiers, voir Jeu de données.
Le code avec TRL
L'exemple de démarrage de la documentation (version 1.18.0, lue le 15/11/2026), avec un adaptateur LoRA :
from datasets import load_dataset
from trl import DPOTrainer
from peft import LoraConfig
trainer = DPOTrainer(
"Qwen/Qwen3-0.6B",
train_dataset=load_dataset("trl-lib/ultrafeedback_binarized", split="train"),
peft_config=LoraConfig(),
)
trainer.train()
Sans ref_model, TRL prend comme modèle de référence l'état du modèle avant l'entraînement DPO : l'apprentissage mesure l'écart des réponses par rapport à ce point de départ.
Les réglages à connaître
Paramètre de DPOConfig |
Valeur par défaut | Rôle |
|---|---|---|
beta |
0,1 | plus il est élevé, moins le modèle s'éloigne du modèle de référence |
learning_rate |
1e-6 |
la documentation indique de monter autour de 1e-5 pour un adaptateur LoRA |
loss_type |
["sigmoid"] |
la perte d'origine de la DPO ; d'autres variantes sont proposées (IPO, Robust DPO, SimPO…) |
max_length |
1024 jetons | au-delà, la séquence est tronquée |
precompute_ref_log_probs=True calcule à l'avance les probabilités du modèle de référence, ce qui évite de le garder en mémoire pendant l'entraînement.
Lire les indicateurs
En plus de la perte, TRL journalise des indicateurs propres à la DPO :
rewards/chosenetrewards/rejected: la « récompense implicite » moyenne des réponses préférées et rejetées ;rewards/margins: l'écart moyen entre les deux ;rewards/accuracies: la part des paires où la réponse préférée obtient la meilleure récompense.
Une marge qui augmente montre que le modèle apprend vos préférences sur le jeu d'entraînement. Elle ne dit pas qu'il répond mieux en conditions réelles : comparez sur un jeu de test à part (Évaluer un modèle affiné).
Et sur les services gérés ?
Chez Google, la documentation du réglage supervisé de Gemini oriente les tâches de raisonnement en plusieurs étapes vers une autre méthode, le réglage par renforcement, décrite sur une page séparée. Sur un modèle à poids ouverts, la DPO avec TRL est une voie documentée et accessible pour enseigner des préférences.
Questions fréquentes
Quelle différence entre SFT et DPO ?
En SFT, chaque exemple donne la bonne réponse à reproduire. En DPO, chaque exemple donne deux réponses à la même demande, l'une préférée, l'autre rejetée, et le modèle apprend à écarter la seconde.
Faut-il un modèle de récompense pour faire de la DPO ?
Non. C'est tout l'intérêt de la méthode : l'article de 2023 ramène le problème à une simple perte de classification, sans modèle de récompense séparé ni étape d'apprentissage par renforcement.
Sources
Pages consultées pour écrire cet article :