Naar de inhoud
NLEN
Illustratie: Direct Preference Optimization: voorbij klassieke RLHF

Direct Preference Optimization: voorbij klassieke RLHF

Door Ivo Donker — samengesteld met AI-ondersteuning (Claude & Gemini)

De verschuiving van ruwe basismodellen naar bruikbare assistenten leunde jarenlang op één specifiek paradigma: Reinforcement Learning from Human Feedback (RLHF) via Proximal Policy Optimization (PPO). Hoewel deze aanpak aan de wieg stond van moderne instructiemodellen, bracht het in engineeringteams aanzienlijke operationele frictie met zich mee. Het gelijktijdig in het geheugen houden en synchroniseren van vier afzonderlijke neurale netwerken maakte trainingslopen kwetsbaar voor instabiliteit, reward hacking en geheugentekorten.

Direct Preference Optimization (DPO) heeft dit trainingslandschap fundamenteel herschikt. Door de wiskundige formulering van het optimalisatieprobleem direct te herleiden naar een gesloten vorm waarin de taalmodel-policy zelf fungeert als impliciet reward-model, elimineert DPO de noodzaak voor expliciete beloningsnetwerken en complexe reinforcement learning-lussen. In dit artikel kijken we naar de theoretische doorbraak, analyseren we de wiskundige afleiding van de DPO-verliesfunctie, vergelijken we de hardware-eisen en belichten we de inherente trade-offs en randvoorwaarden in hedendaagse alignment-pijplijnen.

De frictie van klassieke RLHF met PPO

Om te begrijpen waarom DPO zo snel terrein heeft gewonnen, moeten we de architecturale complexiteit van een klassieke PPO-opstelling ontleden. Wie de basisprincipes van menselijke feedbackvoorkeuren wil teruglezen, kan de basisuitleg over Reinforcement Learning from Human Feedback raadplegen voor een conceptueel fundament. In een traditionele PPO-implementatie moeten vier modellen parallel draaien: het actieve model dat getraind wordt (de policy), een statische kopie van het model (de referentie-policy om drifting via een KL-divergentiestraf te voorkomen), een getraind beloningsmodel (reward model) en een waardenetwerk (critic) dat de cumulatieve toekomstige beloningen schat.

Deze vierkoppige configuratie introduceert zware infrastructurele overhead. Tijdens de trainingsfase genereert de policy continu reacties (rollouts), die vervolgens door het beloningsmodel worden gescoord en via Generalized Advantage Estimation (GAE) door de critic worden verwerkt om beleidsgradienten te berekenen. Wanneer een van deze onderdelen ontspoort — bijvoorbeeld door reward model overoptimization waarbij het model patronen ontdekt die hoog scoren zonder daadwerkelijk kwalitatief te zijn — stort de gehele trainingsloop in. De hyperparametergevoeligheid van PPO, gecombineerd met wisselende gradient-dynamieken over vier modellen heen, maakte alignment een proces dat vaak tientallen mislukte runs vereiste voordat een stabiel checkpoint werd bereikt.

De wiskundige kern van Direct Preference Optimization

De fundamentele doorbraak van DPO, geïntroduceerd door Rafailov et al., schuilt in de observatie dat het constrained RL-probleem een exacte analytische oplossing heeft. In de standaardformulering probeert een model de verwachte beloning te maximaliseren onder een Kullback-Leibler (KL) regularisatiedruk ten opzichte van een referentiemodel:

max_pi E_{x ~ D, y ~ pi}[ r(x, y) ] - beta * D_KL( pi(y|x) || pi_ref(y|x) )

Waar klassieke methoden proberen de onbekende beloningsfunctie r(x, y) te benaderen met een neuraal netwerk, toont de afleiding van DPO aan dat deze beloningsfunctie exact herschreven kan worden in termen van de optimale policy pi*, de referentie-policy pi_ref, de regularisatieparameter beta en een partitiefunctie Z(x):

r(x, y) = beta * log( pi(y|x) / pi_ref(y|x) ) + beta * log( Z(x) )

Wanneer we deze representatie substitueren in het Bradley-Terry voorkeursmodel — waarbij de kans dat antwoord y_w (gewonnen) wordt verkozen boven y_l (verloren) afhangt van het verschil in beloning — valt de normalisatiefactor Z(x) volledig weg. Hierdoor ontstaat een binaire cross-entropy verliesfunctie die direct op de log-kansen van het taalmodel zélf optimaliseert:

L_DPO(pi; pi_ref) = - E_{(x, y_w, y_l) ~ D} [ log( sigma( beta * log( pi(y_w|x) / pi_ref(y_w|x) ) - beta * log( pi(y_l|x) / pi_ref(y_l|x) ) ) ) ]

