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
视为它自己的变量。所以如果你计算