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=−∑jtjlogoj⟹∂E∂zk=−∑jtj∂logoj∂zk
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,Ω=∑iezi⟹logoj=zj−logΩ
∂logoj∂zk=δjk−1Ω∂Ω∂zk
δjk∂Ω∂zk=∑ieziδik=ezk
∂logoj∂zk=δjk−ok
∂oj∂zk=oj(δjk−ok)
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
∂E∂zk=∑jtj(ok−δjk)=ok(∑jtj)−tk⟹∂E∂zk=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+bk⟹∂zk∂wpq=∑iyi∂wik∂wpq=∑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
∂E∂wpq=∑k∂E∂zk∂zk∂wpq=∑k(okτ−tk)δkqyp=yp(oqτ−tq)
τ = 1 ≤ Etτ=1y∂E∂wij=yi(oj−tj)
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
∂E∂wpq=∑i∂E∂oi∂oi∂wpq
∂oi∂wpq=∑k∂oi∂zk∂zk∂wpq
∂E∂wpq=∑i[∂E∂oi(∑k∂oi∂zk∂zk∂wpq)]
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