Suivez nous sur

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

Intelligence Artificielle

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

mm
LLM DPO mathématiques et code

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

Optimisation des préférences directes https://arxiv.org/abs/2305.18290

Optimisation des préférences directes https://arxiv.org/abs/2305.18290

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, un beta 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 par beta.
Fonction de perte DPO à l'aide de PyTorch

Fonction de perte DPO à l'aide de PyTorch

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 :

La formule mathématique complexe de l'image suivante représente la fonction de perte utilisée dans l'optimisation directe des préférences (DPO), une méthode de formation de pointe qui affine la manière dont les LLM alignent leurs résultats sur les préférences humaines.

Où? :
  • πθ 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 :

  1. Former un modèle initial à l'aide de DPO
  2. Générez de nouvelles réponses à l'aide du modèle formé
  3. Collecter de nouvelles données de préférences sur ces réponses
  4. Réentraîner à l'aide de l'ensemble de données étendu

 

Optimisation des préférences directes

Performances d’optimisation des préférences directes

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.

Conclusion

L'optimisation directe des préférences représente une avancée significative dans l'alignement des modèles de langage sur les préférences humaines. Sa simplicité, son efficience et son efficacité en font un outil puissant pour les chercheurs et les praticiens.

En tirant parti de la puissance de l’optimisation directe des préférences et en gardant ces principes à l’esprit, vous pouvez créer des modèles de langage qui non seulement présentent des capacités impressionnantes, mais qui s’alignent également étroitement sur les valeurs et les intentions humaines.

J'ai passé les cinq dernières années à m'immerger dans le monde fascinant du Machine Learning et du Deep Learning. Ma passion et mon expertise m'ont amené à contribuer à plus de 50 projets de génie logiciel divers, avec un accent particulier sur l'IA/ML. Ma curiosité continue m'a également attiré vers le traitement automatique du langage naturel, un domaine que j'ai hâte d'explorer davantage.