计算SVM损失函数的梯度

Mer*_*ozo 15 python gradient machine-learning svm

我正在尝试实现SVM损失函数及其渐变.我找到了一些实现这两个的示例项目,但是在计算渐变时我无法弄清楚它们如何使用loss函数.

这是损失函数的公式: 在此输入图像描述

我无法理解的是,在计算渐变时如何使用损失函数的结果?

示例项目按如下方式计算渐变:

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] 
Run Code Online (Sandbox Code Playgroud)

dW用于梯度结果.X是训练数据的数组.但是我不明白损失函数的导数是如何产生这个代码的.

dex*_*ter 8

在这种情况下计算梯度的方法是微积分(从分析上来说,不是在数值上!)。所以我们像这样区分 W(yi) 的损失函数: 在此处输入图片说明

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

在此处输入图片说明

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

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

希望这可以帮助!

  • @UriAbramson 嗨!这实际上是基本的微积分。微分 (w(j).T * xi - w(yi).T * xi + delta) 关于 w(yi),我们得到 -xi,并且关于 w(j) 微分,我们得到 xi (当指标函数在两种情况下都为真时)。好吧,由于网站不支持方程渲染,最好查看【原注】(http://cs231n.github.io/optimization-1/),如果你理解微积分有困难,我推荐你看可汗学院。他们有很棒的教程视频。我希望这有帮助。 (2认同)
  • 为什么当梯度是关于 Wyi 时有一个总和,但当它关于 Wj 时没有总和?求和怎么就消失了。 (2认同)