AI-modeller og plattformer

Direkte Preferanseoptimalisering: En Komplett Guide

mm
Legg til Unite.AI blant dine foretrukne kilder på Google

Å aligne store språkmodeller (LLM) med menneskelige verdier og preferanser er utfordrende. Tradisjonelle metoder, som Reinforcement Learning from Human Feedback (RLHF), har banet vei ved å integrere menneskelige innputt for å finjustere modellutdata. However, RLHF kan være kompleks og ressurskrevende, og krever betydelig beregningskraft og datautvinning. Direkte Preferanseoptimalisering (DPO) oppstår som en ny og mer strømlinjeformet tilnærming, og tilbyr en effektiv alternativ til disse tradisjonelle metodene. Ved å forenkle optimaliseringsprosessen, reduserer DPO ikke bare den beregningsmessige byrden, men forbedrer også modellens evne til å tilpasse seg raskt til menneskelige preferanser

I denne guiden vil vi dykke dypt inn i DPO, og utforske dens grunnleggende konsepter, implementering og praktiske anvendelser.

Behovet for Preferansealignering

For å forstå DPO, er det avgjørende å forstå hvorfor alignering av LLM med menneskelige preferanser er så viktig. Til tross for deres imponerende evner, kan LLM som er trent på store datasette noen ganger produsere utdata som er inkonsistente, forvrengte eller misalignert med menneskelige verdier. Denne misaligneringen kan manifestere seg på forskjellige måter:

  • Generering av usikre eller skadelige innhold
  • Tilbyding av uriktige eller misvisende informasjon
  • Visning av forvrengninger som er tilstede i treningsdataene

For å løse disse problemene, har forskere utviklet tekniker for å finjustere LLM ved hjelp av menneskelig tilbakemelding. Den mest fremtredende av disse tilnærmingene har vært RLHF.

Forståelse av RLHF: Forgjengeren til DPO

Reinforcement Learning from Human Feedback (RLHF) har vært den vanligste metoden for å alignere LLM med menneskelige preferanser. La oss bryte ned RLHF-prosessen for å forstå dens kompleksitet:

a) Overvåket finjustering (SFT): Prosessen begynner med å finjustere en forhåndsdefinert LLM på et datasett med høykvalitetsrespons. Dette steget hjelper modellen til å generere mer relevante og kohesive utdata for mål-oppgaven.

b) Belønningmodellering: En separat belønningmodell blir trent for å forutsi menneskelige preferanser. Dette innebærer:

  • Generering av responspar for gitt prompter
  • Mennesker rangerer hvilken respons de foretrekker
  • Treningsmodell for å forutsi disse preferansene

c) Forsterkingslæring: Den finjusterte LLM blir deretter ytterligere optimalisert ved hjelp av forsterkingslæring. Belønningmodellen gir tilbakemelding, og veileder LLM til å generere respons som alignerer med menneskelige preferanser.

Her er et forenklet Python-pseudokode for å illustrere RLHF-prosessen:

Selv om det er effektivt, har RLHF flere ulemper:

  • Det krever trening og vedlikehold av flere modeller (SFT, belønningmodell og RL-optimert modell)
  • RL-prosessen kan være ustabil og følsom for hyperparametre
  • Det er beregningskrevende, og krever mange fremover- og bakover-passer gjennom modellene

Disse begrensningene har motivert leting etter enklere og mer effektive alternativer, og har ført til utviklingen av DPO.

Direkte Preferanseoptimalisering: Kjernekonsepter

Direkte Preferanseoptimalisering https://arxiv.org/abs/2305.18290

Direkte Preferanseoptimalisering https://arxiv.org/abs/2305.18290

