Modele și platforme AI

Optimizarea Directă a Preferințelor: O Ghid Complet

mm
Adaugă Unite.AI la sursele tale preferate pe Google

Alinierea modelelor de limbaj mari (LLM) cu valorile și preferințele umane este o provocare. Metodele tradiționale, cum ar fi Învățarea prin Întărire din Feedback Uman (RLHF), au deschis calea prin integrarea intrărilor umane pentru a rafina ieșirile modelului. Cu toate acestea, RLHF poate fi complex și intensiv din punct de vedere al resurselor, necesitând o putere de calcul și o prelucrare a datelor substanțiale. Optimizarea Directă a Preferințelor (DPO) apare ca o abordare nouă și mai simplificată, oferind o alternativă eficientă la aceste metode tradiționale. Prin simplificarea procesului de optimizare, DPO nu numai că reduce încărcătura computațională, dar îmbunătățește și capacitatea modelului de a se adapta rapid la preferințele umane.

În acest ghid, vom explora în profunzime DPO, explorând fundamentele, implementarea și aplicațiile practice.

Nevoia de Aliniere a Preferințelor

Pentru a înțelege DPO, este crucial să înțelegem de ce alinierea LLM cu preferințele umane este atât de importantă. În ciuda capacităților lor impresionante, LLM-urile antrenate pe seturi de date uriașe pot produce, uneori, ieșiri care sunt inconsistente, biasate sau nealinate cu valorile umane. Această nealiniere se poate manifesta în diverse moduri:

  • Generarea de conținut nesigur sau dăunător
  • Furnizarea de informații inexacte sau înșelătoare
  • Exhibarea biasurilor prezente în datele de antrenare

Pentru a aborda aceste probleme, cercetătorii au dezvoltat tehnici pentru a rafina LLM-urile folosind feedback uman. Abordarea cea mai proeminentă a fost RLHF.

Înțelegerea RLHF: Precursorul DPO

Învățarea prin Întărire din Feedback Uman (RLHF) a fost metoda de bază pentru alinierea LLM cu preferințele umane. Să descompunem procesul RLHF pentru a înțelege complexitățile sale:

a) Reglare Fină Supravegheată (SFT): Procesul începe prin reglarea fină a unui LLM preantrenat pe un set de date de răspunsuri de înaltă calitate. Acest pas ajută modelul să genereze ieșiri mai relevante și coerente pentru sarcina țintă.

b) Modelarea Recompensei: Un model de recompensă separat este antrenat pentru a prezice preferințele umane. Acest lucru implică:

  • Generarea de perechi de răspunsuri pentru anumite prompturi
  • Solicitarea oamenilor să evalueze care răspuns preferă
  • Antrenarea unui model pentru a prezice aceste preferințe

c) Învățarea prin Întărire: LLM-ul reglat fin este apoi optimizat suplimentar folosind învățarea prin întărire. Modelul de recompensă oferă feedback, ghidând LLM-ul să genereze răspunsuri care se aliniază cu preferințele umane.

Iată un pseudocod Python simplificat pentru a ilustra procesul RLHF:

Deși eficient, RLHF are câteva dezavantaje:

  • Necesită antrenarea și menținerea mai multor modele (SFT, model de recompensă și model optimizat RL)
  • Procesul RL poate fi instabil și sensibil la hiperparametri
  • Este costisitor din punct de vedere computațional, necesitând multe treceri înainte și înapoi prin modele

Aceste limitări au motivat căutarea unor alternative mai simple și mai eficiente, ducând la dezvoltarea DPO.

Optimizarea Directă a Preferințelor: Concepte de Bază

Optimizarea Directă a Preferințelor https://arxiv.org/abs/2305.18290

Optimizarea Directă a Preferințelor https://arxiv.org/abs/2305.18290

Această imagine prezintă două abordări distincte pentru alinierea ieșirilor LLM cu preferințele umane: Învățarea prin Întărire din Feedback Uman (RLHF) și Optimizarea Directă a Preferințelor (DPO). RLHF se bazează pe un model de recompensă pentru a ghida politica modelului de limbaj prin bucle de feedback iterative, în timp ce DPO optimizează direct ieșirile modelului pentru a se potrivi cu răspunsurile preferate de către oameni, folosind datele de preferință. Această comparație evidențiază punctele forte și posibilele aplicații ale fiecărei metode, oferind insight-uri în modul în care viitoarele LLM-uri ar putea fi antrenate pentru a se alinia mai bine cu așteptările umane.

