我试着用神经网络解决异或问题。为了训练我用了遗传算法。
但是经过一定数量的代数(200)后,错误卡在1,并且输出是正确的,除非输出是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;
其中,错误是目标输出。
我试着在变异中将权重设置在-2.2,但它变得更糟了(误差停留在1.6 )。所以如果它有义务在某一范围内设定重量.
我真的需要你的帮助,谢谢。
编辑
实际上,问题是在权值初始化和变异方法上。
->在-0.1之间加入随机扰动,突变率为5% .这样,我在1800代就得到了最好的结果(网络输出就像期望的那样)。
->用一个新的基因改变基因的值。新的值应该属于范围。在这种情况下,我必须将变异率提高到50%,这样算法才能收敛。重量必须至少在-7到7之间,否则就不会收敛。
发布于 2015-02-21 10:43:20
您指定了sigmoid作为激活函数,但是您应用了负数,sigmoid使用的是正数。我认为这是问题的原因。您应该指定另一个激活函数,例如双曲正切函数(tanh)。
编辑:我现在很确定:重点是健身价值。我怀疑你把它评价为错误(也就是最小化它),同时选择个体作为更好的适合度值更高的个体。
https://stackoverflow.com/questions/28605129
复制相似问题