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

第二部分弹性反向传播神经网络

梁祯
2023-03-14

这是本帖的后续问题。对于一个给定的神经元,我不清楚如何得到它的误差的偏导数和它的权重的偏导数。

通过这个网页,我们可以清楚地看到Propocation是如何工作的(尽管我处理的是弹性传播)。对于一个前馈神经网络,我们必须:1)在向前通过神经网络时,触发神经元;2)从输出层神经元,计算总误差;3)向后移动,以每个神经元的权值来计算该误差;4)再次向前移动,更新每个神经元的权值。

不过,这些都是我不明白的。

A)对于每个神经元,你如何计算偏导数(定义)的误差对权重的偏导数?我的困惑是,在微积分中,偏导数是根据一个n变量函数计算的。我在这篇文章中有点理解ldog和bayer的答案。我甚至理解了链规则。但当我精确地思考如何将它应用于I)线性组合器和ii)乙状结肠激活函数的结果时,它就不凝胶了。

B)使用弹性传播方法,你将如何改变给定神经元的偏差?或者使用弹性传播训练的神经网络中没有偏差或阈值吗?

C)如果有两个或更多的输出神经元,如何传播总误差?总误差*神经元权重对每个输出神经元值是否发生?

谢谢

共有1个答案

齐铭
2023-03-14

A)

在有监督学习任务中,总的优化目标是所有训练样本的总损失,定义为E=\sum_n损失(y_n,t_n),其中n是所有训练样本的索引,y_n是训练样本n的网络输出,t_n是训练样本n的标号,损失是损失函数。注意,y_n和t_n通常是向量化的量--向量长度由网络中输出神经元的数目决定。

损失函数的一个可能选择是定义为损失(y,t)=\sum_k(y_k-t_k)^2的平方误差,其中k是指网络中输出神经元的数目。在反向传播中,必须计算整体优化目标相对于网络参数的偏导数,这些参数是突触权值和神经元偏差。这是根据链式法则通过以下公式实现的:

(\部分E/\部分w_{ij})=(\部分E/\部分out_j)*(\部分out_j/\部分in_j)*(\部分in_j/部分w_{ij}),

其中w_{ij}是神经元i和神经元j之间的权重,out_j是神经元j的输出,in_j是神经元j的输入。

如何计算神经元输出out_j及其相对于神经元输入in_j的导数取决于使用哪种激活函数。如果使用线性激活函数来计算神经元的输出out_j,则项(\partial out_j/\partial in_j)变为1。例如,如果使用logistic函数作为激活函数,则术语(\partial out_j/\partial in_j)变为sig(in_j)*(1-sig(in_j)),其中sig是logistic函数。

B)

在弹性反向传播中,偏差的更新方式与权值的更新方式完全相同--基于偏导数的符号和单个可调步长。

我不太确定我是否理解正确。整体优化目标是所有网络参数的标量函数,无论有多少个输出神经元。所以在这里应该不会有关于如何计算偏导数的混淆。

通常,为了计算总体优化目标E相对于某个权重w_{ij}的偏导数(\partial E/\partial w_{ij}),必须计算每个输出神经元k相对于w_{ij}的偏导数(\partial out_k/\partial w_{ij})为

(\部分E/\部分w_{ij})=\SUM_K(\部分E/\部分out_k)*(\部分out_k/\部分w_{ij})。

然而,请注意,如果w_{ij}不影响输出神经元k的输出out_k,则输出神经元k相对于w_{ij}的偏导数(\部分out_k/\部分w_{ij})将为零。

还有一件事。在使用平方误差作为损失函数的情况下,总体优化目标E相对于某个输出神经元k的输出out_k的偏导数(\partial E/\partial out_k)为

(\部分E/\部分out_k)=\SUM_K 2*(OUT_K-T_K),

其中数量(OUT_K-T_K)被称为附加到输出单元k上的错误,并且为了便于标注,我假设只有一个带有标签t的训练示例。注意,如果w_{ij}对输出神经元k的输出out_k没有任何影响,那么w_{ij}的更新将不依赖于误差(OUT_K-T_K),因为如上所述(\部分out_k/\部分w_{ij})=0。

最后一句避免混淆的话。y_k和out_k均指网络中输出神经元k的输出。

 类似资料:
  • 我正在尝试实现一个简单的神经网络。我知道已经有很多可用的库,这不是重点。 我的网络只有3层:一个输入层一个隐藏层一个输出层 输出层有8个神经元,每个神经元代表不同的类。 我知道如何实现feedfoward算法,但我真的很难实现反向传播算法。 这是我到目前为止得出的结论: 我尝试使用Iris数据集进行测试:https://en.wikipedia.org/wiki/Iris_flower_data_

  • 我很难构建好的神经网络教学算法,因为有一些人工操作。第一件事:我的目标是教nn-xor函数,我使用sigmoid作为激活函数和简单的梯度下降。前馈很容易,但backprop在某种程度上令人困惑——大多数算法描述中常见的步骤有:1。计算输出层上的错误。2、将此错误传播到有关权重3的隐藏层。更新突触上的权重 所以我的问题:1。偏差也应该更新吗?如果是,如何更新?目前我随机选择偏差[0.5;1]?2.在

  • 我正在尝试用RELU实现神经网络。 输入层- 以上是我的神经网络结构。我对这个relu的反向传播感到困惑。对于RELU的导数,如果x 有人能解释一下我的神经网络架构的反向传播“一步一步”吗?

  • 考虑具有以下架构的卷积神经网络: Standford的深度学习教程使用以下等式来实现这一点: 然而,在使用这个等式时,我面临以下问题: 我做错了什么?有人能解释一下如何通过卷积层传播错误吗? 简单的MATLAB示例将受到高度赞赏。

  • 我们首先回顾DNN的反向传播算法。在DNN中,我们是首先计算出输出层的$$deltaL:deltaL = frac{partial J(W,b)}{partial zL} = frac{partial J(W,b)}{partial aL}odot sigma{'}(zL)$$ 利用数学归纳法,用$$delta{l+1}$$的值一步步的向前求出第l层的$$deltal$$,表达式为:$$delta

  • 我正在从头开始编写一个backprop神经网络迷你库,我需要一些帮助来编写有意义的自动测试。到目前为止,我已经进行了自动化测试,以验证backprop算法是否正确计算了权重和偏差梯度,但没有测试训练本身是否有效。 到目前为止,我使用的代码可以执行以下操作: 定义一个具有任意层数和每层神经元数的神经网络 鉴于所有这些,我可以编写什么样的自动化测试来确保训练算法被正确实施。我应该尝试近似什么函数(si