【问题标题】:Issue in solving XOR using neural network and genetic algorithm使用神经网络和遗传算法求解异或的问题
【发布时间】: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


【解决方案1】:

您将 sigmoid 指定为激活函数,但您应用了负数,sigmoid 适用于正数。 我认为这是问题的原因。 您应该指定另一个激活函数,例如双曲正切函数(tanh)。

编辑:我现在很确定:重点是适应度值。我怀疑您将其评估为错误(即最小化它),同时选择具有更大适应度值的个体作为更好的个体。

【讨论】:

  • 您的意思是 sigmoid 激活函数不适用于负权重吗?因为负权重与反向传播效果很好......我会尝试 tanh 激活函数,我会通知你,
  • 嗯,你有 tanh 正在工作,而 sigmoid 没有。是真的吗?
  • 1.你如何初始化输入权重?看看这个答案:stackoverflow.com/questions/4190494/…,同样是关于隐藏神经元的评论。 2. 您如何处理 GA 中的精英主义? 3. feedforward()是做什么的。
  • 你如何看待适应度值——越大越好,反之亦然?
  • 一开始是的,它只适用于 tanh 激活函数。但在调整权重后,它对两者都有效。所以问题在于权重初始化。我更新了问题以获取更多信息。非常感谢您的帮助..
猜你喜欢
  • 2019-04-15
  • 2017-10-25
  • 2011-06-30
  • 2010-10-24
  • 2011-01-06
  • 2018-05-11
  • 2020-08-19
  • 2015-05-09
  • 2018-10-22
相关资源
最近更新 更多