反向传播公式推导

想法

一直不太明白反向传播是怎么做的,在代码层面,矩阵乘上矩阵后,梯度是如何计算的。今天之后稍微能明白一点了。

笔记

参考资料:

线性矩阵相乘梯度推导:

softmax梯度推导:

关于这段代码:

反向传播

1
2
3
4
5
6
7
8
9
10
dscores = softmax_output.copy()
dscores[range(N), list(y)] -= 1
dscores /= N
grads['W2'] = h_output.T.dot(dscores) + reg * W2
grads['b2'] = np.sum(dscores, axis=0)

dh = dscores.dot(W2.T)
dh_ReLU = (h_output > 0) * dh
grads['W1'] = X.T.dot(dh_ReLU) + reg * W1
grads['b1'] = np.sum(dh_ReLU, axis=0)

1
2
3
4
5
6
7
8
9
10
shift_scores: [[-0.10897747 -0.57318629  0.        ]
[ 0. -1.01673634 -0.30180767]
[ 0. -0.49763839 -0.33451674]
[ 0. -0.33210347 -0.37482661]
[ 0. -0.11816528 -0.14608217]]
softmax_output: [[0.3644621 0.22911264 0.40642526]
[0.47590629 0.17217039 0.35192332]
[0.43035767 0.26164229 0.30800004]
[0.41583127 0.2983228 0.28584593]
[0.36328815 0.32279939 0.31391246]]

以正类分数为基线,用softmax计算出概率后。

在计算梯度时要在正类的概率上减1,然后全部除以N就是分数的梯度了?这是为什么呢?

好像就是直接求导后的计算结果,所以说要学会softmax+celoss的求导呀!