Naar inhoud springen
11/30Hoofdstuk 11 van 30

Van basismodel naar assistent: SFT, RLHF, DPO en GRPO

Vraag een basismodel om een haiku en het schrijft vijf keer dezelfde zin. Kijk hoe een beloningsmodel lengte boven juistheid leert verkiezen.

Op deze pagina

Vraag GPT-2 — een degelijk voorgetraind taalmodel — om een haiku over de zee te schrijven:

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.

Het is niet in de war en het heeft zijn taak niet verprutst. Het doet precies waarvoor hoofdstuk 10 het heeft getraind: gegeven wat tekst, plausibele vervolgtekst produceren. Op het internet wordt een regel als Write a haiku about the sea. vaak gevolgd door proza over de zee, en een zin die net is verschenen, heeft een ongewoon grote kans om opnieuw te verschijnen. Het model is een voortreffelijke next-token-voorspeller en een nutteloze assistent.

Nu hetzelfde verzoek aan een model dat op dezelfde manier is gebouwd — Qwen2.5, een half miljard parameters, vier keer zo groot als de GPT-2 hierboven en nog steeds piepklein naar elke maatstaf van 2026 — na de trainingsfasen waar dit hoofdstuk over gaat:

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

Vier keer zoveel parameters leren een model niet om op te houden met praten. De kloof tussen die twee outputs is geen schaal, geen architectuur en geen datavolume. Het is post-training: een tweede fase, ordes van grootte kleiner dan pretraining, die een tekstvoorspeller verandert in iets dat antwoord geeft.

Fase één: laten zien hoe een antwoord eruitziet

Link naar de sectie: Fase één: laten zien hoe een antwoord eruitziet

De eerste stap is het minst glamoureus en doet het meeste werk. Verzamel voorbeelden van instructies gekoppeld aan goede antwoorden, en train daarop verder met precies de loss uit hoofdstuk 8 — voorspel de volgende token — maar alleen op het antwoordgedeelte. Dit is supervised fine-tuning, of SFT.

Er wordt niets nieuws over taal geleerd. Wat wordt geleerd is een format: dat tekst met deze vorm wordt gevolgd door tekst met die vorm, en daarna stopt. Kijk nog eens naar de mislukking van het basismodel. Het beantwoordde de vraag in de eerste zin en kon daarna niet stoppen, omdat niets in zijn training ooit het einde van een antwoord markeerde. Stoppen is aangeleerd gedrag.

Daarom moet het model ook verteld worden waar de grenzen liggen, en dat is wat een chat template doet:

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

Die <|im_start|>- en <|im_end|>-markers zijn echte tokens in de vocabulaire, toegevoegd vóór fine-tuning, en het model zag er miljoenen in precies deze posities. Zo weet het wiens beurt het is en waar een beurt eindigt.

Sla de template over en geef het model een kale vraag, en je geeft het een sequentie die het niet in training heeft gezien. Gemeten, hetzelfde model, dezelfde vraag, dezelfde greedy decoding:

Zonder de template — de ruwe string 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]

Met de template:

TEXT
The capital of France is Paris.

Het antwoord is in beide gevallen goed, maar zonder de markers dwaalt het model af naar Python schrijven om zichzelf te controleren, omdat de prompt die het ontving op niets lijkt waarop het is fine-tuned. Dit is de meest voorkomende oorzaak van „het model werd dommer toen ik het rechtstreeks aanriep”: de template is geen decoratie rond het model, hij is onderdeel van het model, en een verkeerde template is stille degradatie zonder foutmelding.

Fase twee, en het probleem dat die moet oplossen

Link naar de sectie: Fase twee, en het probleem dat die moet oplossen

SFT heeft een plafond, en dat plafond is de data. Om op een demonstratie te fine-tunen moet iemand de ideale response schrijven — en voor de meeste interessante vragen is een goed antwoord schrijven moeilijk, traag, duur, en levert het precies één antwoord op waarvan je de kwaliteit niet kunt verifiëren.

