2010-05-19 134 views
4

首先我想说的是,我是真正的新的神经网络,我不明白这个问题非常好;)弹性BP神经网络 - 约梯度

我做的我的第一个C#实现反向传播神经网络。我用XOR测试过它,它看起来很有效。

现在我想改变我的实现使用弹性反向传播(Rprop - http://en.wikipedia.org/wiki/Rprop)。

的定义说:“RPROP只考虑到了所有的模式(而不是大小)的偏导数的符号,并在每个独立的行为‘重量’

有人能告诉我在什么偏导数。所有的模式是,我应该怎么计算这个偏导数在隐藏层神经元

非常感谢

更新:?对这个Java代码

我的实现基础:www_.dia.fi。 upm.es/~jamartin/downloads/bpnn.java

我backPropagate方法看起来像这样:

public double backPropagate(double[] targets) 
    { 
     double error, change; 

     // calculate error terms for output 
     double[] output_deltas = new double[outputsNumber]; 

     for (int k = 0; k < outputsNumber; k++) 
     { 

      error = targets[k] - activationsOutputs[k]; 
      output_deltas[k] = Dsigmoid(activationsOutputs[k]) * error; 
     } 

     // calculate error terms for hidden 
     double[] hidden_deltas = new double[hiddenNumber]; 

     for (int j = 0; j < hiddenNumber; j++) 
     { 
      error = 0.0; 

      for (int k = 0; k < outputsNumber; k++) 
      { 
       error = error + output_deltas[k] * weightsOutputs[j, k]; 
      } 

      hidden_deltas[j] = Dsigmoid(activationsHidden[j]) * error; 
     } 

     //update output weights 
     for (int j = 0; j < hiddenNumber; j++) 
     { 
      for (int k = 0; k < outputsNumber; k++) 
      { 
       change = output_deltas[k] * activationsHidden[j]; 
       weightsOutputs[j, k] = weightsOutputs[j, k] + learningRate * change + momentumFactor * lastChangeWeightsForMomentumOutpus[j, k]; 
       lastChangeWeightsForMomentumOutpus[j, k] = change; 

      } 
     } 

     // update input weights 
     for (int i = 0; i < inputsNumber; i++) 
     { 
      for (int j = 0; j < hiddenNumber; j++) 
      { 
       change = hidden_deltas[j] * activationsInputs[i]; 
       weightsInputs[i, j] = weightsInputs[i, j] + learningRate * change + momentumFactor * lastChangeWeightsForMomentumInputs[i, j]; 
       lastChangeWeightsForMomentumInputs[i, j] = change; 
      } 
     } 

     // calculate error 
     error = 0.0; 

     for (int k = 0; k < outputsNumber; k++) 
     { 
      error = error + 0.5 * (targets[k] - activationsOutputs[k]) * (targets[k] - activationsOutputs[k]); 
     } 

     return error; 
    } 

因此,我可以使用change = hidden_deltas[j] * activationsInputs[i]变量作为梯度(偏导数),用于检查所述唱?

+0

我昨天晚上在调试我的实现上花了很多时间,我担心我不了解这个算法。你知道它有什么好的描述吗? – 2010-05-20 08:44:10

回答

2

我认为,“在所有的模式”仅仅意味着“在每次迭代” ......看看在RPROP paper

对于滞量衍生物:你已经实现了正常的反向传播算法。这是一种有效计算梯度的方法...在那里您可以计算单个神经元的δ值,实际上它们是负的∂E/∂w值,即作为权重函数的全局误差的部分导数。的

所以不是权重与这些值相乘,则取两个常数之一(η+或η-),这取决于符号是否已改变

+0

你会如此善良,看看我的代码(上面),并告诉我是否正确思考 – 2010-05-19 14:40:13

+0

是的,变化值是偏导数。根据它的符号变化,另一个因素是用来更新重量变化(参考我已经链接的论文中的等式4-7,因为有更多的规则...∂E/∂w值是你的变化变量) – 2010-05-20 13:24:34

+0

我认为http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html解释了反向传播的想法很好。http://www.learnartificialneuralnetworks.com/backpropagation.html是一个更为数学的描述,它是如何工作的以及为什么起作用 – 2010-05-20 13:52:57

1

下面是一个实现的一部分的一个例子Encog人工智能库中的RPROP训练技术。它应该给你一个如何着手的想法。我建议下载整个库,因为在IDE中通过源代码比通过在线svn接口更容易。

http://code.google.com/p/encog-cs/source/browse/#svn/trunk/encog-core/encog-core-cs/Neural/Networks/Training/Propagation/Resilient

http://code.google.com/p/encog-cs/source/browse/#svn/trunk

注意的代码是在C#中,但不应该是很难翻译成另一种语言。

+0

Thx,我会试着回顾一下这个解决方案 – 2010-05-19 12:35:46

+0

我有一个后续问题,我已经[贴在这里](http://stackoverflow.com/questions/12146986/part-2-resilient-反向传播神经网络)。这只是我试图清楚了解NN的偏导数是如何工作的。任何见解都会被赞赏 – Nutritioustim 2012-08-27 17:55:39