ฉันกำลังพยายามใช้การไล่ระดับสีพื้นฐานและฉันทดสอบด้วยฟังก์ชันการสูญเสียบานพับเช่น}) อย่างไรก็ตามฉันสับสนเกี่ยวกับการไล่ระดับสีของการสูญเสียบานพับ ฉันอยู่ภายใต้ความประทับใจที่มันเป็น
แต่นี่จะไม่ส่งกลับเมทริกซ์ที่มีขนาดเท่ากับหรือไม่ ฉันคิดว่าเราต้องการคืนเวกเตอร์ที่มีความยาว ? เห็นได้ชัดว่าฉันมีอะไรบางอย่างสับสน ใครบางคนสามารถชี้ไปในทิศทางที่ถูกต้องที่นี่?
ฉันได้รวมรหัสพื้นฐานไว้ในกรณีที่คำอธิบายงานของฉันไม่ชัดเจน
#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)
อัปเดต: แม้ว่าคำตอบด้านล่างจะช่วยให้ฉันเข้าใจปัญหาได้ผลลัพธ์ของอัลกอริทึมนี้ยังไม่ถูกต้องสำหรับข้อมูลที่กำหนด ฟังก์ชั่นการสูญเสียจะลดลง 0.25 ครั้งต่อครั้ง แต่การรวมกันเร็วเกินไปและน้ำหนักที่ได้จะไม่ส่งผลให้มีการจำแนกประเภทที่ดี ปัจจุบันผลลัพธ์ดูเหมือนว่า
#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"
...