python – numpy:计算softmax函数的导数

我试图用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是局部渐变,它是一个向量.它是否正确?有没有更好的方法来写这个?

我假设你有一个3层NN与W1,b1 for与从输入层到隐藏层的线性变换相关联,W2,b2与从隐藏层到输出层的线性变换相关联. Z1和Z2是隐藏层和输出层的输入向量. a1和a2表示隐藏层和输出层的输出. a2是您的预测输出. delta3和delta2是误差(反向传播),您可以看到损失函数相对于模型参数的梯度.

enter image description here
enter image description here

这是3层NN(输入层,只有一个隐藏层和一个输出层)的一般场景.您可以按照上述步骤计算易于计算的渐变!由于这篇文章的另一个答案已经指出你的代码中的问题,我不是重复相同的.

相关文章
相关标签/搜索