【发布时间】:2015-02-25 07:32:57
【问题描述】:
我正在尝试使用神经网络解决 XOR 问题。对于训练,我使用遗传算法。
但是经过一定数量的世代(200),错误停留在 1。并且输出是正确的,除了 1 xor 0 输出是 0 而不是 1 我不明白为什么会这样。
人口规模:100
交叉率:70
突变率:5
精英号:2
激活函数:sigmoid
选择方法:7人参加的锦标赛选择
变异算法=
for (int i=0; i< individual.getNbrOfWeights(); i++)
if (random(0,100) < mutationRate)
{
genome[i] = genome[i] + random(-0.1,0.1);
}
体能计算 =
double error = 0;
error = error + feedForward({0, 1}, 1);
error = error + feedForward({1, 0}, 1);
error = error + feedForward({1, 1}, 0);
error = error + feedForward({0, 0}, 0);
fitness = error;
错误是目标输出
我尝试在突变中设置 [-2 2] 范围内的权重,但它变得更糟(错误卡在 1.6 中)。所以我现在如果有义务在一定范围内设置权重...
我真的需要你的帮助,提前谢谢。
编辑
其实问题出在权重初始化和变异方法上。
当我在 [-1 1] 之间设置权重时,算法不会收敛。但是我越是扩大范围,它给出的结果就越好,比如在 [-4 4] 之间。
对于突变,我尝试了两种方法(突变一个随机选择的基因):
--> 在 [-0.1 0.1] 之间添加一个随机扰动,突变率为 5%。这样,我在第 1800 代得到了最好的结果(网络输出和期望的一样)
--> 用一个新的改变基因的值。新值应属于该范围。在这种情况下,我必须将突变率设置为 50%,这样算法才能收敛。并且权重必须至少在 -7 和 7 之间,否则它不会收敛。
【问题讨论】:
-
神经网络的结构是什么?
-
输入层2个神经元,隐藏层2个,输出层1个
-
如果有需要我可以分享代码
-
您是否检查过人口是否过快收敛到局部最小值?逐代查看人口如何变化,是否有正确的解决方案(您可以通过适应度值识别它们),它们为什么消失或为什么它们从未出现,等等。
标签: neural-network genetic-algorithm xor fitness