Modele i platformy AI

Optymalizacja Preferencji Bezpośrednich: Kompletny Przewodnik

mm
Dodaj Unite.AI do preferowanych źródeł w Google

Wyrównanie dużych modeli językowych (LLM) z ludzkimi wartościami i preferencjami jest wyzwaniem. Tradycyjne metody, takie jak Nauczanie ze sprzężeniem zwrotnym od ludzi (RLHF), przyprowadziły drogę, integrując dane wejściowe ludzkie, aby udoskonalić dane wyjściowe modelu. Jednak RLHF może być skomplikowany i wymagający zasobów, wymagając znacznej mocy obliczeniowej i przetwarzania danych. Optymalizacja Preferencji Bezpośrednich (DPO) pojawia się jako nowy i bardziej uproszczony podejście, oferując wydajną alternatywę dla tych tradycyjnych metod. Poprzez uproszczenie procesu optymalizacji, DPO nie tylko redukuje obciążenie obliczeniowe, ale także zwiększa zdolność modelu do szybkiej adaptacji do ludzkich preferencji

W tym przewodniku zagłębimy się w DPO, eksplorując jego podstawy, implementację i praktyczne zastosowania.

Potrzeba Wyrównania Preferencji

Aby zrozumieć DPO, niezwykle ważne jest zrozumienie, dlaczego wyrównanie LLM z ludzkimi preferencjami jest takie istotne. Pomimo ich imponujących możliwości, LLM szkolone na ogromnych zbiorach danych mogą czasem produkować dane wyjściowe, które są niespójne, tendencyjne lub niezgodne z ludzkimi wartościami. To niezgodność może manifestować się na różne sposoby:

  • Generowanie niebezpiecznych lub szkodliwych treści
  • Świadczenie nieprecyzyjnych lub mylących informacji
  • Występowanie tendencyjności obecnych w danych szkoleniowych

Aby rozwiązać te problemy, badacze opracowali techniki dofine-tuningu LLM przy użyciu ludzkiej informacji zwrotnej. Najbardziej znaczącym z tych podejść było RLHF.

Zrozumienie RLHF: Poprzednik DPO

Nauczanie ze sprzężeniem zwrotnym od ludzi (RLHF) było podstawową metodą wyrównania LLM z ludzkimi preferencjami. Rozłóżmy proces RLHF, aby zrozumieć jego złożoność:

a) Dofine-tuning Nadzorowany (SFT): Proces rozpoczyna się od dofine-tuningu pre-trenowanego LLM na zbiorze danych o wysokiej jakości. Ten krok pomaga modelowi generować bardziej istotne i spójne dane wyjściowe dla zadania docelowego.

b) Modelowanie Nagrody: Oddzielny model nagrody jest trenowany, aby przewidzieć ludzkie preferencje. To obejmuje:

  • Generowanie par odpowiedzi dla danych wezwań
  • Pozwolenie ludziom na ocenę, którą odpowiedź wolą
  • Trenowanie modelu, aby przewidzieć te preferencje

c) Nauczanie ze Wzmocnieniem: Dofine-tunowany LLM jest następnie dalej optymalizowany przy użyciu nauczania ze wzmocnieniem. Model nagrody zapewnia informację zwrotną, prowadząc LLM do generowania odpowiedzi, które są zgodne z ludzkimi preferencjami.

Oto uproszczony pseudokod Pythona, ilustrujący proces RLHF:

Mimo że skuteczne, RLHF ma kilka wad:

  • Wymaga trenowania i utrzymania wielu modeli (SFT, model nagrody, model zoptymalizowany RL)
  • Proces RL może być niestabilny i wrażliwy na hiperparametry
  • Jest obliczeniowo kosztowny, wymagając wielu kroków do przodu i do tyłu przez modele

Te ograniczenia skłoniły do poszukiwania prostszych, bardziej efektywnych alternatyw, prowadząc do rozwoju DPO.

Optymalizacja Preferencji Bezpośrednich: Podstawowe Pojęcia

Optymalizacja Preferencji Bezpośrednich https://arxiv.org/abs/2305.18290

Optymalizacja Preferencji Bezpośrednich https://arxiv.org/abs/2305.18290

Ten obraz kontrastuje dwa odrębne podejścia do wyrównania danych wyjściowych LLM z ludzkimi preferencjami: Nauczanie ze sprzężeniem zwrotnym od ludzi (RLHF) i Optymalizacja Preferencji Bezpośrednich (DPO). RLHF opiera się na modelu nagrody, aby prowadzić politykę modelu językowego przez iteracyjne pętle informacji zwrotnej, podczas gdy DPO bezpośrednio optymalizuje dane wyjściowe modelu, aby dopasować ludzkie preferencje przy użyciu danych preferencji. Ten kontrast podkreśla zalety i potencjalne zastosowania każdej metody, dostarczając wglądu w to, jak przyszłe LLM mogą być trenowane, aby lepiej odpowiadać ludzkim oczekiwaniom.

