计算 SVM 损失函数的梯度
Compute the gradient of the SVM loss function
我正在尝试实现 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 是训练数据的数组。
但是没看懂这段代码中损失函数的导数是怎么产生的。
如果减法小于零,则损失为零,因此 W 的梯度也为零。如果减法大于零,那么W的梯度就是损失的偏导数。
在这种情况下计算梯度的方法是微积分(分析的,不是数值的!)。所以我们像这样区分关于 W(yi) 的损失函数:
关于 W(j) 当 j!=yi 是:
1只是指示函数,所以当条件为真时我们可以忽略中间形式。当您编写代码时,您提供的示例就是答案。
由于您使用的是 cs231n 示例,因此如果需要,您一定要查看 note 和视频。
希望对您有所帮助!
如果我们不保留这两行代码:
dW[:,j] += X[i]
dW[:,y[i]] -= X[i]
我们得到损失值。
我正在尝试实现 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 是训练数据的数组。 但是没看懂这段代码中损失函数的导数是怎么产生的。
如果减法小于零,则损失为零,因此 W 的梯度也为零。如果减法大于零,那么W的梯度就是损失的偏导数。
在这种情况下计算梯度的方法是微积分(分析的,不是数值的!)。所以我们像这样区分关于 W(yi) 的损失函数:
关于 W(j) 当 j!=yi 是:
1只是指示函数,所以当条件为真时我们可以忽略中间形式。当您编写代码时,您提供的示例就是答案。
由于您使用的是 cs231n 示例,因此如果需要,您一定要查看 note 和视频。
希望对您有所帮助!
如果我们不保留这两行代码:
dW[:,j] += X[i]
dW[:,y[i]] -= X[i]
我们得到损失值。