2010-05-19 85 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