Updates dieser Seite:

  • 21.03.2022: v1 neues Semester

Überblick

In diesem Kapitel geht es um die mathematische Herleitung der Backpropagation-Formeln. Sie sollten also mit Kapitel 5 (Feedforward-Netze II) vertraut sein.

Notation

In diesem Kapitel werden wir folgende Notation verwenden.

Symbol Bedeutung
$n$ Anzahl der Eingabeneuronen
$m$ Anzahl der Ausgabeneuronen
$L$ Anzahl der Schichten
$n_l$ Anzahl der Neuronen in Schicht $l$
$N$ Anzahl der Trainingsbeispiele
$(x^k, y^k)$ $k$-tes Trainingsbeispiel mit Featurevektor $x^k$ und korrektem Output $y^k$ (auch: Label, Klasse)
$W^{(l)}$ Gewichtsmatrix von Schicht $l$ zu Schicht $l+1$
$b^{(l)}$ Bias-Gewichte (Vektor) von Schicht $l$ zu Schicht $l+1$
$z^{(l)}$ Rohinput (Vektor) der Neuronen in Schicht $l$
$g$ Aktivierungsfunktion
$a^{(l)}$ Aktivierung (Vektor) der Neuronen in Schicht $l$
$\hat{y}$ Berechnete Ausgabe (Vorhersage) des Netzwerks bei einer Eingabe $x$ mit den aktuellen Gewichten
$J$ Zielfunktion in Form einer Fehler- oder Kostenfunktion (loss function), die es zu minimieren gilt
$\lambda$ Regularisierungsparameter (kommt in $J$ zum Einsatz)
$\delta^{(l)}$ Fehlerwerte (Vektor) an den Neuronen in Schicht $l$

1 Vorbereitung

Zunächst sammeln wir nochmal alle Formeln ein, die relevant sind. Wir unterscheiden zwischen Formeln, die gegeben sind, und solchen, die gesucht - also herzuleiten - sind.

Gegeben: Kostenfunktion

Wir definieren wir die Kostenfunktion $J$ für binäre Klassifikation und zunächst nur für ein einziges Trainingsbeispiel $(x, y)$ mit der entsprechend berechnten Ausgabe $\hat{y}$. Wir summieren über alle $m$ Ausgabeneuronen $y_1, \ldots, y_m$:

$$ \tag{CE1} J(x, y) = - \sum_{i=1}^m y_i \; log(\hat{y}_i) + (1 - y_i) \; log(1 - \hat{y}_i) $$

Man nennt diese Funktion auch die Cross-Entropy-Funktion. Wir werden uns im Folgenden nur mit $J$ auf diese Funktion beziehen.

Die tatsächliche Kostenfunktion muss alle Trainingsbeispiele $(x^k, y^k)$ mit $k \in \{1, \ldots, N\}$ berücksichtigen und lautet:

$$ \tag{CE2} J_\text{alle} = - \frac{1}{N} \sum_{k=1}^N \sum_{i=1}^m y_i^k \; log(\hat{y}_i^k) + (1 - y_i^k) \; log(1 - \hat{y}_i^k) $$

Das entspricht der Summe der Fehlerfunktionen für einzelne Trainingsbeispiele, d.h. der Zusammenhang zwischen (CE1) und (CE2) ist wie folgt:

$$ J_\text{alle} = \frac{1}{N} \sum_{k=1}^N J(x^k, y^k) $$

Für unsere Herleitung lassen wir den L2-Regularisierungsterm weg bzw. setzen $\lambda = 0$.

Gegeben: Formeln für Forward Propagation

Für die Vorwärtsverarbeitung berechnen wir für jede Schicht $l$ den Rohinput $z^{(l)}$ und die Aktivierung $a^{(l)}$.

Zunächst in der Komponentenschreibweise:

$$ \begin{align} \tag{FP1k} z_i^{(l)} & = \sum_{j=1}^{n_{l-1}} w^{(l-1)}_{i,j} \; a_j^{(l-1)} + b_i^{(l-1)} \\[3mm] \tag{FP2k} a_i^{(l)} &= g(z_i^{(l)}) \end{align} $$

