首页 文章

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

提问于
浏览
6

这是this post的后续问题 . 对于给定的神经元,我的体重 .

在这个web page工作,它处理弹性传播 . 对于前馈神经网络,我们必须1)在通过神经网络向前移动时,触发神经元,2)从输出层神经元,计算总误差 . 然后3)向后移动,通过神经元中的每个重量传播该错误,然后4)再次前进,更新每个神经元中的权重 .

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

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

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

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

谢谢

3 回答

  • 0

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

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

  • 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 )
    

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

    这是偏好某些激活函数的一个原因:一些具有非常方便的导数,这使得实现起来变得简单而有效,特别是如果你在讨论神经网络中的一堆节点时 .

  • 0

    一个)

    在监督学习任务中,总体优化目标是所有训练样例的总损失,并定义为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_ )=(\ partial E / \ partial out_j)(\ partial out_j / \ partial in_j)(\ partial in_j / partial w_ ),

    其中w_ 是指神经元i和神经元j之间的权重,out_j是指神经元j的输出,而in_j是指神经元j的输入 .

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

    B)

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

    C)

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

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

    (\ partial E / \ partial w_ )= \ sum_k(\ partial E / \ partial out_k)*(\ partial out_k / \ partial w_ ) .

    然而,注意,如果w_ 不影响输出神经元k的输出out_k,则输出神经元k相对于w_ 的偏导数(\ partial out_k / \ partial w_ )将为零 .

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

    (\ partial E / \ partial out_k)= \ sum_k 2 *(out_k - t_k),

    其中数量(out_k -t_k)被称为附加到输出单元k的错误,并且我假设只有一个标记为t的单个训练示例以用于标记方便 . 注意,如果w_ 对输出神经元k的输出out_k没有任何影响,那么w_ 的更新将不依赖于错误(out_k -t_k),因为(\ partial out_k / \ partial w_ )= 0如上所述 .

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

相关问题