我正在尝试使用神经网络解决XOR问题。对于训练我正在使用遗传算法。
但经过一定代(200)后,错误卡在1.输出正确,除了1 x或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]。
对于突变,我尝试了两种方法(突变一种随机选择的基因):
- &GT;在[-0.1 0.1]之间添加随机扰动,具有5%的突变率。这样,我在第1800代获得了最好的结果(网络输出,如所需的网络输出)
- &GT;用新的基因改变基因的价值。新值应属于该范围。在这种情况下,我不得不将突变率设置为50%,因为算法可以收敛。并且权重必须在至少-7和7之间,否则它将不会收敛。
答案 0 :(得分:0)
您指定了sigmoid作为激活函数,但是您应用负数,sigmoid与正数一起使用。 我认为这是问题的原因。 您应指定另一个激活功能,例如双曲正切函数(tanh)。
编辑:我现在很确定:重点是适应值。我怀疑你将它评估为误差(即使其最小化),同时选择具有更大适应值的更好的个体。