Ableiten von Backpropagation-Gleichungen "nativ" in Tensorform

7

Das Bild zeigt eine typische Ebene irgendwo in einem Feed-Forward-Netzwerk:

Geben Sie hier die Bildbeschreibung ein

ai(k) ist der Aktivierungswert des -Neurons in der -Schicht.ithkth

Wij(k) ist das Gewicht, das das ith Neuron in der kth Schicht mit dem jth Neuron in der (k+1)th Schicht verbindet.

zj(k+1) ist der Wert der Voraktivierungsfunktion für das Neuron in der Schicht . Manchmal wird dies als "logit" bezeichnet, wenn es mit logistischen Funktionen verwendet wird.jth(k+1)th

Die Feed-Forward-Gleichungen lauten wie folgt:

zj(k+1)=ichW.ichj(k)einich(k)

einj(k+1)=f(zj(k+1))

Der Einfachheit halber wird die Vorspannung als Dummy-Aktivierung von 1 eingeschlossen und implizit in Iterationen über .ich

Ich kann die Gleichungen für die Rückausbreitung in einem vorwärtsgerichteten neuronalen Netzwerk unter Verwendung der Kettenregel und der Identifizierung einzelner Skalarwerte im Netzwerk ableiten (tatsächlich mache ich dies oft als Papierübung nur zum Üben):

Gegeben als Gradient der Fehlerfunktion in Bezug auf eine Neuronenausgabe.einj(k+1)=E.einj(k+1)

1.zj(k+1)=E.zj(k+1)=E.einj(k+1)einj(k+1)zj(k+1)=einj(k+1)f'(zj(k+1))

2.einich(k)=E.einich(k)=jE.zj(k+1)zj(k+1)einich(k)=jzj(k+1)W.ichj(k)

3.W.ichj(k)=E.W.ichj(k)=E.zj(k+1)zj(k+1)W.ichj(k)=zj(k+1)einich(k)

So weit, ist es gut. Es ist jedoch oft besser, diese Gleichungen unter Verwendung von Matrizen und Vektoren zur Darstellung der Elemente abzurufen. Ich kann das tun, aber ich bin nicht in der Lage, die "native" Darstellung der äquivalenten Logik in der Mitte der Ableitungen herauszufinden. Ich kann herausfinden, wie die Endformen aussehen sollten, indem ich auf die skalare Version zurückgreife und überprüfe, ob die Multiplikationen die richtigen Dimensionen haben, aber ich habe keine Ahnung, warum ich die Gleichungen in diese Formen einfügen soll.

Gibt es tatsächlich eine Möglichkeit, die tensorbasierte Ableitung der Rückausbreitung nur unter Verwendung von Vektor- und Matrixoperationen auszudrücken, oder geht es darum, sie an die obige Ableitung anzupassen?

Verwenden der Spaltenvektoren , , und der Gewichtsmatrix plus Bias-Vektor , dann sind die Feed-Forward-Operationen:ein(k)z(k+1)ein(k+1)W.(k)b(k)

z(k+1)=W.(k)ein(k)+b(k)

ein(k+1)=f(z(k+1))

Dann sieht mein Ableitungsversuch folgendermaßen aus:

1.z(k+1)=E.z(k+1)=???=ein(k+1)f'(z(k+1))

2.ein(k)=E.ein(k)=???=W.(k)T.z(k+1)

3.W.(k)=E.W.(k)=???=z(k+1)ein(k)T.

Wobei die elementweise Multiplikation darstellt. Ich habe mich nicht darum gekümmert, eine Voreingenommenheitsgleichung zu zeigen.

Wo habe ich hingelegt ??? Ich bin mir nicht sicher, wie ich von den Feed-Forward-Operationen und der Kenntnis der linearen Differentialgleichungen den richtigen Weg einschlagen soll, um die richtige Form der Gleichungen zu ermitteln. Ich könnte nur einige partielle abgeleitete Begriffe aufschreiben, habe aber keine Ahnung, warum einige eine elementweise Multiplikation verwenden sollten, andere eine Matrixmultiplikation, und warum die Multiplikationsreihenfolge wie gezeigt sein muss, außer dass dies am Ende eindeutig das richtige Ergebnis liefert .

