当前位置: 首页 > 知识库问答 >
问题:

反向传播中sigmoid导数输入的混淆

郎曜文
2023-03-14

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

d C0/d W(L)=...。d a(L)/d z(L)。...

与:

作为感应局部场:z(L)=w1(L)*a1(L-1)w2(L)*a2(L-1)*

a(L)输出端:a(L)=

<代码>

请注意,L被视为层指示符,而不是索引

现在:
代码>d a(L)/d z(L)=

带<代码>

问题是:

但在这篇由James Loy撰写的关于用python从头开始构建简单神经网络的帖子中,
在进行反向传播时,他没有将z(L)
作为输入

def feedforward(self):
        self.layer1 = sigmoid(np.dot(self.input, self.weights1))
        self.output = sigmoid(np.dot(self.layer1, self.weights2))

def backprop(self):
        # application of the chain rule to find derivative of the loss function with respect to weights2 and weights1
        d_weights2 = np.dot(self.layer1.T, (2*(self.y - self.output) * sigmoid_derivative(self.output)))

请注意,在层上方的代码中,层是最后一层或输出层。和sigmoid\u导数(自输出)这是当前层的激活作为用作激活函数的sigmoid函数导数的输入。

问题是:

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

共有3个答案

卞博简
2023-03-14

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

在我继续之前,请先记下一些符号:loss是L,A是activation(又名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_derivative(Z2),即sigmoid_derivative(W2. A1)sigmoid_derivative(np.dot(self.layer1,self.weights2))。所以它不应该是sigmoid_derivative(self.output),因为输出是由sigmoid激活的。

阎宝
2023-03-14

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

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

self.output = sigmoid(np.dot(self.layer1, self.weights2))

根据您的问题:

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

您不能执行以下操作:

sigmoid_derivative(np.dot(self.layer1, self.weights2))

因为在这里,当你还没有应用它的时候,你试图得到S形的导数。

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

sigmoid_derivative(self.output)
通鸿风
2023-03-14

原来<代码>

这是sigmoid\u导数的代码:

def sigmoid(x):
    return 1.0/(1+ np.exp(-x))

def sigmoid_derivative(x):
    return x * (1.0 - x)

sigmoid\u导数的数学公式可以写成:

因此,要获得上述公式,<代码>

 类似资料:
  • 卷积神经网络其实是神经网络特征学习的一个典型例子。传统的机器学习算法其实需要人工的提取特征,比如很厉害的SVM。而卷积神经网络利用模板算子的参数也用以学习这个特点,把特征也学习出来了。其实不同的模板算子本质上就是抽象了图像的不同方面的特征。比如提取边缘,提取梯度的算子。用很多卷积核去提取,那就是 提取了很多的特征。一旦把参数w,b训练出来,意味着特征和目标之间的函数就被确定。今天分享下CNN的关键

  • 训练发散 理想的分类器应当是除了真实标签的概率为1,其余标签概率均为 0,这样计算得到其损失函数为 -ln(1) = 0 损失函数越大,说明该分类器在真实标签上分类概率越小,性能也就越差。一个非常差的分类器,可能在真实标签上的匪类概率接近于0,那么损失函数就接近于正无穷,我们成为训练发散,需要调小学习速率。 6.9 高原反应 在 ImageNet-1000 分类问题中,初始状态为均匀分布,每个类别

  • 1 正向传播(Forward propagation) 回忆一下,给出一个输入特征$x$的时候,我们定义了$a^{[0]}=x$。然后对于层(layer)$l=1,2,3,\dots,N$,其中的$N$是网络中的层数,则有: $z^{[l]}=W^{[l]}a^{[l-1]}+b^{[l]}$ $a^{[l]}=g^{[l]}(z^{[l]})$ 在讲义中都是假设了非线性特征$g^{[l]}$对除

  • 在使用relu激活功能时,我在实现backprop时遇到问题。我的模型有两个隐藏层,两个隐藏层中都有10个节点,输出层中有一个节点(因此有3个权重,3个偏差)。我的模型不适用于这个断开的backward\u prop函数。但是,该函数使用sigmoid激活函数(作为注释包含在函数中)与backprop一起工作。因此,我认为我把relu推导搞砸了。 谁能把我推向正确的方向?

  • 我试图创建一个多层前馈-反向传播神经网络来识别手写数字,但我遇到了一个问题,即输出层中的激活都趋向于相同的值。 我正在使用手写数字数据集的光学识别,训练数据看起来像 <代码>0,1,6,15,12,1,0,0,0,7,16,6,6,10,0,0,0,8,16,2,0,11,2,0,0,5,16,3,0,5,0,0,7,13,3,0,8,7,0,0,4,12,0,1,13,5,0,0,14,9,0,

  • 前面几节里我们使用了小批量随机梯度下降的优化算法来训练模型。在实现中,我们只提供了模型的正向传播(forward propagation)的计算,即对输入计算模型输出,然后通过autograd模块来调用系统自动生成的backward函数计算梯度。基于反向传播(back-propagation)算法的自动求梯度极大简化了深度学习模型训练算法的实现。本节我们将使用数学和计算图(computationa