Я работаю над классом свернутых нейронных сетей 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]
?
«из заметок, что dW [:, y [i]] следует менять каждый раз, когда j == y [i], так как мы вычитаем убытки всякий раз, когда j == y [i].« Разве это не суммирующий символ суммирования по j NOT, равный y [i]? – user31415
Рассматривая это сейчас, похоже, так оно и есть. То, что меня выбрасывает, - это когда написано «Для других строк, где j! = Yi градиент ...». Похоже, что первый - в случае, когда j == yi. В чем здесь смысл? Также (возможно, связанный), почему в первой функции есть сумма, но не во второй? – David
Здесь существуют градиенты относительно разных переменных. Первый из них относится к j == y_i (обратите внимание, что слева - grad_ {y_i}), выражение которого включает сумму всех j, не равных y_i; второй - по отношению к каждому j, не равному y_i. – user31415