Вычислить градиент функции потери SVM
Я пытаюсь реализовать функцию потери SVM и ее градиент. Я нашел несколько примеров проектов, которые реализуют эти два, но я не мог понять, как они могут использовать функцию потерь при вычислении градиента.
Вот формула функции потерь:
Я не понимаю, как я могу использовать результат функции потерь при вычислении градиента?
Пример проекта вычисляет градиент следующим образом:
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) следующим образом:
и относительно W (j), когда j! = yi:
1 - это просто функция индикатора, поэтому мы можем игнорировать среднюю форму, когда условие истинно. И когда вы пишете код, приведенный вами пример является ответом.
Поскольку вы используете пример cs231n, вам обязательно нужно проверить заметку и видеоролики, если это необходимо.
Надеюсь это поможет!
Ответ 2
Если вычитание меньше нуля, то потеря равна нулю, поэтому градиент W также равен нулю. Если подкрепление больше нуля, то градиент W является частичным торможением потери.