Sofortantwort
PPO einfach erklärt
Reinforcement-Learning-Algorithmus für stabiles LLM-Training mit Feedback.
- Kurz gesagt
- Standard-Algorithmus für RLHF bei LLMs (GPT, Claude, etc.)
- Typischer Einsatz
- RLHF für LLMs, Game AI, Robotik
- Wichtig zu wissen
- Balance zwischen Exploration (Neues probieren) und Exploitation (Bewährtes nutzen)
Proximal Policy Optimization im Überblick
PPO (Proximal Policy Optimization) ist der Algorithmus, der LLMs beibringt, “gute” Antworten zu geben. Nach dem Pre-Training lernt das Modell durch PPO, welche Antworten Menschen bevorzugen.
Der RLHF-Prozess mit PPO:
1. Pre-Training
Modell lernt Sprache aus Texten
↓
2. Supervised Fine-Tuning (SFT)
Modell lernt Instruktionen zu befolgen
↓
3. Reward Model Training
Separates Modell lernt, Antworten zu bewerten
↓
4. PPO Training
Modell optimiert sich auf hohe Reward-Scores
Warum “Proximal”?
PPO macht nur kleine Änderungen pro Trainingsschritt:
Ohne Clipping:
Alte Policy → [großer Sprung] → Neue Policy
↑ Kann instabil sein, "vergisst" Gelerntes
Mit PPO Clipping:
Alte Policy → [kleiner Schritt] → Neue Policy
↑ Stabil, behält Gelerntes bei
Die Kernidee:
- Vergleiche neue Policy mit alter Policy
- Wenn Änderung zu groß → abschneiden (clip)
- So bleibt Training stabil
Technisch betrachtet
PPO-Algorithmus (vereinfacht)
def ppo_update(model, old_model, prompts, rewards):
for prompt in prompts:
# Generiere Antwort mit aktuellem Modell
response = model.generate(prompt)
# Berechne Wahrscheinlichkeiten
new_log_prob = model.log_prob(response)
old_log_prob = old_model.log_prob(response)
# Ratio zwischen neuer und alter Policy
ratio = exp(new_log_prob - old_log_prob)
# Advantage (wie viel besser als erwartet?)
advantage = rewards[response] - baseline
# Clipped Objective
unclipped = ratio * advantage
clipped = clip(ratio, 1-epsilon, 1+epsilon) * advantage
# Nimm das Minimum (pessimistisch)
loss = -min(unclipped, clipped)
# Update
loss.backward()
optimizer.step()
Die PPO-Loss-Funktion
L_PPO = E[min(r_t * A_t, clip(r_t, 1-ε, 1+ε) * A_t)]
Wobei:
- r_t = π_new(a|s) / π_old(a|s) (Ratio)
- A_t = Advantage (Reward - Baseline)
- ε = Clipping-Parameter (typisch 0.1-0.2)
Warum Minimum?
- Wenn Advantage positiv: Verhindert zu große Erhöhung
- Wenn Advantage negativ: Verhindert zu große Verringerung
- Ergebnis: Konservative, stabile Updates
PPO für LLMs (RLHF)
from trl import PPOTrainer, PPOConfig
# Konfiguration
config = PPOConfig(
learning_rate=1e-5,
batch_size=64,
ppo_epochs=4,
cliprange=0.2,
vf_coef=0.1,
)
# Trainer
trainer = PPOTrainer(
config=config,
model=model,
ref_model=ref_model, # Frozen copy
tokenizer=tokenizer,
reward_model=reward_model,
)
# Training Loop
for batch in dataloader:
prompts = batch["prompts"]
# Generiere Responses
responses = trainer.generate(prompts)
# Berechne Rewards
rewards = reward_model(prompts, responses)
# PPO Update
stats = trainer.step(prompts, responses, rewards)
Hyperparameter
| Parameter | Typischer Wert | Beschreibung |
|---|---|---|
cliprange | 0.1-0.2 | Wie stark darf Policy sich ändern? |
ppo_epochs | 2-4 | Updates pro Batch |
learning_rate | 1e-5 - 1e-6 | Lernrate |
kl_coef | 0.1-0.2 | KL-Divergenz-Penalty |
vf_coef | 0.1 | Value Function Loss Weight |
PPO vs. DPO
| Aspekt | PPO | DPO |
|---|---|---|
| Reward Model | Benötigt | Nicht benötigt |
| Komplexität | Hoch | Niedrig |
| Training Zeit | Lang | Kurz |
| Stabilität | Gut (mit Tuning) | Sehr gut |
| Flexibilität | Hoch | Begrenzt |
| Online Learning | Ja | Nein |
Wann PPO, wann DPO?
PPO wenn:
- Reward Model bereits existiert
- Online-Feedback möglich
- Komplexe Reward-Strukturen
- Maximale Kontrolle nötig
DPO wenn:
- Schnelles Training wichtig
- Nur Präferenzdaten vorhanden
- Einfachheit bevorzugt
- Ressourcen begrenzt