Dette bildet kontrasterer to distinkte tilnærminger for å alignere LLM-utdata med menneskelige preferanser: Forsterkingslæring fra menneskelig tilbakemelding (RLHF) og Direkte Preferanseoptimalisering (DPO). RLHF avhenger av en belønningmodell for å veilede språkmodellens policy gjennom iterative tilbakemeldingsløkker, mens DPO optimaliserer modellutdata direkte for å matche menneskelige preferanser ved hjelp av preferansedata. Denne sammenligningen fremhever styrkene og potensielle anvendelser av hver metode, og gir innsikt i hvordan fremtidige LLM kan bli trent for å bedre alignere med menneskelige forventninger.

Nøkkelideer bak DPO:

a) Implicit belønningmodellering: DPO eliminerer behovet for en separat belønningmodell ved å behandle språkmodellen selv som en implisitt belønningfunksjon.

b) Policy-basert formulering: I stedet for å optimalisere en belønningfunksjon, optimaliserer DPO direkte policyen (språkmodellen) for å maksimere sannsynligheten for foretrukne respons.

c) Lukket formasjon: DPO utnytter en matematisk innsikt som tillater en lukket formasjon for den optimale policyen, og unngår behovet for iterative RL-oppdateringer.

Implementering av DPO: En Praktisk Kode-gjennomgang

Bildet under viser en kode-utdrag som implementerer DPO-tapfunksjonen ved hjelp av PyTorch. Denne funksjonen spiller en avgjørende rolle i å finjustere hvordan språkmodeller prioriterer utdata basert på menneskelige preferanser. Her er en gjennomgang av de viktigste komponentene:

  • Funksjonsignatur: DPO-tapfunksjonen tar inn flere parametre, inkludert policy-logprobas (pi_logps), referansemodell-logprobas (ref_logps), og indekser som representerer foretrukne og ikke-foretrukne fullføringer (yw_idxs, yl_idxs). I tillegg kontrollerer beta-parameteren styrken av KL-straff.
  • Log-probabilitets-uttrekk: Koden trekker ut log-probabilitetene for foretrukne og ikke-foretrukne fullføringer fra både policy- og referansemodellene.
  • Log-rasjoutregning: Forskjellen mellom log-probabilitetene for foretrukne og ikke-foretrukne fullføringer beregnes for både policy- og referansemodellene. Denne rasjon er kritisk for å bestemme retning og størrelse av optimalisering.
  • Tap og belønning beregning: Tapet beregnes ved hjelp av logsigmoid-funksjonen, mens belønningene bestemmes ved å skala forskjellen mellom policy- og referanse-logprobas med beta.
DPO-tapfunksjon ved hjelp av PyTorch

DPO-tapfunksjon ved hjelp av PyTorch

La oss dykke inn i matematikken bak DPO for å forstå hvordan det oppnår disse målene.

Matematikken bak DPO

DPO er en smart omformulering av preferanse-læringsproblemet. Her er en steg-for-steg-gjennomgang:

a) Utgangspunkt: KL-begrensning av belønning maksimering

Det opprinnelige RLHF-målet kan uttrykkes som:

Den komplekse matematiske formelen i neste bilde representerer tapfunksjonen brukt i Direkte Preferanseoptimalisering (DPO), en banebrytende treningmetode som finjusterer hvordan LLM alignerer utdata med menneskelige preferanser.

Hvor:
  • πθ er policyen (språkmodellen) vi optimaliserer
  • r(x,y) er belønningfunksjonen
  • πref er en referansepolicy (vanligvis den opprinnelige SFT-modellen)
  • β kontrollerer styrken av KL-divergensbegrensningen

b) Optimal policyform: Det kan vises at den optimale policyen for dette målet tar formen:

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

Hvor Z(x) er en normaliseringskonstant.

c) Belønning-policy dualitet: DPOs nøkkelinnsikt er å uttrykke belønningfunksjonen i termer av den optimale policyen:

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

d) Preferansmodell Anta at preferanser følger Bradley-Terry-modellen, kan vi uttrykke sannsynligheten for å foretrekke y1 over y2 som:

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

Hvor σ er den logistiske funksjonen.

e) DPO-mål Ved å erstatte vår belønning-policy dualitet i preferansmodellen, kommer vi til 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)))]