Jetzt in der kompakten Vektorschreibweise:

$$ \begin{align} \label{fp1}\tag{FP1} z^{(l)} &= W^{(l-1)} \; a^{(l-1)} + b^{(l-1)} \\[3mm] \label{fp2}\tag{FP2} a^{(l)} &= g(z^{(l)}) \end{align} $$

Gesucht: Formeln für Backpropagation

Für die Rückwärtsverarbeitung berechnen wir rückwärts-schichtweise die Fehlerterme $\delta$ und die Updates für Gewichtsmatrizen $\Delta W$ und die Updates für die Bias-Vektoren $\Delta b$.

$$ \begin{align} \label{bp1}\tag{BP1-b}\delta^{(l)} & = \begin{cases} \hat{y} - y & \mbox{wenn}\quad l = L\\[3mm] (W^{(l)})^T \; \delta^{l+1} \odot a^{(l)} \odot (1 - a^{(l)})& \mbox{wenn}\quad l \in \{2, \ldots, L-1\} \end{cases}\\[5mm] \label{bp2}\tag{BP2} \Delta W^{(l)} & = - \delta^{(l+1)} \: (a^{(l)})^T \\[3mm] \label{bp3}\tag{BP3} \Delta b^{(l)} & = - \delta^{(l+1)} \end{align} $$

Dies sind die Formeln, die wir herleiten möchten. Im Folgenden formulieren wir die Formeln leicht um, damit wir uns in der Herleitung leichter tun.

BD1: Fehler an der Ausgabeschicht

Diese Formel berechnet den Fehler an der Ausgabeschicht $L$:

$$ \label{BD1}\tag{BD1} \delta_j^{(L)} = \hat{y}_j^{(L)} - y_j $$

BD2: Fehler an einer Zwischenschicht

Die nächste Formel gibt uns die Möglichkeit, den Fehler an einer Zwischenschicht $l$ (nicht Ein- oder Ausgabeschicht) zu berechnen:

$$ \delta^{(l)} = \left[ \left( W^{(l)} \right)^T \delta^{(l+1)} \right] \odot g'(z^{(l)}) \label{BD2}\tag{BD2} $$

für $l \in \{1,\ldots, L-1\}$.

BW1: Gewichte

Wir wollen anhand der Fehlerterme $\delta$ die eigentliche Änderungsrate der Gewichte berechnen. Dies ist schließlich der Betrag, den wir für das Update benötigen. Wir betrachten also die Änderung der Gewichte mit Hilfe der Fehlerterme $\delta$:

$$ \frac{\partial J}{\partial w^{(l)}_{j,k}} = a^{(l)}_k \delta^{(l+1)}_j \label{BW1}\tag{BW1} $$

für $l \in \{1,\ldots, L-1\}$.

BW2: Gewichte der Bias-Vektoren

Und dann schließlich die Änderung der Gewichte der Bias-Neuronen:

$$ \frac{\partial J}{\partial b^{(l)}_i} = \delta^{(l+1)}_i \label{BW2}\tag{BW2} $$

für $l \in \{1,\ldots, L-1\}$.

2 Herleitung

Jetzt leiten wir die zentralen Backpropagation-Formeln (BD1), (BD2), (BW1) und (BW2) her.

2.1 Ziel

Worum geht es genau? Wir möchten unser Netzwerk so optimieren, dass der Fehler so gering wie möglich wird. Das, was wir verändern, sind die Gewichte des Netzes.

Der Fehler wird mit $J$ gemessen. Die Frage ist, wie wir die Gewichte $w$ verändern, damit $J$ stets etwas kleiner wird. Wir wissen, dass die Ableitung von $J$ bezüglich eines speziellen $w$ in die Richtung zeigt, in der $J$ größer wird. Also nehmen wir den negativen Wert der Ableitung, um $w$ anzupassen.

Im Kern der Methode steht also, die Ableitung von $J$ in Bezug auf jedes Gewicht $w$ zu berechnen. Genauer gesagt suchen wir alle partiellen Ableitungen

$$ \frac{\partial J}{\partial w^{(l)}_{i,j}} $$

