Estoy tratando de implementar un descenso de gradiente básico y lo estoy probando con una función de pérdida de bisagra, es decir, . Sin embargo, estoy confundido sobre el gradiente de la pérdida de la bisagra. Tengo la impresión de que es
Pero, ¿no devuelve esto una matriz del mismo tamaño que ? Pensé que estábamos buscando devolver un vector de longitud ? Claramente, tengo algo confundido en alguna parte. ¿Alguien puede apuntar en la dirección correcta aquí?
He incluido un código básico en caso de que mi descripción de la tarea no estuviera clara
#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)
Actualización: Si bien la respuesta a continuación me ayudó a comprender el problema, la salida de este algoritmo sigue siendo incorrecta para los datos dados. La función de pérdida se reduce en 0.25 cada vez, pero converge demasiado rápido y los pesos resultantes no resultan en una buena clasificación. Actualmente la salida se ve así
#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"
...