AI-modeller och plattformar

Direkt Preferensoptimering: En Komplett Guide

mm
Lägg till Unite.AI bland dina föredragna källor på Google

Att anpassa stora språkmodeller (LLM) till mänskliga värderingar och preferenser är en utmaning. Traditionella metoder, som till exempel Reinforcement Learning from Human Feedback (RLHF), har banat väg genom att integrera mänskliga inspel för att förfinare modellutdata. Men RLHF kan vara komplex och resurskrävande, och kräver betydande beräkningskraft och datahantering. Direkt Preferensoptimering (DPO) framträder som en ny och mer strömlinjeformad metod, som erbjuder en effektiv alternativ till dessa traditionella metoder. Genom att förenkla optimeringsprocessen minskar DPO inte bara den beräkningsmässiga bördan, utan förbättrar också modellens förmåga att anpassa sig snabbt till mänskliga preferenser.

I den här guiden kommer vi att dyka djupt in i DPO, och undersöka dess grunder, implementering och praktiska tillämpningar.

Behovet av Preferensanpassning

För att förstå DPO är det viktigt att förstå varför anpassning av LLM till mänskliga preferenser är så viktigt. Trots deras imponerande förmågor kan LLM som tränats på stora datamängder ibland producera utdata som är inkonsekventa, fördomsfulla eller inte överensstämmer med mänskliga värderingar. Denna inkonsekvens kan manifestera sig på olika sätt:

  • Genererar osäkra eller skadliga innehåll
  • Tillhandahåller felaktig eller vilseledande information
  • Visar fördomar som finns i träningsdata

För att hantera dessa problem har forskare utvecklat tekniker för att finjustera LLM med mänsklig feedback. Den mest framträdande av dessa metoder har varit RLHF.

Förstå RLHF: Föregångaren till DPO

Reinforcement Learning from Human Feedback (RLHF) har varit den vanligaste metoden för att anpassa LLM till mänskliga preferenser. Låt oss bryta ner RLHF-processen för att förstå dess komplexitet:

a) Övervakad finjustering (SFT): Processen börjar med att finjustera en förtränad LLM på en datamängd med högkvalitativa svar. Detta steg hjälper modellen att generera mer relevanta och sammanhängande utdata för måluppgiften.

b) Belöningsmodellering: En separat belöningsmodell tränas för att förutsäga mänskliga preferenser. Detta innefattar:

  • Genererar svarpar för givna uppmaningar
  • Mänskliga bedömare avgör vilket svar de föredrar
  • Tränar en modell för att förutsäga dessa preferenser

c) Förstärkt inlärning: Den finjusterade LLM optimeras sedan ytterligare med förstärkt inlärning. Belöningsmodellen tillhandahåller feedback som vägleder LLM att generera svar som överensstämmer med mänskliga preferenser.

Här är ett förenklat Python-pseudokod för att illustrera RLHF-processen:

Även om det är effektivt har RLHF flera nackdelar:

  • Det kräver tränning och underhåll av flera modeller (SFT, belöningsmodell och RL-optimiserad modell)
  • RL-processen kan vara instabil och känslig för hyperparametrar
  • Det är beräkningsmässigt dyrt, och kräver många framåt- och bakåtpasseringar genom modellerna

Dessa begränsningar har motiverat sökandet efter enklare och mer effektiva alternativ, vilket har lett till utvecklingen av DPO.

Direkt Preferensoptimering: Kärnkoncept

Direkt Preferensoptimering https://arxiv.org/abs/2305.18290

Direkt Preferensoptimering https://arxiv.org/abs/2305.18290

Denna bild kontrasterar två distinkta tillvägagångssätt för att anpassa LLM-utdata till mänskliga preferenser: Förstärkt inlärning från mänsklig feedback (RLHF) och Direkt Preferensoptimering (DPO). RLHF förlitar sig på en belöningsmodell för att vägleda språkmodellens policy genom iterativa feedbackloopar, medan DPO optimerar modellutdata direkt för att matcha mänskligt föredragna svar med hjälp av preferensdata. Denna jämförelse belyser styrkorna och potentiella tillämpningar för varje metod, och ger insikt i hur framtida LLM kan tränas för att bättre anpassa sig till mänskliga förväntningar.

Nyckelidéer bakom DPO:

a) Implicit belöningsmodellering: DPO eliminerar behovet av en separat belöningsmodell genom att behandla språkmodellen som en implicit belöningsfunktion.