Concepte cheie din spatele DPO:

a) Modelarea Implicită a Recompensei: DPO elimină nevoia unui model de recompensă separat, tratând modelul de limbaj însuși ca o funcție implicită de recompensă.

b) Formularea Bazată pe Politică: În loc de a optimiza o funcție de recompensă, DPO optimizează direct politica (modelul de limbaj) pentru a maximiza probabilitatea răspunsurilor preferate.

c) Soluție Închisă: DPO folosește o perspicacitate matematică care permite o soluție închisă pentru politica optimă, evitând nevoia de actualizări RL iterative.

Implementarea DPO: O Prezentare Practică a Codului

Imaginea de mai jos prezintă un extras de cod care implementează funcția de pierdere DPO folosind PyTorch. Această funcție joacă un rol crucial în rafinarea modului în care modelele de limbaj prioritizează ieșirile pe baza preferințelor umane. Iată o despărțire a componentelor cheie:

  • Semnătura Funcției: Funcția `dpo_loss` primește mai multe parametri, incluzând logaritmi de probabilitate ai politicii (`pi_logps`), logaritmi de probabilitate ai modelului de referință (`ref_logps`), și indici care reprezintă completări preferate și nepreferate (`yw_idxs`, `yl_idxs`). De asemenea, un parametru `beta` controlează puterea penalizării KL.
  • Extragerea Logaritmului de Probabilitate: Codul extrage logaritmi de probabilitate pentru completări preferate și nepreferate din ambele modele, politică și de referință.
  • Calculul Raportului Logaritmic: Se calculează diferența dintre logaritmi de probabilitate pentru completări preferate și nepreferate, atât pentru modelul politic, cât și pentru modelul de referință. Acest raport este critic în determinarea direcției și mărimii optimizării.
  • Calculul Pierderii și Recompensei: Pierderea se calculează folosind funcția `logsigmoid`, în timp ce recompensele sunt determinate prin scalarea diferenței dintre logaritmi de probabilitate ai politicii și modelului de referință cu `beta`.

Să Explorăm Matematica din Spatele DPO pentru a Înțelege Cum Atinge Aceste Obiective

Matematica DPO

DPO este o reformulare ingenioasă a problemei de învățare a preferințelor. Iată o despărțire pas cu pas:

a) Punct de Plecare: Maximizarea Recompensei cu Constrângere KL

Obiectivul RLHF original poate fi exprimat ca:

Formula matematică complexă din imaginea următoare reprezintă funcția de pierdere utilizată în Optimizarea Directă a Preferințelor (DPO), o metodă de antrenare de ultimă generație care rafinează modul în care LLM-urile se aliniază cu preferințele umane.

Unde:
  • πθ este politica (modelul de limbaj) pe care o optimizăm
  • r(x,y) este funcția de recompensă
  • πref este o politică de referință (de obicei, modelul SFT inițial)
  • β controlează puterea constrângerii de divergență KL

b) Forma Optimală a Politicii: Se poate demonstra că politica optimă pentru acest obiectiv are forma:

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

Unde Z(x) este o constantă de normalizare.

c) Dualitatea Recompensă-Politica: Insight-ul cheie al DPO este de a exprima funcția de recompensă în termeni de politica optimă:

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

d) Modelul de Preferință Presupunând că preferințele urmează modelul Bradley-Terry, putem exprima probabilitatea de a prefera y1 în loc de y2 ca:

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

Unde σ este funcția logistică.

e) Obiectivul DPO Înlocuind dualitatea noastră recompensă-politică în modelul de preferință, ajungem la obiectivul 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)))]

Acest obiectiv poate fi optimizat folosind tehnici standard de coborâre a gradientului, fără a necesita algoritmi RL.

Implementarea DPO

Acum că înțelegem teoria din spatele DPO, să aruncăm o privire la cum să o implementăm în practică. Vom folosi Python și PyTorch pentru acest exemplu:

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: logaritmi de probabilitate ai politicii, formă (B,)
ref_logps: logaritmi de probabilitate ai modelului de referință, formă (B,)
yw_idxs: indici de completare preferată în [0, B-1], formă (T,)
yl_idxs: indici de completare nepreferată în [0, B-1], formă (T,)
beta: temperatură care controlează puterea penalizării KL</p>