Voor een gedetailleerde vergelijking tussen deze twee routes en hoe de wiskunde zich vertaalt naar conceptuele verschillen, biedt het overzicht van DPO versus RLHF aanvullende context over de theoretische scheidslijn tussen directe classificatie en dynamische reinforcement learning.

Architecturale vergelijking en geheugenbesparing

Door het elimineren van het expliciete reward model en het critic-netwerk transformeert DPO een dynamisch RL-probleem in een statische supervised classificatietaak. Dit levert directe voordelen op voor hardware-efficiëntie en implementatiegemak. Waar PPO continue generatie vereist tijdens training (on-policy rollouts), draait DPO op vooraf verzamelde paren van geprefereerde en afgewezen antwoorden (offline data).

Eigenschap Klassieke RLHF (PPO) Direct Preference Optimization (DPO)
Actieve netwerken in VRAM 4 (Actor, Reference, Critic, Reward) 2 (Actor/Policy, Reference)
Gegevenstype tijdens training Online rollouts (dynamische generatie) Offline tokenparen (y_w, y_l)
Wiskundig doel RL policy gradient met value clipping Binaire cross-entropy over log-odds ratios
Trainingsstabiliteit Laag tot matig (gevoelig voor instorting) Zeer hoog (convexe loss-eigenschappen)
VRAM-belasting (relatief) 100% (baseline footprint) ~45% tot 55% van PPO-overhead
Sampling-tijd tijdens fit Significant (interactieve generatielus) Nul (zuivere forward/backward pass)

In de praktijk betekent dit dat engineers aanzienlijk grotere batchgroottes kunnen draaien op dezelfde compute-clusters. Omdat er geen generatiestap plaatsvindt tijdens de optimalisatieslag, wordt de GPU-doorvoer vrijwel uitsluitend begrensd door de forward-backward passes over de tokenreeksen, wat resulteert in een aanzienlijk kortere trainingsduur per epoch.

De rol van DPO bij gespecialiseerde modelklassen

De stabiliteit van DPO heeft geleid tot brede adoptie binnen de open-weights gemeenschap. Waar geavanceerde alignment voorheen was voorbehouden aan partijen met enorme rekenclusters, stelt DPO kleinere organisaties in staat om concurrerende instructiemodellen op te leveren. Dit zien we met name terug bij de opkomst van kleine taalmodellen, waarbij gerichte DPO-fasen op compacte architecturen zorgen voor een sterke stijging in taakgerichte accuraatheid zonder dat er zware RL-infrastructuur nodig is.

Tegelijkertijd zien we dat DPO een andere dynamiek kent bij complexe redeneertaken. Bij modellen die stap voor stap redeneren is het genereren van ketens van gedachten (chain-of-thought) gevoelig voor subtle fouten halverwege de redenering. Omdat standaard DPO het volledige antwoord (de gehele reeks y_w) in één keer beloont ten opzichte van y_l, mist het soms de fijnmazige sturing op token- of stapniveau die reinforcement learning met procesbeloningen (Process-Supervised Reward Models) wel kan bieden.

Implementatie: een DPO-trainingslus in PyTorch

De praktische implementatie van DPO is opvallend compact. In tegenstelling tot de honderden regels code die nodig zijn voor de PPO-actor-critic updates, kan het kernverlies worden gedefinieerd in een enkele functie die log-waarschijnlijkheden vergelijkt. Hieronder staat een representatieve implementatie van de DPO-verliesfunctie met gradient-tracking:

import torch
import torch.nn.functional as F

def compute_dpo_loss(
    model,
    ref_model,
    input_ids_w,
    attention_mask_w,
    input_ids_l,
    attention_mask_l,
    labels_w,
    labels_l,
    beta=0.1
):
    """
    Berekent het DPO-verlies voor een batch van gewonnen (w) en verloren (l) antwoorden.
    """
    # 1. Log-kansen berekenen onder het actieve model
    logits_w = model(input_ids=input_ids_w, attention_mask=attention_mask_w).logits
    logits_l = model(input_ids=input_ids_l, attention_mask=attention_mask_l).logits

    # 2. Log-kansen berekenen onder het bevroren referentiemodel
    with torch.no_grad():
        ref_logits_w = ref_model(input_ids=input_ids_w, attention_mask=attention_mask_w).logits
        ref_logits_l = ref_model(input_ids=input_ids_l, attention_mask=attention_mask_l).logits

    # 3. Bereken log-waarschijnlijkheden van de specifieke doel-tokens
    def get_token_logps(logits, labels):
        # Shift voor autoregressieve doelstelling
        shift_logits = logits[:, :-1, :].contiguous()
        shift_labels = labels[:, 1:].contiguous()
        loss = F.cross_entropy(
            shift_logits.view(-1, shift_logits.size(-1)),
            shift_labels.view(-1),
            reduction='none'
        )
        loss = loss.view(shift_labels.size())
        # Maskeer padding en sommeer over de sequentie
        mask = (shift_labels != -100).float()
        return (loss * mask).sum(dim=-1)

    pi_logps_w = get_token_logps(logits_w, labels_w)
    pi_logps_l = get_token_logps(logits_l, labels_l)
    ref_logps_w = get_token_logps(ref_logits_w, labels_w)
    ref_logps_l = get_token_logps(ref_logits_l, labels_l)

    # 4. Bereken de log-ratio's
    pi_logratios = pi_logps_w - pi_logps_l
    ref_logratios = ref_logps_w - ref_logps_l

    # 5. DPO loss via de Bradley-Terry formulering
    logits_diff = beta * (pi_logratios - ref_logratios)
    losses = -F.logsigmoid(logits_diff)

    # Bereken impliciete beloningen voor monitoring
    chosen_rewards = beta * (pi_logps_w - ref_logps_w).detach()
    rejected_rewards = beta * (pi_logps_l - ref_logps_l).detach()

    return losses.mean(), chosen_rewards.mean(), rejected_rewards.mean()

