Вычислить градиент функции потери SVM

Я пытаюсь реализовать функцию потери SVM и ее градиент. Я нашел несколько примеров проектов, которые реализуют эти два, но я не мог понять, как они могут использовать функцию потерь при вычислении градиента.

Вот формула функции потерь: enter image description here

Я не понимаю, как я могу использовать результат функции потерь при вычислении градиента?

Пример проекта вычисляет градиент следующим образом:

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]:
        continue
      margin = scores[j] - correct_class_score + 1 # note delta = 1
      if margin > 0:
        loss += margin
        dW[:,j] += X[i]
        dW[:,y[i]] -= X[i] 

dW - для результата градиента. И X - это массив данных обучения. Но я не понял, как производная от функции потерь приводит к этому коду.

Ответ 1

Метод вычисления градиента в этом случае - Исчисление (аналитически, НЕ численно!). Поэтому мы различаем функцию потерь относительно W (yi) следующим образом: enter image description here

и относительно W (j), когда j! = yi:

enter image description here

1 - это просто функция индикатора, поэтому мы можем игнорировать среднюю форму, когда условие истинно. И когда вы пишете код, приведенный вами пример является ответом.

Поскольку вы используете пример cs231n, вам обязательно нужно проверить заметку и видеоролики, если это необходимо.

Надеюсь это поможет!

Ответ 2

Если вычитание меньше нуля, то потеря равна нулю, поэтому градиент W также равен нулю. Если подкрепление больше нуля, то градиент W является частичным торможением потери.