13  Das Herzstück des Lernens: Backpropagation im Detail

Die Forward-Propagation liefert uns ein Ergebnis. Doch am Anfang sind die Gewichte rein zufällig gesetzt – die Vorhersage wird also höchstwahrscheinlich falsch sein. Damit das Netzwerk lernen kann, müssen wir präzise bestimmen, wie jedes einzelne Gewicht zum Gesamtfehler beigetragen hat.

13.1 1. Den Fehler messen: Die Loss-Funktion

Bevor wir rückwärts rechnen können, brauchen wir einen Vergleichswert. Wir nehmen an, wir kennen für unsere Trainingsdaten den gewünschten Zielwert (den Target-Vektor \(\mathbf{y}\)).

Den Unterschied zwischen der tatsächlichen Aktivierung der Ausgabeschicht \(\mathbf{a}^{(L)}\) und dem Zielwert \(\mathbf{y}\) messen wir mit einer Loss-Funktion \(L\). Ein klassisches Beispiel ist der quadratische Fehler für ein einzelnes Trainingsbeispiel:

\[L = \frac{1}{2} \sum_{i} (y_i - a^{(L)}_i)^2\]

Das Ziel des Lernens ist es, diesen Wert \(L\) durch geschicktes Anpassen der Gewichte gegen Null zu bringen.

13.2 2. Die detaillierte Fehler-Rechnung

Wir wollen nun wissen, wie wir ein Gewicht \(W^{(l)}_{i,j}\) in einer beliebigen Schicht anpassen müssen. Dafür nutzen wir die mehrdimensionale Kettenregel, um die Ableitung \(\frac{\partial L}{\partial W^{(l)}_{i,j}}\) zu berechnen.

Wir schlüsseln diese Berechnung in drei logische Etappen auf, die wir von hinten nach vorne durchlaufen.

13.2.1 Etappe A: Wie stark ändert sich der Fehler durch das Neuron?

Zuerst schauen wir uns an, wie empfindlich der Gesamtfehler \(L\) auf eine Änderung der Aktivierung \(a^{(l)}_i\) reagiert. In der letzten Schicht (\(L\)) ist das einfach die Ableitung unserer Loss-Funktion:

\[\frac{\partial L}{\partial a^{(L)}_i} = a^{(L)}_i - y_i\]

13.2.2 Etappe B: Der Einfluss der Aktivierungsfunktion

Die Aktivierung \(a^{(l)}_i\) entstand aus der Summe \(z^{(l)}_i\) durch eine Funktion (z. B. Sigmoid oder ReLU). Wir müssen wissen, wie stark sich das Signal durch diese Funktion verändert hat. Das ist die Ableitung der Aktivierungsfunktion \(f'\) an der Stelle \(z\):

\[\frac{\partial a^{(l)}_i}{\partial z^{(l)}_i} = f'(z^{(l)}_i)\]

13.2.3 Etappe C: Der Einfluss des Gewichts auf die Summe

Zuletzt fragen wir: Wie stark ändert sich die Summe \(z^{(l)}_i\), wenn ich an dem Gewicht \(W^{(l)}_{i,j}\) drehe? Da \(z\) die Summe aus \((W \cdot a) + b\) ist, bleibt nach der Ableitung nach einem spezifischen Gewicht einfach nur die Aktivierung des Sender-Neurons übrig:

\[\frac{\partial z^{(l)}_i}{\partial W^{(l)}_{i,j}} = a^{(l-1)}_j\]

13.3 3. Die vollständige Kette (Backpropagation)

Setzen wir diese Etappen nach der Kettenregel zusammen, erhalten wir für ein Gewicht in der Ausgangsschicht:

\[\frac{\partial L}{\partial W^{(L)}_{i,j}} = \underbrace{(a^{(L)}_i - y_i)}_{\text{Fehler-Anteil}} \cdot \underbrace{f'(z^{(L)}_i)}_{\text{Aktivierungs-Steigung}} \cdot \underbrace{a^{(L-1)}_j}_{\text{Eingangs-Signal}}\]

13.3.1 Der „Back“-Schritt: Den Fehler weiterreichen

Um Gewichte in noch tieferen Schichten (z. B. Schicht \(L-1\)) zu berechnen, nutzen wir ein wichtiges Zwischenergebnis, das wir oft als Fehlersignal \(\delta\) (Delta) bezeichnen.

Der Fehler eines Neurons in Schicht \(l\) setzt sich zusammen aus allen Fehlern der Neuronen in Schicht \(l+1\), mit denen es verbunden ist – gewichtet mit der Stärke der Verbindung. So „fließt“ die Information über den Fehler mathematisch präzise von rechts nach links durch das gesamte Netz.

\[\delta^{(l)}_i = \left( \sum_{k} W^{(l+1)}_{k,i} \cdot \delta^{(l+1)}_{k} \right) \cdot f'(z^{(l)}_i)\]


13.4 4. Das Gewicht-Update: Gradient Descent

Sobald wir die Ableitung \(\frac{\partial L}{\partial W^{(l)}_{i,j}}\) für jedes Gewicht im Netz kennen, haben wir den Gradienten. Dieser zeigt in die Richtung des steilsten Fehler-Anstiegs. Diesen können wir dann im bereits bekannten Gradientenverfahren oder einer moderneren Variante wie z. B. *Momentum, RMSProp oder ADAM** verarbeiten.