【发布时间】:2020-04-04 19:14:14
【问题描述】:
我有一个 softmax 层(只有激活本身,没有将输入乘以权重的线性部分),我想为它做一个反向传递。
我在 SO 上找到了许多处理它的教程/答案,但它们似乎都使用 X 作为 (1, n_inputs) 向量。我想将其用作(n_samples, n_inputs) 数组,并且仍然具有正确的前向/后向传递矢量化实现。
我编写了以下前向传递,对每一行/样本的输出进行标准化(正确吗?):
import numpy as np
X = np.asarray([
[0.0, 0.0],
[0.0, 1.0],
[1.0, 0.0],
[1.0, 1.0]], dtype=np.float32)
def prop(self, X):
s = np.exp(X)
s = s.T / np.sum(s, axis=1)
return s.T
它给了我前向传播(包括其他层)的最终结果:
Y = np.asarray([
[0.5 , 0.5 ],
[0.87070241, 0.12929759],
[0.97738616, 0.02261384],
[0.99200957, 0.00799043]], dtype=np.float32))
所以,如果它是正确的,这就是 softmax 的输出。现在,我应该如何编写反向传递?
我推导出softmax的导数为:
1) 如果i=j: p_i*(1 - p_j),
2) 如果i!=j: -p_i*p_j,
我尝试将导数计算为:
ds = np.diag(Y.flatten()) - np.outer(Y, Y)
但它会导致 8x8 矩阵,这对于以下反向传播没有意义......正确的写法是什么?
【问题讨论】:
标签: python numpy backpropagation