Wie die Umsetzung der Softmax-Derivat unabhängig von etwaigen Verlust-Funktion?
Für neuronale Netze Bibliothek, die ich implementiert einige Funktionen Aktivierung-und-Verlust-Funktionen und deren Ableitungen. Sie können beliebig kombiniert werden und die Ableitung am Ausgang Schichten wird das Produkt von der Verlust-Derivat und die Aktivierung Derivat.
Allerdings, ich konnte zur Umsetzung der Ableitung der Softmax-Aktivierung-Funktion unabhängig von etwaigen Verlust-Funktion. Aufgrund der Normalisierung, d.h. der Nenner in der Gleichung, die das ändern einer einzelnen input-Aktivierung ändert sich alle output-Aktivierungen und nicht nur eine.
Hier ist mein Softmax-Implementierung, wo die Ableitung fehl, ist der gradient der überprüfung von über 1%. Wie kann ich die Umsetzung der Softmax-Derivat, so dass es sein kann, kombiniert mit einem Verlust der Funktion?
import numpy as np
class Softmax:
def compute(self, incoming):
exps = np.exp(incoming)
return exps /exps.sum()
def delta(self, incoming, outgoing):
exps = np.exp(incoming)
others = exps.sum() - exps
return 1 /(2 + exps /others + others /exps)
activation = Softmax()
cost = SquaredError()
outgoing = activation.compute(incoming)
delta_output_layer = activation.delta(incoming) * cost.delta(outgoing)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mathematisch die Ableitung von Softmax σ(j) mit Bezug auf das logit-Zi (Z. B. Wi*X) ist
wo das rote Dreieck ist eine Kronecker-delta.
Wenn Sie implementieren iterativ:
Test:
Wenn Sie das umsetzen in eine vektorisierte version:
Es sollte wie folgt sein: (x ist die Eingabe der softmax-Schicht und dy ist die delta kommen die aus dem Verlust oben)
Aber die Art, wie Sie berechnen den Fehler, sollte sein:
Erklärung: Weil die
delta
Funktion ist ein Teil des backpropagation-Algorithmus, dessen Aufgabe ist es, multiplizieren Sie den Vektordy
(in meinem codeoutgoing
in deinem Fall) durch die Jacobi-dercompute(x)
Funktion ausgewertet anx
. Wenn Sie arbeiten heraus, was hat das Jacobi-Aussehen für softmax [1], und dann multiplizieren Sie es von der linken Seite durch einen Vektordy
nach etwas algebra finden Sie heraus, dass Sie etwas bekommen, das entspricht meinem Python-code.[1] https://stats.stackexchange.com/questions/79454/softmax-layer-in-a-neural-network
res
?Hier ist eine c++ - vektorisierte version, mit Interna ( 22-mal (!) schneller als die non-SSE-version):
Wenn aus irgendeinem Grund jemand will eine einfache (nicht SSE) version, hier ist es: