8

我正在研究卷積神經網絡上的this類。我一直在試圖爲svm實現丟失函數的梯度和(我有一個解決方案的副本)我無法理解爲什麼解決方案是正確的。SVM損失函數的梯度

this頁它定義損失函數的梯度如下: Class course notes of cs231n 在我的代碼我的解析梯度用數字一個在代碼中實現時,按如下一致:

dW = np.zeros(W.shape) # initialize the gradient as zero 

    # compute the loss and the gradient 
    num_classes = W.shape[1] 
    num_train = X.shape[0] 
    loss = 0.0 
    for i in xrange(num_train): 
    scores = X[i].dot(W) 
    correct_class_score = scores[y[i]] 
    for j in xrange(num_classes): 
     if j == y[i]: 
     if margin > 0: 
      continue 
     margin = scores[j] - correct_class_score + 1 # note delta = 1 
     if margin > 0: 
     dW[:, y[i]] += -X[i] 
     dW[:, j] += X[i] # gradient update for incorrect rows 
     loss += margin 

然而,從票據看來,dW[:, y[i]]應該每次更改j == y[i],因爲我們每當j == y[i]減去損失。我很困惑爲什麼代碼不是:

dW = np.zeros(W.shape) # initialize the gradient as zero 

    # compute the loss and the gradient 
    num_classes = W.shape[1] 
    num_train = X.shape[0] 
    loss = 0.0 
    for i in xrange(num_train): 
    scores = X[i].dot(W) 
    correct_class_score = scores[y[i]] 
    for j in xrange(num_classes): 
     if j == y[i]: 
     if margin > 0: 
      dW[:, y[i]] += -X[i] 
      continue 
     margin = scores[j] - correct_class_score + 1 # note delta = 1 
     if margin > 0: 
     dW[:, j] += X[i] # gradient update for incorrect rows 
     loss += margin 

和損失會改變時j == y[i]。爲什麼當J != y[i]時它們都被計算?

+0

「在筆記中,每當j == y [i]時應該改變dW [:,y [i]],因爲每當j == y [i]時我們都會減去損失。」是不是求和j中的求和符號不等於y [i]? – user31415

+0

現在看,它似乎確實如此。拋出我的是什麼時候寫的「對於其他行,其中j!= yi的梯度是......」。這聽起來像第一個是在j == yi的情況下。這裏有什麼正確的含義?另外(也許是相關的),爲什麼在第一個函數中有一個總和,而不是在第二個中? – David

+1

這裏有不同變量的梯度。第一個是關於j == y_i(注意在左邊是grad_ {y_i}),其表達式涉及所有j的總和不等於y_i;第二個是關於每個j不等於y_i。 – user31415

回答

4

我沒有足夠的聲望發表評論,所以我在這裏回答。無論何時您計算第012訓練樣例的損失向量並獲得一些非零損失,這意味着您應該將不正確的類(j != y[i])的權重向量移動x[i],並且同時移動權重或超平面以獲得正確的類(j==y[i])在x[i]附近。根據平行四邊形法則,w + x位於wx之間。因此,w[y[i]]每次發現loss>0時都會嘗試接近x[i]

因此,dW[:,y[i]] += -X[i]dW[:,j] += X[i]在循環完成,但在更新,我們將在降低梯度的方向做,所以我們基本上將X[i]糾正類的權重,並從該錯過分類的權重由X[i]消失。