Tôi đang cố gắng thực hiện giảm độ dốc cơ bản và tôi đang thử nghiệm nó với chức năng mất bản lề, ví dụ: . Tuy nhiên, tôi bối rối về độ dốc của bản lề. Tôi có ấn tượng rằng nó là
Nhưng điều này không trả về một ma trận có cùng kích thước với ? Tôi nghĩ rằng chúng tôi đang tìm cách trả về một vectơ có độ dài ? Rõ ràng, tôi đã có một cái gì đó nhầm lẫn ở đâu đó. Ai đó có thể chỉ đúng hướng ở đây?
Tôi đã bao gồm một số mã cơ bản trong trường hợp mô tả nhiệm vụ của tôi không rõ ràng
#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)
Cập nhật: Mặc dù câu trả lời dưới đây đã giúp tôi hiểu vấn đề, đầu ra của thuật toán này vẫn không chính xác cho dữ liệu đã cho. Hàm mất mát giảm 0,25 mỗi lần nhưng hội tụ quá nhanh và trọng số kết quả không dẫn đến phân loại tốt. Hiện tại đầu ra trông như
#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"
...