5

我试图从这个链接 - CS231n - Convolutional Neural Networks for Visual Recognition了解 Softmax 分类器的简单实现。在这里,他们实现了一个简单的 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

但是如何?我的意思是为什么梯度dWnp.dot(X.T, dscores)?为什么的梯度dbnp.sum(dscores, axis=0, keepdims=True)??那么他们是如何计算权重和偏差的梯度的呢?还有他们为什么计算regularization gradient

我刚刚开始学习卷积神经网络和深度学习。我听说这CS231n - Convolutional Neural Networks for Visual Recognition是一个很好的起点。我不知道在哪里放置与深度学习相关的帖子。所以,我把它们放在stackoverflow上。如果有任何地方可以发布与深度学习相关的问题,请告诉我。

4

2 回答 2

9

梯度从这里开始计算:

# 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。它对 是 的导数wx这就是为什么是分数/输出层的梯度和dW之间的点积。x

的导数w*x + bb1这就是为什么你dscores在反向传播时简单地求和。

于 2015-08-28T08:40:04.820 回答
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

在此处输入图像描述

仿射层的反向传播

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

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

在此处输入图像描述

链式法则

当 Affine 层之后还有softmax层、softmax 分类器中的log loss层等层时,我们可以用链式法则计算梯度。在图中,将sigmoid替换为softmax

在此处输入图像描述

正如cs321页面中的用反向传播计算分析梯度中所述,来自softmax层和log loss层的梯度贡献是dscore部分。请参阅下面的注释部分。

在此处输入图像描述

通过链式法则将梯度应用于仿射层的梯度,可以推导出将α替换为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增加成本来降低它,因为梯度下降将有助于减少权重的成本贡献。由于我们不知道哪些,所以使用所有W0.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机器学习第 3 周成本函数

笔记

在此处输入图像描述

偏置参数bX0代替,因为偏置可以通过移到基数来省略。

在此处输入图像描述

于 2020-12-13T11:44:11.333 回答