Kluczowe pomysły za DPO:

a) Implikowane Modelowanie Nagrody: DPO eliminuje potrzebę oddzielnego modelu nagrody, traktując sam model językowy jako implikowaną funkcję nagrody.

b) Formułowanie Polityki: Zamiast optymalizować funkcję nagrody, DPO bezpośrednio optymalizuje politykę (model językowy), aby maksymalizować prawdopodobieństwo preferowanych odpowiedzi.

c) Rozwiązanie Zamknięte: DPO wykorzystuje matematyczną intuicję, która pozwala na rozwiązanie zamknięte dla optymalnej polityki, unikając potrzeby iteracyjnych aktualizacji RL.

Implementacja DPO: Praktyczny Przewodnik Kodowy

Poniższy obraz prezentuje fragment kodu implementujący funkcję straty DPO przy użyciu PyTorch. Ta funkcja odgrywa kluczową rolę w udoskonaleniu, w jaki sposób modele językowe priorytetowo traktują dane wyjściowe na podstawie ludzkich preferencji. Oto rozbiór kluczowych składników:

  • Sygnatura Funkcji: Funkcja dpo_loss przyjmuje kilka parametrów, w tym logarytmy prawdopodobieństwa polityki (pi_logps), logarytmy prawdopodobieństwa modelu referencyjnego (ref_logps) oraz indeksy reprezentujące preferowane i niepreferowane uzupełnienia (yw_idxs, yl_idxs). Dodatkowo, parametr beta kontroluje siłę kary KL.
  • Ekstrakcja Logarytmów Prawdopodobieństwa: Kod wyodrębnia logarytmy prawdopodobieństwa dla preferowanych i niepreferowanych uzupełnień z obu modeli polityki i referencyjnych.
  • Obliczenie Stosunku Logarytmów: Różnica między logarytmami prawdopodobieństwa dla preferowanych i niepreferowanych uzupełnień jest obliczana dla obu modeli polityki i referencyjnych. Ten stosunek jest kluczowy w określaniu kierunku i wielkości optymalizacji.
  • Obliczenie Straty i Nagrody: Strata jest obliczana przy użyciu funkcji logsigmoid, podczas gdy nagrody są określane przez skalowanie różnicy między logarytmami prawdopodobieństwa polityki i modelu referencyjnego przez beta.
Funkcja straty DPO przy użyciu PyTorch

Funkcja straty DPO przy użyciu PyTorch

Zanurzmy się w matematyce za DPO, aby zrozumieć, jak osiąga te cele.

Matematyka DPO

DPO jest inteligentną reformulacją problemu uczenia preferencji. Oto krok-po-kroku:

a) Punkt Wyjścia: Maksymalizacja Nagrody z Ograniczeniem KL

Oryginalny cel RLHF może być wyrażony jako:

Złożona matematyczna formuła w następnym obrazie reprezentuje funkcję straty używaną w Optymalizacji Preferencji Bezpośrednich (DPO), nowoczesną metodę treningu, która udoskonala, w jaki sposób LLM wyrównują swoje dane wyjściowe z ludzkimi preferencjami.

Gdzie:
  • πθ jest polityką (modelem językowym), którą optymalizujemy
  • r(x,y) jest funkcją nagrody
  • πref jest modelem referencyjnym (zwykle początkowym modelem SFT)
  • β kontroluje siłę ograniczenia rozbieżności KL

b) Forma Optymalnej Polityki: Może być udowodnione, że optymalna polityka dla tego celu ma postać:

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

Gdzie Z(x) jest stałą normalizującą.

c) Dwuliczność Nagrody-Polityki: Kluczowa intuicja DPO polega na wyrażeniu funkcji nagrody w kategoriach optymalnej polityki:

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

d) Założenie Modelu Preferencji Zakładając, że preferencje podążają za modelem Bradley-Terry, możemy wyrazić prawdopodobieństwo preferowania y1 nad y2 jako:

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

Gdzie σ jest funkcją logistyczną.

e) Cel DPO Podstawiając naszą dwuliczność nagrody-polityki do modelu preferencji, dochodzimy do celu 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)))]

Ten cel może być zoptymalizowany przy użyciu standardowych technik gradientu.

Implementacja DPO

Teraz, gdy zrozumieliśmy teorię za DPO, spójrzmy, jak ją zaimplementować w praktyce. Będziemy używać Pythona i PyTorch w tym przykładzie:

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: logarytmy prawdopodobieństwa polityki, kształt (B,)
ref_logps: logarytmy prawdopodobieństwa modelu referencyjnego, kształt (B,)
yw_idxs: indeksy preferowanych uzupełnień w [0, B-1], kształt (T,)
yl_idxs: indeksy niepreferowanych uzupełnień w [0, B-1], kształt (T,)
beta: temperatura kontrolująca siłę kary KL</p>

