理解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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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