计算 SVM 损失函数的梯度

Compute the gradient of the SVM loss function

我正在尝试实现 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 是训练数据的数组。 但是没看懂这段代码中损失函数的导数是怎么产生的。

如果减法小于零,则损失为零,因此 W 的梯度也为零。如果减法大于零,那么W的梯度就是损失的偏导数。

在这种情况下计算梯度的方法是微积分(分析的,不是数值的!)。所以我们像这样区分关于 W(yi) 的损失函数:

关于 W(j) 当 j!=yi 是:

1只是指示函数,所以当条件为真时我们可以忽略中间形式。当您编写代码时,您提供的示例就是答案。

由于您使用的是 cs231n 示例,因此如果需要,您一定要查看 note 和视频。

希望对您有所帮助!

如果我们不保留这两行代码:

dW[:,j] += X[i]
dW[:,y[i]] -= X[i] 

我们得到损失值。