Modelli e piattaforme di IA

Ottimizzazione delle Preferenze Dirette: Una Guida Completa

mm
Aggiungi Unite.AI alle tue fonti preferite su Google

Allineare i grandi modelli linguistici (LLM) con i valori e le preferenze umane è una sfida. I metodi tradizionali, come il Reinforcement Learning from Human Feedback (RLHF), hanno aperto la strada integrando gli input umani per raffinare le uscite del modello. Tuttavia, RLHF può essere complesso e richiedere risorse, richiedendo una notevole potenza computazionale e elaborazione dei dati. L’Ottimizzazione delle Preferenze Dirette (DPO) emerge come un approccio nuovo e più efficiente, offrendo un’alternativa efficiente a questi metodi tradizionali. Semplificando il processo di ottimizzazione, DPO non solo riduce il carico computazionale, ma migliora anche la capacità del modello di adattarsi rapidamente alle preferenze umane

In questa guida esploreremo in profondità DPO, esaminandone le fondamenta, l’implementazione e le applicazioni pratiche.

La necessità di allineamento delle preferenze

Per comprendere DPO, è fondamentale capire perché allineare LLM con le preferenze umane è così importante. Nonostante le loro impressionanti capacità, LLM addestrati su vasti set di dati possono talvolta produrre uscite che sono incoerenti, pregiudicate o non allineate con i valori umani. Questo disallineamento può manifestarsi in vari modi:

  • Generare contenuti pericolosi o dannosi
  • Fornire informazioni inaccurate o fuorvianti
  • Mostrare pregiudizi presenti nei dati di addestramento

Per affrontare questi problemi, i ricercatori hanno sviluppato tecniche per raffinare LLM utilizzando il feedback umano. L’approccio più prominente tra questi è stato RLHF.

Comprendere RLHF: il precursore di DPO

Il Reinforcement Learning from Human Feedback (RLHF) è stato il metodo principale per allineare LLM con le preferenze umane. Analizziamo il processo RLHF per comprendere le sue complessità:

a) Supervised Fine-Tuning (SFT): Il processo inizia con il raffinamento di un LLM pre-addestrato su un set di dati di risposte di alta qualità. Questo passaggio aiuta il modello a generare uscite più rilevanti e coerenti per il compito di destinazione.

b) Modellazione del reward: Un modello di reward separato viene addestrato per prevedere le preferenze umane. Ciò include:

  • Generare coppie di risposte per prompt dati
  • Far valutare agli umani quale risposta preferiscono
  • Addestrare un modello per prevedere queste preferenze

c) Reinforcement Learning: L’LLM raffinato viene ulteriormente ottimizzato utilizzando il reinforcement learning. Il modello di reward fornisce feedback, guidando l’LLM a generare risposte che si allineano con le preferenze umane.

Ecco un esempio di pseudocodice Python semplificato per illustrare il processo RLHF:

Sebbene efficace, RLHF ha diversi svantaggi:

  • Richiede l’addestramento e la manutenzione di più modelli (SFT, modello di reward e modello RL-ottimizzato)
  • Il processo RL può essere instabile e sensibile agli iperparametri
  • È computazionalmente costoso, richiedendo molte passate in avanti e all’indietro attraverso i modelli

Queste limitazioni hanno motivato la ricerca di alternative più semplici ed efficienti, portando allo sviluppo di DPO.

Ottimizzazione delle Preferenze Dirette: Concetti Fondamentali

Ottimizzazione delle Preferenze Dirette https://arxiv.org/abs/2305.18290

Ottimizzazione delle Preferenze Dirette https://arxiv.org/abs/2305.18290

Questa immagine contrappone due approcci distinti per allineare le uscite LLM con le preferenze umane: Reinforcement Learning from Human Feedback (RLHF) e Ottimizzazione delle Preferenze Dirette (DPO). RLHF si basa su un modello di reward per guidare la politica del modello linguistico attraverso cicli di feedback iterativi, mentre DPO ottimizza direttamente le uscite del modello per corrispondere alle risposte preferite dagli umani utilizzando dati di preferenza. Questo confronto evidenzia i punti di forza e le potenziali applicazioni di ciascun metodo, fornendo insight su come i futuri LLM potrebbero essere addestrati per allinearsi meglio con le aspettative umane.

Idee chiave dietro DPO:

