Intelligence Artificielle
Optimisation des préférences directes : un guide complet

Aligner les grands modĂšles linguistiques (LLM) avec les valeurs et prĂ©fĂ©rences humaines est un dĂ©fi. Les mĂ©thodes traditionnelles, telles que Apprentissage par renforcement Ă partir de la rĂ©troaction humaine (RLHF), ont ouvert la voie en intĂ©grant les apports humains pour affiner les rĂ©sultats du modĂšle. Cependant, le RLHF peut ĂȘtre complexe et gourmand en ressources, nĂ©cessitant une puissance de calcul et un traitement de donnĂ©es importants. Optimisation des prĂ©fĂ©rences directes L'approche DPO (Digital Progressive Processing) apparaĂźt comme une approche innovante et rationalisĂ©e, offrant une alternative efficace aux mĂ©thodes traditionnelles. En simplifiant le processus d'optimisation, l'approche DPO rĂ©duit non seulement la charge de calcul, mais amĂ©liore Ă©galement la capacitĂ© du modĂšle Ă s'adapter rapidement aux prĂ©fĂ©rences humaines.
Dans ce guide, nous allons approfondir le sujet du DPO, en explorant ses fondements, sa mise en Ćuvre et ses applications pratiques.
La nĂ©cessitĂ© dâun alignement des prĂ©fĂ©rences
Pour comprendre le DPO, il est essentiel de comprendre l'importance d'aligner les LLM sur les préférences humaines. Malgré leurs capacités impressionnantes, les LLM formés sur de vastes ensembles de données peuvent parfois produire des résultats incohérents, biaisés ou non conformes aux valeurs humaines. Ce décalage peut se manifester de différentes maniÚres :
- Générer du contenu dangereux ou nuisible
- Fournir des informations inexactes ou trompeuses
- Présenter des biais présents dans les données d'entraßnement
Pour rĂ©soudre ces problĂšmes, les chercheurs ont dĂ©veloppĂ© des techniques permettant dâaffiner les LLM Ă lâaide de la rĂ©troaction humaine. La plus importante de ces approches est la RLHF.
Comprendre le RLHF : le précurseur du DPO
L'apprentissage par renforcement à partir du feedback humain (RLHF) est la méthode de référence pour aligner les LLM sur les préférences humaines. Analysons le processus RLHF pour en comprendre la complexité :
a) Réglage fin supervisé (SFT): Le processus commence par affiner un LLM pré-entraßné sur un ensemble de données de réponses de haute qualité. Cette étape aide le modÚle à générer des résultats plus pertinents et cohérents pour la tùche cible.
b) Modélisation de récompense: Un modÚle de récompense distinct est formé pour prédire les préférences humaines. Cela implique :
- Générer des paires de réponses pour des invites données
- Demander aux humains d'évaluer la réponse qu'ils préfÚrent
- Entraßner un modÚle pour prédire ces préférences
c) Apprentissage par renforcement: Le LLM affiné est ensuite optimisé davantage à l'aide de l'apprentissage par renforcement. Le modÚle de récompense fournit des commentaires, guidant le LLM pour générer des réponses qui correspondent aux préférences humaines.
Voici un pseudo-code Python simplifié pour illustrer le processus RLHF :
Bien quâefficace, le RLHF prĂ©sente plusieurs inconvĂ©nients :
- Cela nécessite la formation et la maintenance de plusieurs modÚles (SFT, modÚle de récompense et modÚle optimisé pour RL)
- Le processus RL peut ĂȘtre instable et sensible aux hyperparamĂštres
- C'est coûteux en termes de calcul, car cela nécessite de nombreux passages en avant et en arriÚre dans les modÚles.
Ces limites ont motivĂ© la recherche dâalternatives plus simples et plus efficaces, conduisant au dĂ©veloppement du DPO.
Optimisation des préférences directes : concepts de base
Cette image met en contraste deux approches distinctes pour aligner les rĂ©sultats des LLM sur les prĂ©fĂ©rences humaines : l'apprentissage par renforcement Ă partir du feedback humain (RLHF) et l'optimisation directe des prĂ©fĂ©rences (DPO). Le RLHF s'appuie sur un modĂšle de rĂ©compense pour guider la politique du modĂšle linguistique via des boucles de rĂ©troaction itĂ©ratives, tandis que l'DPO optimise directement les rĂ©sultats du modĂšle pour qu'ils correspondent aux rĂ©ponses prĂ©fĂ©rĂ©es des humains Ă l'aide de donnĂ©es de prĂ©fĂ©rences. Cette comparaison met en Ă©vidence les points forts et les applications potentielles de chaque mĂ©thode, offrant un aperçu de la maniĂšre dont les futurs LLM pourraient ĂȘtre formĂ©s pour mieux s'adapter aux attentes humaines.
Les idées clés derriÚre le DPO :
a) ModĂ©lisation implicite des rĂ©compenses: DPO Ă©limine le besoin d'un modĂšle de rĂ©compense distinct en traitant le modĂšle de langage lui-mĂȘme comme une fonction de rĂ©compense implicite.
b) Formulation basée sur des politiques: Au lieu d'optimiser une fonction de récompense, DPO optimise directement la politique (modÚle linguistique) pour maximiser la probabilité de réponses préférées.
c) Solution de forme fermée: DPO exploite une vision mathématique qui permet d'élaborer une solution fermée pour la politique optimale, évitant ainsi le besoin de mises à jour itératives du RL.
Implémentation du DPO : une présentation pratique du code
L'image ci-dessous présente un extrait de code implémentant la fonction de perte DPO avec PyTorch. Cette fonction joue un rÎle crucial dans l'amélioration de la façon dont les modÚles de langage priorisent les sorties en fonction des préférences humaines. Voici une description de ses principaux composants :
- Signature de fonction: Les
dpo_loss
la fonction prend en compte plusieurs paramÚtres, notamment les probabilités du journal de stratégie (pi_logps
), probabilités du journal du modÚle de référence (ref_logps
), et des indices représentant les achÚvements préférés et défavorisés (yw_idxs
,yl_idxs
). De plus, unbeta
Le paramÚtre contrÎle la force de la pénalité KL. - Extraction de probabilité de journal: Le code extrait les probabilités de journal pour les achÚvements préférés et non préférés des modÚles de politique et de référence.
- Calcul du rapport logarithmique: La diffĂ©rence entre les probabilitĂ©s logarithmiques des achĂšvements prĂ©fĂ©rĂ©s et dĂ©prĂ©ciĂ©s est calculĂ©e Ă la fois pour les modĂšles de politique et de rĂ©fĂ©rence. Ce ratio est essentiel pour dĂ©terminer la direction et lâampleur de lâoptimisation.
- Calcul des pertes et des récompenses: La perte est calculée à l'aide du
logsigmoid
fonction, tandis que les récompenses sont déterminées en mettant à l'échelle la différence entre les probabilités de la politique et du journal de référence parbeta
.
Plongeons dans les mathématiques derriÚre DPO pour comprendre comment il atteint ces objectifs.
Les mathématiques du DPO
Le DPO est une reformulation astucieuse du problÚme d'apprentissage des préférences. Voici une description détaillée :
a) Point de départ : maximisation des récompenses sous contrainte KL
Lâobjectif initial du RLHF peut ĂȘtre exprimĂ© comme suit :
- ÏΞ est la politique (modĂšle de langage) que nous optimisons
- r(x,y) est la fonction de récompense
- Ïref est une politique de rĂ©fĂ©rence (gĂ©nĂ©ralement le modĂšle SFT initial)
- ÎČ contrĂŽle la force de la contrainte de divergence KL
b) Forme de politique optimale : On peut montrer que la politique optimale pour cet objectif prend la forme :
Ï_r(y|x) = 1/Z(x) * Ïref(y|x) * exp(1/ÎČ * r(x,y))
OĂč Z(x) est une constante de normalisation.
c) DualitĂ© rĂ©compense-politique : LâidĂ©e clĂ© du DPO est dâexprimer la fonction de rĂ©compense en termes de politique optimale :
r(x,y) = ÎČ * log(Ï_r(y|x) / Ïref(y|x)) + ÎČ * log(Z(x))
d) ModÚle de préférence En supposant que les préférences suivent le modÚle Bradley-Terry, nous pouvons exprimer la probabilité de préférer y1 à y2 comme suit :
p*(y1 â» y2 | x) = Ï(r*(x,y1) - r*(x,y2))
OĂč Ï est la fonction logistique.
e) Objectif du DPO En substituant notre dualitĂ© rĂ©compense-politique dans le modĂšle de prĂ©fĂ©rence, nous arrivons Ă lâobjectif DPO :
L_DPO(ÏΞ; Ïref) = -E_(x,y_w,y_l)~D [log Ï(ÎČ * log(ÏΞ(y_w|x) / Ïref(y_w|x)) - ÎČ * log(ÏΞ(y_l|x) / Ïref(y_l|x)))]
Cet objectif peut ĂȘtre optimisĂ© Ă lâaide de techniques standard de descente de gradient, sans avoir besoin dâalgorithmes RL.
Implémentation du DPO
Maintenant que nous avons compris la théorie du DPO, voyons comment le mettre en pratique. Nous utiliserons Python et PyTorch pour cet exemple:
import torch import torch.nn.functional as F class DPOTrainer: def __init__(self, model, ref_model, beta=0.1, lr=1e-5): self.model = model self.ref_model = ref_model self.beta = beta self.optimizer = torch.optim.AdamW(self.model.parameters(), lr=lr) def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs): """ pi_logps: policy logprobs, shape (B,) ref_logps: reference model logprobs, shape (B,) yw_idxs: preferred completion indices in [0, B-1], shape (T,) yl_idxs: dispreferred completion indices in [0, B-1], shape (T,) beta: temperature controlling strength of KL penalty Each pair of (yw_idxs[i], yl_idxs[i]) represents the indices of a single preference pair. """ # Extract log probabilities for the preferred and dispreferred completions pi_yw_logps, pi_yl_logps = pi_logps[yw_idxs], pi_logps[yl_idxs] ref_yw_logps, ref_yl_logps = ref_logps[yw_idxs], ref_logps[yl_idxs] # Calculate log-ratios pi_logratios = pi_yw_logps - pi_yl_logps ref_logratios = ref_yw_logps - ref_yl_logps # Compute DPO loss losses = -F.logsigmoid(self.beta * (pi_logratios - ref_logratios)) rewards = self.beta * (pi_logps - ref_logps).detach() return losses.mean(), rewards def train_step(self, batch): x, yw_idxs, yl_idxs = batch self.optimizer.zero_grad() # Compute log probabilities for the model and the reference model pi_logps = self.model(x).log_softmax(-1) ref_logps = self.ref_model(x).log_softmax(-1) # Compute the loss loss, _ = self.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs) loss.backward() self.optimizer.step() return loss.item() # Usage model = YourLanguageModel() # Initialize your model ref_model = YourLanguageModel() # Load pre-trained reference model trainer = DPOTrainer(model, ref_model) for batch in dataloader: loss = trainer.train_step(batch) print(f"Loss: {loss}")
Défis et orientations futures
Bien que le DPO offre des avantages significatifs par rapport aux approches RLHF traditionnelles, il existe encore des défis et des domaines nécessitant des recherches plus approfondies :
a) ĂvolutivitĂ© vers des modĂšles plus grands :
Alors que la taille des modĂšles de langage continue de croĂźtre, lâapplication efficace de DPO Ă des modĂšles comportant des centaines de milliards de paramĂštres reste un dĂ©fi ouvert. Les chercheurs explorent des techniques telles que :
- Méthodes de réglage efficaces (par exemple, LoRA, réglage des préfixes)
- Optimisations de la formation distribuée
- Points de contrÎle de gradient et entraßnement à précision mixte
Exemple d'utilisation de LoRA avec DPO :
from peft import LoraConfig, get_peft_model class DPOTrainerWithLoRA(DPOTrainer): def __init__(self, model, ref_model, beta=0.1, lr=1e-5, lora_rank=8): lora_config = LoraConfig( r=lora_rank, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) self.model = get_peft_model(model, lora_config) self.ref_model = ref_model self.beta = beta self.optimizer = torch.optim.AdamW(self.model.parameters(), lr=lr) # Usage base_model = YourLargeLanguageModel() dpo_trainer = DPOTrainerWithLoRA(base_model, ref_model)
b) Adaptation multi-tĂąches et Ă quelques prises de vue :
Le développement de techniques DPO capables de s'adapter efficacement à de nouvelles tùches ou domaines avec des données de préférence limitées est un domaine de recherche actif. Les approches explorées comprennent :
- Cadres de méta-apprentissage pour une adaptation rapide
- Réglage fin basé sur des invites pour DPO
- Transférer l'apprentissage des modÚles de préférences générales vers des domaines spécifiques
c) Gestion des préférences ambiguës ou contradictoires :
Les données de préférences réelles comportent souvent des ambiguïtés ou des conflits. Il est crucial d'améliorer la fiabilité des données du DPO. Parmi les solutions possibles, on peut citer :
- Modélisation probabiliste des préférences
- Apprentissage actif pour résoudre les ambiguïtés
- Agrégation de préférences multi-agents
Exemple de modélisation probabiliste des préférences :
class ProbabilisticDPOTrainer(DPOTrainer): def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob): # Compute log ratios pi_yw_logps, pi_yl_logps = pi_logps[yw_idxs], pi_logps[yl_idxs] ref_yw_logps, ref_yl_logps = ref_logps[yw_idxs], ref_logps[yl_idxs] log_ratio_diff = pi_yw_logps.sum(-1) - pi_yl_logps.sum(-1) loss = -(preference_prob * F.logsigmoid(self.beta * log_ratio_diff) + (1 - preference_prob) * F.logsigmoid(-self.beta * log_ratio_diff)) return loss.mean() # Usage trainer = ProbabilisticDPOTrainer(model, ref_model) loss = trainer.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob=0.8) # 80% confidence in preference
d) Combinaison du DPO avec d'autres techniques d'alignement :
LâintĂ©gration du DPO avec dâautres approches dâalignement pourrait conduire Ă des systĂšmes plus robustes et plus performants :
- Principes constitutionnels de l'IA pour la satisfaction explicite des contraintes
- ModĂ©lisation de dĂ©bats et de rĂ©compenses rĂ©cursives pour lâĂ©licitation de prĂ©fĂ©rences complexes
- Apprentissage par renforcement inverse pour déduire les fonctions de récompense sous-jacentes
Exemple de combinaison de DPO avec une IA constitutionnelle :
class ConstitutionalDPOTrainer(DPOTrainer): def __init__(self, model, ref_model, beta=0.1, lr=1e-5, constraints=None): super().__init__(model, ref_model, beta, lr) self.constraints = constraints or [] def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs): base_loss = super().compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs) constraint_loss = 0 for constraint in self.constraints: constraint_loss += constraint(self.model, pi_logps, ref_logps, yw_idxs, yl_idxs) return base_loss + constraint_loss # Usage def safety_constraint(model, pi_logps, ref_logps, yw_idxs, yl_idxs): # Implement safety checking logic unsafe_score = compute_unsafe_score(model, pi_logps, ref_logps) return torch.relu(unsafe_score - 0.5) # Penalize if unsafe score > 0.5 constraints = [safety_constraint] trainer = ConstitutionalDPOTrainer(model, ref_model, constraints=constraints)
Considérations pratiques et meilleures pratiques
Lors de la mise en Ćuvre du DPO pour des applications rĂ©elles, tenez compte des conseils suivants :
a) Qualité des données: La qualité de vos données de préférences est cruciale. Assurez-vous que votre ensemble de données :
- Couvre une gamme diversifiĂ©e dâentrĂ©es et de comportements souhaitĂ©s
- PossÚde des annotations de préférences cohérentes et fiables
- Ăquilibre diffĂ©rents types de prĂ©fĂ©rences (par exemple, factualitĂ©, sĂ©curitĂ©, style)
b) Réglage des hyperparamÚtres: Bien que DPO ait moins d'hyperparamÚtres que RLHF, le réglage est toujours important :
- ÎČ (bĂȘta) : contrĂŽle le compromis entre la satisfaction des prĂ©fĂ©rences et la divergence par rapport au modĂšle de rĂ©fĂ©rence. Commencez par des valeurs autour 0.1-0.5.
- Taux d'apprentissage : utilisez un taux d'apprentissage inférieur à celui du réglage fin standard, généralement de l'ordre de 1e-6 à 1e-5.
- Taille du lot : tailles de lots plus grandes (32-128) fonctionnent souvent bien pour lâapprentissage des prĂ©fĂ©rences.
c) Raffinement itĂ©ratif: DPO peut ĂȘtre appliquĂ© de maniĂšre itĂ©rative :
- Former un modĂšle initial Ă l'aide de DPO
- Générez de nouvelles réponses à l'aide du modÚle formé
- Collecter de nouvelles données de préférences sur ces réponses
- Réentraßner à l'aide de l'ensemble de données étendu
Cette image illustre les performances de LLM comme GPT-4 par rapport aux jugements humains selon diverses techniques d'apprentissage, notamment l'optimisation directe des préférences (DPO), le réglage fin supervisé (SFT) et l'optimisation des politiques proximales (PPO). Le tableau révÚle que les résultats de GPT-4 sont de plus en plus alignés sur les préférences humaines, notamment dans les tùches de synthÚse. Le niveau de concordance entre GPT-4 et les évaluateurs humains démontre la capacité du modÚle à générer du contenu qui résonne auprÚs des évaluateurs humains, presque aussi étroitement que le contenu généré par les humains.
Ătudes de cas et applications
Pour illustrer lâefficacitĂ© du DPO, examinons quelques applications concrĂštes et certaines de ses variantes :
- DPO itĂ©ratif: DĂ©veloppĂ©e par Snorkel (2023), cette variante combine l'Ă©chantillonnage par rejet avec le DPO, permettant un processus de sĂ©lection plus raffinĂ© pour les donnĂ©es d'entraĂźnement. En itĂ©rant sur plusieurs cycles d'Ă©chantillonnage des prĂ©fĂ©rences, le modĂšle est mieux Ă mĂȘme de gĂ©nĂ©raliser et d'Ă©viter le surajustement Ă des prĂ©fĂ©rences bruyantes ou biaisĂ©es.
- Introduction en bourse (Optimisation itérative des préférences): Introduit par Azar et al. (2023), IPO ajoute un terme de régularisation pour éviter le surajustement, qui est un problÚme courant dans l'optimisation basée sur les préférences. Cette extension permet aux modÚles de maintenir un équilibre entre le respect des préférences et la préservation des capacités de généralisation.
- KTO (Optimisation du transfert de connaissances): Une variante plus rĂ©cente d'Ethayarajh et al. (2023), KTO renonce complĂštement aux prĂ©fĂ©rences binaires. Au lieu de cela, il se concentre sur le transfert de connaissances dâun modĂšle de rĂ©fĂ©rence vers le modĂšle politique, en optimisant pour un alignement plus fluide et plus cohĂ©rent avec les valeurs humaines.
- DPO multimodal pour l'apprentissage inter-domaines par Xu et al. (2024): Une approche oĂč le DPO est appliquĂ© Ă travers diffĂ©rentes modalitĂ©s (texte, image et audio) dĂ©montrant sa polyvalence dans l'alignement des modĂšles avec les prĂ©fĂ©rences humaines sur divers types de donnĂ©es. Cette recherche met en Ă©vidence le potentiel du DPO dans la crĂ©ation de systĂšmes dâIA plus complets, capables de gĂ©rer des tĂąches complexes et multimodales.