我试图了解在一个简单的三层神经网络中使用MNIST数据集的backpropagation。
第一层是带有权重和偏差的输入层。标签是MNIST,因此它是一个10类向量。
第二层是一个线性变换。第三层是softmax激活函数,以获得输出作为概率。
Backpropagation在每个步骤计算导数,并将其称为梯度。
前面的层将全局或上一步的梯度附加到局部梯度中。我很难计算softmax的局部梯度。
在线资源中有许多关于softmax及其导数的说明,甚至提供了softmax本身的代码示例
def softmax(x):
"""Compute the softmax of vector x."""
exps = np.exp(x)
return exps / np.sum(exps)
当i = j时,以i为自变量解释导数;当i != j时,以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
就是一个向量,它代表了局部梯度
。这样写正确吗?有更好的写法吗?