Trainingsdaten
Die Datensätze, mit denen KI-Modelle trainiert werden – sie bestimmen maßgeblich, was ein Modell lernt, wie gut es funktioniert und welche Verzerrungen es aufweist.
Eine Trainingsstrategie, bei der Modelle zuerst mit einfachen Beispielen trainiert werden und die Schwierigkeit schrittweise erhöht wird – wie in der Schule.
Curriculum Learning trainiert Modelle wie Schüler: Erst einfache Aufgaben, dann schrittweise schwierigere. Das kann schnelleres und besseres Lernen ermöglichen.
Random Training vs. Curriculum:
Random Training:
Epoch 1: [schwer, leicht, mittel, schwer, leicht, schwer, mittel...]
→ Modell kämpft mit schweren Beispielen von Anfang an
Curriculum Learning:
Epoch 1: [leicht, leicht, leicht, leicht...]
Epoch 2: [leicht, mittel, leicht, mittel...]
Epoch 3: [mittel, mittel, schwer, mittel...]
Epoch 4: [schwer, schwer, schwer, schwer...]
→ Modell baut Verständnis schrittweise auf
Warum funktioniert das?
| Aspekt | Random | Curriculum |
|---|---|---|
| Frühe Gradienten | Chaotisch | Stabil |
| Konvergenz | Langsamer | Schneller |
| Lokale Minima | Mehr Risiko | Weniger Risiko |
| Finale Qualität | Gut | Oft besser |
Für Text/NLP:
def text_difficulty(text):
scores = []
# Länge
scores.append(len(text.split()) / 100)
# Vokabular-Komplexität
rare_words = count_rare_words(text)
scores.append(rare_words / len(text.split()))
# Syntaktische Komplexität
scores.append(count_clauses(text) / 10)
return sum(scores) / len(scores)
Für Bilder:
def image_difficulty(image):
# Anzahl Objekte
num_objects = detect_objects(image)
# Verdeckung
occlusion_score = estimate_occlusion(image)
# Bildqualität
noise_level = estimate_noise(image)
return (num_objects * 0.3 +
occlusion_score * 0.4 +
noise_level * 0.3)
Model-basiert (Self-Paced Learning):
def model_based_difficulty(model, example):
# Schwierigkeit = Loss des aktuellen Modells
with torch.no_grad():
loss = model.compute_loss(example)
return loss.item()
class CurriculumSampler(torch.utils.data.Sampler):
def __init__(self, dataset, difficulty_fn, num_epochs, current_epoch):
self.dataset = dataset
self.current_epoch = current_epoch
self.num_epochs = num_epochs
# Schwierigkeit für alle Beispiele berechnen
self.difficulties = [
difficulty_fn(dataset[i])
for i in range(len(dataset))
]
def __iter__(self):
# Anteil der Daten basierend auf Epoche
progress = self.current_epoch / self.num_epochs
# Threshold für Schwierigkeit
threshold = np.percentile(
self.difficulties,
min(100, 30 + 70 * progress) # 30% → 100%
)
# Nur Beispiele unter Threshold
indices = [
i for i, d in enumerate(self.difficulties)
if d <= threshold
]
random.shuffle(indices)
return iter(indices)
for epoch in range(num_epochs):
# Sampler mit aktuellem Fortschritt
sampler = CurriculumSampler(
dataset,
difficulty_fn,
num_epochs,
epoch
)
dataloader = DataLoader(dataset, sampler=sampler)
for batch in dataloader:
loss = model(batch)
loss.backward()
optimizer.step()
print(f"Epoch {epoch}: Using {len(sampler)} examples")
Anti-Curriculum:
Self-Paced Learning:
Competence-based:
def competence(epoch, total_epochs, c0=0.01):
"""
Wie viel des Curriculums ist 'freigeschaltet'?
Startet bei c0, endet bei 1.0
"""
return min(1.0, c0 + (1 - c0) * (epoch / total_epochs) ** 2)
| Szenario | Empfehlung |
|---|---|
| Begrenzte Compute-Ressourcen | ✅ Hilft bei Effizienz |
| Sehr schwieriger Task | ✅ Stabileres Training |
| Viel Daten, viel Compute | ⚠️ Weniger Vorteil |
| Schwierigkeit schwer zu definieren | ❌ Aufwand lohnt nicht |
Curriculum Learning ist wie Schulunterricht: Du lernst erst das Einmaleins, dann Bruchrechnung, dann Algebra. Würdest du mit Differentialgleichungen anfangen, wärst du überfordert und würdest nichts lernen.
Training beginnt mit einfachen Beispielen, Schwierigkeit steigt
Kann Konvergenz beschleunigen und finale Qualität verbessern
Erfordert Definition von 'Schwierigkeit' für die Daten
NLP-Training
Erst kurze Sätze, dann längere, komplexere Texte
Computer Vision
Erst klare Bilder, dann verrauschte oder verdeckte
Reinforcement Learning
Erst einfache Level, dann schwierigere
Code-Generierung
Erst einfache Funktionen, dann komplexe Systeme
Abhängig vom Task: Textlänge, Vokabular-Komplexität, Anzahl Objekte im Bild, Loss des Modells auf dem Beispiel. Oft heuristisch oder durch ein separates Modell.
Nicht immer. Bei ausreichend Daten und Compute kann Random Sampling gleichwertig sein. Curriculum hilft besonders bei begrenzten Ressourcen oder schwierigen Tasks.
Experimentell bestimmen. Zu schnell: Modell wird überfordert. Zu langsam: Verschwendete Trainingszeit. Oft: Linear oder exponentiell über Epochen.
Ja, beim Fine-Tuning. Erst einfache Beispiele des neuen Tasks, dann komplexere. Besonders hilfreich bei Domain-Shift.