如何理解:`db = np.sum(dscores,axis = 0,keepdims = True)`

时间:2017-11-08 08:54:18

标签: numpy machine-learning deep-learning

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

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

sum操作背后的基本理念是什么?感谢

2 个答案:

答案 0 :(得分:2)

这是损失函数相对于偏差的导数公式(更准确地说是梯度)(见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(参见上面的链接详细说明)。但是对于一批示例,由于线性,梯度会相加。这就是为什么我们在批次axis=0 中获取金额的原因。

答案 1 :(得分:0)

Numpy轴的视觉描述:

Numpy axis