【问题标题】:Neural network to solve AND神经网络解决 AND
【发布时间】:2015-04-24 04:25:18
【问题描述】:

我正在实施一种反向传播算法。最初,我致力于训练我的网络以解决 XOR,以在将其用于我的设计之前验证它是否正常工作。阅读this 后,我决定先训练它解决与门。我使用 sigmoid 作为传递函数和 MSE 来计算总误差。我使用了介于 0.01 和 0.5 之间的不同学习率。我每次对网络进行几次不同的迭代训练,从 100 次迭代到 1000 次迭代。我得到的最小总误差是 0.08。这是可接受的错误吗?

我的第二个问题,我应该使用阈值而不是 sigmoid 来解决与门吗?如果是,合适的阈值是多少?

第三,我是否应该对初始权重设置一个限制,例如在 -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()));
        }

【问题讨论】:

    标签: neural-network backpropagation


    【解决方案1】:

    0.08 相当低,但 AND 应该是完全可解的,这意味着 0 的错误应该是可能的。您的迭代次数和学习率似乎也很合理。你的网络拓扑是什么?是否包含偏置节点?

    标准反向传播算法通常不能很好地处理阈值,这就是它们通常不被使用的原因。如果您想尝试将其作为调试测试,您可以使用感知器训练规则和 0.5 的阈值(这是相当标准的)。

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

    【讨论】:

    • 不,包括偏见是个好主意!我只是想确定你是。我同意最后一组输入的输出正在减少有点奇怪(尽管并非完全不可信)。否则,这一切看起来就像您所期望的那样 - 输出开始时非常不准确,但逐渐朝着正确的方向发展。
    • 但是对于输出的最后一行,输出必须发散到 1 而是递减!我已经添加了负责进行反向传播的代码,您可以看看编辑吗?
    • 随着时间的推移,我绝对同意最后的输出。但是在该示例开始时,连接权重的降低比增加的压力要大得多——其中三个输出太高,只有一个太低。因此,最后一个输出的性能一开始可能会变得最差。它最终应该会变得更好。我看了你的代码。什么是 outErr 数组,它是如何填充的?另外,你能描述一下神经网络的形状吗,这样我能确保我画的正确吗?我看不出您的代码有任何明显错误。
    • outErr 数组填充了网络输出层的 (Target- output)。神经网络有 2 个输入神经元 - 2 个隐藏神经元 - 和 1 个输出神经元。正如我所说的那样使用偏见。我正在使用这个公式来更新偏差,oldbias+ learninfrate*errorDerivative。这是正确的吗?
    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 2015-06-17
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多