Przejdź do treści
11/30Rozdział 11 z 30

Od modelu bazowego do asystenta: SFT, RLHF, DPO i GRPO

Poproś model bazowy o haiku, a powtórzy zdanie pięć razy. Potem zobacz, jak reward model zaczyna preferować długość zamiast poprawności.

Na tej stronie

Poproś GPT-2 — kompetentnie pretrenowany model językowy — żeby napisał haiku o morzu:

TEXT
prompt: Write a haiku about the sea.

The sea is a beautiful place.

The sea is a beautiful place.

The sea is a beautiful place.

The sea is a beautiful place.

The sea is a beautiful place.

Nie jest zdezorientowany i nie zawiódł w swojej pracy. Robi dokładnie to, do czego wytrenował go Rozdział 10: mając dany tekst, wytwarza wiarygodną kontynuację. W internecie po linijce takiej jak Napisz haiku o morzu. często pojawia się proza o morzu, a zdanie, które właśnie wystąpiło, ma wyjątkowo dużą szansę pojawić się ponownie. Model jest znakomitym predyktorem następnego token i bezużytecznym asystentem.

Teraz ta sama prośba do modelu zbudowanego w ten sam sposób — Qwen2.5, pół miliarda parametrów, cztery razy większego niż GPT-2 powyżej, a wciąż malutkiego według dowolnego standardu z 2026 roku — po etapach treningu, o których jest ten rozdział:

TEXT
Whispers of the ocean,
Silent depths where waves meet,
Mysteries in the vast blue.

Cztery razy więcej parametrów nie uczy modelu, żeby przestał mówić. Różnica między tymi dwoma wynikami to nie skala, nie architektura i nie ilość danych. To post-training: druga faza, o rzędy wielkości mniejsza niż pretraining, która bierze predyktor tekstu i zmienia go w coś, co odpowiada.

Etap pierwszy: pokazanie, jak wygląda odpowiedź

Link do sekcji: Etap pierwszy: pokazanie, jak wygląda odpowiedź

Pierwszy krok jest najmniej efektowny i wykonuje większość pracy. Zbierz przykłady instrukcji sparowanych z dobrymi odpowiedziami i kontynuuj trening na nich z dokładnie tą samą funkcją straty co w Rozdziale 8 — przewidywaniem następnego token — ale tylko na części z odpowiedzią. To jest supervised fine-tuning, czyli SFT.

Nie uczy się tu niczego nowego o języku. Uczy się formatu: że po tekście o takim kształcie następuje tekst o tamtym kształcie, a potem tekst się kończy. Spójrz jeszcze raz na porażkę modelu bazowego. Odpowiedział na pytanie w pierwszym zdaniu, a potem nie potrafił przestać, bo w jego treningu nic nigdy nie oznaczało końca odpowiedzi. Zatrzymywanie się to wyuczone zachowanie.

Dlatego modelowi trzeba też powiedzieć, gdzie są granice — i właśnie tym jest chat template:

TEXT
<|im_start|>system
You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>
<|im_start|>user
What is the capital of France?<|im_end|>
<|im_start|>assistant

Te znaczniki <|im_start|> i <|im_end|> są prawdziwymi token w słowniku, dodanymi przed fine-tuning, a model widział ich miliony dokładnie w tych pozycjach. Dzięki nim wie, czyja jest kolej i gdzie kończy się tura.

Pomiń template i podaj modelowi samo pytanie, a dasz mu sekwencję, której nie widział podczas treningu. Pomiar: ten sam model, to samo pytanie, to samo greedy decoding:

Bez template — surowy ciąg What is the capital of France?:

TEXT
 The capital of France is Paris.

To verify this, I will use a simple
Python code snippet to confirm that
Paris is indeed the capital city of
France.

[...and then it starts writing a
Python script to check its own answer]

Z template:

TEXT
The capital of France is Paris.

Odpowiedź jest poprawna w obu przypadkach, ale bez znaczników model odpływa w pisanie Pythona, żeby sam się sprawdzić, bo prompt, który dostał, nie przypomina niczego, na czym był fine-tuning. To najczęstsza przyczyna zjawiska „model zgłupiał, gdy wywołałem go bezpośrednio”: template nie jest dekoracją wokół modelu, jest częścią modelu, a zły template to cicha degradacja bez żadnego błędu.

Etap drugi i problem, który ma rozwiązać

Link do sekcji: Etap drugi i problem, który ma rozwiązać

