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

时间:2012-08-27 17:54:11

标签: algorithm artificial-intelligence neural-network backpropagation

这是this post的后续问题。对于给定的神经元,我不清楚如何对其误差的偏导数及其重量的偏导数。

从这个web page开始,很清楚传播是如何起作用的(尽管我正在处理弹性传播)。对于前馈神经网络,我们必须1)在通过神经网络向前移动时,触发神经元,2)从输出层神经元,计算总误差。然后3)向后移动,通过神经元中的每个重量传播该错误,然后4)再次前进,更新每个神经元中的权重。

但确切地说,这些是我不理解的事情。

A)对于每个神经元,如何计算误差的偏导数(definition)超过权重的偏导数?我的困惑在于,在微积分中,偏导数是根据n变量函数计算的。我在ldog中理解Bayer'sthis post个答案。我甚至还不知道链条规则。但是,当我想到如何将其应用于i)线性组合器和ii)sigmoid激活函数的结果时,它不会凝胶化。

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

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

谢谢

3 个答案:

答案 0 :(得分:0)

其他方面不是100%肯定,但我现在可以回答B:

B)根据偏导数的方向更新偏差,而不是根据幅度更新偏差。如果连续迭代的方向保持不变,则增加权重更新的大小。振荡方向将减少更新的大小。  http://nopr.niscair.res.in/bitstream/123456789/8460/1/IJEMS%2012(5)%20434-442.pdf

答案 1 :(得分:0)

对于我(也考虑微积分和符号方程的术语),在我意识到它是关于将函数放在自身方面并且因此之后,衍生物的东西只做了点击 >避免分化过程。

一些例子(python)可能会有所帮助......

如果我有线性激活功能:

def f_act( x ):
    return x

那么导数很容易,我需要 d(f_act),我把 1

def der_f_act( y ):
    return 1

同样,如果我有一个后勤激活功能:

  

f_a = 1 /(1 + e ^( - x))

那么衍生物可以用函数本身(here the details)写成:

  

d(f_a)= f_a(1 - f_a)

所有这些都可以编码为:

def f_act( x ):
    return 1 / ( 1 + numpy.exp(-1*x) )

def der_f_act( y ):
    return y * ( 1 - y )

对于这些示例,我已经激活函数的值(来自前馈阶段),因此我可以从中获利并且只计算的那一点 ;)

这是偏好某些激活函数的一个原因:一些具有非常方便的衍生物,这使得实现变得容易和有效,特别是如果你在讨论神经网络中的一堆节点时。

答案 2 :(得分:0)

A)

在监督学习任务中,整体优化目标是所有训练样例的总损失,定义为E = \ sum_n loss(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指网络中输出神经元的数量。在反向传播中,必须根据网络参数(即突触权重和神经元偏差)计算整体优化目标的偏导数。这是根据链规则通过以下公式实现的:

(\ partial E / \ partial w_ {ij})=(\ partial E / \ partial out_j)*(\ partial out_j / \ partial in_j)*(\ partial in_j / partial 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.如果您使用例如逻辑函数作为激活函数,则术语(\ partial out_j / \ partial in_j)变为sig(in_j)*(1 - sig(in_j)),其中sig是逻辑函数。

B)

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

C)

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

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

(\ partial E / \ partial w_ {ij})= \ sum_k(\ partial E / \ partial out_k)*(\ partial out_k / \ partial w_ {ij})。

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

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

(\ partial E / \ partial 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),因为(\ partial out_k / \ partial w_ { ij})= 0如上所述。

最后一句话,以避免任何混淆。 y_k和out_k都指向网络中输出神经元k的输出。