a) Modellazione del reward implicito: DPO elimina la necessità di un modello di reward separato trattando il modello linguistico stesso come una funzione di reward implicita.

b) Formulazione basata sulla politica: Invece di ottimizzare una funzione di reward, DPO ottimizza direttamente la politica (modello linguistico) per massimizzare la probabilità di risposte preferite.

c) Soluzione in forma chiusa: DPO sfrutta un’intuizione matematica che consente una soluzione in forma chiusa per la politica ottimale, evitando la necessità di aggiornamenti RL iterativi.

Implementazione di DPO: Una Panoramica Pratica del Codice

L’immagine seguente mostra un esempio di codice che implementa la funzione di perdita DPO utilizzando PyTorch. Questa funzione gioca un ruolo cruciale nel raffinare come i modelli linguistici danno priorità alle uscite in base alle preferenze umane. Ecco una panoramica dei componenti chiave:

  • Firma della funzione: La funzione dpo_loss accetta diversi parametri, tra cui le probabilità logaritmiche della politica (pi_logps), le probabilità logaritmiche del modello di riferimento (ref_logps) e gli indici che rappresentano le completazioni preferite e non preferite (yw_idxs, yl_idxs). Inoltre, un parametro beta controlla la forza della penalità KL.
  • Estrazione delle probabilità logaritmiche: Il codice estrae le probabilità logaritmiche per le completazioni preferite e non preferite da entrambi i modelli, politica e di riferimento.
  • Calcolo del rapporto logaritmico: La differenza tra le probabilità logaritmiche per le completazioni preferite e non preferite viene calcolata per entrambi i modelli, politica e di riferimento. Questo rapporto è cruciale per determinare la direzione e la magnitudine dell’ottimizzazione.
  • Calcolo della perdita e del reward: La perdita viene calcolata utilizzando la funzione logsigmoid, mentre i reward vengono determinati scalando la differenza tra le probabilità logaritmiche del modello e del modello di riferimento per beta.
Funzione di perdita DPO utilizzando PyTorch

Funzione di perdita DPO utilizzando PyTorch

Esploriamo ora la matematica alla base di DPO per comprendere come raggiunge questi obiettivi.

La Matematica di DPO

DPO è una riformulazione astuta del problema di apprendimento delle preferenze. Ecco una panoramica passo dopo passo:

a) Punto di partenza: Massimizzazione del reward con vincolo KL

L’obiettivo originale di RLHF può essere espresso come:

La formula matematica complessa nell'immagine successiva rappresenta la funzione di perdita utilizzata nell'Ottimizzazione delle Preferenze Dirette (DPO), un metodo di formazione all'avanguardia che raffina come gli LLM allineano le loro uscite con le preferenze umane.

Dove:
  • πθ è la politica (modello linguistico) che stiamo ottimizzando
  • r(x,y) è la funzione di reward
  • πref è una politica di riferimento (di solito il modello SFT iniziale)
  • β controlla la forza del vincolo di divergenza KL

b) Forma della politica ottimale: Si può dimostrare che la politica ottimale per questo obiettivo ha la forma:

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

Dove Z(x) è una costante di normalizzazione.

c) Dualità reward-politica: L’intuizione chiave di DPO è esprimere la funzione di reward in termini della politica ottimale:

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

d) Modello di preferenza Supponendo che le preferenze seguano il modello di Bradley-Terry, possiamo esprimere la probabilità di preferire y1 rispetto a y2 come:

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

Dove σ è la funzione logistica.

e) Obiettivo DPO Sostituendo la nostra dualità reward-politica nel modello di preferenza, arriviamo all’obiettivo 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)))]

Questo obiettivo può essere ottimizzato utilizzando tecniche di discesa del gradiente standard, senza la necessità di algoritmi RL.

Implementazione di DPO

Ora che comprendiamo la teoria alla base di DPO, esaminiamo come implementarlo nella pratica. Utilizzeremo Python e PyTorch per questo esempio:

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: logprobabilità della politica, forma (B,)
ref_logps: logprobabilità del modello di riferimento, forma (B,)
yw_idxs: indici di completamento preferito in [0, B-1], forma (T,)
yl_idxs: indici di completamento non preferito in [0, B-1], forma (T,)
beta: temperatura che controlla la forza della penalità KL</p>

