Mathe: Cross-Entropy & Gradient Descent

Die Intuition war: gewichtete Summe + Sigmoid. Jetzt die Frage, die in jeder Prüfung kommt: Woher kommen die Gewichte? Antwort: aus einem Optimierungsproblem — Loss-Funktion definieren, Gradient ausrechnen, bergab laufen.

Trainingsziel: Finde Gewichte w und Bias b, die den Trainingsdaten die höchste Wahrscheinlichkeit geben (Maximum Likelihood) — gleichbedeutend mit: minimiere die Cross-Entropy.

Schritt 1: Das Modell

z = w·x + b     p̂ = σ(z) = 1 / (1 + e−z)

x ist unser Feature-Vektor (512 Histogramm-Werte), w hat dieselbe Länge, p̂ ist die vorhergesagte Wahrscheinlichkeit für „krank“ (binärer Fall — Softmax kommt unten).

Schritt 2: Die Loss-Funktion (Binary Cross-Entropy)

L(w, b) = −(1/n) Σᵢ [ yᵢ · log(p̂ᵢ) + (1 − yᵢ) · log(1 − p̂ᵢ) ]

Lies es so: Für ein krankes Blatt (y=1) zählt nur −log(p̂) — je näher p̂ an 1, desto kleiner die Strafe. Für ein gesundes (y=0) zählt −log(1−p̂). Entscheidend ist die Form der Strafe: log explodiert nahe 0. Ein Modell, das sich mit p̂ = 0,99 irrt, zahlt dafür drastisch — selbstbewusst falsch ist die teuerste Art, falsch zu sein.

Schritt 3: Der Gradient

Das Schöne an der Kombination Sigmoid + Cross-Entropy: Beim Ableiten kürzt sich fast alles weg und übrig bleibt:

∂L/∂w = (1/n) Σᵢ (p̂ᵢ − yᵢ) · xᵢ     ∂L/∂b = (1/n) Σᵢ (p̂ᵢ − yᵢ)

Der Gradient ist einfach Fehler mal Input: Wo das Modell daneben liegt (p̂ − y groß), werden genau die Gewichte der Features korrigiert, die an dieser Vorhersage beteiligt waren.

Schritt 4: Gradient Descent

w ← w − η · ∂L/∂w
  1. Gewichte zufällig (oder mit 0) initialisieren.
  2. Vorhersagen für die Trainingsdaten berechnen.
  3. Gradient ausrechnen — die Richtung des steilsten Anstiegs.
  4. Einen kleinen Schritt (Lernrate η) in die Gegenrichtung gehen.
  5. Wiederholen, bis sich der Loss kaum noch bewegt.

In scikit-learn übernehmen das Solver wie lbfgs oder saga — cleverere Varianten desselben Prinzips. Beim CNN-Training begegnet dir exakt derselbe Mechanismus wieder, nur mit Millionen Parametern statt 512.

Von 2 auf 38 Klassen: Softmax

p̂ₖ = ezₖ / Σⱼ ezⱼ    mit   zₖ = wₖ·x + bₖ

Pro Klasse ein eigener Gewichtsvektor → 38 Scores, die Softmax normiert sie zu einer Verteilung. Die Loss-Funktion wird zur kategorischen Cross-Entropy: −log(p̂ der wahren Klasse). Bei 512 Features sind das 38 × 513 ≈ 19.500 lernbare Parameter — winzig im Vergleich zu jedem CNN.

Warum eigentlich?Warum nicht einfach MSE als Loss?
Mean Squared Error funktioniert formal, hat aber zwei Probleme. Erstens: MSE durch die Sigmoid ist nicht konvex — die Loss-Landschaft hat lokale Mulden, Gradient Descent kann steckenbleiben. Cross-Entropy + Sigmoid ist konvex: ein einziges globales Minimum, garantiert findbar. Zweitens: Bei MSE wird der Gradient gerade dann winzig, wenn das Modell selbstbewusst falsch liegt (Sigmoid-Sättigung) — das Lernen stirbt ab, wo es am nötigsten wäre. Cross-Entropy hält den Gradienten dort groß.
Häufiger Denkfehlerp̂ = 0,93 heißt nicht: zu 93 % sicher wahr
Die Softmax-Ausgabe ist eine modellinterne Größe, keine geprüfte Wahrscheinlichkeit. Ein Modell kann systematisch überkonfident sein: im Schnitt 95 % behaupten, aber nur 80 % Trefferquote liefern. Wer die Werte ernsthaft als Wahrscheinlichkeiten nutzen will (z.B. „nur ab 90 % automatisch handeln“), muss Kalibrierung messen (Reliability Diagram) und ggf. nachkalibrieren (Platt Scaling, Isotonic Regression).
Tiefer reinRegularisierung steckt schon in der Loss
scikit-learn minimiert standardmäßig nicht die reine Cross-Entropy, sondern L + (1/C) · ||w||² — eine L2-Strafe auf große Gewichte. Statistisch entspricht das einem Gauß-Prior auf w (MAP-Schätzung statt Maximum Likelihood): Ohne Gegenbeweis sollen Gewichte klein bleiben. Das verhindert, dass einzelne, zufällig im Training nützliche Histogramm-Bins absurd hohe Gewichte bekommen — der wichtigste Schutz gegen Overfitting bei vielen Features. Der Parameter C steuert die Stärke; die Tuning-Lektion dreht genau an diesem Knopf.