深度学习 - 2019年1月30日
2019年1月30日
反向传播公式推导
想法
一直不太明白反向传播是怎么做的,在代码层面,矩阵乘上矩阵后,梯度是如何计算的。今天之后稍微能明白一点了。
笔记
参考资料:
线性矩阵相乘梯度推导:
softmax梯度推导:
- CSDN/cs231n - softmax梯度推导
- CSDN/softmax的log似然代价函数(公式求导)
- 通俗详解softmax函数及其求导过程
- softmax loss层的求导反向传播
- softmax 反向传播
- softmax层的实现
关于这段代码:
反向传播1
2
3
4
5
6
7
8
9
10dscores = 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 | shift_scores: [[-0.10897747 -0.57318629 0. ] |
以正类分数为基线,用softmax计算出概率后。
在计算梯度时要在正类的概率上减1,然后全部除以N就是分数的梯度了?这是为什么呢?
好像就是直接求导后的计算结果,所以说要学会softmax+celoss的求导呀!