Waar mensen goed in zijn is vergelijken. Als een annotator twee responses ziet, kan die in een paar seconden betrouwbaar zeggen welke beter is, zonder een van beide zelf te kunnen produceren. Op dat feit is de hele tweede fase gebouwd, en dit is het deel dat de meeste uitleg omdraait:

Mensen schrijven de antwoorden niet. Ze rangschikken paren.

De data bestaat dus uit paren — een prompt, twee responses, en welke heeft gewonnen. Dat kun je niet in een next-token loss stoppen, want er is geen doelsequentie. Daar is een andere machine voor nodig.

Het reward model, en wat het werkelijk leert

Link naar de sectie: Het reward model, en wat het werkelijk leert

Je kunt een mens niet tijdens training elke response laten scoren — dat zijn miljoenen beoordelingen. Dus train je een model om de mensen na te bootsen: een reward model dat een response neemt en een scalar teruggeeft.

Het trainen uit vergelijkingen gebruikt een resultaat uit 1952. Het Bradley–Terry-model2 zegt dat als twee items latente sterktes hebben, de kans dat het ene het andere verslaat de logistische functie is van hun verschil. Draai dat om en het wordt een loss: gegeven dat een mens ywy_w verkoos boven yly_l, maximaliseer

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

wat in code de hele trainingslus is:

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

Let op wat het model nooit ziet: een absolute score. Het leert alleen verschillen, en dat is precies wat de data bevat.

Nu het deel dat het meten waard is. Een reward model leert wat de annotators beloonden, en annotators zijn mensen. Hier is een simulatie waarin de werkelijke kwaliteit van een response alleen afhangt van nuttig en correct zijn — lengte is niets waard — maar de gesimuleerde annotator een lichte voorkeur heeft voor langere antwoorden wanneer alles verder dicht bij elkaar ligt, wat een goed gedocumenteerde menselijke bias is. Train het reward model op 2.000 vergelijkingen en lees de gewichten:

lengte-bias van annotatorgeleerd gewicht op nuttigop correctop lengte
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

Het reward model werkt perfect. Het heeft trouw de voorkeuren geleerd die het te zien kreeg — inclusief het deel van die voorkeuren dat niets met kwaliteit te maken heeft. Een reward model is geen maat voor goed; het is een maat voor wat de annotators kozen, en elke bias in de annotatiepool is nu een coëfficiënt in een differentieerbare functie waartegen een veel groter model zo meteen gaat optimaliseren.

Dat brengt ons bij wat er gebeurt wanneer je ervoor optimaliseert. Geef de policy een vast budget aan inspanning om te besteden over de eigenschappen van de response, met een realistische asymmetrie: nuttig zijn en correct zijn zijn duur, en langer zijn is goedkoop — je blijft gewoon schrijven.

Reward per eenheid inspanning, voor het hierboven getrainde model: nuttig 8,26, correct 8,31, lengte 31,70. Lengte betaalt bijna vier keer beter dan correctheid, niet omdat het reward model kapot is, maar omdat lengte goedkoop is.

Optimaliseer tegen die reward en kijk naar beide getallen:

score van het reward modelwerkelijke kwaliteitgeproduceerde lengte
startende policy12,5880,9743,365
na optimalisatie31,6960,00012,497

De reward steeg met een factor 2,5. Datgene wat de reward moest meten ging naar nul. De policy ontdekte dat hij enorm goed kon scoren door lang te schrijven en niets te zeggen, en geen enkel deel van de trainingslus had een manier om dat te merken, omdat het reward model de definitie van goed is binnen de lus.

Dit is reward hacking, en als je je ooit hebt afgevraagd waarom chatmodellen zo breedsprakig zijn, is deze tabel een groot deel van het antwoord.

De standaardverdediging is om de policy te bestraffen wanneer die te ver weg beweegt van waar hij begon, waarbij afstand wordt gemeten met de KL-divergentie uit hoofdstuk 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)

