【发布时间】:2016-10-08 02:48:02
【问题描述】:
我创建了一个程序,允许我创建任意大小/长度的灵活神经网络,但是我正在使用 XOR 设置的简单结构(前馈、Sigmoid 激活、反向传播、无批处理)对其进行测试.
编辑:以下是我原来的问题的全新方法,它没有提供足够的信息
编辑 2:我的体重开始在 -2.5 和 2.5 之间,并修复了我的代码中的一个问题,我忘记了一些负面因素。现在它要么在所有情况下收敛到 0,要么在所有情况下收敛到 1,而不是 0.5
一切都完全按照我认为应该的方式运行,但是它正在向 0.5 收敛,而不是在 0 和 1 的输出之间振荡。我已经完全完成并手动计算了整个设置前馈/计算增量错误/后退prop./等,它与我从程序中得到的相匹配。我还尝试通过改变学习率/动量来优化它,以及增加网络的复杂性(更多的神经元/层)。
因此,我假设我的方程式中的一个是错误的,或者我的神经网络中存在某种其他类型的误解。以下是我对每个步骤遵循的方程式逻辑:
我有一个包含两个输入和一个偏差的输入层,一个包含 2 个神经元和一个偏差的隐藏层,以及一个包含 1 个神经元的输出。
- 从两个输入神经元和偏置神经元中获取输入,然后将它们乘以各自的权重,然后将它们加在一起作为隐藏层中两个神经元中每个神经元的输入。
- 获取每个隐藏神经元的输入,通过 Sigmoid 激活函数(参考 1)并将其用作神经元的输出。
- 获取隐藏层中每个神经元的输出(偏置为 1),将它们乘以各自的权重,然后将这些值添加到输出神经元的输入中。
- 将输出神经元的输入通过 Sigmoid 激活函数,并将其用作整个网络的输出。
- 计算输出神经元的Delta误差(参考2)
- 计算 2 个隐藏神经元中的每一个的 Delta 误差(参考 3)
- 计算每个权重的梯度(参考4)(从末端开始计算)
- 计算每个权重的Delta权重(参考5),并将其添加到其值中。
- 通过更改输入和预期输出重新开始流程(参考6)
以下是对方程式/过程的引用的详细信息(这可能是我的问题所在!):
- x 是神经元的输入:
(1/(1 + Math.pow(Math.E, (-1 * x)))) -1*(actualOutput - expectedOutput)*(Sigmoid(x) * (1 - Sigmoid(x))//Same sigmoid used in reference 1SigmoidDerivative(Neuron.input)*(The sum of(Neuron.Weights * the deltaError of the neuron they connect to))ParentNeuron.output * NeuronItConnectsTo.deltaErrorlearningRate*(weight.gradient) + momentum*(Previous Delta Weight)- 我有一个数组列表,其中包含值
0,1,1,0按此顺序排列。它需要第一对(0,1),然后需要1。第二次通过,它需要第二对(1,1)并期望0。它只是不断迭代每个新集合的列表。也许以这种系统的方式训练它会导致问题?
就像我之前说的,他们认为我认为这不是代码问题的原因是它与我用纸和铅笔计算的结果完全匹配(如果出现编码错误就不会发生这种情况)。
另外,当我第一次初始化权重时,我会给它们一个介于 0 和 1 之间的随机双精度值。这篇文章认为这可能会导致问题:Neural Network with backpropogation not converging
会是这样吗? 我使用了 n^(-1/2) 规则,但这并没有解决问题。
如果我可以更具体或者您想要其他代码,请告诉我,谢谢!
【问题讨论】:
-
您问题的简短摘要:我有一堆代码没有显示,因为我很确定它是正确的。但是有些东西不起作用。怎么了?
-
@Henry 是的,我很抱歉,但我不知道从哪里开始。它是 3 个类的组合,每个类都有几百行代码。然而,收敛到 0.5 的神经网络是一个非常具体的问题,我希望有人至少有一个方向让我开始寻找。我将添加我的 deltaerror 和梯度代码,因为它不会太长
-
@Henry 我刚刚完全重做了这个问题,为领域提供了更多信息和解释。希望你能重新评估?谢谢!
标签: java neural-network xor