计算SVM损失函数的梯度。

19
我正在尝试实现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
你在使用哪个示例? - Prophecies
3个回答

9
在这种情况下,计算梯度的方法是微积分(解析地,而不是数值上!)。因此,我们对损失函数关于W(yi)进行微分,如下所示: enter image description here 当j!= yi时,对W(j)进行微分如下:

enter image description here

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

由于您正在使用cs231n示例,因此如果需要,您应该确保查看note和视频。

希望这有所帮助!


1
他们是如何从基本的SVM损失函数中推导出这些公式的?您能否详细解释一下?谢谢。 - Uri Abramson
2
@UriAbramson 你好!这其实是基本的微积分。对于w(yi),求导(w(j).T * xi - w(yi).T * xi + delta)得到-xi;对于w(j),我们得到xi(当指示函数对两种情况都为真时)。由于该网站不支持方程式呈现,最好查看原始笔记,如果您在理解微积分方面有困难,我建议您观看可汗学院的教程视频。他们有很棒的教学视频。希望这可以帮助到您。 - dexhunter
1
我现在明白了。我没有想到1(....>0)是一个条件。感谢您的解释,能否请您解释一下为什么需要进行两个导数 - 一个关于Wj,另一个关于 Wyi?它是如何工作的..? - Uri Abramson
2
为什么在梯度相对于Wyi时有求和,但是在相对于Wj时却没有求和?这个求和是如何消失的? - user2076774
1
我曾经很难理解这个问题。幸运的是,这篇文章帮了我大忙:https://mlxai.github.io/2017/01/06/vectorized-implementation-of-svm-loss-and-gradient-update.html - tandem
显示剩余2条评论

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

-2
如果我们不保留这两行代码:
dW[:,j] += X[i]
dW[:,y[i]] -= X[i] 

我们得到了损失值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接