Rückausbreitung mit Softmax / Cross Entropy


40

Ich versuche zu verstehen, wie Backpropagation für eine Softmax / Cross-Entropy-Ausgabeebene funktioniert.

Die Kreuzentropiefehlerfunktion ist

E(t,o)=jtjlogoj

mit und als Ziel bzw. Ausgabe bei Neuron . Die Summe befindet sich über jedem Neuron in der Ausgabeschicht. selbst ist das Ergebnis der Softmax-Funktion:tojoj

oj=softmax(zj)=ezjjezj

Wieder ist die Summe über jedem Neuron in der Ausgabeschicht und ist die Eingabe für das Neuron :zjj

zj=iwijoi+b

Das ist die Summe über alle Neuronen in der vorherigen Schicht mit ihrer entsprechenden Ausgabe und dem Gewicht Richtung Neuron plus einer Verzerrung .oiwijjb

Um nun ein Gewicht zu aktualisieren , das ein Neuron in der Ausgabeebene mit einem Neuron in der vorherigen Ebene verbindet, muss die partielle Ableitung der Fehlerfunktion unter Verwendung der Kettenregel berechnet werden:wijji

Ewij=Eojojzjzjwij

mit als Eingabe für das Neuron .zjj

Der letzte Begriff ist ganz einfach. Da es nur ein Gewicht zwischen und , lautet die Ableitung:ij

zjwij=oi

Der erste Term ist die Ableitung der Fehlerfunktion in Bezug auf den Ausgang :oj

Eoj=tjoj

Der mittlere Term ist die Herleitung der Softmax-Funktion in Bezug auf ihre Eingabe ist schwieriger:zj

ojzj=zjezjjezj

, wir haben drei Ausgangsneuronen, die den Klassen dann ist :o b = s o f t m a x ( b )a,b,cob=softmax(b)

ob=ezbez=ezbeza+ezb+ezc

und deren Herleitung nach der Quotientenregel:

=softmax(b)-softmax2(b)=ob-o 2 b =ob(1-ob)oj

obzb=ezbez(ezb)2(jez)2=ezbez(ezb)2(ez)2
=softmax(b)softmax2(b)=obob2=ob(1ob)
Zurück zum mittleren Term für die bedeutet dies:
ojzj=oj(1oj)

Alles zusammen bekomme ich

Ewij=tjojoj(1oj)oi=tj(1oj)oi

Das heißt, wenn das Ziel für diese Klasse , werde ich die Gewichte dafür nicht aktualisieren. Das klingt nicht richtig.tj=0

Als ich dies untersuchte, fand ich Leute mit zwei Varianten für die Softmax-Ableitung, eine mit und die andere mit , wie hier oder hier .i ji=jij

Aber ich kann daraus keinen Sinn machen. Ich bin mir auch nicht sicher, ob dies die Ursache für meinen Fehler ist, weshalb ich alle meine Berechnungen poste. Ich hoffe, jemand kann mir erklären, wo mir etwas fehlt oder was schief geht.


Die Links, die Sie angegeben haben, berechnen die Ableitung relativ zur Eingabe, während Sie die Ableitung relativ zu den Gewichten berechnen.
Jenkar

Antworten:


35

Hinweis: Ich bin kein Experte für Backprop, aber nachdem ich jetzt ein bisschen gelesen habe, denke ich, dass der folgende Vorbehalt angebracht ist. Beim Lesen von Artikeln oder Büchern über neuronale Netze ist es nicht ungewöhnlich, dass Derivate mit einer Mischung aus Standard- Summations- / Indexnotation , Matrixnotation und Multi-Indexnotation geschrieben werden (schließen Sie einen Hybrid der letzten beiden für Tensor-Tensor-Derivate ein) ). In der Regel ist die Absicht, dass dies "aus dem Kontext heraus" verstanden werden sollte, also muss man vorsichtig sein!