Dette målet kan optimaliseres ved hjelp av standard gradient-descent-teknikker, uten behov for RL-algoritmer.

Implementering av DPO

Nå som vi forstår teorien bak DPO, la oss se på hvordan vi kan implementere det i praksis. Vi vil bruke Python og PyTorch i dette eksemplet:

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>Each pair of (yw_idxs[i], yl_idxs[i]) represents the indices of a single preference pair.
&quot;&quot;&quot;</p>

<p># 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]</p>

<p># Calculate log-ratios
pi_logratios = pi_yw_logps - pi_yl_logps
ref_logratios = ref_yw_logps - ref_yl_logps</p>

<p># Compute DPO loss
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># 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)</p>

<p># Compute the loss
loss, _ = self.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs)
loss.backward()
self.optimizer.step()</p>

return loss.item()

<p># Usage
model = YourLanguageModel() # Initialize your model
ref_model = YourLanguageModel() # Load pre-trained reference model
trainer = DPOTrainer(model, ref_model)</p>

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

Utfordringer og Fremtidige Retninger

Selv om DPO tilbyr betydelige fordeler over tradisjonelle RLHF-tilnærminger, finnes det fortsatt utfordringer og områder for videre forskning:

a) Skalering til Større Modeller:

Ettersom språkmodeller fortsetter å vokse i størrelse, er det en åpen utfordring å effektivt anvende DPO på modeller med hundredvis av milliarder av parametre. Forskere utforsker tekniker som:

  • Effektive finjusteringsmetoder (f.eks. LoRA, prefix-tuning)
  • Distribuert treningsoptimalisering
  • Gradient-checkpointing og mixed-precision-trening

Eksempel på bruk 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># Usage
base_model = YourLargeLanguageModel()
dpo_trainer = DPOTrainerWithLoRA(base_model, ref_model)

b) Multi-Task og Few-Shot-Tilpasning:

Utvikling av DPO-teknikker som kan effektivt tilpasse seg nye oppgaver eller domener med begrenset preferansedata er et aktivt forskningsområde. Tilnærminger som utforskes inkluderer:

  • Meta-læring-rammeverk for rask tilpasning
  • Prompt-basert finjustering for DPO
  • Overføring av læring fra generelle preferansmodeller til spesifikke domener

c) Behandling av Tvetydige eller Motstridende Preferanser:

Reell preferansedata inneholder ofte tvetydigheter eller motstridende preferanser. Forbedring av DPOs robusthet til slike data er kritisk. Potensielle løsninger inkluderer:

  • Probabilistisk preferansmodellering
  • Aktiv læring for å løse tvetydigheter
  • Multi-agent-preferansaggregasjon

Eksempel på probabilistisk preferansmodellering:


<p>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]</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># 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) Kombinering av DPO med Andre Aligneringsteknikker:

Integrering av DPO med andre aligneringsteknikker kan føre til mer robuste og kapable systemer:

  • Constitutional AI-prinsipper for eksplisitt begrensningstilfredsstillelse
  • Debate og rekursiv belønningmodellering for kompleks preferanseligging
  • Invers forsterkingslæring for å inferere underliggende belønningfunksjoner

Eksempel på kombinering av DPO med constitutional AI:


<p>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 []</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># 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 &amp;gt; 0.5</p>

<p>constraints = [safety_constraint]
trainer = ConstitutionalDPOTrainer(model, ref_model, constraints=constraints)</p>

Praktiske Overveielser og Beste Praksis

Når du implementerer DPO for virkelige anvendelser, vurdér følgende tips:

a) Datakvalitet: Kvaliteten på dine preferansedata er avgjørende. Sørg at ditt datasett:

  • Dekker et bredt spekter av inndata og ønskede atferd
  • Har konsistente og pålitelige preferansannoteringer
  • Balancerer forskjellige typer preferanser (f.eks. faktualitet, sikkerhet, stil)

