我正在尝试实现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是训练数据的数组。 但是我不明白损失函数的导数是如何产生这个代码的。
答案 0 :(得分:3)
在这种情况下计算梯度的方法是微积分(分析,非数字!)。所以我们将损失函数与W(yi)区分开来,如下所示:
并且关于W(j)当j!= yi是:
1只是指标函数,所以当条件为真时我们可以忽略中间形式。当你用代码编写时,你提供的例子就是答案。
由于您使用的是cs231n示例,因此如果需要,您一定要检查note和视频。
希望这有帮助!
答案 1 :(得分:0)
如果减法小于零,则损失为零,因此W的梯度也为零。如果梗阻大于零,那么W的梯度就是损失的部分折射。
答案 2 :(得分:0)
如果我们不保留这两行代码:
dW[:,j] += X[i]
dW[:,y[i]] -= X[i]
我们得到损失值。