Loss-Functions

鉸鏈損失梯度

  • November 17, 2010

我正在嘗試實現基本的梯度下降,並且正在使用鉸鏈損失函數進行測試,即. 但是,我對鉸鏈損失的梯度感到困惑。我的印像是

但這不是返回一個大小相同的矩陣嗎? 我以為我們正在尋找返回長度的向量? 顯然,我在某個地方有些困惑。有人可以在這裡指出正確的方向嗎?

我已經包含了一些基本代碼,以防我對任務的描述不清楚

#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 時. 二階導數變為. 所以最後你得到

自從範圍超過的組件, 你可以把上面的看成一個向量,然後寫作為簡寫

引用自:https://stats.stackexchange.com/questions/4608

comments powered by Disqus

相關問答