SVM_LOSS梯度推导

首先给出损失函数的定义:

其中符号定义:

SVM_LOSS梯度推导_第1张图片

其中Xi是某一样本输入,为行向量;Wj为权值矩阵中的某一列;Yi为Xi标签值,这里也代表所在向量的索引值。

我们将Li展开后可以得到其具体表达式为:

SVM_LOSS梯度推导_第2张图片

上式每一行前后表示意义为:

SVM_LOSS梯度推导_第3张图片

现在我们把损失函数对权值矩阵求导展开得到:

SVM_LOSS梯度推导_第4张图片

为了叙述清晰,这里我们忽略max(0,...)函数,它对权重求导的影响即将小于零位置导数置0即可,结合上述两式,可以得到求导值:

SVM_LOSS梯度推导_第5张图片

也就是:

SVM_LOSS梯度推导_第6张图片

其中Xi前面的部分主要是考虑到max(0,...)的影响,计算式小于0时,该位置置0;

下面计算dLi/dwyi1,含有wyi1的部分如下所示:

SVM_LOSS梯度推导_第7张图片

需要指出的是如果考虑到max(0,...)的影响,个数一般小于C。同样的,对于Wyi2...求导结果类似:

SVM_LOSS梯度推导_第8张图片

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

你可能感兴趣的:(SVM_LOSS梯度推导)