De referentie πref\pi_{\text{ref}} is het SFT-model — de policy vóór de reinforcement-fase. De claim is dat dit voorkomt dat het model afdwaalt naar gedegenereerd gedrag. Laten we uitzoeken hoeveel van die claim overeind blijft bij meting. Zelfde opzet, sweep over β\beta:

β\betarewardwerkelijke kwaliteitlengteKL
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
alleen het referentiemodel9,1621,7910,6870

Lees de laatste rij tegenover de rest. Bij β=0\beta = 0 en β=1\beta = 1 doet de straf helemaal niets: de reward is zoveel meer waard dan de KL dat de optimizer de boete betaalt en toch hackt. Tussen 5 en 15 slaat het gedrag om. En bij β=60\beta = 60 is de werkelijke kwaliteit teruggeklommen naar 1,769 — wat nog steeds lager is dan de 1,791 die het referentiemodel had voordat dit alles begon.

Eén kanttekening voordat dat getal ergens wordt geciteerd: de 1,791 uit de laatste rij en de 0,974 die de eerste tabel aan de startende policy geeft, zijn twee verschillende metingen van hetzelfde pre-RL-model, afzonderlijk genomen door de twee experimenten. Vergelijk rijen binnen een tabel, nooit tussen tabellen — de conclusie van elke tabel staat op zijn eigen rijen, en geen van beide hangt af van de baseline van de andere.

De eerlijke samenvatting is dus niet „de KL-straf voorkomt reward hacking”. Het is:

De KL-straf voorkomt reward hacking niet. Hij beperkt hoe ver de policy van de referentie kan bewegen — en omdat de mislukking beweging vereist, helpt dat. Maar het is een lijn, geen correctie: bij lage β\beta knapt de lijn, en bij hoge β\beta krijg je het referentiemodel terug en heeft de hele dure fase niets opgeleverd.

De bruikbare band is smal, de locatie ervan hangt af van het reward model, en er is geen manier om hem te vinden behalve door te kijken. Daarom moet het referentiemodel goed zijn — de KL is een vloer op de kwaliteit van de referentie, geen plafond op de mislukking — en het is een groot deel van de reden waarom deze fase in de praktijk moeilijk is in plaats van in principe.

Het algoritme dat dit op schaal liet werken is Proximal Policy Optimization.3 In één alinea: het schat de advantage van elke response, werkt de policy bij om de waarschijnlijkheid van responses boven de baseline te verhogen, en clipt de grootte van elke afzonderlijke update zodat een grote advantage-schatting de policy niet in één stap kan vernietigen. Toegepast op taalmodellen4 betekent dit vier modellen tegelijk in het spel houden — de policy, de referentie, het reward model en een critic — waarbij de policy tijdens de hele training verse samples genereert.

Het werkt, het leverde InstructGPT op en alles wat daarvan afstamt, en het is echt moeilijk: vier modellen in geheugen, sampling in de trainingslus, en een verdiende reputatie voor instabiliteit. Doen alsof je het in een blogpost kunt implementeren zou oneerlijk zijn, dus dit hoofdstuk doet dat niet.

Wat het voor de meeste doeleinden verving, kwam voort uit een observatie. De KL-geregulariseerde doelstelling hierboven heeft een gesloten-vorm optimale policy, en die expressie kan worden omgekeerd: de reward kan worden geschreven in termen van de optimale policy en de referentie. Stop je dat terug in de Bradley–Terry-loss, dan verdwijnt het reward model volledig. Wat overblijft is een supervised loss op voorkeurenparen — geen sampling, geen critic, geen reward model, twee modellen in geheugen in plaats van vier.

Dat is Direct Preference Optimization,5 en het zijn twee regels:

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)                        

Lees wat er staat. De grootheid die omhoog wordt geduwd is hoeveel meer de policy de winnaar verkiest dan de referentie deed, min hoeveel meer hij de verliezer verkiest. De referentie is geen straf die er achteraf op is geschroefd — hij zit in de loss, en daarom heeft DPO geen aparte KL-term nodig.

