出于学术目的,我试图使用递归实现反向传播,但似乎我在某处出错了。已经对它进行了一段时间的修补,但要么根本没有学到任何东西,要么在第二种模式上没有学到东西。
请告诉我哪里出错了。(这是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();
}发布于 2013-07-18 17:17:27
解决了它。显然,低维网络更容易陷入局部极小值。这很容易掌握,因为高维网络不太可能达到任何最小值,甚至是全局的。
实现随着每次迭代而增加的动量,可以让我通过大多数最小值。因此,将权重重新初始化为随机(-0.5到0.5)值,并进行多次训练,最终可以帮助我完成所有这些任务。
我很高兴地宣布,如果数据是可分类的,我的网络现在可以通过100%的训练。
https://stackoverflow.com/questions/17535800
复制相似问题