SFT ma sufit, a tym sufitem są dane. Żeby wykonać fine-tuning na demonstracji, ktoś musi napisać idealną odpowiedź — a przy większości interesujących pytań napisanie dobrej odpowiedzi jest trudne, powolne, drogie i daje dokładnie jedną odpowiedź, której jakości nie potrafisz zweryfikować.

Ludzie są dobrzy w porównywaniu. Widząc dwie odpowiedzi, anotator potrafi w kilka sekund wiarygodnie powiedzieć, która jest lepsza, nawet jeśli sam nie umiałby stworzyć żadnej z nich. Na tym fakcie zbudowany jest cały drugi etap — i to jest część, którą większość wyjaśnień przedstawia odwrotnie:

Ludzie nie piszą odpowiedzi. Klasyfikują pary.

Dane są więc parami — prompt, dwie odpowiedzi i informacja, która wygrała. Tego nie da się podłączyć do straty next-token, bo nie ma sekwencji docelowej. Potrzebna jest inna maszyna.

Reward model i czego naprawdę się uczy

Link do sekcji: Reward model i czego naprawdę się uczy

Nie możesz prosić człowieka o ocenianie każdej odpowiedzi podczas treningu — to byłyby miliony osądów. Trenujesz więc model, żeby naśladował ludzi: reward model, który bierze odpowiedź i zwraca skalar.

Trening z porównań używa wyniku z 1952 roku. Model Bradley–Terry2 mówi, że jeśli dwa elementy mają ukryte siły, prawdopodobieństwo, że jeden pokona drugi, jest funkcją logistyczną ich różnicy. Odwróć to, a staje się funkcją straty: mając informację, że człowiek wolał ywy_w od yly_l, maksymalizuj

P(ywyl)=σ(r(yw)r(yl))P(y_w \succ y_l) = \sigma\big(r(y_w) - r(y_l)\big)

co w kodzie jest całą pętlą treningową:

reward_model.pyPYTHON
loss = -F.logsigmoid(reward(chosen) - reward(rejected)).mean()   

Zauważ, czego model nigdy nie widzi: bezwzględnego wyniku. Uczy się wyłącznie różnic, czyli dokładnie tego, co zawierają dane.

Teraz część, którą warto zmierzyć. Reward model uczy się tego, co nagradzali anotatorzy, a anotatorzy to ludzie. Oto symulacja, w której prawdziwa jakość odpowiedzi zależy wyłącznie od użyteczności i poprawności — długość nie jest warta nic — ale symulowany anotator ma łagodną preferencję dla dłuższych odpowiedzi, gdy wszystko inne jest podobne; to dobrze udokumentowane ludzkie skrzywienie. Wytrenuj reward model na 2000 porównań i odczytaj jego wagi:

skrzywienie anotatora ku długościwyuczona waga dla użytecznedla poprawnedla długości
0.0+1.00+1.00+0.01
0.3+0.98+1.00+0.15
0.6+0.97+1.00+0.27
1.2+1.00+0.99+0.59

Reward model działa perfekcyjnie. Wiernie nauczył się preferencji, które mu pokazano — w tym tej części preferencji, która nie ma nic wspólnego z jakością. Reward model nie jest miarą dobra; jest miarą tego, co wybrali anotatorzy, a każde skrzywienie w puli anotacji jest teraz współczynnikiem w różniczkowalnej funkcji, względem której znacznie większy model zaraz będzie optymalizowany.

Co prowadzi nas do tego, co dzieje się, gdy to optymalizujesz. Daj policy stały budżet wysiłku do rozdysponowania między właściwości odpowiedzi, z realistyczną asymetrią: bycie użytecznym i poprawnym jest kosztowne, a bycie dłuższym jest tanie — po prostu piszesz dalej.

Reward na jednostkę wysiłku dla modelu wytrenowanego powyżej: użyteczność 8,26, poprawność 8,31, długość 31,70. Długość opłaca się prawie cztery razy lepiej niż poprawność, nie dlatego, że reward model jest zepsuty, ale dlatego, że jest tania.

Optymalizuj względem tego reward i obserwuj obie liczby:

wynik reward modelprawdziwa jakośćwytworzona długość
policy początkowa12.5880.9743.365
po optymalizacji31.6960.00012.497

Reward wzrósł 2,5-krotnie. Rzecz, którą reward miał mierzyć, spadła do zera. Policy odkryła, że może osiągać ogromne wyniki, pisząc długo i nie mówiąc nic, a żadna część pętli treningowej nie miała jak tego zauważyć, bo reward model jest definicją dobra wewnątrz pętli.

To jest reward hacking i jeśli kiedykolwiek zastanawiało cię, dlaczego modele czatowe są tak rozwlekłe, ta tabela jest dużą częścią odpowiedzi.

