6

Próbuję wprowadzić backpropagation z rekursją dla celów akademickich, ale wydaje się, że gdzieś się nie udało. Od pewnego czasu majstrujesz przy tym, ale albo się nie uczysz, albo nie uczysz się drugiego wzoru.ANN: Rekursywna backpropagacja

Proszę dać mi znać, gdzie popełniłem błąd. (To jest składnia javascript) Uwaga: błędy są resetowane do null przed każdym cyklem uczenia.

this.backpropagate = function(oAnn, aTargetOutput, nLearningRate) { 
    nLearningRate = nLearningRate || 1; 

    var oNode, 
     n = 0; 

    for (sNodeId in oAnn.getOutputGroup().getNodes()) { 
     oNode = oAnn.getOutputGroup().getNodes()[sNodeId]; 
     oNode.setError(aTargetOutput[n] - oNode.getOutputValue()); 
     n ++; 
    } 

    for (sNodeId in oAnn.getInputGroup().getNodes()) { 
     this.backpropagateNode(oAnn.getInputGroup().getNodes()[sNodeId], nLearningRate); 
    } 
} 

this.backpropagateNode = function(oNode, nLearningRate) { 
    var nError = oNode.getError(), 
     oOutputNodes, 
     oConn, 
     nWeight, 
     nOutputError, 
     nDerivative = oNode.getOutputValue() * (1 - oNode.getOutputValue()), // Derivative for sigmoid activation funciton 
     nInputValue = oNode.getInputValue(), 
     n; 

    if (nError === null /* Dont do the same node twice */ && oNode.hasOutputs()) { 

     nDerivative = nDerivative || 0.000000000000001; 
     nInputValue = nInputValue || 0.000000000000001; 

     oOutputNodes = oNode.getOutputNodes(); 

     for (n=0; n<oOutputNodes.length; n++) { 
      nOutputError = this.backpropagateNode(oOutputNodes[n], nLearningRate); 

      oConn = oAnn.getConnection(oNode, oOutputNodes[n]); 
      nWeight = oConn.getWeight(); 
      oConn.setWeight(nWeight + nLearningRate * nOutputError * nDerivative * nInputValue); 
      nError += nOutputError * nWeight; 
     } 
     oNode.setError(nError); 
    } 

    return oNode.getError(); 
} 
+0

Jak wygląda twoja sieć neuronowa? Czy istnieje powód, dla którego używasz rekursji? Powinieneś być w stanie iterować po poszczególnych warstwach, zaczynając od warstwy wyjściowej i wracając do góry. –

+0

Vivin, akademickim punktem tego ćwiczenia jest użycie rekurencji dla BP. (Nie, to nie jest moja praca domowa, po prostu staram się o tym myśleć :) Sieć w tym miejscu jest bardzo prosta: 2-2-1 3-warstwowa sieć z sigmoidalnymi funkcjami aktywacyjnymi, którą próbuję trenować przy pomocy [1, 0] -> [0.2] i [0, 1] -> [0.9] próbek szkoleniowych. –

+0

Typowe algorytmy, które widziałem, robią to iteracyjnie; Właśnie się zastanawiałem, dlaczego wybrałeś rekursję. :) –

Odpowiedz

2

Rozwiązano problem. Wygląda na to, że sieci o mniejszym wymiarze mają większe szanse utknąć w lokalnych minimach. Łatwo to zrozumieć, wiedząc, że sieci o wyższym wymiarze są mniej podatne na osiągnięcie jakichkolwiek minimów, nawet globalnych.

Wdrażanie, które rośnie wraz z każdą iteracją, pozwala mi przejść przez większość minima. Tak więc, ponowna inicjalizacja wag losowych (-0,5 do 0,5) wartości i przeprowadzanie wielu sesji treningowych ostatecznie doprowadza mnie do ich wszystkich.

Z przyjemnością ogłaszam, że moja sieć przechodzi teraz szkolenie w 100% przypadków, jeśli dane można sklasyfikować.

Powiązane problemy