Computergraphen
Backpropagation wird in Deep-Learning-Frameworks wie Tensorflow, Torch, Theano usw. mithilfe von Berechnungsgraphen implementiert. Noch wichtiger ist, dass das Verständnis der Rückausbreitung in Berechnungsgraphen verschiedene Algorithmen und ihre Variationen wie Backprop durch die Zeit und Backprop mit gemeinsamen Gewichten kombiniert. Sobald alles in einen Berechnungsgraphen konvertiert ist, sind sie immer noch der gleiche Algorithmus - nur die Rückübertragung auf Berechnungsgraphen.
Was ist Computational Graph?
Ein Berechnungsgraph ist als gerichteter Graph definiert, bei dem die Knoten mathematischen Operationen entsprechen. Computergraphen sind eine Möglichkeit, einen mathematischen Ausdruck auszudrücken und auszuwerten.
Zum Beispiel ist hier eine einfache mathematische Gleichung -
$$ p = x + y $$
Wir können einen Berechnungsgraphen der obigen Gleichung wie folgt zeichnen.
Der obige Berechnungsgraph hat einen Additionsknoten (Knoten mit "+" - Vorzeichen) mit zwei Eingangsvariablen x und y und einem Ausgang q.
Nehmen wir ein anderes, etwas komplexeres Beispiel. Wir haben die folgende Gleichung.
$$ g = \ left (x + y \ right) \ ast z $$
Die obige Gleichung wird durch den folgenden Berechnungsgraphen dargestellt.
Computergraphen und Backpropagation
Computergraphen und Backpropagation sind wichtige Kernkonzepte des Deep Learning für das Training neuronaler Netze.
Vorwärtspass
Der Vorwärtsdurchlauf ist das Verfahren zum Bewerten des Werts des mathematischen Ausdrucks, der durch Berechnungsgraphen dargestellt wird. Vorwärtsdurchlauf bedeutet, dass wir den Wert von Variablen in Vorwärtsrichtung von links (Eingabe) nach rechts übergeben, wo sich die Ausgabe befindet.
Betrachten wir ein Beispiel, indem wir allen Eingaben einen Wert geben. Angenommen, die folgenden Werte werden für alle Eingaben angegeben.
$$ x = 1, y = 3, z = –3 $$
Indem wir diese Werte den Eingaben zuweisen, können wir einen Vorwärtsdurchlauf durchführen und die folgenden Werte für die Ausgaben auf jedem Knoten erhalten.
Zuerst verwenden wir den Wert von x = 1 und y = 3, um p = 4 zu erhalten.
Dann verwenden wir p = 4 und z = -3, um g = -12 zu erhalten. Wir gehen von links nach rechts vorwärts.
Ziele des Rückwärtspasses
Im Rückwärtsdurchlauf möchten wir die Gradienten für jede Eingabe in Bezug auf die endgültige Ausgabe berechnen. Diese Gradienten sind für das Training des neuronalen Netzwerks unter Verwendung eines Gradientenabfalls wesentlich.
Zum Beispiel wünschen wir uns die folgenden Farbverläufe.
Gewünschte Farbverläufe
$$ \ frac {\ partielles x} {\ partielles f}, \ frac {\ partielles y} {\ partielles f}, \ frac {\ partielles z} {\ partielles f} $$
Rückwärtspass (Backpropagation)
Wir beginnen den Rückwärtsdurchlauf, indem wir die Ableitung der endgültigen Ausgabe in Bezug auf die endgültige Ausgabe (selbst!) Finden. Somit führt dies zur Identitätsableitung und der Wert ist gleich eins.
$$ \ frac {\ partielles g} {\ partielles g} = 1 $$
Unser Berechnungsdiagramm sieht nun wie folgt aus:
Als nächstes werden wir den Rückwärtsdurchlauf durch die "*" - Operation durchführen. Wir werden die Gradienten bei p und z berechnen. Da g = p * z ist, wissen wir, dass -
$$ \ frac {\ partielles g} {\ partielles z} = p $$
$$ \ frac {\ partielles g} {\ partielles p} = z $$
Wir kennen die Werte von z und p bereits aus dem Vorwärtsdurchlauf. Daher bekommen wir -
$$ \ frac {\ partielles g} {\ partielles z} = p = 4 $$
und
$$ \ frac {\ partielles g} {\ partielles p} = z = -3 $$
Wir wollen die Gradienten bei x und y berechnen -
$$ \ frac {\ partielles g} {\ partielles x}, \ frac {\ partielles g} {\ partielles y} $$
Wir möchten dies jedoch effizient tun (obwohl x und g in diesem Diagramm nur zwei Sprünge entfernt sind, stellen Sie sich vor, dass sie wirklich weit voneinander entfernt sind). Um diese Werte effizient zu berechnen, verwenden wir die Kettenregel der Differenzierung. Aus der Kettenregel haben wir -
$$ \ frac {\ partielles g} {\ partielles x} = \ frac {\ partielles g} {\ partielles p} \ ast \ frac {\ partielles p} {\ partielles x} $$
$$ \ frac {\ partielles g} {\ partielles y} = \ frac {\ partielles g} {\ partielles p} \ ast \ frac {\ partielles p} {\ partielles y} $$
Wir wissen jedoch bereits, dass dg / dp = -3, dp / dx und dp / dy einfach sind, da p direkt von x und y abhängt. Wir haben -
$$ p = x + y \ Rightarrow \ frac {\ partielles x} {\ partielles p} = 1, \ frac {\ partielles y} {\ partielles p} = 1 $$
Daher bekommen wir -
$$ \ frac {\ partielles g} {\ partielles f} = \ frac {\ partielles g} {\ partielles p} \ ast \ frac {\ partielles p} {\ partielles x} = \ links (-3 \ rechts) .1 = -3 $$
Zusätzlich für die Eingabe y -
$$ \ frac {\ partielles g} {\ partielles y} = \ frac {\ partielles g} {\ partielles p} \ ast \ frac {\ partielles p} {\ partielles y} = \ links (-3 \ rechts) .1 = -3 $$
Der Hauptgrund dafür ist, dass wir bei der Berechnung des Gradienten bei x nur bereits berechnete Werte und dq / dx (Ableitung der Knotenausgabe in Bezug auf die Eingabe desselben Knotens) verwendet haben. Wir haben lokale Informationen verwendet, um einen globalen Wert zu berechnen.
Schritte zum Trainieren eines neuronalen Netzwerks
Befolgen Sie diese Schritte, um ein neuronales Netzwerk zu trainieren -
Für den Datenpunkt x im Datensatz leiten wir den Durchlauf mit x als Eingabe weiter und berechnen die Kosten c als Ausgabe.
Wir machen einen Rückwärtsdurchlauf ab c und berechnen Gradienten für alle Knoten im Diagramm. Dies schließt Knoten ein, die die Gewichte des neuronalen Netzwerks darstellen.
Wir aktualisieren dann die Gewichte, indem wir W = W - Lernrate * Gradienten machen.
Wir wiederholen diesen Vorgang, bis die Stoppkriterien erfüllt sind.