Ich habe ein paar Inkonsistenzen in Ihrer Ableitung festgestellt. Ich mache eigentlich keine neuronalen Netze, daher ist das Folgende möglicherweise falsch. Hier ist jedoch, wie ich das Problem angehen würde.

Zunächst müssen Sie die Summe in berücksichtigen , und Sie können nicht davon ausgehen, dass jeder Term nur von einer Gewichtung abhängt. Nehmen wir also den Gradienten von in Bezug auf die Komponente von , so ist EEkz

E=jtjlogojEzk=jtjlogojzk

dann als wir haben wobei ist Kronecker Delta . Dann ist der Gradient des Softmax-Nenners , was oder Erweitern des Protokolls Beachten Sie, dass sich die Ableitung auf , ein beliebigeroj

oj=1Ωezj,Ω=iezilogoj=zjlogΩ
logojzk=δjk1ΩΩzk
δjk
Ωzk=ieziδik=ezk
logojzk=δjkok
ojzk=oj(δjkok)
zkKomponente von , die den Term ergibt ( nur wenn ).zδjk=1k=j

So dass der Gradient von in bezug auf ist dann wobei konstant ist (für einen gegebenen Vektor).Ez

Ezk=jtj(okδjk)=ok(jtj)tkEzk=okτtk
τ=jtjt

Dies zeigt einen ersten Unterschied zu Ihrem Ergebnis: Das multipliziert nicht mehr . Beachten Sie, dass für den typischen Fall, in dem "one-hot" ist, (wie in Ihrem ersten Link angegeben).tkoktτ=1

Eine zweite Inkonsistenz ist, wenn ich richtig verstehe, dass das " ", das in eingegeben wird, wahrscheinlich nicht das " " ist, das vom Softmax ausgegeben wird. Ich würde denken, dass es sinnvoller ist, dass dies in der Netzwerkarchitektur tatsächlich "weiter hinten" liegt?ozo

wir diesen Vektor , haben wir dann y

zk=iwikyi+bkzkwpq=iyiwikwpq=iyiδipδkq=δkqyp

Um schließlich den Gradienten von in Bezug auf die Gewichtsmatrix , verwenden wir die Kettenregel den endgültigen Ausdruck zu geben (unter der Annahme einer einem -hot , dh ) wobei die Eingabe auf der untersten Ebene ist (in Ihrem Beispiel).Ew

Ewpq=kEzkzkwpq=k(okτtk)δkqyp=yp(oqτtq)
τ = 1 Etτ=1y
Ewij=yi(ojtj)
y

Dies zeigt also einen zweiten Unterschied zu Ihrem Ergebnis: Das " " sollte vermutlich von der Ebene unter , die ich nenne , und nicht von der Ebene über (die ). z y z ooizyzo

Hoffentlich hilft das. Scheint dieses Ergebnis konsistenter zu sein?

Update: Als Antwort auf eine Abfrage aus dem OP in den Kommentaren hier eine Erweiterung des ersten Schritts. Beachten Sie zunächst, dass die Vektorkettenregel Summierungen erfordert (siehe hier ). Zweitens sollten Sie immer einen neuen tiefgestellten Buchstaben für die Komponente im Nenner der partiellen Ableitung eingeben, um sicherzugehen, dass alle Verlaufskomponenten erhalten werden. Um den Gradienten mit der Vollkettenregel vollständig auszuschreiben, haben wir und so

Ewpq=iEoioiwpq
oiwpq=koizkzkwpq
Ewpq=i[Eoi(koizkzkwpq)]
In der Praxis reduzieren sich die vollen Summierungen, weil Sie viele Terme erhalten. Die Verwendung der Regel für die vollständige Kette stellt sicher, dass Sie immer das richtige Ergebnis erhalten, auch wenn viele zusätzliche Summierungen und Indizes erforderlich sind.δab

