理解softmax分类器

我正在尝试理解从这个链接中提到的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,这就是为什么dWx和分数/输出层的梯度的点积。

w*x + b相对于b的导数是1,这就是为什么在反向传播时你只需对dscores求和。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注