我正在尝试使用神经网络解决异或问题。为了训练,我正在使用遗传算法。
但是经过一定数量的世代(200)后,错误停留在1。并且输出是正确的,除了1 xor 0,输出是0而不是1,我不明白为什么会发生这种情况。
种群规模:100
交叉率:70
突变率:5
精英数量:2
激活功能:乙状体
选择方法: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;
其中错误是目标输出
我尝试在变异中将权重设置在[-22]的范围内,但结果变得更糟(错误停留在1.6)。所以我现在不知道它是否有义务在一定范围内设置重量。。。
我真的需要你的帮助,提前谢谢。
编辑
事实上,问题出在权重初始化和突变方法上。
>
当我将权重设置在[-1 1]之间时,算法不会收敛。但是我越扩大范围,它就会给出更好的结果,比如在[-4 4]之间。
对于突变,我尝试了两种方法(突变一个随机选择的基因):
-
-
您指定 sigmoid 作为激活函数,但您应用负数,sigmoid 使用正数。我认为这是问题的原因。您应该指定另一个激活函数,例如双曲正切函数 (tanh)。
编辑:我现在很确定:重点是健身值。我怀疑您将其评估为错误(即最小化它),同时选择具有更大健身价值的更好的个人。