Standardowa obrona polega na karaniu policy za zbyt duże oddalenie od punktu startowego, mierzone dywergencją KL z Rozdziału 4:

objective=E[r(y)]βDKL(πθπref)\text{objective} = \mathbb{E}\big[r(y)\big] - \beta \, D_{\mathrm{KL}}\big(\pi_\theta \,\|\, \pi_{\text{ref}}\big)

Referencja πref\pi_{\text{ref}} to model SFT — policy sprzed etapu reinforcement. Twierdzenie brzmi: to zapobiega odpłynięciu modelu w zachowania zdegenerowane. Sprawdźmy, ile z tego twierdzenia przetrwa pomiar. Ten sam układ, przegląd po β\beta:

β\betarewardprawdziwa jakośćdługośćKL
031.6990.00012.4982.994
131.6970.00012.4972.993
528.3180.28510.7002.163
1512.8601.5422.5520.151
3010.4261.7191.3030.025
609.6321.7690.9080.005
sam model referencyjny9.1621.7910.6870

Czytaj ostatni wiersz na tle reszty. Przy β=0\beta = 0 i β=1\beta = 1 kara nie robi absolutnie nic: reward jest wart o tyle więcej niż KL, że optymalizator płaci mandat i i tak hackuje. Między 5 a 15 zachowanie gwałtownie się zmienia. A przy β=60\beta = 60 prawdziwa jakość wróciła do 1,769 — co wciąż jest poniżej 1,791, które model referencyjny miał, zanim cokolwiek z tego się zaczęło.

Jedno zastrzeżenie, zanim ktokolwiek gdzieś zacytuje tę liczbę: 1,791 z ostatniego wiersza i 0,974, które pierwsza tabela przypisuje policy początkowej, to dwa różne pomiary tego samego modelu sprzed RL, wykonane osobno w dwóch eksperymentach. Porównuj wiersze wewnątrz tabeli, nigdy między tabelami — wniosek z każdej tabeli wynika z jej własnych wierszy i żaden nie zależy od baseline drugiej.

Uczciwe podsumowanie nie brzmi więc „kara KL zapobiega reward hacking”. Brzmi tak:

Kara KL nie zapobiega reward hacking. Ogranicza to, jak daleko policy może odejść od referencji — a ponieważ porażka wymaga ruchu, to pomaga. Ale to smycz, nie korekta: przy niskim β\beta smycz pęka, a przy wysokim β\beta odzyskujesz model referencyjny i cały drogi etap nie kupił niczego.

Użyteczny zakres jest wąski, jego położenie zależy od reward model i nie da się go znaleźć inaczej niż patrząc. Dlatego model referencyjny musi być dobry — KL jest podłogą na poziomie jakości referencji, nie sufitem nad porażką — i to duża część powodu, dla którego ten etap jest trudny w praktyce, a nie w zasadzie.

Algorytm, dzięki któremu zadziałało to w skali, to Proximal Policy Optimization.3 W jednym akapicie: estymuje advantage każdej odpowiedzi, aktualizuje policy tak, żeby zwiększyć prawdopodobieństwo odpowiedzi powyżej baseline, i przycina rozmiar pojedynczej aktualizacji, żeby duża estymacja advantage nie zniszczyła policy w jednym kroku. Zastosowane do modeli językowych4 oznacza trzymanie jednocześnie czterech modeli w grze — policy, referencji, reward model i critic — przy czym policy generuje świeże próbki przez cały trening.

To działa, dało InstructGPT i wszystko, co od niego pochodzi, i jest naprawdę trudne: cztery modele w pamięci, próbkowanie w pętli treningowej oraz zasłużona reputacja niestabilności. Udawanie, że da się to zaimplementować w poście na blogu, byłoby nieuczciwe, więc ten rozdział tego nie robi.

To, co zastąpiło je w większości zastosowań, wzięło się z pewnej obserwacji. Powyższy cel regularyzowany KL ma zamkniętą postać optymalnej policy, a to wyrażenie można odwrócić: reward da się zapisać w kategoriach optymalnej policy i referencji. Podstawienie tego z powrotem do straty Bradley–Terry sprawia, że reward model całkowicie znika. Zostaje supervised loss na parach preferencji — bez próbkowania, bez critic, bez reward model, dwa modele w pamięci zamiast czterech.

To jest Direct Preference Optimization,5 i mieści się w dwóch liniach:

dpo.pyPYTHON
def dpo_loss(pi_w, pi_l, ref_w, ref_l, beta=0.1):
    """pi_* and ref_* are summed log-probabilities of a full response."""
    logits = beta * ((pi_w - ref_w) - (pi_l - ref_l))   
    return -F.logsigmoid(logits)                        

Przeczytaj, co to mówi. Wielkością wypychaną w górę jest to, o ile bardziej policy preferuje zwycięzcę niż robiła to referencja, minus to, o ile bardziej preferuje przegranego. Referencja nie jest karą doklejoną później — jest wewnątrz straty, dlatego DPO nie potrzebuje osobnego członu KL.

Najważniejsza własność jest w gradient. Oblicz stratę i jej gradient na tej samej parze w pięciu różnych stanach policy:

stan policystratawielkość gradient
już silnie preferuje zwycięzcę0.51300.0401
już go preferuje, słabo0.66850.0488
identyczna z referencją0.69310.0500
preferuje przegranego0.79810.0550
silnie preferuje przegranego1.00550.0634

Gradient rośnie, gdy policy myli się bardziej. Pary, z którymi model już sobie radzi, wnoszą prawie nic; pary, które ma odwrócone, dominują aktualizację. DPO waży każdy przykład według tego, jak bardzo policy obecnie się myli, automatycznie, bez harmonogramu — i to samoważenie jest mechanizmem wykonującym pracę, którą w PPO wykonywały estymacja advantage i critic. (Strata w trzecim wierszu to dokładnie ln2\ln 2, czyli kotwica do sprawdzania każdej implementacji: policy identyczna ze swoją referencją nie nauczyła się niczego i powinna siedzieć przy ln2\ln 2.)

GRPO6 wychodzi z tego samego problemu inną drogą. Zachowuje pętlę próbkowania, ale usuwa critic: zamiast trenować model do przewidywania baseline, próbkuje grupę odpowiedzi na ten sam prompt i bezpośrednio używa średniego reward grupy jako baseline. Advantage odpowiedzi to to, o ile była lepsza od swojego rodzeństwa. Zamienia to cały model na większy batch i właśnie to uczyniło praktycznym trening na weryfikowalnych reward — temat Rozdziału 12.

Pokaż szczegóły

Trzy kolejne elementy krajobrazu post-training, krótko.

RLAIF i Constitutional AI.7 Anotator nie musi być człowiekiem. Daj modelowi spisane zasady i poproś go, żeby krytykował i poprawiał własne wyniki albo wybierał między dwoma kandydatami, a otrzymasz zbiór danych preferencji tworzony z szybkością i kosztem maszyny. Oczywisty zarzut — model ocenia własną pracę domową — jest realny, a uczciwa odpowiedź brzmi: działa to lepiej, niż się wydaje, bo ocenianie jest łatwiejsze niż generowanie; to ta sama asymetria, na której opiera się cały rozdział.

LIMA i jak mało danych to wymaga.8 Tysiąc starannie dobranych demonstracji dało konkurencyjnego asystenta. Proponowane wyjaśnienie jest takie, że pretraining już zainstalował wiedzę i format, a post-training musi tylko wybrać, które z istniejących zachowań modelu wydobyć na powierzchnię. Jeśli to prawda, jakość danych post-training dominuje nad ilością — a zachowanie branży od tamtej pory sugeruje, że ludzie w to wierzą.

LoRA i QLoRA.910 Fine-tuning wszystkich wag dużego modelu wymaga pamięci na wagi, ich gradient i stan optymalizatora — szesnaście bajtów na parametr z Rozdziału 10, ponad dwiema średnimi zbudowanymi ręcznie w Rozdziale 6 — w skali, która potrzebuje klastra. LoRA zamraża oryginalne wagi i trenuje obok nich parę macierzy niskiego rzędu, zmniejszając liczbę trenowalnych parametrów o rzędy wielkości; QLoRA dodatkowo kwantyzuje zamrożoną bazę do 4 bitów. Oba są tu omawiane jako technika. Czy fine-tuning w ogóle jest właściwą rzeczą, na którą warto wydawać pieniądze, to inne pytanie — i należy do Rozdziału 20.

Alignment tax i pytanie, na które nikt nie odpowiedział

Link do sekcji: Alignment tax i pytanie, na które nikt nie odpowiedział

Dwie rzeczy warto zabrać dalej.

Pierwsza: ten etap ma koszt i widać go w możliwościach. Modele często mierzalnie pogarszają się w niektórych zadaniach benchmarkowych po treningu alignment — to alignment tax — bo cel się zmienił: odpowiedź bezpieczna, ostrożna i dobrze sformatowana nie zawsze jest odpowiedzią maksymalizującą trafność. Część tej luki udało się zniwelować inżynieryjnie, a część jest prawdziwą wymianą, nie błędem do naprawy.