b) Policybaserad formulerings: Istället för att optimera en belöningsfunktion optimerar DPO direkt policyn (språkmodellen) för att maximera sannolikheten för föredragna svar.

c) Sluten formell lösning: DPO utnyttjar en matematisk insikt som möjliggör en sluten formell lösning för den optimala policyn, och undviker behovet av iterativa RL-uppdateringar.

Implementering av DPO: En praktisk kodgenomgång

Bilden nedan visar en kodsnutt som implementerar DPO-förlustfunktionen med hjälp av PyTorch. Denna funktion spelar en avgörande roll för att förfinare hur språkmodeller prioriterar utdata baserat på mänskliga preferenser. Här är en genomgång av de viktigaste komponenterna:

  • Funktionsignatur: DPO-förlustfunktionen tar in flera parametrar, inklusive policylogprobabiliteter (pi_logps), referensmodelllogprobabiliteter (ref_logps), och index som representerar föredragna och icke-föredragna kompletteringar (yw_idxs, yl_idxs). Dessutom kontrollerar beta-parametern styrkan på KL-straffet.
  • Logprobabilitetsutvinning: Koden utvinner logprobabiliteter för föredragna och icke-föredragna kompletteringar från både policy- och referensmodellerna.
  • Logförhållandeberäkning: Skillnaden mellan logprobabiliteter för föredragna och icke-föredragna kompletteringar beräknas för både policy- och referensmodellerna. Detta förhållande är avgörande för att bestämma riktning och storlek på optimeringen.
  • Förlust- och belöningsberäkning: Förlusten beräknas med hjälp av logsigmoid-funktionen, medan belöningar bestäms genom att skala skillnaden mellan policy- och referenslogprobabiliteter med beta.
DPO-förlustfunktion med PyTorch

DPO-förlustfunktion med PyTorch

Låt oss dyka in i matematiken bakom DPO för att förstå hur det uppnår dessa mål.

Matematiken bakom DPO

DPO är en smart omformulering av preferensinlärningsproblemet. Här är en steg-för-steg-genomgång:

a) Startpunkt: KL-begränsad belöningsmaximering

Det ursprungliga RLHF-målet kan uttryckas som:

Den komplexa matematiska formeln i nästa bild representerar förlustfunktionen som används i Direkt Preferensoptimering (DPO), en banbrytande träningsmetod som förfinar hur LLM anpassar sina utdata till mänskliga preferenser.

Där:
  • πθ är policyn (språkmodellen) som vi optimerar
  • r(x,y) är belöningsfunktionen
  • πref är en referenspolicy (vanligtvis den initiala SFT-modellen)
  • β kontrollerar styrkan på KL-avvikelsebegränsningen

b) Optimal policyform: Det kan visas att den optimala policyn för detta mål har formen:

π_r(y|x) = 1/Z(x) * πref(y|x) * exp(1/β * r(x,y))

Där Z(x) är en normaliseringskonstant.

c) Belönings-policy-dualitet: DPO:s nyckelinsikt är att uttrycka belöningsfunktionen i termer av den optimala policyn:

r(x,y) = β * log(π_r(y|x) / πref(y|x)) + β * log(Z(x))

d) Preference-modell Antagande att preferenser följer Bradley-Terry-modellen, kan vi uttrycka sannolikheten för att föredra y1 över y2 som:

p*(y1 ≻ y2 | x) = σ(r*(x,y1) - r*(x,y2))

Där σ är den logistiska funktionen.

e) DPO-mål Genom att ersätta vår belönings-policy-dualitet i preferensmodellen, kommer vi fram till DPO-målet:

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)))]

Detta mål kan optimeras med hjälp av standard gradientnedstigningstekniker, utan behov av RL-algoritmer.

Implementering av DPO

Nu när vi förstår teorin bakom DPO, låt oss titta på hur man implementerar det i praktiken. Vi kommer att använda Python och PyTorch för det här exemplet:

import torch
import torch.nn.functional as F

<p>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)</p>

<p>def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs):
&quot;&quot;&quot;
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</p>

<p>Varje par av (yw_idxs[i], yl_idxs[i]) representerar indexen för ett enda preferenspar.
&quot;&quot;&quot;</p>

<p># Utvinna logprobabiliteter för de föredragna och icke-föredragna kompletteringarna
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]</p>

<p># Beräkna logförhållanden
pi_logratios = pi_yw_logps - pi_yl_logps
ref_logratios = ref_yw_logps - ref_yl_logps</p>

