【问题标题】:Understanding softmax classifier理解 softmax 分类器
【发布时间】:2015-08-27 20:23:47
【问题描述】:

我正在尝试通过此链接了解 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上。如果有任何地方可以发布与深度学习相关的问题,请告诉我。

【问题讨论】:

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


    【解决方案1】:

    从这里开始计算梯度:

    # 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 + bb 的导数是1,这就是为什么你在反向传播时简单地求和dscores

    【讨论】:

    • 您好,感谢您的帮助。只有一件事我没有得到。我的激活函数是w*x+b。所以如果我计算dW,(我的意思是W 上的梯度)它是x(正如你所提到的)。那么为什么我需要在x 和分数梯度之间使用点积呢?(我的意思是为什么dW = np.dot(X.T, dscores))?它实际上做了什么?
    • @S_kar 是W 的最终梯度。您可以从输出层开始对整个事物进行导数,并使用链式法则您将得到它。它会变得丑陋,所以我只给出了X出现的直觉:因为激活函数的导数是X。如果您希望计算所有内容,链式法则会让您更清楚。反向传播基本上只是链式法则的持续应用:g(f(x)) 的导数是g'(f(x)) * f'(x) * x'
    • 所以使用链式法则我​​会得到dW = X*dscore?现在,如果链规则是g(f(x)) is g'(f(x)) * f'(x) * x',那么如果激活函数是f = w*x + b,那么通过链规则,我得到dW = x。那我为什么不直接从w 中减去呢? (W += -step_size * dW)?我是这个主题的新手,所以你知道我很难理解这一点。对不起,如果我遗漏了一些明显的观点。
    • @S_kar 你的输出层激活函数是softmax。您需要从应用 softmax 的位置开始计算导数,然后使用链式法则。你不是从f = w*x + b 开始的。这个f 进一步被输入到 softmax 函数中,这就是你开始的地方。
    • 你能提供一些链接来获得一些直觉吗?
    【解决方案2】:

    梯度下降

    反向传播是为了降低整个系统的成本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

    Affin 层的反向传播

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

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

    链式规则

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

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

    通过链式法则将梯度应用于仿射层的梯度,得到代码,其中α替换为step_size。实际上,step_size 也需要学习。

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

    偏置梯度可以通过对偏置b应用链式法则以及来自后层的梯度(dscore)得出。

    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 Machine Learning Week 3 Cost Function

    注意

    偏置参数 b 被替换为 X0,因为偏置可以通过转移到基数来省略。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-20
      • 2019-04-27
      • 2018-11-27
      • 2021-08-11
      • 2017-04-26
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多