我正在研究卷積神經網絡上的this類。我一直在試圖爲svm實現丟失函數的梯度和(我有一個解決方案的副本)我無法理解爲什麼解決方案是正確的。SVM損失函數的梯度
在this頁它定義損失函數的梯度如下: 在我的代碼我的解析梯度用數字一個在代碼中實現時,按如下一致:
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]
時它們都被計算?
「在筆記中,每當j == y [i]時應該改變dW [:,y [i]],因爲每當j == y [i]時我們都會減去損失。」是不是求和j中的求和符號不等於y [i]? – user31415
現在看,它似乎確實如此。拋出我的是什麼時候寫的「對於其他行,其中j!= yi的梯度是......」。這聽起來像第一個是在j == yi的情況下。這裏有什麼正確的含義?另外(也許是相關的),爲什麼在第一個函數中有一個總和,而不是在第二個中? – David
這裏有不同變量的梯度。第一個是關於j == y_i(注意在左邊是grad_ {y_i}),其表達式涉及所有j的總和不等於y_i;第二個是關於每個j不等於y_i。 – user31415