Erklärung zur Feinabstimmung von GRPO: Wie man einem lokalen LLM das Denken beibringt
GRPO gibt den Kritiker von PPO auf und lernt durch Vergleiche mit anderen Gruppen. Es wird auf die fünf zentralen Größen, die Belohnungsfunktionen sowie ein kurzes Trainingsskript für Unsloth und TRL eingegangen.
Modellarten, die auf logischem Denken ausgerichtet sind, wie DeepSeek-R1, haben viel Aufmerksamkeit erregt, und viele Menschen möchten nun dasselbe Verhalten in einem kleinen Modell, das sie selbst betreiben können. Die üblicherweise zugeschriebene Technik ist die GRPO-Feinabstimmung. Die überwachte Feinabstimmung (SFT) lehrt ein Modell, Muster in Beispielen nachzuahmen. Die Group Relative Policy Optimization (GRPO) nutzt das Verstärkungslernen, um ein Modell dazu zu bringen, Antworten zu liefern, die tatsächlich funktionieren – was dem Lehren, wie man denkt, näher kommt als dem Lehren, wie man klingt.
In diesem Artikel wird erläutert, wo GRPO unter den RLHF-Methoden steht, was ihre fünf Kerngrößen bedeuten und wie daraus einige Dutzend Zeilen an Trainingscode entstehen.
Stellung von GRPO unter den Präferenz-Feinabstimmungsmethoden
RLHF, das durch menschliche Rückmeldungen gestützte Lernen, sollte am besten als Sammelbegriff betrachtet werden. PPO, GRPO und DPO sind unterschiedliche Optimierer, die dasselbe Ziel verfolgen: ein Modell so anzupassen, dass es den Präferenzen der Menschen entspricht.
Eine Vergleich mit dem Kochen hilft. RLHF bedeutet, ein Gericht durch Probieren und Anpassungen zu verbessern. PPO ist ein älteres, aufwändigeres Verfahren, das ein zweites Modell (einen Kritiker) sowie viel GPU-Speicher erfordert. GRPO hingegen ist ein neueres, effizienteres Verfahren, das den Kritiker weglässt und durch den Vergleich der Antworten Speicher spart.
Der zugrundeliegende Lernalgorithmus
Im Allgemeinen läuft das Lernen mit Reinforcement Learning in einem Zyklus ab: Der Agent nimmt einen Zustand wahr, wählt eine Aktion aus, die Umgebung ändert sich, es kommt eine Belohnung und anschließend ein neuer Zustand. Als PPO (Proximal Policy Optimization) auf Sprachmodelle angewendet wurde, wurde das Sprachmodell zum Agenten, und die Konfiguration umfasste drei Komponenten:
- die Generierungsrichtlinie, also das Modell, das derzeit trainiert wird
- die Referenzrichtlinie, das ursprüngliche Modell, das eingefroren bleibt
- das Wertemodell, das eine durchschnittliche Belohnung schätzt
Ein Belohnungsmodell bewertet die Ausgaben, und das Training versucht, diese Bewertung zu erhöhen.
PPO folgt einem Actor-Critic-Design, was bedeutet, dass zwei getrennte Netzwerke trainiert werden. Der Actor ist das LLM selbst. Der Critic ist ein Wertemodell ähnlicher Größe, das die Belohnung vorhersagt, die eine Antwort erhalten sollte. Beides erhöht den während des Trainings benötigten Speicherbedarf etwa um das Doppelte.
GRPO verfügt über keinen Critic. Durch dessen Weglassen sinkt der Speicherverbrauch um etwa die Hälfte. Als Grundlinie generiert GRPO eine Gruppe von Antworten auf denselben Prompt, bewertet jede davon und verwendet den Durchschnitt der Gruppe als Referenzpunkt, um zu entscheiden, welche Antworten besser oder schlechter sind als die anderen.
DeepSeek stellte GRPO in seinem Paper DeepSeekMath von 2024 vor, und die Methode wurde später in DeepSeek-R1 integriert.
Die fünf Größen hinter GRPO
Fünf Konzepte bilden die Grundlage dieser Methode. Für jedes davon geht es darum zu erklären, was gemessen wird und warum es auf diese Weise konzipiert wurde.
1. Das Policy-Verhältnis: Wie weit hat sich die Meinung des Modells verändert?
Dieses Verhältnis vergleicht die von dem aktualisierten Modell für eine Antwort angegebene Wahrscheinlichkeit mit der Wahrscheinlichkeit, die das vorherige Modell angab: Die neue Antwortwahrscheinlichkeit für den Prompt x geteilt durch die alte.
Abgesehen von den Symbolen fragt es danach, wie viel wahrscheinlicher oder unwahrscheinlicher das Modell nun ist, diese Antwort zu liefern, im Vergleich zu vor diesem Trainingsschritt.
Stellen Sie sich einen Schüler vor, bevor und nach einer Nacht des Lernens. Einige Antworten erscheinen nun offensichtlicher, andere weniger. Das Verhältnis zeigt diesen Wandel im Selbstvertrauen des Modells wider.
- Mehr als 1 bedeutet, dass das Modell zu der Antwort mehr Vertrauen hat als zuvor.
- Kleiner als 1 bedeutet, dass das Vertrauen gesunken ist und das Modell sich von dieser Antwort entfernt.
- Genau 1 bedeutet, dass die Aktualisierung für diese Antwort nichts geändert hat.
Warum ist das wichtig? Im herkömmlichen Verstärkungslernen könnte man sagen, dass eine Antwort mit hoher Belohnung eine große Wahrscheinlichkeitssteigerung verdient. Das ist riskant, denn zu starke Anreize können dazu führen, dass das Modell wild schwankt und gutes Verhalten einfach deshalb verliert, weil eine einzige Antwort zufällig erfolgreich war. Das Verhältnis wirkt wie eine Geschwindigkeitsbegrenzung. GRPO begrenzt große Sprünge, sodass sich das Modell schrittweise und nicht unregelmäßig verändert.
2. Die durchschnittliche Belohnung: Wie hoch war die Durchschnittsnote dieser Gruppe?
Der Durchschnitt ist die Summe der Belohnungen für die Gruppe von G Antworten geteilt durch G. G ist die Anzahl der für eine Frage ausgewählten Antworten, und jede Antwort erhält eine Bewertung vom Belohnungsmodell.
Nehmen wir an, Sie bitten ein Modell, ein Mathematikproblem zu lösen, und ziehen fünf Antworten mit gewisser Zufälligkeit. Eine ist perfekt (Belohnung 1,0), eine weitere teilweise richtig (0,5) und eine dritte eindeutig falsch (0,0). Der Durchschnitt gibt an, wie gut das Modell im Moment bei diesem Problem abschneidet.
Die Rolle, die dabei eine wichtige Funktion spielt, macht GRPO besonders interessant. PPO benötigte einen Kritiker – ein zweites Netzwerk, dessen einzige Aufgabe darin bestand, die erwartete Belohnung vorherzusagen – und dessen Training kostspielig, memorienaufwendig und fehleranfällig war. GRPO fragt stattdessen, warum man den Durchschnitt vorhersagen soll, wenn man ihn einfach berechnen kann. Das Ziehen einer Gruppe von Antworten und das Durchschnittnehmen der tatsächlichen Belohnungen liefert kostenlos die Grundlage, ohne zusätzliches Netzwerk und ohne unnötigen Speicherverbrauch. Das ist der „Gruppe“-Anteil im Namen dieser Methode.
3. Die Standardabweichung: Wie stark sind die Werte verstreut?
Die Standardabweichung misst, wie weit jede Belohnung vom Mittelwert entfernt ist, indem sie die Quadratwurzel der durchschnittlichen quadrierten Differenz berechnet. Während der Mittelwert die typische Leistung beschreibt, gibt sie die Konstanz wieder.
Ein hoher Wert bedeutet, dass die Antworten sehr unterschiedlich sind – manche hervorragend, andere schlecht. Ein niedriger Wert bedeutet, dass das Modell jedes Mal ähnlich qualitativ hochwertige Antworten liefert.
Betrachten wir zwei Schüler. Schüler A erzielt die Noten 90, 10, 95, 5 und 88, was einen Mittelwert von 57,6 sowie eine große Streuung ergibt: äußerst inkonstant. Schüler B erzielt die Noten 58, 56, 60, 57 und 59, was einen Mittelwert von 58 sowie eine geringe Streuung bedeutet: zuverlässig mittelmäßig.
In GRPO dient die Standardabweichung als Normalisierer. Wenn die Antworten stark variieren, enthalten die Unterschiede zwischen den Belohnungen relevante Informationen und rechtfertigen größere Aktualisierungen. Wenn das Modell bereits konstant ist, können kleine Unterschiede in den Belohnungen Rauschen darstellen, weshalb die Aktualisierungen vorsichtiger erfolgen sollten.
4. Der gruppenbezogene Vorteil: Übertraf diese Antwort die anderen?
Dies ist der Kern der Methode. Der Vorteil für eine Antwort i besteht aus ihrer Belohnung abzüglich des Gruppendurchschnitts, geteilt durch die Standardabweichung der Gruppe. Dadurch werden Rohbelohnungen in einen relativen Wert umgewandelt, der das Lernen antreibt.
Durch die Subtraktion wird angezeigt, um wie viel besser oder schlechter eine Antwort im Vergleich zum Durchschnitt ist. Die Division skaliert nach der Streuung, sodass die Werte zwischen den Fragen sowie über die Trainingsschritte vergleichbar sind.
Stellen Sie sich eine sehr schwierige Prüfung vor, bei der der Klassendurchschnitt 40 von 100 Punkten beträgt. Ein Schüler erhält 60 Punkte. Als Rohwert klingt das durchschnittlich, doch im Vergleich zur Klasse liegt er 20 Punkte über dem Durchschnitt – was hervorragend ist. Der Vorteil funktioniert auf ähnliche Weise: Er ignoriert die absoluten Belohnungswerte und prüft, ob diese Antwort besser ist als das, was das Modell normalerweise für diesen Prompt erzeugt.
Drei Eigenschaften machen dies nützlich.
- Kein Kritiker. Der Vorteil von PPO hing davon ab, dass ein Kritiker die erwartete Belohnung schätzte. GRPO ersetzt diese Schätzung durch einen empirischen Durchschnitt innerhalb der Gruppe.
- Selbstkalibrierung. Wenn das Belohnungsmodell voreingenommen ist und alles zu hoch oder zu niedrig bewertet, gleicht die relative Form dieses Verzerrung aus. Nur die Rangfolge innerhalb der Gruppe ist relevant.
- Stabilität. Durch die Normalisierung passt sich die Lerngeschwindigkeit an. Wenn das Modell weitreichend erkundet, sind die Aktualisierungen ausgreifend. Im Laufe der Konvergenz werden sie sanfter.
5. Die KL-Bestrafung: Bleiben Sie erkennbar Sie selbst
Das ist die Sicherheitsbremse. Während GRPO das Modell in Richtung von Antworten mit hohen Belohnungen lenkt, zieht der KL-Termin in die entgegengesetzte Richtung und verhindert, dass das Modell zu jemand anderem wird. Er vergleicht das aktuelle Modell mit dem festgefrorenen Referenzmodell, das in der Regel das Basismodell vor Beginn des RL-Trainings ist. Die KL-Divergenz ist ein Maß dafür, wie stark zwei Wahrscheinlichkeitsverteilungen voneinander abweichen. Die in der Quelle angegebene Formel ist eine häufig verwendete Schätzung pro Token, die aus dem Verhältnis der Referenz- zu den aktuellen Wahrscheinlichkeiten gebildet wird.
Stellen Sie sich das Basismodell als gut gebildeten Allrounder vor, der Gedichte schreiben, Code debuggen und Nachrichten zusammenfassen kann. Nun führen Sie RL durch, um daraus einen Mathematikgenie zu machen. Ohne einen KL-Termin könnte es so sehr auf mathematische Belohnungen fokussiert sein, dass es alles andere vergisst – sogar sinnlose Inhalte im mathematischen Stil für unzusammenhängende Anfragen erzeugt.
Ein niedriger KL-Wert bedeutet, dass das Modell noch seinem ursprünglichen Zustand ähnelt. Ein hoher KL-Wert bedeutet, dass es weit abgewichen ist – möglicherweise durch Überanpassung an das Belohnungsmodell oder Verlust der allgemeinen Fähigkeit.
Belohnungsmodelle sind unvollkommen und können umgangen werden. Ein Modell ohne KL-Term könnte feststellen, dass das Aussprechen von „Lassen Sie mich Schritt für Schritt nachdenken“ zusätzliche Belohnung einbringt, selbst wenn es nichts hinzufügt. Das Festhalten an Referenzwerten ermöglicht so eine Art Belohnungsbetrug. In der Praxis tritt der KL-Term mit einem geringen Gewicht in die Verlustfunktion ein, etwa 0,01 bis 0,04. Er dient nicht dazu, Fortschritte zu stoppen, sondern nur dazu, diese auszugleichen.
Die vollständige Erklärung in einfachen Worten
- Erstellen Sie eine Gruppe von Antworten auf eine Frage.
- Bewerten Sie jede Antwort mit dem Belohnungsmodell.
- Berechnen Sie den Durchschnitt sowie die Standardabweichung dieser Bewertungen.
- Ermitteln Sie den Vorteil jeder Antwort, also um wie viel sie über oder unter dem Durchschnitt liegt.
Das Ergebnis ist ein Modell, das lernt zu reasoningen – nicht durch das Auswendiglernen richtiger Antworten, sondern indem es herausfindet, welche Denkmuster regelmäßig seine eigene Durchschnittswert übertrifft.
Von Gleichungen zu trainer.train()
Nun, da die Mathematik erläutert wurde, folgt Code, der dies in die Praxis umsetzt. Er verwendet Unsloth, um ein 4-Bit-Llama 3.2 3B Instruct-Modell mit vLLM-Backend zu laden, fügt LoRA-Adapter hinzu, erzwingt durch einen Systemprompt ein bestimmtes Reasoning-Format und erstellt das Trainingsset aus GSM8K. vLLM wird benötigt, weil GRPO viele Ergänzungen pro Prompt schnell generieren muss.
from unsloth import FastLanguageModel
from datasets import load_dataset
import re
# 1. Load 4-bit model with vLLM backend for fast group generation
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/Llama-3.2-3B-Instruct",
max_seq_length=1024,
load_in_4bit=True,
fast_inference=True,
max_lora_rank=32,
gpu_memory_utilization=0.6,
)
# 2. Attach LoRA adapters
model = FastLanguageModel.get_peft_model(
model,
r=32,
target_modules=["q_proj","k_proj","v_proj","o_proj","gate_proj","up_proj","down_proj"],
lora_alpha=64,
use_gradient_checkpointing="unsloth",
)
# 3. Enforcing reasoning format - GRPO needs structure to reward
SYSTEM_PROMPT = "Respond in the following format:\n<reasoning>\n...\n</reasoning>\n<answer>\n...\n</answer>"
# 4. Load GSM8K and wrap prompts
dataset = load_dataset("openai/gsm8k", "main")["train"]
dataset = dataset.map(lambda x: {
"prompt": [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": x["question"]}
],
"answer": x["answer"].split("####")[1].strip()
})
#vLLM is used in GRPO because GRPO requires the AI to generate a ma
Auszeichnungsfunktionen
Die Gestaltung der Auszeichnungen ist der sensibelste Teil der Feinabstimmung von GRPO. Wenn man hier Fehler macht, lernt das Modell, an den Bewertungsregeln zu manipulieren, anstatt logisch zu denken. Die individuellen Punktzahlen werden zu einer Rohauszeichnung summiert, die wiederum zur Berechnung des Vorteils verwendet wird. Die unten aufgeführte Liste enthält fünf Funktionen, von denen jede einen bestimmten Zweck hat.
- correctness_reward ist das Hauptsignal. Es extrahiert den Text innerhalb der Antwort-Tags und gibt 2,0 für eine Übereinstimmung mit der korrekten Lösung, ansonsten 0,0. Das Gewicht ist absichtlich hoch gewählt, damit das Richtige immer wichtiger ist als eine ordentliche Darstellung.
- int_reward dient als Sicherheitsnetz. Zu Beginn des Trainings ist fast alles falsch, daher wird bereits für die Erstellung einer gültigen Zahl 0,5 vergeben – dadurch bleibt ein gewisser Lernreiz bestehen, bis das Modell anfängt, Probleme zu lösen.
Allein betrachtet ist jede Funktion einfach. In Summe sorgt die Korrektheit für Qualität, das Format gibt Richtlinien vor und die Details kümmern sich selbst um Ordnung.
def extract_xml_answer(text: str) -> str:
return text.split("<answer>")[-1].split("</answer>")[0].strip()
# Primary signal: is the final answer correct?
def correctness_reward(prompts, completions, answer, **kwargs):
responses = [c[0]["content"] for c in completions]
extracted = [extract_xml_answer(r) for r in responses]
return [2.0 if r == a else 0.0 for r, a in zip(extracted, answer)]
# Dense shaping rewards - keep learning signal alive even when answers are wrong
def int_reward(completions, **kwargs):
return [0.5 if extract_xml_answer(c[0]["content"]).isdigit() else 0.0 for c in completions]
def strict_format_reward(completions, **kwargs):
pattern = r"^<reasoning>\n.*?\n</reasoning>\n<answer>\n.*?\n</answer>\nquot;
return [0.5 if re.match(pattern, c[0]["content"]) else 0.0 for c in completions]
def soft_format_reward(completions, **kwargs):
pattern = r"<reasoning>.*?</reasoning>\s*<answer>.*?</answer>"
return [0.5 if re.match(pattern, c[0]["content"]) else 0.0 for c in completions]
def xmlcount_reward(completions, **kwargs):
def score(text):
count = 0.0
if text.count("<reasoning>\n") == 1: count += 0.125
if text.count("\n</reasoning>\n") == 1: count += 0.125
if text.count("\n<answer>\n") == 1:
count += 0.125
count -= len(text.split("\n</answer>\n")[-1]) * 0.001
if text.count("\n</answer>") == 1:
count += 0.125
count -= (len(text.split("\n</answer>")[-1]) - 1) * 0.001
return count
return [score(c[0]["content"]) for c in completions]pyt
Der Trainer
from trl import GRPOConfig, GRPOTrainer
trainer = GRPOTrainer(
model=model,
processing_class=tokenizer,
reward_funcs=[
xmlcount_reward, # tag quality
soft_format_reward, # structure (forgiving)
strict_format_reward, # structure (exact)
int_reward, # partial credit
correctness_reward, # ground-truth match
],
args=GRPOConfig(
learning_rate=5e-6,
per_device_train_batch_size=1,
gradient_accumulation_steps=1,
num_generations=8, # G = group size
max_prompt_length=256,
max_completion_length=200,
max_steps=250,
warmup_ratio=0.1,
max_grad_norm=0.1,
output_dir="outputs",
),
train_dataset=dataset,
)
trainer.train()
Bei jedem Schritt führt GRPOTrainer die oben beschriebenen fünf Berechnungen durch.
Warum DPO Schwierigkeiten mit dem Schlussfolgern hat
DPO ist elegant, weil es das Verstärkungslernen völlig umgeht. Es formuliert das Problem neu als Klassifizierung: Gegeben ein Prompt und zwei Antworten, lernt man, die bessere Antwort zu bevorzugen. Das funktioniert gut, wenn die Präferenzlabels aussagekräftig sind.
Das Schlussfolgern ist jedoch eigentlich kein Präferenzproblem – es handelt sich dabei um ein Suchproblem.
Nehmen wir an, man möchte, dass ein Modell einen geometrischen Satz beweist. DPO benötigt eine Person oder ein stärkeres Modell, das entscheidet, welcher der beiden Beweise besser ist. Was passiert, wenn beide falsch sind? Oder wenn der richtige Beweis 12 Schritte umfasst und nie ausgewählt wird? DPO lernt nur von den Paaren, die ihm gegeben werden, und kann keine neue Strategie zum Schlussfolgern entwickeln.
GRPO erzeugt eine Gruppe von Antworten auf dieselbe Anfrage, bewertet jede davon und fragt heraus, welche über dem Durchschnitt liegt. Das bedeutet, es erkundet mögliche Lösungswege. Es kann auf einen unbekannten Denkansatz stoßen, diesen gut bewerten und ausbauen – ohne dass zuvor jemand diesen Weg notiert hat.
Einfach ausgedrückt ist DPO günstiger in der Anwendung, beschränkt das Modell jedoch auf die Qualität seiner Präferenzdaten. GRPO kostet zwar pro Schritt mehr, kann aber über menschlich beschriftete Daten hinaus zu wirklich neuen Denkweisen gelangen.
Zusammenfassende Gedanken
GRPO lehrt ein Modell, durch das Lernen herauszufinden, welche seiner eigenen Antworten über dem Durchschnitt liegen. Durch das Entfernen des Kritikers wird der Speicherverbrauch verringert, während das Lernsignal erhalten bleibt. Mit sinnvollen Belohnungsfunktionen sowie Gruppenerhebungen lässt sich das Denken eines lokalen Modells auf einer einzigen GPU verbessern. Belohnen Sie das Verhalten, das Sie tatsächlich möchten, halten Sie das Modell stabil und achten Sie auf den KL-Wert.