Ich bin nicht sicher, wie die "Backprop / AutoDiff" -Community diese Probleme löst, aber ich kann Fehler machen, wenn ich versuche, Verknüpfungen zu erstellen. Also mache ich es wie hier, schreibe alles in Form von Summierungen mit vollständiger Indexierung auf und führe immer neue Indexe für jedes Derivat ein. (Ähnlich wie meine Antwort hier ... Ich hoffe, ich gebe am Ende zumindest korrekte Ergebnisse!)
GeoMatt22

Ich persönlich finde, dass du alles aufschreibst, was es viel einfacher macht, zu folgen. Die Ergebnisse sehen für mich richtig aus.
Jenkar

Obwohl ich immer noch versuche, jeden Ihrer Schritte vollständig zu verstehen, habe ich einige wertvolle Einblicke erhalten, die mir beim Gesamtbild geholfen haben. Ich denke, ich muss mehr über Ableitungen und Summen lesen. Aber unter Berücksichtigung Ihrer Empfehlung, die Summe in E zu berücksichtigen, habe ich
Folgendes gefunden

für zwei Ausgaben und mit der Kreuzentropiefehler ist Dann lautet die Ableitung was mit Ihrem Ergebnis übereinstimmt ... unter Berücksichtigung, dass Sie vor der Fehlersumme kein Minuszeichen hattenoj1=ezj1Ωoj1=ezj1Ω
Ω=ezj1+ezj2
E=(t1logoj1+t2logoj2)=(t1(zj1log(Ω))+t2(zj2log(Ω)))
E(zj1=(t1t1ezj1Ωt2ezj2Ω)=t1+oj1(t1+t2)
micha

Aber eine weitere Frage, die ich habe, ist: Anstelle von , die im allgemeinen ist , was Ihre eingeführt mit Backpropagation, Sie berechnet: , um . Warum führt dieser Weg zum richtigen Ergebnis?
Ewij=Eojojzjzjwij
Ewij=Ezjzjwij
oj
Micha

12

Während die Antwort von @ GeoMatt22 richtig ist, fand ich es persönlich sehr nützlich, das Problem auf ein Spielzeugbeispiel zu reduzieren und ein Bild zu zeichnen:

Grafisches Modell.

I definiert dann die Operationen jeder Knoten wurde Berechnung, Behandeln der 's und ist , als Eingänge zu einem ‚Netzwerk‘ ( ist ein One-Hot - Vektor , der die Klasse Kennzeichens des Datenpunkt darstellt):hwt

L=t1logo1t2logo2
o1=exp(y1)exp(y1)+exp(y2)
o2=exp(y2)exp(y1)+exp(y2)
y1=w11h1+w21h2+w31h3
y2=w12h1+w22h2+w32h3

Angenommen, ich möchte die Ableitung des Verlusts in Bezug auf berechnen . Ich kann mein Bild nur verwenden, um den Weg vom Verlust zum Gewicht, an dem ich interessiert bin, zurückzuverfolgen (die zweite Spalte von aus Gründen der Klarheit entfernt):w21w

Grafikmodell mit hervorgehobenem Rückwärtspfad.

Dann kann ich einfach die gewünschten Ableitungen berechnen. Beachten Sie, dass es zwei Pfade durch , die zu führen. muss ich die Ableitungen summieren, die durch die einzelnen Pfade gehen.y1w21

Lo1=t1o1
Lo2=t2o2
o1y1=exp(y1)exp(y1)+exp(y2)(exp(y1)exp(y1)+exp(y2))2=o1(1o1)
o2y1=exp(y2)exp(y1)(exp(y1)+exp(y2))2=o2o1
y1w21=h2

Zum Schluss die Kettenregel zusammenfassen:

Lw21=Lo1o1y1y1w21+Lo2o2y1y1w21=t1o1[o1(1o1)]h2+t2o2(o2o1)h2=h2(t2o1t1+t1o1)=h2(o1(t1+t2)t1)=h2(o1t1)

Beachten Sie, dass im letzten Schritt da der Vektor ein One-Hot-Vektor ist.t1+t2=1t


Das ist es, was das für mich endlich geklärt hat! Ausgezeichnete und elegante Erklärung !!!!
SantoshGupta7

2
Ich bin froh, dass Sie beide das Lesen meines Beitrags genossen und davon profitiert haben! Es war auch hilfreich für mich, es aufzuschreiben und zu erklären.
Vivek Subramanian

@VivekSubramanian sollte es stattdessen ?
=t1o1[o1(1o1)]h2+t2o2(o2o1)h2
Koryakinp

Du hast recht - es war ein Tippfehler! Ich werde die Änderung vornehmen.
Vivek Subramanian

Das, was ich hier nicht verstehe, ist, dass Sie einigen Neuronen auch Logits (nicht skalierte Scores) zuweisen. (o ist softmaxed logits (Prognosen) und y ist logits in Ihrem Fall). Dies ist jedoch normalerweise nicht der Fall, oder? Schauen Sie sich dieses Bild an (o_out1 ist Vorhersage und o_in1 ist Logs). Wie ist es in diesem Fall möglich, wie können Sie die partielle Ableitung von o2 in Bezug auf y1 finden?
ARAT

6

von möchte ich einen Buchstaben, dessen Großbuchstaben sich optisch von seinem Kleinbuchstaben unterscheiden. Lassen Sie mich also ersetzen . Verwenden wir auch die Variable , um das aus der vorherigen Ebene zu .{oi},{yi}{pi}{oi}

Sei die Diagonalmatrix, deren Diagonale gleich dem Vektor , dh Mit dieser neuen Matrixvariablen und dem Frobenius- Innenprodukt können wir den Gradienten von wrt berechnen . Yy

Y=Diag(y)
EW
z=Wp+bdz=dWpy=softmax(z)dy=(YyyT)dzE=t:log(y)dE=t:Y1dydE=t:Y1(YyyT)dz=t:(I1yT)dz=t:(I1yT)dWp=(y1TI)tpT:dW=((1Tt)ypTtpT):dWEW=(1Tt)ypTtpT

6

Hier ist eine der saubersten und am besten geschriebenen Notizen , die ich im Internet gefunden habe und die "Berechnung von Derivaten im Backpropagation-Algorithmus mit Cross-Entropy-Loss-Funktion" erklärt .


Wie wurde aus Gleichung 22 in der angegebenen PDF-Datei Gleichung 23? Wie hat die Summation (k! = I) ein negatives Vorzeichen bekommen? Sollte es nicht ein positives Zeichen bekommen? Gerne Summation(Fn)(For All K) = Fn(k=i) + Summation(Fn)(k!=i)sollte das nach meinem Verständnis geschehen.
Faizan

1

Hier ist ein Link , der den Softmax und seine Ableitung erklärt.

Es erklärt den Grund für die Verwendung von i = j und i! = J.


Es wird empfohlen, eine minimale, eigenständige Antwort bereitzustellen, falls die Verbindung in Zukunft unterbrochen wird. Andernfalls kann dies anderen Benutzern in Zukunft möglicherweise nicht mehr helfen.
Luchonacho

0

Andere Antworten haben die korrekte Methode zur Berechnung der Ableitung bereitgestellt, zeigen jedoch nicht auf, wo Sie einen Fehler gemacht haben. Tatsächlich ist in Ihrer letzten Gleichung immer 1, da Sie angenommen haben, dass diesen Knoten von Ziel 1 in Ihre Ausgabe aufnimmt. von anderen Knoten haben unterschiedliche Formen der Wahrscheinlichkeitsfunktion und führen daher zu unterschiedlichen Formen der Ableitung. Sie sollten jetzt verstehen, warum andere Personen und unterschiedlich behandelt haben.tjojoji=jij

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.