计算SVM损失函数的梯度

时间:2016-03-15 19:38:06

标签: python machine-learning svm gradient

我正在尝试实现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是训练数据的数组。 但是我不明白损失函数的导数是如何产生这个代码的。

3 个答案:

答案 0 :(得分:3)

在这种情况下计算梯度的方法是微积分(分析,非数字!)。所以我们将损失函数与W(yi)区分开来,如下所示:  enter image description here

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

enter image description here

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

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

希望这有帮助!

答案 1 :(得分:0)

如果减法小于零,则损失为零,因此W的梯度也为零。如果梗阻大于零,那么W的梯度就是损失的部分折射。

答案 2 :(得分:0)

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

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

我们得到损失值。