计算SVM损失函数的梯度

2024-05-11 19:23:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图实现支持向量机的损失函数及其梯度。 我发现了一些实现这两种方法的示例项目,但是我不知道它们如何在计算梯度时使用损失函数。

损失函数公式如下: 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是训练数据的数组。 但我不明白损失函数的导数是如何产生这段代码的。


Tags: 项目函数inmargin示例fornumclass
2条回答

如果减法小于零,则损耗为零,因此W的梯度也为零。如果子弧大于零,那么W的梯度就是损耗的部分消去。

在这种情况下,计算梯度的方法是微积分(解析的,不是数值的!)。因此,我们将损失函数与W(yi)区分如下: enter image description here

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

enter image description here

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

因为您使用的是cs231n示例,所以如果需要的话,一定要检查note和视频。

希望这有帮助!

相关问题 更多 >