首先给出损失函数的定义:
其中符号定义:
其中Xi是某一样本输入,为行向量;Wj为权值矩阵中的某一列;Yi为Xi标签值,这里也代表所在向量的索引值。
我们将Li展开后可以得到其具体表达式为:
上式每一行前后表示意义为:
现在我们把损失函数对权值矩阵求导展开得到:
为了叙述清晰,这里我们忽略max(0,...)函数,它对权重求导的影响即将小于零位置导数置0即可,结合上述两式,可以得到求导值:
也就是:
其中Xi前面的部分主要是考虑到max(0,...)的影响,计算式小于0时,该位置置0;
下面计算dLi/dwyi1,含有wyi1的部分如下所示:
需要指出的是如果考虑到max(0,...)的影响,个数一般小于C。同样的,对于Wyi2...求导结果类似:
cs231n - assignment1 - linear-svm代码实现为:
for i in range(num_train):
scores = X[i].dot(W)
correct_class_score = scores[y[i]]
for j in range(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].T
dW[:,y[i]] += -X[i].T
参考:Vectorized Implementation of SVM Loss and Gradient Update