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 Lernen stabilisieren oder beschleunigen, funktioniert aber nicht für jeden Task automatisch besser.
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 | können stark variieren | können stabiler sein |
| Konvergenz | taskabhängig | kann schneller sein |
| Lokale Minima | taskabhängig | kann helfen |
| Finale Qualität | baselineabhängig | kann besser sein |
Für Text/NLP:
def text_difficulty(text):
scores = []
# Länge
scores.append(len(text.split()) / reference_length)
# Vokabular-Komplexität
rare_words = count_rare_words(text)
scores.append(rare_words / len(text.split()))
# Syntaktische Komplexität
scores.append(count_clauses(text) / reference_clause_count)
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 * object_weight +
occlusion_score * occlusion_weight +
noise_level * noise_weight)
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(max_percentile, start_percentile + growth_range * progress)
)
# 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):
"""
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 | kann Effizienz verbessern |
| Sehr schwieriger Task | kann Training stabilisieren |
| Viel Daten, viel Compute | Nutzen separat validieren |
| Schwierigkeit schwer zu definieren | Aufwand kritisch prüfen |
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 und Qualität verbessern, hängt aber stark vom Task ab
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, robustem Training und gutem Sampling kann Random Sampling ähnlich gut sein. Curriculum Learning hilft vor allem dann, wenn Schwierigkeit sinnvoll messbar ist und das Training sonst instabil wird.
Experimentell bestimmen. Zu schnelle Erhöhung kann das Modell überfordern, zu langsame Erhöhung kann ineffizient sein. Linear, stufenweise oder adaptive Strategien sollten validiert werden.
Ja, besonders beim Fine-Tuning kann ein Curriculum sinnvoll sein. Der Nutzen hängt davon ab, wie stark der neue Task vom Pretraining abweicht und ob einfache Beispiele wirklich hilfreiche Zwischenschritte sind.