Druga to pytanie ukryte w słowie aligned. Z kim aligned? Łańcuch wygląda tak: firma pisze wytyczne, kontraktorzy je interpretują, ich porównania trenują reward model, reward model kształtuje policy, a policy odpowiada na pytanie kogoś, kto nie widział żadnego z tych etapów. Każde ogniwo jest wyborem dokonanym przez konkretnych ludzi, a żaden z algorytmów w tym rozdziale nie ma zdania na temat tego, czy te wybory są dobre.

To nie jest retoryczna ozdoba. To konkretny powód, dla którego dwa modele frontier odmawiają różnych próśb, dlaczego ten sam model zmienia zdanie między wersjami i dlaczego „aligned” jest opisem procesu, a nie właściwością artefaktu. Matematyka w tym rozdziale jest rozstrzygnięta. Ta część nie jest.

Post-training nauczył model odpowiadać. Nie nauczył go myśleć przed odpowiedzią — a to dwie różne rzeczy, w sposób, który okazuje się trenowalny.

Rozdział 12 jest o tym, co dzieje się, gdy pozwalasz modelowi wydać więcej obliczeń na trudne pytanie w czasie odpowiadania, a nie w czasie treningu — chain of thought, reinforcement learning z weryfikowalnych reward oraz powód, dla którego model pokazujący swoją pracę nie tylko się wyjaśnia, lecz liczy inaczej. Spłaca też dług z tego rozdziału: GRPO istnieje w nim, wykonując pracę, którą wcześniej wykonywał critic w PPO, na reward, które nie potrzebują żadnego anotatora, bo dowód albo się sprawdza, albo nie.


Generacje powyżej pochodzą z gpt2 i Qwen/Qwen2.5-0.5B-Instruct z greedy decoding, więc odtwarzają się dokładnie. Rozdział 11 kursu Hugging Face LLM Course przeprowadza przez SFT i DPO z trl oraz peft, jeśli chcesz uruchomić prawdziwy proces zamiast symulacji; rozdział 7 książki Sebastiana Raschki Build a Large Language Model (From Scratch) implementuje instruction fine-tuning od początku do końca bez biblioteki.

  1. Sutton, R. S. and Barto, A. G. Reinforcement Learning: An Introduction, 2nd edition (MIT Press, 2018). To odesłanie jest celowe: ramka ze słownikiem powyżej to najmniejszy użyteczny podzbiór, a właściwy temat jest książką.

  2. Bradley, R. A. and Terry, M. E. Rank Analysis of Incomplete Block Designs: I. The Method of Paired Comparisons. Biometrika 39(3/4), pp. 324–345 (1952). Model porównań parami leżący pod każdym używanym dziś reward model.

  3. Schulman, J., Wolski, F., Dhariwal, P., Radford, A. and Klimov, O. Proximal Policy Optimization Algorithms. arXiv:1707.06347 (2017).

  4. Ouyang, L. et al. Training language models to follow instructions with human feedback. arXiv:2203.02155 (2022). InstructGPT — praca, która uczyniła trzyetapową receptę standardem. Poprzedzona przez Christiano et al. (arXiv:1706.03741), gdzie wprowadzono uczenie reward model z ludzkich porównań, oraz Stiennon et al. (arXiv:2009.01325), gdzie zastosowano je do streszczania.

  5. Rafailov, R., Sharma, A., Mitchell, E., Ermon, S., Manning, C. D. and Finn, C. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. arXiv:2305.18290 (2023). Wyprowadzenie usuwające reward model jest w sekcji 4 i warto przeczytać je w całości; jest krótsze, niż sugeruje reputacja.

  6. Shao, Z. et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. arXiv:2402.03300 (2024). Wprowadza GRPO w sekcji 4.1.

  7. Bai, Y. et al. Constitutional AI: Harmlessness from AI Feedback. arXiv:2212.08073 (2022).

  8. Zhou, C. et al. LIMA: Less Is More for Alignment. arXiv:2305.11206 (2023).

  9. Hu, E. J. et al. LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685 (2021).

  10. Dettmers, T., Pagnoni, A., Holtzman, A. and Zettlemoyer, L. QLoRA: Efficient Finetuning of Quantized LLMs. arXiv:2305.14314 (2023).

Gotowy, żeby to LIA wybierała za Ciebie?

Twórz ze wszystkimi modelami AI w jednym miejscu — zacznij dziś za darmo.