<p>Each pair of (yw_idxs[i], yl_idxs[i]) reprezintă indicii unei singure perechi de preferință.
&quot;&quot;&quot;</p>

<p># Extrage logaritmi de probabilitate pentru completările preferate și nepreferate
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># Calculează raportul logaritmic
pi_logratios = pi_yw_logps - pi_yl_logps
ref_logratios = ref_yw_logps - ref_yl_logps</p>

<p># Calculează pierderea DPO
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># Calculează logaritmi de probabilitate pentru model și modelul de referință
pi_logps = self.model(x).log_softmax(-1)
ref_logps = self.ref_model(x).log_softmax(-1)</p>

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

return loss.item()

<p># Utilizare
model = YourLanguageModel() # Inițializează modelul dvs.
ref_model = YourLanguageModel() # Încărcați modelul de referință preantrenat
trainer = DPOTrainer(model, ref_model)</p>

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

Provocări și Direcții Viitoare

Deși DPO oferă avantaje semnificative față de abordările RLHF tradiționale, există încă provocări și domenii pentru cercetare ulterioară:

a) Scalabilitate la Modele Mai Mari:

Pe măsură ce modelele de limbaj continuă să crească în dimensiune, aplicarea eficientă a DPO la modele cu sute de miliarde de parametri rămâne o provocare deschisă. Cercetătorii explorează tehnici precum:

  • Metode de reglare fină eficiente (de exemplu, LoRA, prefix tuning)
  • Optimizări de antrenare distribuite
  • Puncte de control ale gradientului și antrenare cu precizie mixtă

Exemplu de utilizare a LoRA cu 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># Utilizare
base_model = YourLargeLanguageModel()
dpo_trainer = DPOTrainerWithLoRA(base_model, ref_model)

b) Adaptare Multi-Task și Few-Shot:

Dezvoltarea tehnicilor DPO care pot adapta eficient la noi sarcini sau domenii cu date de preferință limitate este un domeniu activ de cercetare. Abordări explorează:

  • Framework-uri de meta-învățare pentru adaptare rapidă
  • Reglare fină bazată pe prompte pentru DPO
  • Învățare de transfer de la modele de preferință generală la domenii specifice

c) Gestionarea Preferințelor Ambigue sau Conflictuale:

Datele reale de preferință conțin adesea ambiguități sau conflicte. Îmbunătățirea robusteței DPO la astfel de date este crucială. Soluții potențiale includ:

  • Modelarea probabilistică a preferințelor
  • Învățare activă pentru a rezolva ambiguitățile
  • Aggregarea preferințelor multi-agente

Exemplu de modelare probabilistică a preferințelor:


<p>class ProbabilisticDPOTrainer(DPOTrainer):
def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob):
# Calculează raportul logaritmic
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># Utilizare
trainer = ProbabilisticDPOTrainer(model, ref_model)
loss = trainer.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob=0.8) # 80% încredere în preferință

d) Combinarea DPO cu Alte Tehnici de Aliniere:

Integrarea DPO cu alte abordări de aliniere ar putea duce la sisteme mai robuste și capabile:

  • Principii de Inteligență Artificială Constituțională pentru satisfacerea explicită a constrângerilor
  • Dezbatere și modelare a recompensei recursive pentru elicitation complexă a preferințelor
  • Învățare de întărire inversă pentru inferarea funcțiilor de recompensă subiacente

Exemplu de combinare a DPO cu Inteligență Artificială Constituțională:


<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># Utilizare
def safety_constraint(model, pi_logps, ref_logps, yw_idxs, yl_idxs):
# Implementați logica de verificare a siguranței
unsafe_score = compute_unsafe_score(model, pi_logps, ref_logps)
return torch.relu(unsafe_score - 0.5) # Penalizați dacă scorul de siguranță &gt; 0.5</p>

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

Considerații Practice și Cele Mai Bune Practici

Atunci când implementați DPO pentru aplicații din lumea reală, luați în considerare următoarele sfaturi:

a) Calitatea Datelor: Calitatea datelor dvs. de preferință este crucială. Asigurați-vă că setul dvs. de date:

  • Acoperă o gamă largă de intrări și comportamente dorite
  • Are anotări de preferință consistente și fiabile
  • Echilibrează diferite tipuri de preferințe (de exemplu, faptualitate, siguranță, stil)

