【问题标题】:How to understand this: `db = np.sum(dscores, axis=0, keepdims=True)`如何理解:`db = np.sum(dscores, axis=0, keepdims=True)`
【发布时间】:2018-04-20 21:03:49
【问题描述】:

cs231n 2017 class 中,当我们反向传播梯度时,我们会像这样更新偏差:

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

sum 操作背后的基本思想是什么?谢谢

【问题讨论】:

  • 实际上,恐怕我没有说清楚。我想知道的是为什么我们需要对每一行求和而不是计算平均值或其他什么?

标签: numpy machine-learning deep-learning


【解决方案1】:

这是损失函数相对于偏差的导数(更准确地说是梯度)公式(参见this questionthis post for derivation details)。

numpy.sum 调用计算 沿 0 轴的每列总和。示例:

dscores = np.array([[1, 2, 3],[2, 3, 4]])    # a 2D matrix
db = np.sum(dscores, axis=0, keepdims=True)  # result: [[3 5 7]]

结果正好是元素总和[1, 2, 3] + [2, 3, 4] = [3 5 7]。此外,keepdims=True 保留了原始矩阵的秩,这就是为什么结果是[[3 5 7]] 而不仅仅是[3 5 7]

顺便说一句,如果我们要计算np.sum(dscores, axis=1, keepdims=True),结果将是[[6] [9]]

[更新]

显然,这个问题的重点是公式本身。我不想在这里过多地跑题,只是试着说出主要思想。总和出现在公式中是因为 广播 在前向传递中的小批量。如果你一次只举一个例子,偏差导数就是误差信号,即dscores(请参阅上面的链接详细解释)。但是对于一批示例,由于线性,梯度是相加的。这就是为什么我们在 batch axis=0 中取总和。

【讨论】:

  • 非常感谢。但我想我没有足够清楚地解释我的问题。我想知道的是为什么偏差是每一行的总和?
  • @Woody.Wang 啊,知道了。我已经在答案中包含了这个公式背后的主要思想,但是除了自己推导出它之外没有更好的方法来理解它,所以我强烈建议你这样做。
【解决方案2】:

Numpy 轴视觉描述:

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 2020-05-22
相关资源
最近更新 更多