<p>Every pair of (yw_idxs[i], yl_idxs[i]) rappresenta gli indici di una singola coppia di preferenza.
&quot;&quot;&quot;</p>

<p># Estrae le probabilità logaritmiche per i completamenti preferiti e non preferiti
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># Calcola i rapporti logaritmici
pi_logratios = pi_yw_logps - pi_yl_logps
ref_logratios = ref_yw_logps - ref_yl_logps</p>

<p># Calcola la perdita 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># Calcola le probabilità logaritmiche per il modello e il modello di riferimento
pi_logps = self.model(x).log_softmax(-1)
ref_logps = self.ref_model(x).log_softmax(-1)</p>

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

return loss.item()

<p># Utilizzo
model = YourLanguageModel() # Inizializza il tuo modello
ref_model = YourLanguageModel() # Carica il modello di riferimento pre-addestrato
trainer = DPOTrainer(model, ref_model)</p>

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

Sfide e Direzioni Future

Sebbene DPO offra vantaggi significativi rispetto agli approcci RLHF tradizionali, ci sono ancora sfide e aree per ulteriori ricerche:

a) Scalabilità a Modelli più Grandi:

Mentre i modelli linguistici continuano a crescere in dimensioni, applicare efficientemente DPO a modelli con centinaia di miliardi di parametri rimane una sfida aperta. I ricercatori stanno esplorando tecniche come:

  • Metodi di raffinamento efficienti (ad es. LoRA, prefix tuning)
  • Ottimizzazioni per l’addestramento distribuito
  • Checkpointing dei gradienti e addestramento a precisione mista

Esempio di utilizzo di LoRA con 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># Utilizzo
base_model = YourLargeLanguageModel()
dpo_trainer = DPOTrainerWithLoRA(base_model, ref_model)

b) Adattamento Multi-Task e Few-Shot:

Sviluppare tecniche DPO che possano adattarsi efficientemente a nuovi compiti o domini con dati di preferenza limitati è un’area attiva di ricerca. Gli approcci in esame includono:

  • Quadri di apprendimento meta per un rapido adattamento
  • Raffinamento basato su prompt per DPO
  • Apprendimento di trasferimento da modelli di preferenza generali a domini specifici

c) Gestione di Preferenze Ambigue o Contraddittorie:

I dati di preferenza del mondo reale spesso contengono ambiguità o contraddizioni. Migliorare la robustezza di DPO a tali dati è cruciale. Le soluzioni potenziali includono:

  • Modellazione delle preferenze probabilistiche
  • Apprendimento attivo per risolvere ambiguità
  • Aggregazione delle preferenze multi-agente

Esempio di modellazione delle preferenze probabilistiche:


<p>class ProbabilisticDPOTrainer(DPOTrainer):
def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob):
# Calcola i rapporti logaritmici
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># Utilizzo
trainer = ProbabilisticDPOTrainer(model, ref_model)
loss = trainer.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob=0.8) # 80% di fiducia nella preferenza

d) Combinazione di DPO con Altre Tecniche di Allineamento:

Integrare DPO con altri approcci di allineamento potrebbe portare a sistemi più robusti e capaci:

  • Principi di intelligenza artificiale costituzionale per la soddisfazione esplicita delle vincoli
  • Debate e modellazione del reward ricorsivo per l’elicitazione delle preferenze complesse
  • Apprendimento di rinforzo inverso per l’inferenza delle funzioni di reward sottostanti

Esempio di combinazione di DPO con intelligenza artificiale costituzionale:


<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># Utilizzo
def safety_constraint(model, pi_logps, ref_logps, yw_idxs, yl_idxs):
# Implementa la logica di controllo della sicurezza
unsafe_score = compute_unsafe_score(model, pi_logps, ref_logps)
return torch.relu(unsafe_score - 0.5) # Penalizza se il punteggio di sicurezza &gt; 0.5</p>

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

Considerazioni Pratiche e Migliori Pratiche

Quando si implementa DPO per applicazioni nel mondo reale, considerare i seguenti suggerimenti:

a) Qualità dei dati: La qualità dei dati di preferenza è cruciale. Assicurarsi che il set di dati:

  • Copra una gamma diversificata di input e comportamenti desiderati
  • Abbia annotazioni di preferenza coerenti e affidabili
  • Bilanci i diversi tipi di preferenze (ad es. factualità, sicurezza, stile)