Wat in deze code opvalt, is dat het referentiemodel uitsluitend in een forward pass met uitgeschakelde gradiënten (torch.no_grad()) wordt gebruikt. Veel frameworks optimaliseren dit verder door de referentie-log-kansen vooraf eenmalig over de gehele dataset te berekenen en op te slaan op disk, waardoor het referentiemodel tijdens de actieve training zelfs helemaal niet in het videogeheugen hoeft te blijven.

Datakwaliteit, distributieverschuiving en synthetische voorkeuren

Omdat DPO strikt offline opereert op gepaarde voorbeelden, hangt het succes van de training volledig af van de kwaliteit van de voorkeursdataset. Wanneer de data imperfecties bevat, vertaalt dit zich direct in suboptimale modelspecificaties. Het gevaar van vervuiling is reëel: in onze analyse van data poisoning bij fine-tuning wordt duidelijk hoe kwetsbaar preferentiemodellen zijn voor subtiele manipulaties in de trainingsvoorbeelden.

Om aan voldoende hoogwaardige voorkeursparen te komen, leunt de industrie steeds zwaarder op geautomatiseerde pipelines. Zie ook de bredere trend rond synthetische data in AI-ontwikkeling, waarbij grotere modellen worden ingezet om antwoorden te genereren en te rangschikken via methodes als UltraFeedback. Hier ontstaat echter een specifiek risico: distribution shift. Als de data afkomstig is van een distributie die te ver afstaat van wat de huidige policy genereert, kan het model leren om zinnen te bevoordelen die het zelf tijdens runtime nooit op natuurlijke wijze zou formuleren.

De zwakke plekken en randvoorwaarden van DPO

Ondanks de wiskundige elegantie is DPO geen wondermiddel. In productiesystemen lopen engineers tegen specifieke beperkingen aan die zorgvuldig moeten worden beheerst:

Evaluatie van gealigneerde modellen

Het meten van de daadwerkelijke vooruitgang na een DPO-ronde vereist robuuste meetmethoden. Traditionele benchmarks zoals MMLU of GSM8K meten feitelijke kennis en redeneervermogen, maar missen vaak nuances in behulpzaamheid, toon en veiligheid. Om de prestaties van een model na preference alignment objectief te kwantificeren, is een gestructureerde evaluatiestructuur noodzakelijk; zie daarvoor het raamwerk voor het zelf evalueren van LLM's, waarmee systematisch win-rates en regressies in kaart kunnen worden gebracht.

Vaak wordt gebruikgemaakt van geautomatiseerde LLM-as-a-Judge-evaluaties op benchmarks zoals MT-Bench en AlpacaEval 2.0. Daarbij wordt het DPO-checkpoint zij-aan-zij vergeleken met het basis-SFT-model (Supervised Fine-Tuning) en concurrerende checkpoints. Uit experimenten blijkt consistent dat DPO binnen enkele honderden stappen een aanzienlijke sprong in win-rate realiseert, mits de lengtebias van de evaluator wordt gecorrigeerd — DPO-modellen hebben immers de neiging om langere antwoorden te associëren met hogere kwaliteit als de trainingsdata hier niet expliciet voor gecorrigeerd is.

Recente evoluties: IPO, KTO en Online DPO

De academische wereld en industrie hebben niet stilgezeten sinds de introductie van DPO. Verschillende varianten adresseren de bekende zwaktes van het oorspronkelijke algoritme:

Met de volwassenheid van DPO en diens iteratieve varianten is preference alignment getransformeerd van een onvoorspelbaar infrastructureel knelpunt naar een deterministisch, beheersbaar onderdeel van de moderne ML-pijplijn.