Fine-Tuning
Das gezielte Nachtrainieren eines vortrainierten KI-Modells auf spezifische Daten oder Aufgaben, um es für einen bestimmten Einsatzzweck zu optimieren.
Der erste Schritt nach dem Pre-Training, bei dem LLMs auf Instruktions-Daten trainiert werden – macht aus einem Text-Vervollständiger einen hilfreichen Assistenten.
SFT (Supervised Fine-Tuning) trainiert ein vortrainiertes Sprachmodell darauf, Instruktionen zu befolgen. Nach dem Pre-Training kann ein Modell Text vervollständigen – nach SFT kann es Fragen beantworten und Aufgaben erledigen.
Der Unterschied:
Base Model (nach Pre-Training):
Input: "Was ist die Hauptstadt von Frankreich?"
Output: "Was ist die Hauptstadt von Deutschland? Was ist..."
↑ Vervollständigt nur, antwortet nicht
SFT Model:
Input: "Was ist die Hauptstadt von Frankreich?"
Output: "Die Hauptstadt von Frankreich ist Paris."
↑ Versteht und beantwortet die Frage
Die Training-Pipeline:
┌─────────────────┐
│ Pre-Training │ Riesige Textmengen, Next-Token-Prediction
│ (Base Model) │ → Sprachverständnis
└────────┬────────┘
↓
┌─────────────────┐
│ SFT │ (Instruktion, Antwort)-Paare
│ │ → Instruktionen befolgen
└────────┬────────┘
↓
┌─────────────────┐
│ RLHF / DPO │ Menschliche Präferenzen
│ (optional) │ → Besseres Alignment
└─────────────────┘
Chat-Format:
{
"messages": [
{"role": "system", "content": "Du bist ein hilfreicher Assistent."},
{"role": "user", "content": "Erkläre Photosynthese einfach."},
{"role": "assistant", "content": "Photosynthese ist der Prozess..."}
]
}
Instruction-Format:
{
"instruction": "Fasse den folgenden Text zusammen.",
"input": "Der lange Originaltext...",
"output": "Die Zusammenfassung..."
}
from trl import SFTTrainer
from transformers import AutoModelForCausalLM, AutoTokenizer
from datasets import load_dataset
# Modell und Tokenizer laden
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3-8B")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3-8B")
# Dataset laden
dataset = load_dataset("your-sft-dataset")
# Trainer konfigurieren
trainer = SFTTrainer(
model=model,
train_dataset=dataset,
tokenizer=tokenizer,
max_seq_length=2048,
dataset_text_field="text", # Oder formatting_func
)
# Training starten
trainer.train()
from peft import LoraConfig
from trl import SFTTrainer
lora_config = LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
)
trainer = SFTTrainer(
model=model,
train_dataset=dataset,
peft_config=lora_config, # LoRA aktivieren
max_seq_length=2048,
)
Gute SFT-Daten:
Schlechte SFT-Daten:
| Parameter | Typischer Wert | Anmerkung |
|---|---|---|
| Learning Rate | 1e-5 bis 5e-5 | Niedriger als Pre-Training |
| Epochs | 1-3 | Mehr kann zu Overfitting führen |
| Batch Size | 4-32 | Je nach GPU-Speicher |
| Max Seq Length | 2048-4096 | Abhängig von Daten |
| Warmup | 3-10% | Stabileres Training |
# Perplexity auf Held-out Set
eval_results = trainer.evaluate()
# Manuelle Evaluation
test_prompts = [
"Erkläre Machine Learning.",
"Schreibe ein Gedicht über KI.",
"Was ist 15 * 23?",
]
for prompt in test_prompts:
response = model.generate(prompt)
print(f"Prompt: {prompt}")
print(f"Response: {response}\n")
| Aspekt | SFT | RLHF |
|---|---|---|
| Daten | (Prompt, Response) | Präferenz-Rankings |
| Komplexität | Einfach | Komplex |
| Compute | Moderat | Hoch |
| Ergebnis | Instruktionen befolgen | Besser aligned |
| Wann nutzen | Immer als Basis | Für Top-Qualität |
SFT ist wie ein Praktikum nach dem Studium: Das Studium (Pre-Training) vermittelt breites Wissen, das Praktikum (SFT) lehrt, dieses Wissen praktisch anzuwenden – Fragen zu beantworten, Aufgaben zu erledigen.
Trainiert Modelle auf (Instruktion, Antwort)-Paare
Verwandelt Base Model in Instruction-Following Model
Vorstufe zu RLHF/DPO für weitere Alignment
Chat-Modelle
Base Model → Chat-fähiges Modell (GPT-4, Claude)
Task-spezifische Assistenten
Modell für spezifische Aufgaben trainieren
Domain-Anpassung
Allgemeines Modell auf Fachgebiet spezialisieren
Vorbereitung für RLHF
SFT-Modell als Startpunkt für Preference Learning
Praktisch dasselbe. SFT ist der technische Begriff (Supervised Fine-Tuning), Instruction Tuning beschreibt das Ziel (Instruktionen befolgen). Beide trainieren auf (Prompt, Response)-Paaren.
Nicht zwingend. SFT allein kann gute Ergebnisse liefern. RLHF/DPO verbessert Alignment weiter, ist aber aufwändiger. Für viele Anwendungen reicht SFT.
Qualität > Quantität. 1.000-10.000 hochwertige Beispiele können ausreichen. Mehr hilft, aber schlechte Daten schaden. Alpaca nutzte 52k, viele erfolgreiche Modelle weniger.
SFT IST eine Form von Fine-Tuning, speziell auf Instruktions-Daten. 'Full' bezieht sich auf alle Gewichte vs. LoRA/Adapter. Man kann SFT mit LoRA machen.