De belangrijkste eigenschap zit in de gradient. Evalueer de loss en de gradient op hetzelfde paar in vijf verschillende toestanden van de policy:

toestand van de policylossgradientgrootte
verkiest de winnaar al sterk0,51300,0401
verkiest hem al, zwak0,66850,0488
identiek aan de referentie0,69310,0500
verkiest de verliezer0,79810,0550
verkiest de verliezer sterk1,00550,0634

De gradient groeit naarmate de policy het verkeerder heeft. Paren die het model al aankan dragen bijna niets bij; paren die het omgekeerd doet domineren de update. DPO weegt elk voorbeeld op basis van hoe fout de policy het momenteel heeft, automatisch, zonder scheduling — en die zelfweging is het mechanisme dat het werk doet dat bij PPO door de advantage-schatting en de critic werd gedaan. (De loss op de derde rij is precies ln2\ln 2, wat het anker is om elke implementatie aan te toetsen: een policy die identiek is aan zijn referentie heeft niets geleerd en hoort op ln2\ln 2 te zitten.)

GRPO6 neemt een andere route uit hetzelfde probleem. Het behoudt de sampling-lus maar verwijdert de critic: in plaats van een model te trainen om de baseline te voorspellen, sampled het een groep responses op dezelfde prompt en gebruikt het het gemiddelde van de rewards van de groep rechtstreeks als baseline. De advantage van een response is hoeveel beter die was dan zijn siblings. Dat ruilt een heel model in voor een grotere batch, en het is wat verifieerbare-reward-training — het onderwerp van hoofdstuk 12 — praktisch maakte.

Details tonen

Nog drie onderdelen van het post-training-landschap, kort.

RLAIF en Constitutional AI.7 De annotator hoeft geen mens te zijn. Geef een model een geschreven set principes en vraag het zijn eigen outputs te bekritiseren en te herzien, of te kiezen tussen twee kandidaten, en je hebt een voorkeurendataset die wordt geproduceerd tegen machinesnelheid en machinekosten. Het voor de hand liggende bezwaar — het model beoordeelt zijn eigen huiswerk — is reëel, en het eerlijke antwoord is dat het beter werkt dan het klinkt omdat beoordelen makkelijker is dan genereren, dezelfde asymmetrie waarop het hele hoofdstuk rust.

LIMA, en hoe weinig data dit nodig heeft.8 Duizend zorgvuldig gecureerde demonstraties leverden een concurrerende assistent op. De voorgestelde verklaring is dat pretraining de kennis en het format al heeft geïnstalleerd, en dat post-training alleen hoeft te selecteren welk bestaand gedrag van het model naar voren komt. Als dat klopt, domineert de kwaliteit van post-training-data de kwantiteit — en het gedrag van het veld sindsdien suggereert dat mensen dit geloven.

LoRA en QLoRA.910 Elke gewicht van een groot model fine-tunen vereist geheugen voor de gewichten, hun gradients en de optimizer-state — de zestien bytes per parameter uit hoofdstuk 10, over de twee gemiddelden die hoofdstuk 6 met de hand opbouwde — op een schaal waarvoor je een cluster nodig hebt. LoRA bevriest de oorspronkelijke gewichten en traint daarnaast een low-rank paar matrices, waardoor het aantal trainbare parameters met ordes van grootte daalt; QLoRA quantizet bovendien de bevroren base naar 4 bits. Beide worden hier behandeld als techniek. Of fine-tuning überhaupt de juiste besteding is, is een andere vraag, en die hoort bij hoofdstuk 20.

De alignment tax, en de vraag die niemand heeft beantwoord

Link naar de sectie: De alignment tax, en de vraag die niemand heeft beantwoord

Twee dingen om mee te nemen.

