在阅读了一些关于神经网络(反向传播)的文章后,我试着自己编写一个简单的神经网络。
我已经确定了XOR神经网络, 我的问题是当我试图训练网络时, 如果我只用一个例子来训练网络,那就说1,1,0(作为input1,input2,targetOutput)。 500列车后+ - 网络回答0.05。 但如果我尝试更多一个例子(让我们说2个不同或所有4种可能性),网络的目标是0.5作为输出:( 我在谷歌搜索我的错误没有结果:S 我试着提供尽可能多的细节,以帮助找出错误:
-ive尝试使用2,2,1和2,4,1(输入层,隐藏层,输出层)的网络。
- 每个神经元的输出:
double input = 0.0;
for (int n = 0; n < layers[i].Count; n++)
input += layers[i][n].Output * weights[n];
而'i'是当前图层,而权重是前一图层的所有权重。
- 最后一层(输出层)错误由:
定义value*(1-value)*(targetvalue-value);
而'value'是神经输出,'targetvalue'是当前神经元的目标输出。
- 其他神经元的错误由:
定义foreach neural in the nextlayer
sum+=neural.value*currentneural.weights[neural];
- 所有网络中的权重都适应这个公式(来自神经的权重 - >神经2)
weight+=LearnRate*neural.myvalue*neural2.error;
而LearnRate是纽约学习率(在我的网络中定义为0.25)。 - 每个神经元的偏重量由下式定义:
bias+=LearnRate*neural.myerror*neural.Bias;
偏差是const值= 1。
我几乎可以详细说明 正如我所说,输出目标是0.5,不同的训练样例:(
非常感谢你的帮助^ _ ^。
答案 0 :(得分:1)
如果没有看到完整的代码,很难分辨出错误的位置。您应该仔细检查的一件事是,您对每个单元的局部误差梯度的计算与您在该层上使用的激活函数相匹配。看看这里的通用公式:http://www.learnartificialneuralnetworks.com/backpropagation.html。
例如,您对输出层执行的计算假定您使用的是逻辑sigmoid激活函数,但是您没有在上面的代码中提到它,所以看起来您正在使用线性激活函数。
原则上,2-2-1网络应该足以学习XOR,尽管训练有时会被困在局部最小值而不能收敛到正确的状态。因此,重要的是不要从单个训练课程中得出关于算法性能的结论。请注意,简单的backprog必然会很慢,例如Rprop等更快更强大的解决方案。
有关于这个主题的书籍提供了一个简单网络的详细逐步计算(例如,'A.I:Negnevitsky的智能系统指南'),这可以帮助您调试算法。另一种方法是使用现有的框架(例如Encog,FANN,Matlab)设置完全相同的拓扑和初始权重,并将计算与您自己的实现进行比较。