我试图用MNIST理解一个简单的3层神经网络中的反向传播.
输入层有权重和偏差.标签是MNIST,因此它是10类向量.
第二层是线性转变.第三层是softmax激活,以获得输出作为概率.
反向传播计算每一步的导数并将其称为梯度.
以前的图层将全局或上一个渐变附加到局部渐变.我无法计算softmax的局部梯度
在线的几个资源通过对softmax及其衍生物的解释,甚至给出了softmax本身的代码样本
def softmax(x):
"""Compute the softmax of vector x."""
exps = np.exp(x)
return exps / np.sum(exps)
关于何时i = j和何时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是局部渐变,它是一个向量.它是否正确?有没有更好的方法来写这个?