6

Я пытаюсь реализовать backpropagation с рекурсией в академических целях, но, похоже, я где-то ошибся. Некоторое время они занимались этим, но либо не учились вообще, либо не учились по второму образцу.ANN: Рекурсивное обратное распространение

Пожалуйста, дайте мне знать, где я ошибся. (Это синтаксис javascript) Примечание: ошибки сбрасываются до null перед каждым циклом обучения.

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

Как выглядит ваша структура нервной сети? Есть ли причина, по которой вы используете рекурсию? Вы должны иметь возможность выполнять итерацию по отдельным слоям, начиная с уровня вывода и восстанавливая обратный путь. –

+0

Vivin, академическая точка этого упражнения - использовать рекурсию для BP. (Нет, это не моя домашняя работа, я просто пытаюсь понять это :) Сеть на этом этапе очень проста: 2-2-1 трехслойная сеть с сигмоидными функциями активации, которую я пытаюсь тренировать с образцами [1, 0] -> [0,2] и [0, 1] -> [0,9]. –

+0

Типичные алгоритмы, которые я видел, делают это итеративно; Мне просто интересно, почему вы выбрали рекурсию. :) –

ответ

2

Решено. По-видимому, низкоразмерные сети чаще застревают в локальных минимумах. Это легко понять, зная, что более крупные сети менее склонны к достижению любых минимумов, даже глобальных.

Реализация импульса, который увеличивается с каждой итерацией, приводит меня к большинству минимумов. Таким образом, повторная инициализация весов до случайных (-0,5 до 0,5) значений и проведение нескольких тренировочных сессий в конечном итоге приводит меня ко всем из них.

Я рад сообщить, что моя сеть теперь проходит через обучение в 100% случаев, если данные классифицируются.

Смежные вопросы