了解softmax分类器

时间:2015-08-27 20:23:48

标签: machine-learning deep-learning gradient-descent calculus softmax

我试图通过此链接了解Softmax分类器的简单实现 - CS231n - Convolutional Neural Networks for Visual Recognition。他们在这里实现了一个简单的softmax分类器。在链接上的Softmax分类器的示例中,2D空间上有随机的300个点以及与它们相关联的标签。 softmax分类器将了解哪个点属于哪个类。

这是softmax分类器的完整代码。或者你可以看到我提供的链接。

# initialize parameters randomly
W = 0.01 * np.random.randn(D,K)
b = np.zeros((1,K))

# some hyperparameters
step_size = 1e-0
reg = 1e-3 # regularization strength

# gradient descent loop
num_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 - Convolutional Neural Networks for Visual Recognition是一个很好的起点。我不知道在哪里放置深度学习相关的帖子。所以,我把它们放在stackoverflow上。如果有任何地方可以发布与深度学习相关的问题,请告诉我。

2 个答案:

答案 0 :(得分:6)

渐变开始在这里计算:

# compute the gradient on scores
dscores = probs
dscores[range(num_examples),y] -= 1
dscores /= num_examples

首先,这将dscores设置为等于softmax函数计算的概率。然后,它从第二行中为正确类计算的概率中减去1,然后除以第三行中的训练样本数。

为什么减去1?因为您希望正确标签的概率为1,理想情况下。所以它从它实际预测的内容中减去它应该预测的内容:如果它预测接近1的东西,则减法将是一个大的负数(接近零),所以渐变会很小,因为你是接近解决方案。否则,它将是一个小的负数(远离零),因此渐变将更大,您将采取更大的步骤来解决。

您的激活功能只是w*x + b。它相对于w的导数是x,这就是dWx与得分/输出图层渐变之间的点积的原因。

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

答案 1 :(得分:0)

梯度下降

反向传播是为了降低整个系统的成本J(此处为softmax分类器),优化权重参数W以最小化成本是一个问题。假设成本函数J = f(W),则梯度下降W = W - α * f'(W)将导致Wmin最小化J。超参数α称为学习率,我们也需要对其进行优化,但在此答案中不需要。

Y在图中应读为J。假设您位于形状定义为J = f(W)的地方的表面上,并且需要到达点Wmin。没有重力,因此您不知道哪种方式朝向底部,但是您知道函数和坐标。您怎么知道应该走哪条路?您可以从导数f'(W)找到方向,并通过W = W - α * f'(W)移至新坐标。通过重复此操作,您可以越来越靠近Wmin点。

enter image description here

仿射层的反向传播

在发生乘法或点运算(仿射)的节点上,该函数为J = f(W) = X * W。假设有m个固定的二维坐标表示为X。我们如何找到最小化J = f(W) = X * W及其向量W的超平面?

如果α适用,我们可以通过重复梯度下降W来接近最佳W += -α * X

enter image description here

链式规则

当在Affine层之后有诸如softmax分类器中的 softmax 层和 log loss 层之类的层时,我们可以使用链规则计算梯度。在图中,将 Sigmoid 替换为 softmax

enter image description here

如cs321页上的Computing the Analytic Gradient with Backpropagation中所述, softmax 层和 log loss 层的梯度贡献是 dscore 强>部分。也请参见下面的“注释”部分。

enter image description here

通过链规则将渐变应用于仿射层的渐变,可以导出代码,其中α step_size 替换。实际上,还需要学习 step_size

dW = np.dot(X.T, dscores)
W += -step_size * dW

可以通过将链规则应用到带有来自帖子层的梯度( dscore )的偏差 b 来导出偏差梯度。

db = np.sum(dscores, axis=0, keepdims=True)

正则化

如cs231页面的Regularization中所述,通过添加正则化来调整成本函数(目标),正则化在代码中为 reg_loss 。这是为了减少过度拟合。在我的理解中,直觉是,如果特定特征导致过度拟合,我们可以通过使用权重参数 W 来夸大成本来减少它,因为梯度下降将有助于减少来自权重。由于我们不知道哪个,请全部使用 W 0.5 * W * W 的原因是因为它给出了简单的导数 W

reg_loss = 0.5*reg*np.sum(W*W)

梯度贡献reg*W来自 reg_loss 的导数。 reg 是要在实际训练中学习的超级参数。

reg_loss/dw -> 0.5 * reg * 2 * W

将其添加到仿射后的图层的渐变中。

dW += reg*W # regularization gradient

在帖子中引用的cs231页面中省略了从包括正则化在内的成本中获取导数的过程,这可能是因为通常的做法是仅放置正则化的梯度,但对于那些学习的人却感到困惑。有关正则化,请参见Andrew Ng的Coursera Machine Learning Week 3 Cost Function

注意

enter image description here

偏差参数 b X0 代替,因为可以通过移至基数来省略偏差。

enter image description here