b) Regolazione degli iperparametri: Sebbene DPO abbia meno iperparametri di RLHF, la regolazione è ancora importante:

  • β (beta): Controlla il trade-off tra la soddisfazione della preferenza e la divergenza dal modello di riferimento. Inizia con valori intorno a 0.1-0.5.
  • Tasso di apprendimento: Utilizza un tasso di apprendimento inferiore rispetto al raffinamento standard, di solito nell’intervallo di 1e-6 a 1e-5.
  • Dimensione del batch: Le dimensioni del batch più grandi (32-128) spesso funzionano meglio per l’apprendimento delle preferenze.

c) Raffinamento iterativo: DPO può essere applicato iterativamente:

  1. Addestra un modello iniziale utilizzando DPO
  2. Genera nuove risposte utilizzando il modello addestrato
  3. Raccogli nuovi dati di preferenza su queste risposte
  4. Riaddestra utilizzando il set di dati ampliato

 

Ottimizzazione delle Preferenze Dirette

Prestazioni dell’Ottimizzazione delle Preferenze Dirette

Questa immagine mostra le prestazioni dei modelli LLM come GPT-4 rispetto ai giudizi umani in vari compiti di formazione, tra cui Ottimizzazione delle Preferenze Dirette (DPO), Raffinamento Supervisionato (SFT) e Ottimizzazione della Politica Prossimale (PPO). La tabella rivela che le uscite di GPT-4 sono sempre più allineate con le preferenze umane, in particolare nei compiti di riassunto. Il livello di accordo tra GPT-4 e i revisori umani dimostra la capacità del modello di generare contenuti che risuonano con gli valutatori umani, quasi come i contenuti generati dagli umani.

Casi di Studio e Applicazioni

Per illustrare l’efficacia di DPO, esaminiamo alcune applicazioni reali e alcune delle sue varianti:

  • DPO Iterativo: Sviluppato da Snorkel (2023), questa variante combina il campionamento di rifiuto con DPO, consentendo un processo di selezione più raffinato per i dati di addestramento. Iterando su più round di campionamento delle preferenze, il modello è in grado di generalizzare meglio ed evitare di sovrapprendere a preferenze rumorose o pregiudicate.
  • IPO (Ottimizzazione Iterativa delle Preferenze): Introdotta da Azar et al. (2023), IPO aggiunge un termine di regolarizzazione per prevenire il sovrapprendimento, un problema comune nell’ottimizzazione basata sulle preferenze. Questa estensione consente ai modelli di mantenere un equilibrio tra l’aderenza alle preferenze e la capacità di generalizzazione.
  • KTO (Ottimizzazione del Trasferimento della Conoscenza): Una variante più recente di Ethayarajh et al. (2023), KTO elimina le preferenze binarie e si concentra sul trasferimento della conoscenza da un modello di riferimento al modello di politica, ottimizzando per un allineamento più fluido e coerente con i valori umani.
  • DPO Multi-Modale per l’Apprendimento Cross-Domain di Xu et al. (2024): Un approccio in cui DPO viene applicato attraverso diverse modalità—testo, immagine e audio—dimostrando la sua versatilità nell’allineare i modelli con le preferenze umane attraverso dati diversi. Questa ricerca evidenzia il potenziale di DPO nella creazione di sistemi AI più comprensivi in grado di gestire compiti complessi e multi-modalità.

Conclusione

L’Ottimizzazione delle Preferenze Dirette rappresenta un avanzamento significativo nell’allineamento dei modelli linguistici con le preferenze umane. La sua semplicità, efficienza e efficacia la rendono uno strumento potente per ricercatori e pratici.

Sfruttando il potere dell’Ottimizzazione delle Preferenze Dirette e tenendo presente questi principi, è possibile creare modelli linguistici che non solo esibiscono capacità impressionanti, ma si allineano anche strettamente con i valori e le intenzioni umane.

Ho trascorso gli ultimi cinque anni immergendomi nel mondo affascinante del Machine Learning e del Deep Learning. La mia passione e la mia esperienza mi hanno portato a contribuire a oltre 50 progetti di ingegneria del software diversi, con un focus particolare su AI/ML. La mia curiosità in corso mi ha anche portato verso l'elaborazione del linguaggio naturale, un campo che sono ansioso di esplorare ulteriormente.