6

在阅读了一些关于神经网络(反向传播)的文章后,我尝试自己编写一个简单的神经网络。

我决定了 XOR 神经网络,我的问题是当我试图训练网络时,如果我只使用一个例子来训练网络,让我们说 1,1,0(作为输入 1,输入 2,目标输出)。经过 500 次火车 +- 网络回答 0.05。但是,如果我尝试不止一个示例(让我们说 2 种不同或所有 4 种可能性),网络的目标是 0.5 作为输出 :( 我在谷歌搜索我的错误但没有结果:我会尽量提供尽可能多的细节帮助找出问题所在:

-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;

偏差是常量值 = 1。

这几乎是我能详细说明的,正如我所说的输出目标是 0.5,不同的训练示例:(

非常感谢您的帮助^_^。

4

1 回答 1

1

如果没有看到完整的代码,很难判断错误在哪里。您应该仔细检查的一件事是您对每个单元的局部误差梯度的计算是否与您在该层上使用的激活函数相匹配。在这里查看通用公式: http: //www.learnartificialneuralnetworks.com/backpropagation.html

例如,您为输出层所做的计算假设您使用的是逻辑 sigmoid 激活函数,但您没有在上面的代码中提及这一点,因此看起来您正在使用线性激活函数。

原则上,2-2-1 网络应该足以学习 XOR,尽管训练有时会陷入局部最小值而无法收敛到正确的状态。因此,重要的是不要从一次训练中得出关于算法性能的结论。请注意,简单的 backprog 肯定会很慢,例如 Rprop 等更快、更健壮的解决方案。

有一些关于该主题的书籍提供了简单网络的详细逐步计算(例如 Negnevitsky 的“AI:智能系统指南”),这可以帮助您调试算法。另一种方法是使用现有框架(例如 Encog、FANN、Matlab)设置完全相同的拓扑和初始权重,并将计算结果与您自己的实现进行比较。

于 2011-09-22T17:30:51.197 回答