我正致力于实现反向传播算法。最初,我致力于训练我的网络以解决XOR,以便在将其用于我的设计之前验证它是否正常工作。在阅读this之后,我决定训练它以先解决AND门。我使用sigmoid作为传递函数,使用MSE来计算总误差。我使用了不同的学习率,范围在0.01到0.5之间。我每次都训练网络几次,用于从100次迭代到1000次迭代的不同迭代。我得到的最小总误差是0.08。这是可接受的错误吗?
我的第二个问题,我应该使用阈值而不是sigmoid来解决AND门吗?如果是,那么合适的门槛是多少?
第三,我应该设置初始权重的限制,例如-1和1之间的
提前致谢。
编辑1
我认为输出很奇怪 这是第一次迭代后的输出:
Target: 0.0 Output: 0.5314680723170211
Target: 0.0 Output: 0.7098671414869142
Target: 0.0 Output: 0.625565435381579
Target: 1.0 Output: 0.7827456263767251
和第400次迭代后的输出:
Target: 0.0 Output: 0.2826892072063843
Target: 0.0 Output: 0.4596476713717095
Target: 0.0 Output: 0.3675222634971935
Target: 1.0 Output: 0.5563197014845178
编辑2
以下是我的代码执行反向传播的部分:
for( int i=0;i< currentLayer.getSize();i++)
{
temp = currentLayer.getAt(i);
err=temp.getOutput()*(1-temp.getOutput())*outErr[i];
temp.setError(roundTwoDecimals(err));
}
for ( int i=0;i<currentLayer.getSize();i++)
{
temp = currentLayer.getAt(i); // get a neuron at the output layer
// update the connections
for (int j=0 ;j<temp.getInConnections().size();j++)
{
inputCon= temp.getInputConnectionAt(j);
newW=inputCon.getWeight()+ inputCon.getDst().getError()*inputCon.getInput()*this.learningRate;
inputCon.setWeight(roundTwoDecimals(newW));
}
// now update the bias
temp.setBias(temp.getBias()+(this.learningRate*temp.getError()));
}
答案 0 :(得分:2)
0.08非常低,但AND应该是完全可解的,这意味着错误0应该是可能的。您的迭代和学习率似乎也合理。您网络的拓扑结构是什么?你是否包括偏见节点?
标准反向传播算法通常不能很好地与阈值一起使用,这是它们通常不常用的原因。如果您想将其作为调试测试,可以使用Perceptron训练规则和.5的阈值(这是非常标准的)。
是的,将初始权重约束在-1和1之间可能是一个好主意。对于简单的逻辑任务,人们通常不允许权重超出该范围,尽管原则上我不认为这应该是一个问题。