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"
...
quelle
Antworten:
Um den Gradienten zu erhalten, differenzieren wir den Verlust in Bezug auf die te Komponente von .wi w
Schreiben Sie den Scharnierverlust in Bezug auf als wobei undf ( g ( w ) ) f ( z ) = max ( 0 , 1 - y z ) g ( w ) = x ⋅ ww f(g(w)) f( z) = max ( 0 , 1 - y z) G( w ) = x ⋅ w
Mit Kettenregel bekommen wir
Der Term der ersten Ableitung wird ausgewertet , wenn wenn , und 0, wenn . Der zweite abgeleitete Term wird zu . Ende erhalten Sie also - y x ⋅ w < 1 x ⋅ w > 1 x i ∂ f ( g ( w ) )G( w ) = x ⋅ w - y x ≤w<1 x ⋅w>1 xich
Da über den Komponenten von , können Sie das Obige als Vektorgröße anzeigen und als Kurzform für schreibenx ∂ich x (∂∂∂w ( ∂∂w1, ∂∂w2, … )
quelle
Dies ist 3 Jahre zu spät, kann aber dennoch für jemanden relevant sein ...
Es sei eine Stichprobe von Punkten und die Menge der entsprechenden Bezeichnungen . Wir suchen nach einer Hyperebene , die den gesamten Scharnierverlust minimiert: Zum Ermitteln von die Ableitung des gesamten Scharnierverlusts verwendet. Der Gradient jeder Komponente ist: x i ∈ R d y i ∈ { - 1 , 1 } w w ∗ = argmin w L h i n g e S ( w ) = argmin w ∑ i l h i n g e ( w , x i , y i ) = argmin w ∑ i max { 0 ,S xi∈Rd yi∈{−1,1} w w * ∂ l h i n g e
Der Gradient der Summe ist eine Summe von Gradienten. Python-Beispiel, das GD verwendet, um zu finden Es folgt die optimale Trennung der Hyperebene durch Scharnierverlust (es ist wahrscheinlich nicht der effizienteste Code, aber es funktioniert)
quelle
Ich habe deinen Code repariert. Das Hauptproblem ist Ihre Definition von Scharnier- und d_hinge-Funktionen. Diese sollten jeweils einzeln aufgetragen werden. Stattdessen aggregiert Ihre Definition alle Stichproben, bevor Sie das Maximum nehmen.
Ich brauche n = 10000, um zu konvergieren.
[1] Verlust: 0,090000, xw: 1,0899999999999995,0,909999999999905, -1,190000000008, -1,69000000000011 [1] Verlust: 0,100000, xw: 1,33999999999995,1,119999999999999, -0,90000000000000000, 0,20,49 0,939999999999999,0,829999999999905, -1,32000000000007, -1,77000000000011 [1] Verlust: 0,370000, xw: 1,64999999999995,1,28999999999999999, -0,630000000000075, -1,25000000000011 [0,0070099999: 9999: 9999 [1] Verlust: 0,240000, xw: 1,49999999999995,1,2099999999999, -0,760000000000075, -1,33000000000011 [1] Verlust: 0,080000, xw: 1,0999999999999995,0,91999999999999905, -1,1800000000000000, -1,6905 1.34999999999995,1.1299999999999, -0,890000000000075, -1,41000000000011[1] Verlust: 0,210000, xw: 0,949999999999948,0,839999999999905, -1,310000000007, -1,76000000000011 [1] Verlust: 0,380000, xw: 1,6599999999999995,1,2999999999999, -0,620000000000000, -1,299 1.25999999999995,1.0099999999999, -1.04000000000008, -1.59000000000011 [1] Verlust: 0.000000, xw: 1.25999999999995,1.0099999999999, -1.0400000000000008, -1.59000000000011
quelle