Ich bin mir nicht einmal sicher, ob es eine reine Tensorableitung gibt oder ob es sich nur um eine "Vektorisierung" des ersten Satzes von Gleichungen handelt. Aber meine Algebra ist nicht so gut und ich bin daran interessiert, es auf jeden Fall herauszufinden. Ich denke, es könnte mir eine gute Verständnisarbeit in z. B. TensorFlow bringen, wenn ich diese Operationen besser verstehen würde, indem ich mehr mit Tensoralgebra denke.


Entschuldigung für Ad-hoc / falsche Notation. Ich verstehe jetzt, dass dank Ehsans Antwort besser geschrieben istWas ich wirklich wollte, ist eine kurze Referenzvariable, die im Gegensatz zu den ausführlichen partiellen Ableitungen in die Gleichungen eingesetzt werden kann.einj(k+1)einj(k+1)E.

Neil Slater
quelle
Um ehrlich zu sein, ist die Verwendung von Komponenten weitaus einfacher als die Verwendung der Matrix- / Vektorform der Gleichungen. Wenn Sie jedoch die Matrixform ableiten möchten, sollten Sie sich en.wikipedia.org/wiki/Matrix_calculus
J. O'Brien Antognini vom
@ J.O'BrienAntognini: Ich denke, das ist es, was ich sehen möchte, ja. Wenn sich herausstellt, dass dies eine theoretische Untersuchung ist und nicht zu nützlich für das Verständnis der Routinearbeit mit TensorFlow usw. ist, dann denke ich, dass ich es immer noch interessant finden werde.
Neil Slater

Antworten:

3

Notation ist wichtig! Das Problem beginnt bei:

Gegebenaj(k+1)=Eaj(k+1)

Ich mag deine Notation nicht! In der mathematischen Standardnotation ist das in der Tat falsch. Die richtige Notation ist

aj(k+1)E=Eaj(k+1)

Dann wird der Gradient des Fehlers für einen Vektor definiert alsEa(k)

a(k)E=(Ea1(k),,Ean(k))T()

( Randnotiz : Wir transponieren aufgrund der Konvention, dass wir Vektoren als Spaltenvektoren darstellen. Wenn Sie als Zeilenvektoren darstellen möchten, ändern die Gleichungen, die Sie beweisen möchten, eine Transponierung!)

daher mit Kettenregel,

Eai(k)=jEzj(k+1)zj(k+1)ai(k)=jEzj(k+1)Wij(k)

wegenJetzt können Sie das Obige als Vektorprodukt (inneres Produkt) ausdrückenzj(k+1)=iWij(k)ai(k).

Eai(k)=(W:,i(k))Tz(k+1)E
und wenn wir sie in stapeln wir als Matrixvektorprodukt ausdrücken(),a(k)E

a(k)E=(W(k))Tz(k+1)E.

Den Rest überlasse ich dir :)

Mehr Vektorrechnung!

Verwenden wir die Konvention von Vektoren als Spaltenvektoren. Dann ist undz(k+1)=(W(k))Ta(k)+b(k)

a(k)E=Ea(k)=z(k+1)a(k)Ez(k+1)=W(k)Ez(k+1)

da

z(k+1)a(k)=((W(k))Ta(k)+b(k))a(k)=((W(k))Ta(k))a(k)+b(k)a(k)

und da dies nicht tut hängen vonb(k)a(k)=0b(k)a(k).

Somit

((W(k))Ta(k))a(k)=a(k)a(k)W(k)=W(k).

nach Vektor für Vektor (acht bzw. siebte Zeile, letzte Spaltenidentität)

Ehsan M. Kermani
quelle
@NeilSlater Ich habe mehr hinzugefügt. Ich hoffe es hilft jetzt.
Ehsan M. Kermani
Vielen Dank. Der Link zu en.wikipedia.org/wiki/… ist für mich ein Schlüsselfaktor.
Neil Slater