我试图backpropagation
在一个简单的 3 层神经网络中理解MNIST
.
输入层带有weights
和bias
。标签是MNIST
这样的,它是一个10
类向量。
第二层是一个linear tranform
。第三层是将softmax activation
输出作为概率。
Backpropagation
计算每一步的导数并将其称为梯度。
以前的图层将global
或previous
渐变附加到local gradient
. 我无法local gradient
计算softmax
网上的一些资源对softmax及其派生词进行了解释,甚至给出了softmax本身的代码示例
def softmax(x):
"""Compute the softmax of vector x."""
exps = np.exp(x)
return exps / np.sum(exps)
导数是关于 wheni = j
和 when来解释的i != j
。这是我想出的一个简单的代码片段,希望能验证我的理解:
def softmax(self, x):
"""Compute the softmax of vector x."""
exps = np.exp(x)
return exps / np.sum(exps)
def forward(self):
# self.input is a vector of length 10
# and is the output of
# (w * x) + b
self.value = self.softmax(self.input)
def backward(self):
for i in range(len(self.value)):
for j in range(len(self.input)):
if i == j:
self.gradient[i] = self.value[i] * (1-self.input[i))
else:
self.gradient[i] = -self.value[i]*self.input[j]
然后self.gradient
是local gradient
which 是一个向量。这个对吗?有没有更好的方法来写这个?