计算 SVM 损失函数的梯度

Posted

技术标签:

【中文标题】计算 SVM 损失函数的梯度【英文标题】:Compute the gradient of the SVM loss function 【发布时间】:2016-07-01 10:36:21 【问题描述】:

我正在尝试实现 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 示例,如果需要,您绝对应该查看note 和视频。

希望这会有所帮助!

【讨论】:

他们是如何从基本的 SVM 损失中开发出这些公式的?你能更详细地解释一下吗?谢谢 @UriAbramson 嗨!这实际上是基本的微积分。将 (w(j).T * xi - w(yi).T * xi + delta) 对 w(yi) 进行微分,得到 -xi,对 w(j) 进行微分,得到 xi (当指标函数对这两种情况都为真时)。好吧,由于该网站不支持方程渲染,最好查看the original note,如果您对微积分理解有困难,我建议您观看可汗学院。他们有很棒的教程视频。我希望这会有所帮助。 我现在明白了。我没有弄清楚 1(.... > 0) 是一个条件。谢谢你的解释,你能解释一下为什么你需要做2个衍生品——一个w.r.t Wj,另一个w.r.t Wyi?它是如何工作的..? 当梯度相对于 Wyi 时,为什么会有求和,而相对于 Wj 时却没有求和?总和是如何消失的。 我很难理解这一点。幸运的是,这个救了:mlxai.github.io/2017/01/06/…【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

我们得到损失值。

【讨论】:

以上是关于计算 SVM 损失函数的梯度的主要内容,如果未能解决你的问题,请参考以下文章

2多类SVM

SVM算法的另外一种理解

SVM、Softmax 损失函数

Keras 中的自定义损失函数(IoU 损失函数)和梯度误差?

多分类SVM损失函数: Multiclass SVM loss

svm损失函数