b) Hyperparameter-justering: Selv om DPO har færre hyperparametere enn RLHF, er justering likevel viktig:

  • β (beta): Kontrollerer avveiningen mellom preferanse-tilfredsstillelse og divergens fra referansemodellen. Start med verdier rundt 0.1-0.5.
  • Læringsrate: Bruk en lavere læringsrate enn standard finjustering, vanligvis i området 1e-6 til 1e-5.
  • Batch-størrelse: Større batch-størrelser (32-128) fungerer ofte godt for preferanselæring.

c) Iterativ forbedring: DPO kan anvendes iterativt:

  1. Tren en initial modell ved hjelp av DPO
  2. Generer nye respons ved hjelp av den trenede modellen
  3. Saml inn nye preferansedata på disse responsene
  4. Tren igjen ved hjelp av det utvidede datasettet

 

Direkte Preferanseoptimalisering

Direkte Preferanseoptimalisering Performance

Dette bildet viser ytelsen til LLM som GPT-4 i sammenligning med menneskelige vurderinger over forskjellige treningsteknikker, inkludert Direkte Preferanseoptimalisering (DPO), Overvåket Finjustering (SFT) og Proximal Policy Optimization (PPO). Tabellen avslører at GPT-4s utdata er stadig mer alignert med menneskelige preferanser, spesielt i sammenfattningsoppgaver. Nivået av enighet mellom GPT-4 og menneskelige vurderere demonstrerer modellens evne til å generere innhold som resonerer med menneskelige evalueringer, nesten like nært som menneske-generert innhold gjør.

Sakstudier og Anvendelser

For å illustrere effektiviteten av DPO, la oss se på noen virkelige anvendelser og noen av dens varianter:

  • Iterativ DPO: Utviklet av Snorkel (2023), denne varianten kombinerer avvisningsprøving med DPO, og muliggjør en mer finjustert utvalgprosess for treningdata. Ved å iterere over flere runder av preferansesampling, kan modellen bedre generalisere og unngå overfitting til støyende eller forvrengde preferanser.
  • IPO (Iterativ Preferanseoptimalisering): Innført av Azar et al. (2023), IPO legger til en regulariseringsterm for å forhindre overfitting, som er et vanlig problem i preferanse-basert optimalisering. Denne utvidelsen tillater modeller å opprettholde en balanse mellom å følge preferanser og bevare generaliserings-evner.
  • KTO (Kunnskaps-Overførings-Optimalisering): En mer nylig variant fra Ethayarajh et al. (2023), KTO forkaster binære preferanser helt. I stedet fokuserer den på å overføre kunnskap fra en referansemodell til policy-modellen, og optimaliserer for en jevnere og mer konsistent alignering med menneskelige verdier.
  • Multi-Modal DPO for Cross-Domain Learning by Xu et al. (2024): En tilnærming hvor DPO anvendes på tvers av forskjellige modaliteter—tekst, bilde og lyd—demonstrerer dens fleksibilitet i å alignere modeller med menneskelige preferanser på tvers av ulike datatyper. Denne forskningen fremhever potensialet for DPO i å skape mer omfattende AI-systemer i stand til å håndtere komplekse, multi-modale oppgaver.

Konklusjon

Direkte Preferanseoptimalisering representerer en betydelig fremgang i å alignere språkmodeller med menneskelige preferanser. Dens enkelhet, effektivitet og effekt gjør det til et kraftig verktøy for både forskere og praktikere.

Ved å utnytte kraften av Direkte Preferanseoptimalisering og holde disse prinsippene i mente, kan du skape språkmodeller som ikke bare viser imponerende evner, men også alignerer nært med menneskelige verdier og intensjoner.

Jeg har brukt de siste fem årene på å dykke ned i den fasiniserende verden av Maskinlæring og Dypt Læring. Min lidenskap og ekspertise har ledet meg til å bidra til over 50 ulike programvareprosjekter, med særlig fokus på AI/ML. Min pågående nysgjørhet har også trukket meg mot Naturlig Språkbehandling, et felt jeg er ivrig etter å utforske videre.