【问题标题】:Part 2 Resilient backpropagation neural network第 2 部分弹性反向传播神经网络
【发布时间】:2012-08-22 05:40:36
【问题描述】:

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

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

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

A) 对于每个神经元,如何计算误差对权重的偏导数的偏导数 (definition)?我的困惑是,在微积分中,偏导数是根据 n 变量函数计算的。我有点理解ldogBayer'sthis post 中的答案。我什至理解了链式法则。但是当我准确地想到如何将它应用于 i) 线性组合器和 ii) sigmoid 激活函数的结果时,它并没有凝固。

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

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

谢谢

【问题讨论】:

    标签: algorithm artificial-intelligence neural-network backpropagation


    【解决方案1】:

    一)

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

    损失函数的一个可能选择是平方误差,定义为 loss(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 / 部分 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 / \部分 in_j) 变为 sig(in_j) * (1 - sig(in_j)),其中 sig 是逻辑函数。

    B)

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

    C)

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

    一般来说,为了计算整体优化目标 E 关于某个权重 w_{ij} 的偏导数 (\partial E / \partial w_{ij}),必须计算偏导数 (\partial E / \partial w_{ij})每个输出神经元 k 相对于 w_{ij} as的部分 out_k / \partial 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}) 将为零k.

    还有一件事。如果使用平方误差作为损失函数,则整体优化目标 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 的输出。

    【讨论】:

      【解决方案2】:

      对我来说(也在考虑微积分和符号方程的术语),只有在我意识到这一切都是关于将函数放在自身方面并因此 避免这样的分化过程。

      几个例子(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 )
      

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

      这是更喜欢某些激活函数的一个原因:有些具有非常方便的导数,这使得实现变得简单而高效,尤其是当您谈论的是神经网络中的一堆节点时。

      【讨论】:

        【解决方案3】:

        其他点不是 100% 确定,但我现在可以回答 B:

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

        【讨论】:

          猜你喜欢
          • 2015-03-03
          • 2012-02-21
          • 2011-01-05
          • 1970-01-01
          • 1970-01-01
          • 2013-04-26
          • 2016-09-19
          • 2014-03-15
          相关资源
          最近更新 更多