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"
...