<p>Każda para (yw_idxs[i], yl_idxs[i]) reprezentuje indeksy jednej pary preferencji.
&quot;&quot;&quot;</p>

<p># Wyodrębnij logarytmy prawdopodobieństwa dla preferowanych i niepreferowanych uzupełnień
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># Oblicz log-stosunki
pi_logratios = pi_yw_logps - pi_yl_logps
ref_logratios = ref_yw_logps - ref_yl_logps</p>

<p># Oblicz stratę 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># Oblicz logarytmy prawdopodobieństwa dla modelu i modelu referencyjnego
pi_logps = self.model(x).log_softmax(-1)
ref_logps = self.ref_model(x).log_softmax(-1)</p>

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

return loss.item()

<p># Użycie
model = TwójModelJęzykowy() # Zainicjuj swój model
ref_model = TwójModelJęzykowy() # Załaduj pre-trenowany model referencyjny
trainer = DPOTrainer(model, ref_model)</p>

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

Wyzwania i Przyszłe Kierunki

Chociaż DPO oferuje znaczne zalety w porównaniu z tradycyjnymi podejściami RLHF, istnieją jeszcze wyzwania i obszary wymagające dalszych badań:

a) Skalowalność do Większych Modeli:

Gdy modele językowe nadal rosną w rozmiarze, efektywne zastosowanie DPO do modeli z setkami miliardów parametrów pozostaje otwartym wyzwaniem. Badacze eksplorują techniki takie jak:

  • Wygodne metody dofine-tuningu (np. LoRA, prefix tuning)
  • Optymalizacje treningu rozproszonego
  • Punkty kontrolne gradientu i trening z mieszaną precyzją

Przykład użycia LoRA z 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># Użycie
base_model = TwójDużyModelJęzykowy()
dpo_trainer = DPOTrainerWithLoRA(base_model, ref_model)

b) Adaptacja Wielozadaniowa i Few-Shot:

Rozwój technik DPO, które mogą efektywnie adaptować się do nowych zadań lub domen z ograniczonymi danymi preferencji, jest aktywnym obszarem badań. Podejścia, które są eksplorowane, obejmują:

  • Ramy meta-nauki dla szybkiej adaptacji
  • Dofine-tuning oparte na prompach dla DPO
  • Przenoszenie wiedzy z ogólnych modeli preferencji do konkretnych domen

c) Radzenie Sobie z Niejasnymi lub Sprzecznymi Preferencjami:

Rzeczywiste dane preferencji często zawierają niejasności lub sprzeczności. Poprawa odporności DPO na takie dane jest kluczowa. Potencjalne rozwiązania obejmują:

  • Modelowanie preferencji probabilistycznych
  • Nauka aktywna w celu rozwiązania niejasności
  • Aggregacja preferencji wieloagentowych

Przykład modelowania preferencji probabilistycznych:


<p>class ProbabilisticDPOTrainer(DPOTrainer):
def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob):
# Oblicz log-stosunki
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># Użycie
trainer = ProbabilisticDPOTrainer(model, ref_model)
loss = trainer.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob=0.8) # 80% pewności co do preferencji

d) Kombinowanie DPO z Innymi Technikami Wyrównania:

Integracja DPO z innymi podejściami wyrównania może prowadzić do bardziej odpornych i zdolnych systemów:

  • Zasady AI konstytucyjne dla jawnej satysfakcji ograniczeń
  • Debata i rekursywne modelowanie nagrody dla złożonej ekstrakcji preferencji
  • Nauka odwrotna dla wywnioskowania ukrytych funkcji nagrody

Przykład kombinacji DPO z AI konstytucyjnym:


<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># Użycie
def safety_constraint(model, pi_logps, ref_logps, yw_idxs, yl_idxs):
# Zaimplementuj logikę sprawdzania bezpieczeństwa
unsafe_score = compute_unsafe_score(model, pi_logps, ref_logps)
return torch.relu(unsafe_score - 0.5) # Ukaranie, jeśli wynik niebezpieczny &gt; 0.5</p>

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

Praktyczne Rozważania i Najlepsze Praktyki

Podczas implementacji DPO dla aplikacji świata rzeczywistego, rozważ następujące wskazówki:

a) Jakość Danych: Jakość Twoich danych preferencji jest kluczowa. Upewnij się, że Twój zbiór danych:

  • Obejmuje szeroki zakres danych wejściowych i pożądanych zachowań
  • Ma spójne i niezawodne adnotacje preferencji
  • Zbalansowane różne typy preferencji (np. faktualność, bezpieczeństwo, styl)

