Ich habe versucht, ein neuronales Netzwerk von Grund auf neu zu implementieren, um die Mathematik dahinter zu verstehen. Mein Problem hängt vollständig mit der Rückausbreitung zusammen, wenn wir eine Ableitung in Bezug auf die Verzerrung vornehmen, und ich habe alle Gleichungen abgeleitet, die bei der Rückausbreitung verwendet werden. Jetzt stimmt jede Gleichung mit dem Code für das neuronale Netzwerk überein, mit Ausnahme der Ableitung in Bezug auf Verzerrungen.
z1=x.dot(theta1)+b1
h1=1/(1+np.exp(-z1))
z2=h1.dot(theta2)+b2
h2=1/(1+np.exp(-z2))
dh2=h2-y
#back prop
dz2=dh2*(1-dh2)
H1=np.transpose(h1)
dw2=np.dot(H1,dz2)
db2=np.sum(dz2,axis=0,keepdims=True)
Ich habe online nach dem Code gesucht und möchte wissen, warum wir die Matrix addieren und dann der Skalar db2=np.sum(dz2,axis=0,keepdims=True)
von der ursprünglichen Verzerrung subtrahiert wird, warum nicht die Matrix als Ganzes subtrahiert wird. Kann mir jemand helfen, etwas Intuition dahinter zu geben. Wenn ich eine partielle Ableitung des Verlusts in Bezug auf die Vorspannung nehme, gibt es mir nur einen oberen Gradienten, der dz2 ist, weil z2=h1.dot(theta2)+b2
h1 und Theta 0 und b2 1 sind. Der obere Term bleibt also übrig.
b2+=-alpha*db2
quelle
theta1=theta1-alpha*dw1 theta2=theta2-alpha*dw2
Ich verstehe es immer noch nicht. Auf diese Weise wird allen verschiedenen Begriffen im 'b'-Vektor derselbe Begriff hinzugefügt, der sonst für jeden einzelnen Begriff unterschiedliche Gewichte gehabt hätte. Dies würde einen signifikanten Unterschied für das neuronale Netzwerk bedeuten, um Minima zu erreichen.Ich möchte die Bedeutung von erklären,
db2=np.sum(dz2,axis=0,keepdims=True)
da es mich auch einmal verwirrt hat und nicht beantwortet wurde.Die Ableitung von∂L∂b=∂L∂Z∂Z∂b
L
(Verlust) wrtb
ist die vorgelagerte Ableitung multipliziert mit der lokalen Ableitung :Wenn wir mehrere Stichproben haben
Z
undL
beide Matrizen sind. b ist immer noch ein Vektor.Die lokale Ableitung ist einfach ein Vektor von Einsen :∂Z∂b=∂∂bW×X+b=1
Das heißt, unsere vollständige Ableitung ist eine Matrixmultiplikation, die wie folgt aussieht (z. B. 2 Abtastwerte mit 3 Ausgängen) :∂L∂Z×1=[......]⎡⎣⎢111⎤⎦⎥
Beachten Sie, dass dies die Summe der Zeilen ist .
Und da
db2=np.sum(dz2, axis=0, keepdims=True)
kommt es her. Es ist einfach eine Abkürzung für die Matrixmultiplikation der lokalen und der vorgelagerten Ableitungen.quelle
Zunächst müssen Sie Ihre Formel für den Gradienten der Sigmoidfunktion korrigieren.
Die erste Ableitung der Sigmoidfunktion ist:
(1−σ(x))σ(x)
Ihre Formel für dz2 lautet:
dz2 = (1-h2)*h2 * dh2
Sie müssen die Ausgabe der Sigmoid-Funktion
σ(x)
nicht für den Gradienten verwenden.Sie müssen den Gradienten für die Vorspannung summieren, da dieser Gradient von vielen einzelnen Eingaben stammt (Anzahl der Eingaben = Stapelgröße). Daher müssen wir sie akkumulieren, um die Verzerrungen von Schicht 2 zu aktualisieren. Da die Gradienten jedoch zu Schicht 1 kommen, müssen Sie den gesamten Gradienten für die Aktualisierung der Verzerrungen und Gewichte in Schicht 1 summieren, da sie von vielen Knoten von Schicht 2 stammen Dieser Fall unterscheidet sich von der Summe der Verzerrungen in Schicht 2.
Mein Gerät für zwei vollständig verbundene Schichten mit den Aktivierungsfunktionen sind Sigmoidfunktionen:
quelle