神经网络解决AND

时间:2015-02-22 21:54:20

标签: neural-network backpropagation

我正致力于实现反向传播算法。最初,我致力于训练我的网络以解决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()));
        }

1 个答案:

答案 0 :(得分:2)

0.08非常低,但AND应该是完全可解的,这意味着错误0应该是可能的。您的迭代和学习率似乎也合理。您网络的拓扑结构是什么?你是否包括偏见节点?

标准反向传播算法通常不能很好地与阈值一起使用,这是它们通常不常用的原因。如果您想将其作为调试测试,可以使用Perceptron训练规则和.5的阈值(这是非常标准的)。

是的,将初始权重约束在-1和1之间可能是一个好主意。对于简单的逻辑任务,人们通常不允许权重超出该范围,尽管原则上我不认为这应该是一个问题。