Het eerste is dat deze fase een kostprijs heeft, en die zie je terug als capability. Modellen worden na alignment-training vaak meetbaar slechter op sommige benchmarktaken — de alignment tax — omdat de doelstelling veranderde: een response die veilig, voorbehouden en goed geformatteerd is, is niet altijd de response die nauwkeurigheid maximaliseert. Een deel van die kloof is technisch weggewerkt, en een deel ervan is een echte afweging in plaats van een bug om te repareren.

Het tweede is de vraag die het woord aligned verbergt. Aligned met wie? De keten is: een bedrijf schrijft richtlijnen, contractors interpreteren ze, hun vergelijkingen trainen een reward model, het reward model vormt een policy, en de policy beantwoordt een vraag van iemand die daar niets van heeft gezien. Elke schakel is een keuze van specifieke mensen, en geen enkel algoritme in dit hoofdstuk heeft een mening over de vraag of die keuzes goed zijn.

Dat is geen retorische versiering. Het is de concrete reden waarom twee frontiermodellen verschillende verzoeken weigeren, waarom hetzelfde model tussen versies van gedachten verandert, en waarom „aligned” een beschrijving is van een proces in plaats van een eigenschap van een artefact. De wiskunde in dit hoofdstuk staat vast. Dat deel niet.

Post-training leerde het model antwoorden. Het leerde het niet om te denken vóór het antwoord geeft, en die twee verschillen op een manier die trainbaar blijkt.

Hoofdstuk 12 gaat over wat er gebeurt wanneer je een model meer compute laat besteden aan een moeilijke vraag op het moment van antwoorden in plaats van op het moment van training — chain of thought, reinforcement learning uit verifieerbare rewards, en de reden dat een model dat zijn uitwerking laat zien niet alleen zichzelf uitlegt maar anders compute. Het lost ook de schuld uit dit hoofdstuk in: GRPO bestaat daarin, doet het werk dat PPO’s critic vroeger deed, op rewards waarvoor helemaal geen annotator nodig is omdat een bewijs klopt of niet.


De generaties hierboven komen uit gpt2 en Qwen/Qwen2.5-0.5B-Instruct met greedy decoding, dus ze reproduceren exact. Hoofdstuk 11 van de Hugging Face LLM Course loopt SFT en DPO door met trl en peft als je het echte werk wilt draaien in plaats van de simulatie; hoofdstuk 7 van Sebastian Raschka’s Build a Large Language Model (From Scratch) implementeert instruction fine-tuning end-to-end zonder library.

  1. Sutton, R. S. en Barto, A. G. Reinforcement Learning: An Introduction, 2e editie (MIT Press, 2018). De delegatie is bewust: het vocabulairekader hierboven is de kleinste bruikbare subset, en het echte onderwerp is een boek.

  2. Bradley, R. A. en Terry, M. E. Rank Analysis of Incomplete Block Designs: I. The Method of Paired Comparisons. Biometrika 39(3/4), pp. 324–345 (1952). Het paarsgewijze-vergelijkingsmodel onder elk reward model dat vandaag wordt gebruikt.

  3. Schulman, J., Wolski, F., Dhariwal, P., Radford, A. en 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 — het paper dat het drietrapsrecept standaard maakte. Voorafgegaan door Christiano et al. (arXiv:1706.03741), dat het leren van een reward model uit menselijke vergelijkingen introduceerde, en Stiennon et al. (arXiv:2009.01325), dat het toepaste op samenvatten.

  5. Rafailov, R., Sharma, A., Mitchell, E., Ermon, S., Manning, C. D. en Finn, C. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. arXiv:2305.18290 (2023). De afleiding die het reward model verwijdert staat in sectie 4 en is het waard om volledig te lezen; hij is korter dan zijn reputatie.

  6. Shao, Z. et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. arXiv:2402.03300 (2024). Introduceert GRPO in sectie 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. en Zettlemoyer, L. QLoRA: Efficient Finetuning of Quantized LLMs. arXiv:2305.14314 (2023).

Klaar om LIA te laten kiezen?

Bouw met elk AI-model op één plek — begin vandaag nog gratis.