Temel degrade inişini uygulamaya çalışıyorum ve bunu bir menteşe kaybı fonksiyonu ile test ediyorum, yani . Ancak, menteşe kaybının derecesi hakkında kafam karıştı. Olduğu izlenimi altındayım
Fakat bu, \ boldsymbol {x} ile aynı boyutta bir matris döndürmüyor mu? Bir uzunluk vektör döndürmek istediğimizi sanıyordum ? Açıkçası, bir yerlerde kafam karıştı. Birisi burada doğru yöne işaret edebilir mi?
Görev tanımının net olmadığı durumda bazı temel kodları ekledim.
#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)
Güncelleme: Aşağıdaki cevap sorunu anlamada yardımcı olurken, bu algoritmanın çıktısı verilen veriler için hala yanlış. Kayıp fonksiyonu her seferinde 0.25 azalır, ancak çok hızlı bir şekilde birleşir ve sonuçta ortaya çıkan ağırlıklar iyi bir sınıflandırma ile sonuçlanmaz. Şu anda çıktı gibi görünüyor
#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"
...