Training

01.05.2026 13:22

Definition

Training ist der Prozess, bei dem ein neuronales Netz durch iterative Anpassung seiner Gewichte auf Basis von Trainingsdaten lernt, Eingabe-Ausgabe-Muster vorherzusagen. Im modernen KI-Kontext (LLMs, Diffusion-Modelle) bedeutet dies: Millarden von Token oder Bildern durch das Netz laufen lassen, dabei Verluste berechnen (z.B. Next-Token-Prediction) und Gewichte mit Optimierern wie Adam zur Minimierung des Verlusts aktualisieren — ein kostspieliger Prozess, der bei großen Modellen Wochen auf Multi-GPU-Clustern dauert und später durch günstigeres Fine-Tuning ersetzt werden kann.

Mechanik

Das Training folgt dem klassischen Loop: (1) Forward Pass — Input durch alle Schichten des Netzes propagieren, (2) Loss-Berechnung — Differenz zwischen Vorhersage und Ground-Truth messen (meist Cross-Entropy für LLMs), (3) Backward Pass — Gradienten via Backpropagation durch alle Parameter berechnen, (4) Weight Update — Parameter mit Lernrate und Optimizer-Regel anpassen (z.B. w = w - lr * grad). Dieser Loop läuft über viele Epochen oder, bei LLMs, über Milliarden Token in einer einzigen Epoche. Checkpoints werden regelmäßig gespeichert, um Training bei Fehlern fortzusetzen oder das beste Modell zu halten.

Beispiel

Minimalbeispiel: Training eines einfachen 2-schichtigen Netzes auf Klassifikation

import numpy as np

# Dummy-Daten: 100 Samples, 5 Features, 3 Klassen
np.random.seed(42)
X_train = np.random.randn(100, 5)
y_train = np.random.randint(0, 3, 100)

# Einfaches Netz: Input→Hidden(10)→Output(3)
W1 = np.random.randn(5, 10) * 0.01
b1 = np.zeros(10)
W2 = np.random.randn(10, 3) * 0.01
b2 = np.zeros(3)

def softmax(x):
    ex = np.exp(x - x.max(axis=1, keepdims=True))
    return ex / ex.sum(axis=1, keepdims=True)

def forward(X):
    global W1, b1, W2, b2
    z1 = X @ W1 + b1
    h1 = np.maximum(0, z1)  # ReLU
    z2 = h1 @ W2 + b2
    return softmax(z2), h1, z1

def loss_fn(logits, y_true):
    m = len(y_true)
    loss = -np.log(logits[np.arange(m), y_true] + 1e-8).mean()
    return loss

# Training-Loop
lr = 0.01
for epoch in range(50):
    logits, h1, z1 = forward(X_train)
    loss = loss_fn(logits, y_train)

    # Backprop (vereinfacht)
    m = len(y_train)
    dloss = logits.copy()
    dloss[np.arange(m), y_train] -= 1
    dloss /= m

    dW2 = h1.T @ dloss
    db2 = dloss.sum(axis=0)
    dh1 = dloss @ W2.T
    dz1 = dh1 * (z1 > 0)  # ReLU gradient
    dW1 = X_train.T @ dz1
    db1 = dz1.sum(axis=0)

    # Update
    W2 -= lr * dW2
    b2 -= lr * db2
    W1 -= lr * dW1
    b1 -= lr * db1

    if epoch % 10 == 0:
        print(f"Epoch {epoch:3d} | Loss: {loss:.4f}")

In der Praxis mit großen Modellen nutzt man Frameworks wie PyTorch und Optimierer wie AdamW:

filename="train_llm_simple.py"
pip="torch transformers datasets"
pre="ollama pull llama2:7b || true"
# Hinweis: Dieser Code demonstriert die Struktur; echtes LLM-Training 
# braucht GPUs und viel mehr Setup (Distributed Training, Gradient Accumulation etc.)

import torch
from torch.optim import AdamW

# Dummy-Modell und Daten
model = torch.nn.Sequential(
    torch.nn.Linear(512, 2048),
    torch.nn.ReLU(),
    torch.nn.Linear(2048, 50257)  # Vereinfacht: nur 50k Token
)

optimizer = AdamW(model.parameters(), lr=1e-4)
loss_fn = torch.nn.CrossEntropyLoss()

# Simulated Token-Batch (in echtem Training: aus Dataloader)
X = torch.randn(32, 512)  # 32 sequences, 512-dim embeddings
targets = torch.randint(0, 50257, (32,))

# Ein Training-Step
optimizer.zero_grad()
logits = model(X)
loss = loss_fn(logits, targets)
loss.backward()
optimizer.step()

print(f"Loss: {loss.item():.4f}")

Quellen