für alle Schichten $l\in\{1,\ldots,L-1\}$, wobei $j \in \{1, \ldots, n_l\}$ und $i \in \{1, \ldots, n_{l+1}\}$.

Da wir die Bias-Neuronen gesondert betrachten, wollen wir außerdem die Ableitung der Fehlerfunktion nach den Bias-Gewichten $b$ herleiten:

$$ \frac{\partial J}{\partial b^{(l)}_{i}} $$

wobei das $i \in \{1, \ldots, n_{l+1}\}$.

Kurz gesagt ist unser Ziel also, die Ableitung der Fehlerfunktion nach allen Gewichten zu berechnen.

2.2 Netz mit drei Schichten

Wir betrachten zunächst ein Netz mit nur drei Schichten und verallgemeinern im Anschluss auf ein Netz mit beliebig vielen Schichten. Sie werden sehen, dass man mit drei Schichten alle Fälle abdeckt.

Die folgende Abbildung ist eine reduzierte Darstellung des Beispielnetzes. Die Anzahl der Neuronen pro Schicht ist aber allgemein gehalten über die Bezeichnung $n_l$, wobei $l\in\{1,2\}$ die Schicht angibt.

Warum betrachten wir ein 3-Schichten-Netz? In der Herleitung von Backpropagation unterscheidet man auch im allgemeinen Fall (mit beliebig vielen Schichten) nur zwischen den Gewichten zur Ausgabeschicht und allen anderen Gewichten. Dies kann man auch bei einem 3-Schichten-Netzwerk tun.

Wir gehen in zwei Schritten vor. Zunächst betrachten wir ein Gewicht zur letzten Schicht.

2.3 Schritt 1: Gewicht einer Verbindung zur Ausgabeschicht

Da Backpropagation von Schicht 3 zu Schicht 1 arbeitet, wählen wir zunächst eines der "hinteren" Gewichte, also ein Gewicht aus $W^{(2)}$. Wir nennen dieses einzelne Gewicht $w^{(2)}_{i,j}$, es befindet sich irgendwo zwischen der zweiten und dritten Schicht.

Um $w^{(2)}_{i,j}$ zu verändern, wollen wir wissen, wie sich die Fehlerfunktion $J$ verhält, wenn wir $w^{(2)}_{i,j}$ ein bisschen kleiner oder größer machen. Genau das sagt uns die Ableitung von $J$ nach $w^{(2)}_{i,j}$, also

$$ \tag{a} \frac{\partial J}{\partial w^{(2)}_{i,j}} $$

Wir schauen uns die Fehlerfunktion (CE) an (wir haben den Index für die Summe hier $p$ genannt, damit es keine Verwechslungen mit dem $i$ in $w^{(2)}_{i,j}$ gibt):

$$ \tag{CE1} J = - \sum_{p=1}^m y_p \; log(\hat{y}_p) + (1 - y_p) \; log(1 - \hat{y}_p) $$

Wir sehen, dass $w^{(2)}_{i,j}$ nicht direkt in $J$ enthalten ist. Wie können wir also Ableitung (a) finden? Dazu benötigen wir die Kettenregel. Hier wiederum müssen wir zunächst klären, welche Parameter sich in welchen anderen Parametern "verstecken". Ausgangspunkt ist die berechnete Ausgabe $\hat{y}$. Zur Erinnerung: $y$ ist der vom Trainingsbeispiel vorgegebene Zielwert, ist also eine Konstante.

Wenn man sich die Formeln für Forward Propagation (FP1k, FP2k) und für die Fehlerfunktion (CE2) anschaut, sieht man, dass es folgende Abhängigkeiten zwischen $w^{(2)}_{i,j}$ und $J$ gibt (ein Pfeil in der Abbildung besagt "ist enthalten in"):

Wenn man vom Gewicht $w^{(2)}_{i,j}$ ausgeht, dann steckt das Gewicht in der Berechnung eines Rohinputs $z_i^{(3)}$, der wiederum zu $\hat{y}_i$ führt. Genauer gesagt zeigt unser Gewicht auf Neuron $i$ in Schicht 3 und geht also dort in die Berechnung des Rohinputs des i-ten Neurons ein, also in $z^{(3)}_i$ ein. Wir sehen das an der Berechnungsformel:

$$ z_i^{(3)} = \sum_{p=1}^{n_{2}} w^{(2)}_{i,p} \; a_p^{(2)} $$

Daher können wir die Ableitung (a) mit Hilfe der Kettenregel umformulieren:

$$ \tag{b} \frac{\partial J}{\partial w^{(2)}_{i,j}} = \frac{\partial J}{\partial z^{(3)}_i} \frac{\partial z^{(3)}_i}{\partial w^{(2)}_{i,j}}$$

Betrachten wir uns den ersten Faktor: Der Rohinput $z_i^{(3)}$ geht in die Berechnung der Aktivierung $a^{(3)}_i$ ein:

$$ a_i^{(3)} = g(z_i^{(3)}) $$

Also wenden wir in (b) noch einmal die Kettenregel an:

$$ \tag{c} \frac{\partial J}{\partial w^{(2)}_{i,j}} = \underbrace{\frac{\partial J}{\partial a_i^{(3)}}}_{1} \quad \underbrace{\frac{\partial a_i^{(3)}}{\partial z^{(3)}_i}}_2 \quad \underbrace{\frac{\partial z^{(3)}_i}{\partial w^{(2)}_{i,j}}}_3 $$

Erst jetzt können wir anfangen zu rechnen. Wir behandeln die drei obigen Faktoren separat in der Reihenfolge 3, 2 und 1.

Zu 3: Hier setzen wir die Formel (FP1k) für $z^{(3)}_i$ ein und lösen auf.

$$ \frac{\partial z^{(3)}_i}{\partial w^{(2)}_{i,j}} = \frac{\partial }{\partial w^{(2)}_{i,j}} \left( \sum_{p=1}^{n_2} w^{(2)}_{i,p} \; a_p^{(2)} + b_i^{(2)} \right) = a_j^{(2)} $$

Zu 2: Hier setzen wir Formel (FP2) für $a_i^{(3)}$ ein.

$$ \frac{\partial a_i^{(3)}}{\partial z^{(3)}_i} = \frac{\partial}{\partial z^{(3)}_i} g(z^{(3)}_i) = g'(z^{(3)}_i) $$

Es handelt sich also um die Ableitung der Aktivierungsfunktion. Wenn wir annehmen, dass es sich bei $g$ um die logistische Funktion handelt, bekommen wir:

$$ \frac{\partial a_i^{(3)}}{\partial z^{(3)}_i} = g'(z^{(3)}_i) = g(z^{(3)}_i) \, (1 - g(z^{(3)}_i)) = \hat{y}_i\,( 1 - \hat{y}_i) $$

Zu 1: Hier nutzen wir, dass $a_i^{(3)}$ gleichzeitig die berechte Ausgabe des Netzes $\hat{y}$ ist. Wir leiten also die Fehlerfunktion $J$ nach $\hat{y}$ ab und nutzen dabei die Definition der Fehlerfunktion (CE1).

$$ \begin{align} \frac{\partial J}{\partial a_i^{(3)}} &= \frac{\partial J}{\partial \hat{y}_i} \\[3mm] &= \frac{\partial }{\partial \hat{y}_i}\left[ - \sum_{p=1}^m y_p \; log(\hat{y}_p) + (1 - y_p) \; log(1 - \hat{y}_p)\right] \\[3mm] &= - \frac{\partial }{\partial \hat{y}_i} y_i \; log(\hat{y}_i) + \frac{\partial }{\partial \hat{y}_i} (1 - y_i) \; log(1 - \hat{y}_i)\\[3mm] &= - \frac{y_i}{\hat{y}_i} - \frac{1 - y_i }{1 - \hat{y}_i} \\[3mm] &= - \frac{y_i (1 - \hat{y}_i)}{\hat{y}_i (1 - \hat{y}_i)} - \frac{\hat{y}_i (1 - y_i)}{\hat{y}_i (1 - \hat{y}_i)}\\[3mm] &= \frac{\hat{y}_i - y_i}{\hat{y}_i (1 - \hat{y}_i)} \end{align} $$

Wir führen jetzt die Einzelergebnisse 1, 2, und 3 jetzt zusammen, indem wir sie in (c) einsetzen:

$$ \begin{align} \tag{d} \frac{\partial J}{\partial w^{(2)}_{i,j}} &= \underbrace{\frac{\partial J}{\partial a_i^{(3)}}}_{1} \quad \underbrace{\frac{\partial a_i^{(3)}}{\partial z^{(3)}_i}}_2 \quad \underbrace{\frac{\partial z^{(3)}_i}{\partial w^{(2)}_{i,j}}}_3 \\[4mm] &= \frac{\hat{y}_i - y_i}{\hat{y}_i (1 - \hat{y}_i)} \quad \hat{y}_i ( 1 - \hat{y}_i)\quad a_j^{(2)}\\[4mm] &= \left( \hat{y}_i - y_i \right) a_j^{(2)} \end{align} $$

Fehlerterm delta

Betrachten wir noch einmal das obige Ergebnis (d). Wir können die Faktoren 1 und 2 wieder zusammenziehen und als Fehlerterm $\delta^{(3)}_i$ definieren.

$$ \underbrace{\frac{\partial J}{\partial a_i^{(3)}}}_{1} \quad \underbrace{\frac{\partial a_i^{(3)}}{\partial z^{(3)}_i}}_2 \quad \underbrace{\frac{\partial z^{(3)}_i}{\partial w^{(2)}_{i,j}}}_3 = \underbrace{\frac{\partial J}{\partial z_i^{(3)}}}_{1 \& 2} \quad \underbrace{\frac{\partial z_i^{(3)}}{\partial w^{(2)}_{i,j}}}_3 = \delta^{(3)}_i \, \underbrace{\frac{\partial z_i^{(3)}}{\partial w^{(2)}_{i,j}}}_3 = \left( \hat{y}_i - y_i \right) a_j^{(2)} $$

Wir definieren also den Fehlerterm $\delta^{(3)}_i$ als Ableitung von $J$ nach $z$:

$$\tag{D1} \delta^{(3)}_i := \frac{\partial J}{\partial z_i^{(3)}} $$

Für unsere konkrete Situation bedeutet das:

$$ \delta^{(3)}_i = \hat{y}_i - y_i $$

Jetzt können wir die Ableitung von $J$ so darstellen:

$$\frac{\partial J}{\partial w^{(2)}_{i,j}} = a_j^{(2)} \, \delta^{(3)}_i $$

Man beachte, dass das zunächst mal so "in den Raum gestellt" wird. Die Bedeutung diesser Definition wird erst im nächsten Schritt klar.

Verallgemeinerung

Da wir in unserer Herleitung immer von der "letzten Schicht" gesprochen haben, können die obige Herleitung auf ein Netz mit $L$ Schichten verallgemeinern.

Wir halten fest:

$$ \begin{align} \tag{BD1}\delta^{(L)}_i &= \hat{y}_i - y_i \\[3mm] \tag{BW1'}\frac{\partial J}{\partial w^{(L-1)}_{i,j}} &= a_j^{(L-1)}\, \delta^{(L)}_i \end{align} $$

Wir haben somit (BD1) hergeleitet und (BW1) für den Fall, dass $l = L$, hergeleitet.

2.4 Schritt 2: Gewicht einer Verbindung in eine Zwischenschicht

Jetzt betrachten wir in unserem 3-Schichten-Netz ein beliebiges Gewicht zwischen Schicht 1 und 2. Wie wir später sehen, ist dieses Gewicht repräsentativ für das Gewicht einer Verbindung, die nicht in die Ausgabeschicht zeigt.

Man beachte, dass die Indizes $i$ und $j$ jetzt andere Indizes sind als beim Gewicht in Schritt 1.

Wir erinnern uns wieder an unser Ziel: Die Ableitung der Fehlerfunktion $J$ nach dem Gewicht, in diesem Fall also $w^{(1)}_{i,j}$:

$$ \tag{a} \frac{\partial J}{\partial w^{(1)}_{i,j}} $$

Auch hier fragen wir uns wieder: Welche Abhängigkeiten gibt es auf dem "Weg" von Gewicht $w^{(1)}_{i,j}$ in Richtung Ausgabeschicht bis zu $J$? Anders gesagt: In welche Berechnungen (bei Forward Propagation) fließt unser $w^{(1)}_{i,j}$ ein?

In der folgenden Abbildung sehen wir, dass der Weg von $w^{(1)}_{i,j}$ in Richtung Ausgabe zunächst zum Rohinput $z^{(2)_i}$ führt. Von Schicht 2 zu Schicht 3 sieht man aber, dass der Wert in alle Neuronen der nächsten Schicht eingeht (graue Pfeile). Das muss sich später in den Formeln natürlich widerspiegeln.

Wir wenden auch hier wieder die Kettenregel schrittweise an. Wir betrachten jetzt den roten Pfeil und pflegen in Formel (a) den Einfluss auf $z^{(2)}_i$ ein:

$$ \tag{b} \frac{\partial J}{\partial w^{(1)}_{i,j}} = \frac{\partial J}{\partial z^{(2)}_i} \frac{\partial z^{(2)}_i}{\partial w^{(1)}_{i,j}}$$

Wir bleiben beim roten Pfeil und bilden den Einfluss auf $a^{(2)}_i$ ab:

$$ \tag{c} \frac{\partial J}{\partial w^{(1)}_{i,j}} = \frac{\partial J}{\partial a^{(2)}_i} \frac{\partial a^{(2)}_i}{\partial z^{(2)}_i}\frac{\partial z^{(2)}_i}{\partial w^{(1)}_{i,j}}$$

Der nächste Schritt sind die grauen Pfeile rechts. Das ist schwieriger, denn - wie man sieht - hat das $a^{(2)}_i$ Einfluss auf alle Rohinputs $z^{(3)}_p$ der Schicht 3. Wir können das durch den Vektor $z^{(3)}$ ausdrücken? Das kann man erstmal so hinschreiben, sollte aber beachten, dass die ersten zwei Faktoren Vektoren sind, d.h. es handelt sich um ein Skalarprodukt:

$$ \tag{d} \frac{\partial J}{\partial w^{(1)}_{i,j}} = \underbrace{\frac{\partial J}{\partial z^{(3)}} \frac{\partial z^{(3)}}{\partial a^{(2)}_i}}_1 \quad \underbrace{\frac{\partial a^{(2)}_i}{\partial z^{(2)}_i}}_2 \quad \underbrace{\frac{\partial z^{(2)}_i}{\partial w^{(1)}_{i,j}}}_3 $$

Zu 1:

Jetzt muss man sich erstmal vor Augen führe, wie diese zwei Vektoren aussehen:

$$ \frac{\partial J}{\partial z^{(3)}} = \begin{pmatrix} \frac{\partial J}{\partial z^{(3)}_1} \\ \vdots \\ \frac{\partial J}{\partial z^{(3)}_{n_3}} \end{pmatrix} \quad \quad \frac{\partial z^{(3)}}{\partial a^{(2)}_i} = \begin{pmatrix} \frac{\partial z^{(3)}_1}{\partial a^{(2)}_i} \\ \vdots \\ \frac{\partial z^{(3)}_{n_3}}{\partial a^{(2)}_i} \end{pmatrix} $$

Jetzt kann man das Skalarprodukt aus (d) wie folgt hinschreiben:

$$ \frac{\partial J}{\partial z^{(3)}} \frac{\partial z^{(3)}}{\partial a^{(2)}_i} = \sum_{p=1}^{n_3} \underbrace{\frac{\partial J}{\partial z^{(3)}_p}}_{\delta^{(3)}_p} \, \frac{\partial z^{(3)}_p}{\partial a^{(2)}_i} $$

Sie sehen es schon oben: Der linke Faktor ist das, was wir in Schritt 1 in (D1) als $\delta^{(3)}_p$ definiert hatten. Schauen wir uns den rechten Faktor an und setzen dort (FP1k) ein:

$$ \frac{\partial z^{(3)}_p}{\partial a^{(2)}_i} = \frac{\partial}{\partial a^{(2)}_i} \left( \sum_{h=1}^{n_2} w^{(2)}_{p,h} \; a_h^{(2)} + b_p^{(2)} \right) = w^{(2)}_{p,i} $$

Unser Skalarprodukt sieht also wie folgt aus:

$$ \frac{\partial J}{\partial z^{(3)}} \frac{\partial z^{(3)}}{\partial a^{(2)}_i} = \sum_{p=1}^{n_3} w^{(2)}_{p,i}\, \delta^{(3)}_p $$

Zu 2: Wie schon in Schritt 1 ist dieser Term einfach die Ableitung der Aktivierungsfunktion $g$.

$$ \frac{\partial a_i^{(2)}}{\partial z^{(2)}_i} = \frac{\partial}{\partial z^{(2)}_i} g(z^{(2)}_i) = g'(z^{(2)}_i) $$

In diesem Fall lassen wir das $g'$ stehen und lösen dies nicht weiter auf, so dass die Lösung unabhängig von der konkreten Aktivierungsfunktion bleibt.

Zu 3: Wie in Schritt 1 setzen wir die Formel für $z^{(2)}_i$ ein und lösen auf.

$$ \frac{\partial z^{(2)}_i}{\partial w^{(1)}_{i,j}} = \frac{\partial }{\partial w^{(1)}_{i,j}} \left( \sum_{p=1}^{n_1} w^{(1)}_{i,p} \; a_p^{(1)} + b_p^{(1)}\right) = a_j^{(1)} $$

Wir führen jetzt die Einzelergebnisse 1, 2, und 3 jetzt zusammen, indem wir sie in (d) einsetzen:

$$ \begin{align} \frac{\partial J}{\partial w^{(1)}_{i,j}} &= \underbrace{\frac{\partial J}{\partial z^{(3)}} \frac{\partial z^{(3)}}{\partial a^{(2)}_i}}_1 \quad \underbrace{\frac{\partial a^{(2)}_i}{\partial z^{(2)}_i}}_2 \quad \underbrace{\frac{\partial z^{(2)}_i}{\partial w^{(1)}_{i,j}}}_3 \\[4mm] \tag{e} &= \left[ \sum_{p=1}^{n_3} \delta^{(3)}_p \, w^{(2)}_{p,i} \right] \quad g'(z^{(2)}_i) \quad a_j^{(1)} \end{align} $$

Fehlerterm delta

Wir definieren jetzt wie schon bei Schritt 1 (D1) den Fehlerterm $\delta$ als Ableitung von $J$ nach $z$:

$$\tag{D2} \delta^{(2)}_i = \frac{\partial J}{\partial z_i^{(2)}} $$

Wie wir in (e) sehen, kann man dieses Delta wie folgt berechnen:

$$ \delta^{(2)}_i = g'(z^{(2)}_i) \sum_{p=1}^{n_3} w^{(2)}_{p,i}\, \delta^{(3)}_p $$

Jetzt können wir die Ableitung von $J$ so darstellen:

$$\frac{\partial J}{\partial w^{(1)}_{i,j}} = a_j^{(1)}\, \delta^{(2)}_i $$

Verallgemeinerung

Wir verallgemeinern wieder und stellen uns vor, das Gewicht tritt an einer beliebigen Schicht $l$ auf, wobei dieses $l$ nicht die Schicht direkt vor der Ausgabeschicht ist, d.h. $l < L-1$ oder $l\in\{1,\ldots,L-2\}$.

$$ \begin{align} \tag{BD2}\delta^{(l)}_i &= g'(z^{(l)}_i) \sum_{p=1}^{n_3} w^{(l)}_{p,i}\, \delta^{(l+1)}_p \\[3mm] \tag{BW1''}\frac{\partial J}{\partial w^{(l)}_{i,j}} &= a_j^{(l)}\, \delta^{(l+1)}_i \end{align} $$

Wir haben somit (BD2) hergeleitet und (BW1) jetzt auch für alle $l$ hergeleitet.

Bias-Neuronen

Wir wenden die obige Herleitung jetzt auf die Bias-Gewichte an.

Wir wenden auch hier wieder die Kettenregel schrittweise an. Wir stellen uns vor, dass der rote Pfeil von einem Bias-Neuron in Schicht 1 auf $z^{(2)}_i$ zeigt:

$$ \frac{\partial J}{\partial b^{(1)}_i} = \frac{\partial J}{\partial z^{(2)}_i} \frac{\partial z^{(2)}_i}{\partial b^{(1)}_i}$$

Wir bilden den Einfluss auf $a^{(2)}_i$ ab:

$$ \frac{\partial J}{\partial b^{(1)}_i} = \frac{\partial J}{\partial a^{(2)}_i} \frac{\partial a^{(2)}_i}{\partial z^{(2)}_i}\frac{\partial z^{(2)}_i}{\partial b^{(1)}_i}$$

Der nächste Schritt sind wieder die grauen Pfeile rechts, also der Einfluss auf alle Rohinputs $z^{(3)}_p$ der Schicht 3.

$$ \frac{\partial J}{\partial b^{(1)}_i} = \underbrace{\frac{\partial J}{\partial z^{(3)}} \frac{\partial z^{(3)}}{\partial a^{(2)}_i}}_1 \quad \underbrace{\frac{\partial a^{(2)}_i}{\partial z^{(2)}_i}}_2 \quad \underbrace{\frac{\partial z^{(2)}_i}{\partial b^{(1)}_i}}_3 $$

Tatsächlich unterscheiden sich die Rechnungen 1 und 2 nicht von der obigen Herleitung zu den Gewichten.

Einen Unterschied gibt es aber in 3: Wir setzen wir die Formel für $z^{(2)}_i$ ein und lösen auf.

$$ \frac{\partial z^{(2)}_i}{\partial b^{(1)}_i} = \frac{\partial }{\partial b^{(1)}_i} \left( \sum_{p=1}^{n_1} w^{(1)}_{i,p} \; a_p^{(1)} + b_p^{(1)}\right) = 1 $$

Wir führen jetzt die Einzelergebnisse 1, 2, und 3 wieder zusammen:

$$ \begin{align} \frac{\partial J}{\partial b^{(1)}_i} &= \underbrace{\frac{\partial J}{\partial z^{(3)}} \frac{\partial z^{(3)}}{\partial a^{(2)}_i}}_1 \quad \underbrace{\frac{\partial a^{(2)}_i}{\partial z^{(2)}_i}}_2 \quad \underbrace{\frac{\partial z^{(2)}_i}{\partial b^{(1)}_i}}_3 \\[4mm] &= \left[ \sum_{p=1}^{n_3} \delta^{(3)}_p \, w^{(2)}_{p,i} \right] \quad g'(z^{(2)}_i) \quad 1 \end{align} $$

Unser Delta ist wie folgt definiert:

$$ \delta^{(2)}_i = g'(z^{(2)}_i) \sum_{p=1}^{n_3} w^{(2)}_{p,i}\, \delta^{(3)}_p $$

Wir setzen ein und bekommen:

$$ \frac{\partial J}{\partial b^{(1)}_i} = \delta^{(2)}_i $$

Verallgemeinerung

Wir verallgemeinern wieder und stellen uns vor, das Bias-Gewicht tritt an einer beliebigen Schicht $l$ (außer der Schicht direkt vor der Ausgabeschicht) auf, d.h. $l < L-1$ oder $l\in\{1,\ldots,L-2\}$.

Damit hätten wir

$$ \frac{\partial J}{\partial w^{(l)}_{j,k}} = a^{(l)}_k \delta^{(l+1)}_j \tag{BW1} $$

hergeleitet.

2.5 Ergänzungen

Dieser Abschnitt ist noch in Arbeit. Wir betrachten den "echten Fehler" mit Regularisierung.

3 Quellenhinweise

Es ist tatsächlich nicht leicht, gute Herleitungen im Netz oder auch in Lehrbüchern zu finden. Oft werden die Gedankengänge stark verkürzt dargestellt.

Teile meiner Herleitung gehen zurück auf die Darstellung von Michael Nielsen die in seinem Online-Buch Neural Networks and Deep Learning (Chapter 2). Falls Sie dort nachschauen, beachten Sie, dass der Index der Gewichtsmatrizen um 1 abweicht von der Darstellung hier. Außerdem wird eine andere Kostenfunktion verwendet.