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.