Saya mencoba menerapkan gradient descent dasar dan saya mengujinya dengan fungsi kehilangan engsel yaitu . Namun, saya bingung tentang gradien kehilangan engsel. Saya mendapat kesan bahwa itu adalah
Tapi bukankah ini mengembalikan matriks dengan ukuran yang sama dengan ? Saya pikir kami ingin mengembalikan vektor dengan panjang ? Jelas, saya punya sesuatu yang membingungkan. Bisakah seseorang menunjuk ke arah yang benar di sini?
Saya telah memasukkan beberapa kode dasar jika deskripsi tugas saya tidak jelas
#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)
Pembaruan: Sementara jawaban di bawah ini membantu saya memahami masalah, output dari algoritma ini masih salah untuk data yang diberikan. Fungsi kerugian berkurang 0,25 setiap kali tetapi konvergen terlalu cepat dan bobot yang dihasilkan tidak menghasilkan klasifikasi yang baik. Saat ini hasilnya terlihat seperti
#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"
...
sumber
Jawaban:
Untuk mendapatkan gradien kami membedakan kerugian sehubungan dengan komponen ke- dari w .saya w
Tulis ulang kehilangan engsel dalam bentuk sebagai f ( g ( w ) ) di mana f ( z ) = maks ( 0 , 1 - y z ) dan g ( w ) = x ⋅w f(g(w)) f(z)=max(0,1−y z) g(w)=x⋅w
Menggunakan aturan rantai yang kita dapatkan
Istilah derivatif pertama dievaluasi pada menjadi - y ketika x ⋅ w < 1 , dan 0 ketika x ⋅ w > 1 . Istilah turunan kedua menjadi x i . Jadi pada akhirnya Anda mendapatkan ∂ f ( g ( w ) )g(w)=x⋅w −y x⋅w<1 x⋅w>1 xi
Karena berkisar pada komponen x , Anda dapat melihat di atas sebagai jumlah vektor, dan menulis ∂i x sebagai singkatan untuk(∂∂∂w (∂∂w1,∂∂w2,…)
sumber
Ini terlambat 3 tahun, tetapi mungkin masih relevan untuk seseorang ...
Gradien dari jumlah adalah jumlah dari gradien.
sumber
Saya memperbaiki kode Anda. Masalah utama adalah definisi Anda tentang fungsi engsel dan d_hinge. Ini harus diterapkan satu sampel pada satu waktu. Alih-alih, definisi Anda mengumpulkan semua sampel sebelum mengambil yang maksimum.
Saya perlu n = 10.000 untuk bertemu.
[1] "kerugian: 0,090000, xw: 1,0899999999999595,9099999999905, -1.19000000000008, -1.6900000000001111" [1] "kerugian: 0.100000, xw: 1.33999999999999999, -0.9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ,00 0,990,9999999999999,9919909900000000000000000000000, bisnis, bisnis, bisnis,,,,,,,,, dalam perkawinan, lebih lanjut, lebih lanjut lagi, lagi, lagi, lagi, lagi, lagi-lebih112100100100100100000000990000000000000000000000000000o0000o990000 usaha_,,,,,,,,,,,,, ... [1] "kerugian: 0.240000, xw: 1.49999999999995.1.2099999999999, -0.760000000000075, -1.3300000000001111" [1] "kerugian: 0.080000, xw: 1.09999999999999999.0.0.91999999999999905, -1.180000000000700, -10000000000700, 0000000000007, 0000, 0000" 1.34999999999995,1.1299999999999, -0.890000000000075, -1.4100000000001111 "[1] "kerugian: 0,210000, xw: 0.949999999999948.0.8399999999995, -1.31000000000007, -1.7600000000001111" [1] "kerugian: 0.380000, xw: 1.65999999999999991.299999999999999, -0.6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 1.25999999999995,1.0099999999999, -1.04000000000008, -1.5900000000001111 "[1]" kerugian: 0,000000, xw: 1,259999999999991,19999999999999, -1,0400000000000011 "
sumber