ANN:递归反向传播

时间:2013-07-08 20:53:29

标签: javascript recursion artificial-intelligence neural-network backpropagation

我正在尝试用递归来实现学术目的的反向传播,但似乎我在某处出错了。现在已经修补了一段时间,但要么根本没有学习,要么没有学习第二种模式。

请让我知道我哪里出错了。 (这是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();
}

1 个答案:

答案 0 :(得分:2)

解决了它。显然,低维网络更容易陷入局部最小值。这很容易理解,因为高维网络不太可能达到任何最小值,甚至是全局的。

实现每次迭代增加的动量可以让我完成大部分最小值。因此,将权重重新初始化为随机(-0.5到0.5)值并进行多次训练会最终让我了解所有这些。

我很高兴地宣布,如果数据是可分类的,我的网络现在可以通过100%的案例进行培训。