Ich versuche, eine grundlegende Gradientenabsenkung zu implementieren und teste sie mit einer Scharnierverlustfunktion, dh . Ich bin jedoch verwirrt über den Gradienten des Scharnierverlustes. Ich habe den Eindruck, dass es so ist
Gibt dies aber nicht eine Matrix mit der gleichen Größe wie ? Ich dachte, wir wollten einen Vektor mit der Länge \ boldsymbol {w} zurückgeben ? Offensichtlich habe ich irgendwo etwas verwirrt. Kann hier jemand in die richtige Richtung zeigen?
Ich habe einen Basiscode eingefügt, falls meine Beschreibung der Aufgabe nicht klar war
#Run standard gradient descent
gradient_descent<-function(fw, dfw, n, lr=0.01)
{
#Date to be used
x<-t(matrix(c(1,3,6,1,4,2,1,5,4,1,6,1), nrow=3))
y<-c(1,1,-1,-1)
w<-matrix(0, nrow=ncol(x))
print(sprintf("loss: %f,x.w: %s",sum(fw(w,x,y)),paste(x%*%w, collapse=',')))
#update the weights 'n' times
for (i in 1:n)
{
w<-w-lr*dfw(w,x,y)
print(sprintf("loss: %f,x.w: %s",sum(fw(w,x,y)),paste(x%*%w,collapse=',')))
}
}
#Hinge loss
hinge<-function(w,x,y) max(1-y%*%x%*%w, 0)
d_hinge<-function(w,x,y){ dw<-t(-y%*%x); dw[y%*%x%*%w>=1]<-0; dw}
gradient_descent(hinge, d_hinge, 100, lr=0.01)
Update: Während die Antwort unten mein Verständnis des Problems erleichterte, ist die Ausgabe dieses Algorithmus für die angegebenen Daten immer noch falsch. Die Verlustfunktion verringert sich jedes Mal um 0,25, konvergiert jedoch zu schnell, und die resultierenden Gewichte führen nicht zu einer guten Klassifizierung. Derzeit sieht die Ausgabe so aus
#y=1,1,-1,-1
"loss: 1.000000, x.w: 0,0,0,0"
"loss: 0.750000, x.w: 0.06,-0.1,-0.08,-0.21"
"loss: 0.500000, x.w: 0.12,-0.2,-0.16,-0.42"
"loss: 0.250000, x.w: 0.18,-0.3,-0.24,-0.63"
"loss: 0.000000, x.w: 0.24,-0.4,-0.32,-0.84"
"loss: 0.000000, x.w: 0.24,-0.4,-0.32,-0.84"
"loss: 0.000000, x.w: 0.24,-0.4,-0.32,-0.84"
...