Python 关于sigmoid导数的混淆&x27;反向传播中的s输入

Python 关于sigmoid导数的混淆&x27;反向传播中的s输入,python,neural-network,backpropagation,derivative,activation-function,Python,Neural Network,Backpropagation,Derivative,Activation Function,使用链规则计算成本函数相对于层L权重的斜率时,公式为: dc0/d W(L)=。d a(L)/d z(L) 与: z(L)作为诱导局部场:z(L)=w1(L)*a1(L-1)+w2(L)*a2(L-1)*…… a(L)beeing输出:a(L)=&z(L)) &是用作激活功能的sigmoid函数 请注意,L被用作层指示符,而不是索引 现在: da(L)/dz(L)=&(z(L)) &是sigmoid函数的导数 问题: 但是在James Loy写的关于用python从头开始构建简单神经网络的文章

使用链规则计算成本函数相对于层
L
权重的斜率时,公式为:

dc0/d W(L)=。d a(L)/d z(L)

与:

z(L)
作为诱导局部场:
z(L)=w1(L)*a1(L-1)+w2(L)*a2(L-1)*……

a(L)
beeing输出:
a(L)=&z(L))

&
是用作激活功能的sigmoid函数

请注意,
L
被用作层指示符,而不是索引

现在:
da(L)/dz(L)=&(z(L))

&
是sigmoid函数的导数

问题:

但是在James Loy写的关于用python从头开始构建简单神经网络的文章中,
在进行反向传播时,他没有将
z(L)
作为
&'
的输入来代替链式规则函数中的
da(L)/dz(L)
。相反,他给了它
输出=层(L)的最后激活
,作为sigmoid导数的输入
&'

请注意,层
L
上方的代码中是最后一层或输出层
2
。 和
sigmoid_导数(self.output)
这是当前层的激活作为用作激活函数的sigmoid函数导数的输入

问题:


我们是否应该使用此
sigmoid_导数(np.dot(self.layer1,self.weights2))
而不是此
sigmoid_导数(self.output)

您想使用与输出相关的导数。在反向传播过程中,我们仅使用权重来确定误差有多少属于每个权重,通过这样做,我们可以进一步将误差传播回各层

在本教程中,sigmoid应用于最后一层:

self.output = sigmoid(np.dot(self.layer1, self.weights2))
根据您的问题:

我们不应该使用这个sigmoid_导数(np.dot(self.layer1,self.weights2))而不是这个sigmoid_导数(self.output)

你不能这样做:

sigmoid_derivative(np.dot(self.layer1, self.weights2))
因为在这里,当你还没有应用它的时候,你试图得到S形的导数

这就是为什么您必须使用:

sigmoid_derivative(self.output)

您希望对输出使用导数。在反向传播过程中,我们仅使用权重来确定误差有多少属于每个权重,通过这样做,我们可以进一步将误差传播回各层

在本教程中,sigmoid应用于最后一层:

self.output = sigmoid(np.dot(self.layer1, self.weights2))
根据您的问题:

我们不应该使用这个sigmoid_导数(np.dot(self.layer1,self.weights2))而不是这个sigmoid_导数(self.output)

你不能这样做:

sigmoid_derivative(np.dot(self.layer1, self.weights2))
因为在这里,当你还没有应用它的时候,你试图得到S形的导数

这就是为什么您必须使用:

sigmoid_derivative(self.output)

你说得对,看来作者犯了个错误。我将解释:当网络通过前向传递(所有激活+损失)完成时,您必须根据损失函数使用梯度下降来最小化权重。为此,需要损失函数对每个权重矩阵的偏导数

在我继续之前,有一些符号:丢失是
L
A
是激活(也称为sigmoid),
Z
表示净输入,换句话说,是
W的结果。X
。数字是索引,因此
A1
表示第一层的激活

您可以使用链规则在网络中向后移动,并将权重表示为损失的函数。要开始向后传递,首先要获得损失相对于最后一层激活的导数。这是dL/dA2,因为第二层是最后一层。要更新第二层的权重,我们需要完成
dA2/dZ2
dZ/dW2


在继续之前,请记住第二层的激活是
A2=sigmoid(W2.A1)
Z2=W2。A1
。为了清楚起见,我们将编写
A2=sigmoid(Z2)
。将
Z2
视为它自己的变量。因此,如果你计算
dA2/dZ2
,你会得到
sigmoid_导数(Z2)
,也就是
sigmoid_导数(W2.A1)
sigmoid_导数(np.dot(self.layer1,self.weights2))
。所以它不应该是sigmoid_导数(self.output)
,因为sigmoid激活了
输出。

你是对的-看起来作者犯了一个错误。我将解释:当网络通过前向传递(所有激活+损失)完成时,您必须根据损失函数使用梯度下降来最小化权重。为此,需要损失函数对每个权重矩阵的偏导数

在我继续之前,有一些符号:丢失是
L
A
是激活(也称为sigmoid),
Z
表示净输入,换句话说,是
W的结果。X
。数字是索引,因此
A1
表示第一层的激活

您可以使用链规则在网络中向后移动,并将权重表示为损失的函数。要开始向后传递,首先要获得损失相对于最后一层激活的导数。这是dL/dA2,因为第二层是最后一层。要更新第二层的权重,我们需要完成
dA2/dZ2
dZ/dW2

在继续之前,请记住第二层的激活是
A2=sigmoid(W2.A1)
Z2=W2。A1
。为了清楚起见,我们将编写
A2=sigmoid(Z2)
。将
Z2
视为它自己的变量。所以如果你计算