기본 그라디언트 하강을 구현하려고하는데 힌지 손실 기능으로 테스트하고 있습니다. . 그러나 힌지 손실의 그라디언트에 대해 혼란 스럽습니다. 나는 그것이
그러나 이것은 \ boldsymbol {x} 와 같은 크기의 행렬을 반환하지 않습니까? 길이가 \ boldsymbol {w} 인 벡터를 반환하려고 생각했습니다 . 분명히, 어딘가에 혼란스러워하는 것이 있습니다. 누군가 올바른 방향으로 여기를 가리킬 수 있습니까?
작업에 대한 설명이 명확하지 않은 경우 기본 코드를 포함 시켰습니다.
#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"
...