Ich arbeite an dieser Klasse für konvolutionelle neuronale Netze. Ich habe versucht, den Gradienten einer Verlustfunktion für ein SVM zu implementieren und (ich habe eine Kopie der Lösung) Ich habe Probleme zu verstehen, warum die Lösung korrekt ist.
Auf dieser Seite definiert es den Verlauf der Verlustfunktion wie folgt: In meinem Code stimmt mein analytischer Gradient mit dem numerischen Code überein, wenn er wie folgt in Code implementiert wird:
%Vor% Aus den Notizen scheint jedoch, dass dW[:, y[i]]
jedes Mal j == y[i]
geändert werden sollte, da wir den Verlust jedes Mal subtrahieren, wenn j == y[i]
. Ich bin sehr verwirrt, warum der Code nicht ist:
und der Verlust würde sich ändern, wenn j == y[i]
. Warum werden beide berechnet, wenn J != y[i]
?
Ich habe nicht genug Reputation, um zu kommentieren, also antworte ich hier. Immer wenn Sie den Verlustvektor für x[i]
, i
th Trainingsbeispiel berechnen und einen Verlust ungleich Null erhalten, sollten Sie Ihren Gewichtsvektor für die falsche Klasse (j != y[i])
weg von x[i]
verschieben und gleichzeitig verschieben die Gewichte oder Hyperebenen für die korrekte Klasse ( j==y[i]
) in der Nähe von x[i]
. Nach dem Parallelogrammgesetz liegt w + x
zwischen w
und x
. Auf diese Weise versucht w[y[i]]
, immer näher an x[i]
zu kommen, wenn loss>0
gefunden wird.
Somit wird dW[:,y[i]] += -X[i]
und dW[:,j] += X[i]
in der Schleife ausgeführt, aber während der Aktualisierung werden wir in Richtung abnehmender Steigung verfahren, also fügen wir im Wesentlichen X[i]
hinzu, um die Klassengewichte zu korrigieren und gehen weg von X[i]
von Gewichten, die nicht klassifizieren.
Tags und Links python computer-vision linear-regression svm gradient-descent