b) Dostosowywanie Hiperparametrów: Chociaż DPO ma mniej hiperparametrów niż RLHF, dostosowywanie jest nadal ważne:

  • β (beta): Kontroluje trade-off między zadowoleniem preferencji a rozbieżnością od modelu referencyjnego. Rozpocznij z wartościami wokół 0.1-0.5.
  • Szybkość uczenia: Użyj niższej szybkości uczenia niż standardowe dofine-tuning, zwykle w zakresie 1e-6 do 1e-5.
  • Rozmiar partii: Większe rozmiary partii (32-128) często działają dobrze dla uczenia preferencji.

c) Iteracyjne Udoskonalenie: DPO może być stosowane iteracyjnie:

  1. Trenuj początkowy model przy użyciu DPO
  2. Generuj nowe odpowiedzi przy użyciu wytrenowanego modelu
  3. Zbierz nowe dane preferencji na tych odpowiedziach
  4. Przetrenuj przy użyciu rozszerzonego zbioru danych

 

Optymalizacja Preferencji Bezpośrednich

Optymalizacja Preferencji Bezpośrednich Wydajność

Ten obraz pokazuje wydajność LLM, takich jak GPT-4, w porównaniu z ludzkimi osądami w różnych technikach treningu, w tym Optymalizacji Preferencji Bezpośrednich (DPO), Dofine-tuningu Nadzorowanym (SFT) i Proximal Policy Optimization (PPO). Tabela ujawnia, że dane wyjściowe GPT-4 są coraz bardziej zgodne z ludzkimi preferencjami, szczególnie w zadaniach podsumowywania. Poziom zgodności między GPT-4 a ludzkimi recenzentami demonstruje zdolność modelu do generowania treści, które rezonują z ludzkimi ocenianiami, prawie tak ściśle, jak treści generowane przez ludzi.

Studia Przypadków i Zastosowania

Aby zilustrować skuteczność DPO, spójrzmy na kilka aplikacji świata rzeczywistego i niektóre z jego wariantów:

  • Iteracyjna DPO: Opracowana przez Snorkel (2023), ta wariacja łączy próbkowanie odrzucania z DPO, umożliwiając bardziej wyrafinowany proces selekcji danych treningowych. Poprzez iterację nad wieloma rundami próbkowania preferencji, model jest lepiej w stanie uogólniać i unikać przeuczenia się na szumie lub tendencyjnych preferencjach.
  • IPO (Iteracyjna Optymalizacja Preferencji): Wprowadzona przez Azar et al. (2023), IPO dodaje termin regularizacji, aby zapobiec przeuczeniu, co jest powszechnym problemem w optymalizacji opartej na preferencjach. To rozszerzenie pozwala modelom utrzymać balans między przestrzeganiem preferencji a zachowaniem zdolności uogólniania.
  • KTO (Optymalizacja Przenoszenia Wiedzy): Bardziej aktualna wariacja od Ethayarajh et al. (2023), KTO rezygnuje z preferencji binarnych całkowicie. Zamiast tego, koncentruje się na przenoszeniu wiedzy z modelu referencyjnego do modelu polityki, optymalizując dla gładkiej i spójnej zgodności z ludzkimi wartościami.
  • Wielomodalna DPO dla Nauki Międzydomenowej przez Xu et al. (2024): Podejście, w którym DPO jest stosowane w różnych modalnościach – tekście, obrazie i dźwięku – demonstrując jego wszechstronność w wyrównywaniu modeli z ludzkimi preferencjami w różnych typach danych. To badanie podkreśla potencjał DPO w tworzeniu bardziej kompleksowych systemów AI zdolnych do radzenia sobie z złożonymi, wielomodalnymi zadania.

Podsumowanie

Optymalizacja Preferencji Bezpośrednich reprezentuje znaczący postęp we wyrównywaniu modeli językowych z ludzkimi preferencjami. Jej prostota, efektywność i skuteczność czynią ją potężnym narzędziem dla badaczy i praktyków.

Poprzez wykorzystanie mocy Optymalizacji Preferencji Bezpośrednich i przestrzeganie tych zasad, możesz tworzyć modele językowe, które nie tylko wykazują imponujące zdolności, ale także są zgodne z ludzkimi wartościami i intencjami.

Przez ostatnie pięć lat zanurzałem się w fascynującym świecie Machine Learning i Deep Learning. Moja pasja i ekspertyza doprowadziły mnie do udziału w ponad 50 różnorodnych projektach inżynierii oprogramowania, ze szczególnym uwzględnieniem AI/ML. Moja nieustanna ciekawość również skierowała mnie w stronę Natural Language Processing, dziedziny, którą chcę dalej eksplorować.