Невозможно получить правильный SVM-градиент, используя векторизацию
Я пытался использовать CS231n Assignment 1 для векторизации вычисления SVM-градиентов. dW - матрица градиента. Следующее - моя попытка:
def svm_loss_vectorized(W, X, y, reg):
num_train = X.shape[0]
loss = 0.0
dW = np.zeros(W.shape) # initialize the gradient as zero
scores = X.dot(W)
margins = np.maximum(0, scores - scores[y] + 1)
margins[y] = 0
# indices gets the position in the margins matrix where entry is > 0
indices = np.argwhere(margins > 0)
i = indices[:, 0]
j = indices[:, 1]
dW[:, j] += np.transpose(X[i])
dW[:, y[i]] -= np.transpose(X[i])
loss = np.sum(margins)
# average it
loss /= num_train
dW /= num_train
# regularization
loss += reg * np.sum(W * W)
dW += reg * W
return loss, dW
Мои расчеты потерь верны, однако рассчитанный градиент отклоняется с огромным запасом. Может ли кто-нибудь помочь мне понять, что мне здесь не хватает?