Próbuję zaimplementować podstawowe zejście gradientu i testuję go za pomocą funkcji utraty zawiasu, tj. . Jestem jednak zdezorientowany co do gradientu utraty zawiasu. Mam wrażenie, że tak jest
Ale czy to nie zwraca macierzy tego samego rozmiaru co ? Myślałem, że chcemy zwrócić wektor długości ? Najwyraźniej mam gdzieś coś zagubionego. Czy ktoś może tutaj wskazać właściwy kierunek?
Dołączyłem podstawowy kod na wypadek, gdyby mój opis zadania nie był jasny
#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)
Aktualizacja: Chociaż poniższa odpowiedź pomogła mi zrozumieć problem, dane wyjściowe tego algorytmu są nadal niepoprawne dla danych. Funkcja strat zmniejsza się za każdym razem o 0,25, ale zbiega się zbyt szybko, a uzyskane masy nie skutkują dobrą klasyfikacją. Obecnie wygląda to na wynik
#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"
...
źródło
Odpowiedzi:
Aby uzyskać gradient, różnicujemy stratę w odniesieniu do tego składnika .wja w
Przepisać straty zawiasu pod względem jako , gdzie if ( g ( w ) ) f ( z ) = max ( 0 , 1 - y z ) g ( w ) = x ⋅ ww fa( g( w ) ) fa( z) = maks. ( 0 , 1 - y z) sol( w ) = x ⋅ w
Używając reguły łańcucha, otrzymujemy
Pierwszy składnik pochodny jest oceniany przy staje się gdy , i 0, gdy . Drugi termin pochodny staje się . Więc w końcu dostajesz - y x ⋅ w < 1 x ⋅ w > 1 x i ∂ f ( g ( w ) )sol( w ) = x ⋅ w - y x ⋅w<1 x ⋅w>1 xja
Ponieważ rozciąga się na składowe , możesz zobaczyć powyższe jako wielkość wektorową i napisać jako skrót dlax ∂ja x (∂∂∂w ( ∂∂w1, ∂∂w2), … )
źródło
Spóźnia się to o 3 lata, ale może być przydatne dla kogoś ...
Niech oznacza próbkę punktów i zestaw odpowiednich etykiet . Szukamy hiperpłaszczyzny , która minimalizuje całkowitą utratę zawiasów: Aby znaleźć oblicz pochodną całkowitej utraty zawiasu. Gradient każdego komponentu to: 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. xja∈ R.re yja∈ { - 1 , 1 } w w ∗ ∂ l h i n g e
Gradient sumy jest sumą gradientów. przykład Python, który wykorzystuje GD do znalezienia następuje optymalna separacja hiperpłaszczyzny zawiasu (prawdopodobnie nie jest to najbardziej wydajny kod, ale działa)
źródło
Naprawiłem twój kod. Głównym problemem jest twoja definicja funkcji zawiasów i d_hinge. Należy je nakładać pojedynczo. Zamiast tego twoja definicja agreguje wszystkie próbki przed pobraniem maksimum.
Potrzebuję n = 10000, aby się zbiegać.
[1] "strata: 0,090000, xw: 1,08999999999995,0.90999999999999905, -1.19000000000008, -1.69000000000011" [1] "strata: 0.100000, xw: 1.33999999999995,1,1199999999999, -0,900000000000075, -1,420000000000, 11,420000000000, 11,420000000000, 11,42000000000000, 11,4000000000000, 11,4000000000000, 11,4000000000000, 11,4000000000000, 11,4000000000000 0,939999999999948,0.829999999999905, -1.32000000000007, -1.77000000000011 Strata „[1]”: 0,370000, xw: 1,64999999999995,1,2899999999999, -0,630000000000075, -1,25000000000011 ”[1]” strata: 0,000000 [1] "strata: 0,240000, xw: 1,49999999999995,1.2099999999999, -0,760000000000075, -1.33000000000011" [1] "strata: 0,080000, xw: 1,09999999999995,05,0, 9199999999995, -1.18000000000007, -1.680000000000, 11.68000000000000, 11.68000000000000, 11.68000000000000 1.34999999999995,1,129999999999, -0,880000000000075, -1.41000000000011 "[1] "strata: 0.210000, xw: 0,949999999999948,0.839999999999905, -1.31000000000007, -1.76000000000011" [1] "strata: 0.380000, xw: 1.65999999999995,1,999999999999, -0,62000000000074, -11,0000000000, x1,1100 1,25999999999995,1,009999999999999, -1.0400000000000008, -1.59000000000011 Strata „[1]”: 0,000000, xw: 1,25999999999995,1,009999999999999, -1,04000000000008, -1,500000000000011 ”
źródło