<p># Beräkna DPO-förlust
losses = -F.logsigmoid(self.beta * (pi_logratios - ref_logratios))
rewards = self.beta * (pi_logps - ref_logps).detach()</p>

return losses.mean(), rewards

<p>def train_step(self, batch):
x, yw_idxs, yl_idxs = batch
self.optimizer.zero_grad()</p>

<p># Beräkna logprobabiliteter för modellen och referensmodellen
pi_logps = self.model(x).log_softmax(-1)
ref_logps = self.ref_model(x).log_softmax(-1)</p>

<p># Beräkna förlusten
loss, _ = self.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs)
loss.backward()
self.optimizer.step()</p>

return loss.item()

<p># Användning
model = DinSpråkModell() # Initiera din modell
ref_model = DinSpråkModell() # Ladda förtränad referensmodell
trainer = DPOTrainer(model, ref_model)</p>

<p>for batch in dataloader:
loss = trainer.train_step(batch)
print(f&quot;Förlust: {loss}&quot;)

Utmaningar och Framtida Riktningar

Även om DPO erbjuder betydande fördelar jämfört med traditionella RLHF-metoder, finns det fortfarande utmaningar och områden för ytterligare forskning:

a) Skalbarhet till Större Modeller:

När språkmodeller fortsätter att växa i storlek, kvarstår det öppna problemet att effektivt tillämpa DPO på modeller med hundratals miljarder parametrar. Forskare undersöker tekniker som:

  • Effektiva finjusteringsmetoder (t.ex. LoRA, prefix-tuning)
  • Distribuerad träningsoptimering
  • Gradient-checkpointing och mixed-precision-träning

Exempel på användning av LoRA med DPO:


<p>from peft import LoraConfig, get_peft_model</p>

<p>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=[&quot;q_proj&quot;, &quot;v_proj&quot;],
lora_dropout=0.05,
bias=&quot;none&quot;,
task_type=&quot;CAUSAL_LM&quot;
)
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)</p>

<p># Användning
base_model = DinStoraSpråkModell()
dpo_trainer = DPOTrainerWithLoRA(base_model, ref_model)

b) Multi-Task och Few-Shot-Anpassning:

Utveckling av DPO-tekniker som kan effektivt anpassa sig till nya uppgifter eller domäner med begränsad preferensdata är ett aktivt forskningsområde. Tillvägagångssätt som undersöks inkluderar:

  • Meta-lärande-ramverk för snabb anpassning
  • Prompt-baserad finjustering för DPO
  • Överföringslärande från allmänna preferensmodeller till specifika domäner

c) Hantering av Tvetydiga eller Motstridiga Preferenser:

Verkliga preferensdata innehåller ofta tvetydigheter eller motsättningar. Förbättring av DPO:s robusthet mot sådan data är avgörande. Potentiella lösningar inkluderar:

  • Probabilistisk preferensmodellering
  • Aktivt lärande för att lösa tvetydigheter
  • Multi-agent-preferensaggregering

Exempel på probabilistisk preferensmodellering:


<p>class ProbabilistiskDPOTrainer(DPOTrainer):
def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob):
# Beräkna logförhållanden
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]</p>

<p>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()</p>

<p># Användning
trainer = ProbabilistiskDPOTrainer(model, ref_model)
loss = trainer.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob=0.8) # 80% konfidens i preferens

d) Kombination av DPO med Andra Anpassningstekniker:

Integrering av DPO med andra anpassningsmetoder kan leda till mer robusta och kapabla system:

  • Konstitutionella AI-principer för explicit begränsningsuppfyllnad
  • Debatt och rekursiv belöningsmodellering för komplex preferensutvinning
  • Invers förstärkt lärande för att härleda underliggande belöningsfunktioner

Exempel på kombination av DPO med konstitutionell AI:


<p>class KonstitutionellDPOTrainer(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 []</p>

<p>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)</p>

<p>constraint_loss = 0
for constraint in self.constraints:
constraint_loss += constraint(self.model, pi_logps, ref_logps, yw_idxs, yl_idxs)</p>

return base_loss + constraint_loss

<p># Användning
def säkerhetsbegränsning(model, pi_logps, ref_logps, yw_idxs, yl_idxs):
# Implementera säkerhetskontrolllogik
osäkerhetspoäng = beräkna_osäkerhetspoäng(model, pi_logps, ref_logps)
return torch.relu(osäkerhetspoäng - 0.5) # Straffa om osäkerhetspoäng &gt; 0.5</p>

