在cs231n 2017 class中,当我们反向传播渐变时,我们会像这样更新偏差:
db = np.sum(dscores, axis=0, keepdims=True)
sum
操作背后的基本理念是什么?感谢
答案 0 :(得分:2)
这是损失函数相对于偏差的导数公式(更准确地说是梯度)(见this question和this 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)