b) Reglarea Hiperparametrilor: Deși DPO are mai puțini hiperparametri decât RLHF, reglarea este încă importantă:

  • β (beta): Controlează compromisul dintre satisfacerea preferințelor și divergența de la modelul de referință. Începeți cu valori în jurul lui 0.1-0.5.
  • Rata de învățare: Utilizați o rată de învățare mai mică decât cea standard pentru reglare fină, de obicei în intervalul 1e-6 la 1e-5.
  • Dimensiunea lotului: Dimensiuni mai mari ale lotului (32-128) funcționează adesea bine pentru învățarea preferințelor.

c) Refinare Iterativă: DPO poate fi aplicat iterativ:

  1. Antrenați un model inițial utilizând DPO
  2. Generați noi răspunsuri utilizând modelul antrenat
  3. Colectați noi date de preferință pe aceste răspunsuri
  4. Reantrenați utilizând setul de date extins

 

Optimizarea Directă a Preferințelor

Performanța Optimizării Directe a Preferințelor

Această imagine arată performanța LLM-urilor, cum ar fi GPT-4, în comparație cu judecățile umane în diferite tehnici de antrenare, incluzând Optimizarea Directă a Preferințelor (DPO), Reglare Fină Supravegheată (SFT) și Optimizarea Politicii Proximale (PPO). Tabelul revelează că ieșirile GPT-4 sunt din ce în ce mai aliniate cu preferințele umane, în special în sarcinile de rezumare. Nivelul de acord între GPT-4 și evaluatorii umani demonstrează capacitatea modelului de a genera conținut care rezonă cu evaluatorii umani, aproape la fel de strâns ca și conținutul generat de oameni.

Studii de Caz și Aplicații

Pentru a ilustra eficacitatea DPO, să examinăm câteva aplicații din lumea reală și unele variante ale sale:

  • Iterative DPO: Dezvoltat de Snorkel (2023), această variantă combină eşantionarea de respingere cu DPO, permițând o selecție mai rafinată a datelor de antrenare. Prin iterarea peste mai multe runde de eşantionare a preferințelor, modelul este mai capabil să generalizeze și să evite suprareglarea la preferințe zgomotoase sau biasate.
  • IPO (Iterative Preference Optimization): Introdus de Azar et al. (2023), IPO adaugă un termen de regularizare pentru a preveni suprareglarea, o problemă comună în optimizarea bazată pe preferințe. Această extensie permite modelului să mențină un echilibru între alinierea cu preferințele și păstrarea capacităților de generalizare.
  • KTO (Knowledge Transfer Optimization): O variantă mai recentă de la Ethayarajh et al. (2023), KTO renunță la preferințele binare în totalitate. În schimb, se concentrează pe transferul de cunoștințe de la modelul de referință la modelul politic, optimizând pentru o aliniere mai lină și mai consistentă cu valorile umane.
  • Multi-Modal DPO for Cross-Domain Learning de Xu et al. (2024): O abordare în care DPO este aplicat în traversul diferitelor modalități—text, imagine, audio—demonstrând versatilitatea sa în alinierea modelelor cu preferințele umane în traversul tipurilor diverse de date. Această cercetare subliniază potențialul DPO în crearea unor sisteme AI mai cuprinzătoare, capabile să gestioneze sarcini complexe și multi-modale.

Concluzii

Optimizarea Directă a Preferințelor reprezintă o avansare semnificativă în alinierea modelelor de limbaj cu preferințele umane. Simplitatea, eficiența și eficacitatea sa o fac un instrument puternic atât pentru cercetători, cât și pentru practicieni.

Prin valorificarea puterii Optimizării Directe a Preferințelor și ținând cont de aceste principii, puteți crea modele de limbaj care nu numai că prezintă capacități impresionante, dar se și aliniază îndeaproape cu valorile și intențiile umane.

Am petrecut ultimii cinci ani scufundându-mă în lumea fascinantă a Machine Learning și Deep Learning. Pasinea și expertiza mea m-au condus să contribui la peste 50 de proiecte diverse de inginerie software, cu un focus deosebit pe AI/ML. Curiozitatea mea în continuare m-a atras și spre Natural Language Processing, un domeniu pe care sunt dornic să îl explorez mai departe.