Loss-Functions
鉸鏈損失梯度
我正在嘗試實現基本的梯度下降,並且正在使用鉸鏈損失函數進行測試,即. 但是,我對鉸鏈損失的梯度感到困惑。我的印像是
但這不是返回一個大小相同的矩陣嗎? 我以為我們正在尋找返回長度的向量? 顯然,我在某個地方有些困惑。有人可以在這裡指出正確的方向嗎?
我已經包含了一些基本代碼,以防我對任務的描述不清楚
#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" ...
為了得到梯度,我們將損失區分為的第一個組成部分.
重寫鉸鏈損失作為在哪裡和
使用鍊式法則我們得到
一階導數項在變得什麼時候, 0 時. 二階導數變為. 所以最後你得到
自從範圍超過的組件, 你可以把上面的看成一個向量,然後寫作為簡寫