gpt4 book ai didi

python - 矢量化 SVM 梯度

转载 作者:太空狗 更新时间:2023-10-30 00:12:54 28 4
gpt4 key购买 nike

我正在查看 SVM 损失和导数的代码,我确实理解了损失,但我无法理解如何以矢量化方式计算梯度

def svm_loss_vectorized(W, X, y, reg):

loss = 0.0
dW = np.zeros(W.shape) # initialize the gradient as zero
num_train = X.shape[0]

scores = X.dot(W)
yi_scores = scores[np.arange(scores.shape[0]),y]
margins = np.maximum(0, scores - np.matrix(yi_scores).T + 1)
margins[np.arange(num_train),y] = 0
loss = np.mean(np.sum(margins, axis=1))
loss += 0.5 * reg * np.sum(W * W)

理解到这里,到这里之后我不明白为什么我们要在二进制矩阵中逐行求和并减去它的和

binary = margins
binary[margins > 0] = 1
row_sum = np.sum(binary, axis=1)
binary[np.arange(num_train), y] = -row_sum.T
dW = np.dot(X.T, binary)

# Average
dW /= num_train

# Regularize
dW += reg*W

return loss, dW

最佳答案

让我们先回顾一下场景和损失函数,所以我们在同一页上:

给出的是P N 中的样本点形式的维空间 PxN矩阵 X , 所以点是这个矩阵的行。 X 中的每个点分配给 M 中的一个类别。这些以向量形式给出 Y长度P具有介于 0 和 M-1 之间的整数值.

目标是通过 M 预测所有点的类别以权重矩阵形式给出的线性分类器(每个类别一个)W形状NxM , 所以分类器是 W 的列.预测所有样本的类别X形成所有点和所有权重向量之间的标量积。这与矩阵乘法相同 XW产生一个分数矩阵 Y0其排列方式使其行的顺序类似于 Y 的元素,每一行对应一个样本。每个样本的预测类别就是得分最高的类别。

没有偏差项,所以我假设存在某种对称性或零均值假设。

现在,为了找到一组好的权重,我们需要一个损失函数,该损失函数对于好的预测要小,对于坏的预测要大,这样我们就可以进行梯度下降。最直接的方法之一是对每个样本进行惩罚 i每个分数大于该样本正确类别的分数,并让惩罚随着差异线性增长。所以如果我们写 A[i]对于类别集 j得分高于正确类别 Y0[i, j] > Y0[i, Y[i]]样本损失 i可以写成

sum_{j in A[i]} (Y0[i, j] - Y0[i, Y[i]])

或者等价地,如果我们写 #A[i] A[i] 中的元素数量

(sum_{j in A[i]} Y0[i, j]) - #A[i] Y0[i, Y[i]]

关于分数的偏导数因此很简单

                    | -#A[i]      if j == Y[i]
dloss / dY0[i, j] = { 1 if j in A[i]
| 0 else

这正是您所说的前四行您不了解计算的内容。

下一行应用链式规则dloss/dW = dloss/dY0 dY0/dW .

仍然需要除以样本数以获得每个样本的损失,并添加调节项的导数,其中正则化只是一个分量二次函数很容易。

关于python - 矢量化 SVM 梯度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47607814/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com