我正在尝试理解从这个链接中提到的Softmax分类器的简单实现 – CS231n – 用于视觉识别的卷积神经网络。在这里,他们实现了一个简单的softmax分类器。在链接中Softmax分类器的例子中,有一个2D空间中的300个随机点,并且每个点都有一个关联的标签。softmax分类器将学习这些点属于哪个类别。
这是softmax分类器的完整代码。或者你可以查看我提供的链接。
# initialize parameters randomlyW = 0.01 * np.random.randn(D,K)b = np.zeros((1,K))# some hyperparametersstep_size = 1e-0reg = 1e-3 # regularization strength# gradient descent loopnum_examples = X.shape[0]for i in xrange(200): # evaluate class scores, [N x K] scores = np.dot(X, W) + b # compute the class probabilities exp_scores = np.exp(scores) probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True) # [N x K] # compute the loss: average cross-entropy loss and regularization corect_logprobs = -np.log(probs[range(num_examples),y]) data_loss = np.sum(corect_logprobs)/num_examples reg_loss = 0.5*reg*np.sum(W*W) loss = data_loss + reg_loss if i % 10 == 0: print "iteration %d: loss %f" % (i, loss) # compute the gradient on scores dscores = probs dscores[range(num_examples),y] -= 1 dscores /= num_examples # backpropate the gradient to the parameters (W,b) dW = np.dot(X.T, dscores) db = np.sum(dscores, axis=0, keepdims=True) dW += reg*W # regularization gradient # perform a parameter update W += -step_size * dW b += -step_size * db
我无法理解他们是如何在这里计算梯度的。我认为他们在这里计算了梯度 –
dW = np.dot(X.T, dscores) db = np.sum(dscores, axis=0, keepdims=True) dW += reg*W # regularization gradient
但是,怎么计算的呢?我是说,为什么dW
的梯度是np.dot(X.T, dscores)
?为什么db
的梯度是np.sum(dscores, axis=0, keepdims=True)
?那么他们是如何计算权重和偏置的梯度的?他们为什么要计算regularization gradient
?
我刚开始学习卷积神经网络和深度学习。我听说CS231n - 用于视觉识别的卷积神经网络
是一个很好的起点。我不知道在哪里发布与深度学习相关的问题。所以,我把它们放在了stackoverflow上。如果有任何适合发布深度学习相关问题的地方,请告诉我。
回答:
梯度从这里开始计算:
# compute the gradient on scoresdscores = probsdscores[range(num_examples),y] -= 1dscores /= num_examples
首先,这将dscores
设置为由softmax函数计算的概率。然后,在第二行中,它从正确类别的计算概率中减去1
,在第三行中,它除以训练样本的数量。
为什么要减去1
?因为你希望正确标签的概率理想情况下是1
。所以它从实际预测中减去应该预测的值:如果它预测接近1
,减法将是一个大的负数(接近零),所以梯度会很小,因为你接近一个解。否则,它将是一个小的负数(远离零),所以梯度会更大,你会采取更大的步骤走向解。
你的激活函数只是w*x + b
。相对于w
的导数是x
,这就是为什么dW
是x
和分数/输出层的梯度的点积。
w*x + b
相对于b
的导数是1
,这就是为什么在反向传播时你只需对dscores
求和。