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

«из заметок, что dW [:, y [i]] следует менять каждый раз, когда j == y [i], так как мы вычитаем убытки всякий раз, когда j == y [i].« Разве это не суммирующий символ суммирования по j NOT, равный y [i]? – user31415

+0

Рассматривая это сейчас, похоже, так оно и есть. То, что меня выбрасывает, - это когда написано «Для других строк, где j! = Yi градиент ...». Похоже, что первый - в случае, когда j == yi. В чем здесь смысл? Также (возможно, связанный), почему в первой функции есть сумма, но не во второй? – David

+1

Здесь существуют градиенты относительно разных переменных. Первый из них относится к j == y_i (обратите внимание, что слева - grad_ {y_i}), выражение которого включает сумму всех j, не равных y_i; второй - по отношению к каждому j, не равному y_i. – user31415

ответ

4

У меня недостаточно репутации для комментариев, поэтому я отвечаю здесь. Всякий раз, когда вы вычисляете вектор потерь для x[i], i-го примера тренировки и получаете некоторую ненулевую потерю, это означает, что вы должны переместить свой вектор веса для неправильного класса (j != y[i]) на x[i] и в то же время переместить веса или гиперплоскость для правильного класса (j==y[i]) около x[i]. В соответствии с законом параллелограмма w + x находится между w и x. Таким образом, w[y[i]] пытается приблизиться к x[i] каждый раз, когда находит loss>0.

Таким образом, dW[:,y[i]] += -X[i] и dW[:,j] += X[i] делается в цикле, но в то время как обновление, мы будем делать в направлении уменьшения градиента, таким образом, мы, по существу, добавляя X[i] исправить веса класса и уезжаю на X[i] от веса, которые пропускают классифицировать.

Смежные вопросы