2

我正在尝试使用神经网络解决 XOR 问题。对于训练,我使用遗传算法。

但是经过一定数量的代数(200),错误停留在 1 中。并且输出是正确的,除了 1 xor 0 输出为 0 而不是 1 我不明白为什么会发生这种情况。

人口规模:100
交叉率:70
突变率:5
精英数:2
激活函数:S 型
选择方法: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 之间,否则它不会收敛。

4

1 回答 1

0

You specified sigmoid as the activation function, but you apply the negative numbers, sigmoid works with positive numbers. I think it's the cause of the problem. You should specify another activation function e.g. hyperbolic tangent function (tanh).

EDIT: I'm pretty sure by now: the point is the fitness value. I suspected that you evaluating it as the error (i.e. minimazing it) at the same time selecting individuals as better ones with greater fitness value.

于 2015-02-21T10:43:20.790 回答