<p>constraints = [säkerhetsbegränsning]
trainer = KonstitutionellDPOTrainer(model, ref_model, constraints=constraints)</p>

Praktiska Överväganden och Bästa Praxis

När du implementerar DPO för verkliga tillämpningar, överväg följande tips:

a) Datakvalitet: Kvaliteten på din preferensdata är avgörande. Se till att din datamängd:

  • Täcker en bred variation av indata och önskade beteenden
  • Har konsekventa och tillförlitliga preferensannoteringar
  • Balanserar olika typer av preferenser (t.ex. faktualitet, säkerhet, stil)

b) Hyperparameterjustering: Även om DPO har färre hyperparametrar än RLHF, är justering fortfarande viktigt:

  • β (beta): Kontrollerar avvägningen mellan preferensuppfyllnad och avvikelse från referensmodellen. Börja med värden runt 0.1-0.5.
  • Lärandehastighet: Använd en lägre lärandehastighet än standardfinjustering, vanligtvis i intervallet 1e-6 till 1e-5.
  • Batchstorlek: Större batchstorlekar (32-128) fungerar ofta bra för preferensinlärning.

c) Iterativ förfining: DPO kan tillämpas iterativt:

  1. Träna en initial modell med DPO
  2. Generera nya svar med den tränade modellen
  3. Samlar in ny preferensdata på dessa svar
  4. Träna om med den utvidgade datamängden

 

Direkt Preferensoptimering

Direkt Preferensoptimering Prestanda

Denna bild visar prestandan hos LLM som GPT-4 i jämförelse med mänskliga bedömningar över olika träningsmetoder, inklusive Direkt Preferensoptimering (DPO), Övervakad Finjustering (SFT) och Proximal Policy Optimization (PPO). Tabellen visar att GPT-4:s utdata är alltmer anpassade till mänskliga preferenser, särskilt i sammanfattningsuppgifter. Nivån på överensstämmelse mellan GPT-4 och mänskliga bedömare visar modellens förmåga att generera innehåll som överensstämmer med mänskliga utvärderare, nästan lika nära som mänskligt genererat innehåll.

Fallstudier och Tillämpningar

För att illustrera effektiviteten hos DPO, låt oss titta på några verkliga tillämpningar och några av dess varianter:

  • Iterativ DPO: Utvecklad av Snorkel (2023), denna variant kombinerar avvisningsprovning med DPO, vilket möjliggör en mer raffinerad urvalsprocess för träningsdata. Genom att iterera över flera omgångar av preferensprovning kan modellen bättre generalisera och undvika överanpassning till brusig eller fördomsfulla preferenser.
  • IPO (Iterativ Preferensoptimering): Introducerad av Azar et al. (2023), IPO lägger till en regleringsterm för att förhindra överanpassning, som är ett vanligt problem i preferensbaserad optimering. Denna utvidgning tillåter modeller att upprätthålla en balans mellan att följa preferenser och bevara generaliseringsförmåga.
  • KTO (Kunskapsöverföringsoptimering): En senare variant från Ethayarajh et al. (2023), KTO avskaffar binära preferenser helt. Istället fokuserar den på att överföra kunskap från en referensmodell till policy-modellen, och optimerar för en jämnare och mer konsekvent anpassning till mänskliga värderingar.
  • Multi-Modal DPO för Cross-Domain-Lärande av Xu et al. (2024): En tillvägagångssätt där DPO tillämpas över olika modaliteter – text, bild och ljud – vilket visar dess flexibilitet i anpassning till mänskliga preferenser över olika datatyper. Denna forskning belyser potentialen hos DPO i skapandet av mer omfattande AI-system som kan hantera komplexa, multimodala uppgifter.

Slutsats

Direkt Preferensoptimering representerar en betydande framsteg i anpassning av språkmodeller till mänskliga preferenser. Dess enkelhet, effektivitet och effekter gör det till ett kraftfullt verktyg för forskare och praktiker.

Genom att utnyttja kraften hos Direkt Preferensoptimering och hålla dessa principer i åtanke, kan du skapa språkmodeller som inte bara visar imponerande förmågor, utan också anpassar sig nära till mänskliga värderingar och avsikter.

Jag har tillbringat de senaste fem åren med att dyka djupt in i den fascinerande världen av Maskinlärning och Djupinlärning. Min passion och expertis har lett mig till att bidra till över 50 olika mjukvaruprojekt, med särskild fokus på AI/ML. Min pågående nyfikenhet har också lett mig mot Naturlig Språkbehandling, ett område som jag är angelägen om att utforska vidare.