Sam*_*amy 10 python numpy backpropagation neural-network softmax
我试图backpropagation在一个简单的3层神经网络中理解MNIST.
有输入层weights和a 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)
Run Code Online (Sandbox Code Playgroud)
所述衍生物相对于解释时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]
Run Code Online (Sandbox Code Playgroud)
然后self.gradient是local gradient矢量.它是否正确?有没有更好的方法来写这个?
Was*_*mad 17
我假设你有一个3层NN与W1,b1用于与从输入层到隐层的线性变换相关联,并且W2,b2与从隐藏层到输出层的线性变换相关联.Z1并且Z2是隐藏层和输出层的输入向量.a1并a2表示隐藏层和输出层的输出.a2是你预测的输出.delta3并且delta2是错误(反向传播),您可以看到损失函数相对于模型参数的渐变.
这是3层NN(输入层,只有一个隐藏层和一个输出层)的一般场景.您可以按照上述步骤计算易于计算的渐变!由于这篇文章的另一个答案已经指出了你的代码中的问题,我不是重复相同的.
正如我所说,你有n^2偏导数.
如果你做数学题,你会发现dSM[i]/dx[k]是SM[i] * (dx[i]/dx[k] - SM[i])这样,你应该有:
if i == j:
self.gradient[i,j] = self.value[i] * (1-self.value[i])
else:
self.gradient[i,j] = -self.value[i] * self.value[j]
Run Code Online (Sandbox Code Playgroud)
代替
if i == j:
self.gradient[i] = self.value[i] * (1-self.input[i])
else:
self.gradient[i] = -self.value[i]*self.input[j]
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这可以更简洁地计算如下:
SM = self.value.reshape((-1,1))
jac = np.diagflat(self.value) - np.dot(SM, SM.T)
Run Code Online (Sandbox Code Playgroud)
小智 6
np.exp不稳定,因为它有Inf.所以你应该减去x中的最大值.
def softmax(x):
"""Compute the softmax of vector x."""
exps = np.exp(x - x.max())
return exps / np.sum(exps)
Run Code Online (Sandbox Code Playgroud)
如果x是矩阵,请检查此笔记本中的softmax函数(https://github.com/rickiepark/ml-learn/blob/master/notebooks/5.%20multi-layer%20perceptron.ipynb)
| 归档时间: |
|
| 查看次数: |
19050 次 |
| 最近记录: |