J'essaie d'implémenter une descente de gradient de base et je la teste avec une fonction de perte de charnière, c'est-à-dire . Cependant, je suis confus quant au gradient de la perte de charnière. J'ai l'impression que c'est
Mais cela ne renvoie-t-il pas une matrice de la même taille que ? Je pensais que nous cherchions à renvoyer un vecteur de longueur ? De toute évidence, j'ai quelque chose de confus quelque part. Quelqu'un peut-il pointer dans la bonne direction ici?
J'ai inclus un code de base au cas où ma description de la tâche n'était pas claire
#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)
Mise à jour: Alors que la réponse ci-dessous m'a aidé à comprendre le problème, la sortie de cet algorithme est toujours incorrecte pour les données données. La fonction de perte diminue de 0,25 à chaque fois mais converge trop rapidement et les poids résultants n'entraînent pas une bonne classification. Actuellement, la sortie ressemble à
#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"
...
la source
Réponses:
Pour obtenir le gradient, nous différencions la perte par rapport à la ème composante de .wje w
Réécrire la perte de charnière en termes de en où etf ( 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
En utilisant la règle de chaîne, nous obtenons
Le premier dérivé est évalué à devenant lorsque , et 0 lorsque . Le second terme dérivé devient . Donc, à la fin, vous obtenez - y x ⋅ w < 1 x ⋅ w > 1 x i ∂ f ( g ( w ) )g(w)=x⋅w −y x⋅w<1 x⋅w>1 xi
Puisque s'étend sur les composants de , vous pouvez voir ce qui précède comme une quantité vectorielle et écrire comme raccourci pourx ∂i x (∂∂∂w (∂∂w1,∂∂w2,…)
la source
C'est 3 ans de retard, mais cela peut quand même être pertinent pour quelqu'un ...
Soit un échantillon des points et l'ensemble des étiquettes correspondantes . Nous recherchons un hyperplan qui minimiserait la perte totale de charnière: Pour trouver prendre la dérivée de la perte totale de charnière. Le gradient de chaque composant est:S xi∈Rd yi∈{−1,1} w w ∗ ∂ l h i n g e
Le gradient de la somme est une somme de gradients. Exemple Python, qui utilise GD pour trouver l'hyperplan de séparation optimal de perte de charnière suit (ce n'est probablement pas le code le plus efficace, mais cela fonctionne)
la source
J'ai corrigé ton code. Le principal problème est votre définition des fonctions charnière et d_hinge. Ceux-ci doivent être appliqués un échantillon à la fois. Au lieu de cela, votre définition regroupe tous les échantillons avant de prendre le maximum.
J'ai besoin de n = 10000 pour converger.
[1] "perte: 0,090000, xw: 1,08999999999995,0,909999999999905, -1,19000000000008, -1,69000000000011" [1] "perte: 0,100000, xw: 1,33999999999995,1.119999999999999, -0,900000000000075, -1,42000000000011" [1] "perte: 0,23 0.939999999999948,0.829999999999905, -1.32000000000007, -1.77000000000011 "[1]" perte: 0,370000, xw: 1,6499999999999995,1,2899999999999, -0,630000000000075, -1,25000000000011 "[1]" perte: 0,000000, xw: 1,2499999999999999999999999999999999 [1] "perte: 0,240000, xw: 1,499999999999999,1,19999999999999, -0,760000000000075, -1,33000000000011" [1] "perte: 0,080000, xw: 1,09999999999995,0,91999999999999905, -1,18000000000007, -1,6800000000001111" [1] "perte 1.34999999999995,1.1299999999999, -0.890000000000075, -1.41000000000011 "[1] "perte: 0,210000, xw: 0,949999999999948,0,839999999999905, -1,31000000000007, -1,76000000000011" [1] "perte: 0,380000, xw: 1,65999999999995,1,299999999999999, -0,620000000000074, -1,24000000000011:" 1 "," 1 " 1.25999999999995,1.0099999999999, -1.04000000000008, -1.59000000000011 "[1]" perte: 0.000000, xw: 1.25999999999995,1.0099999999999, -1.04000000000008, -1.59000000000011 "
la source