我正在开发一个前馈人工神经网络(ffann),它会接受简单计算形式的输入并返回结果(类似于袖珍计算器)。结果不会完全精确。
该人工神经网络使用遗传算法对权重进行训练。
目前我的程序在以下局部最大值处卡住:
- 正确率5-6%,误差范围1%
- 正确率30%,误差范围10%
- 正确率40%,误差范围20%
- 正确率45%,误差范围30%
- 正确率60%,误差范围40%
我目前使用两种不同的遗传算法:
第一种是基本选择,从我的种群中随机挑选两个,称其中适应度较高者为赢家,另一者为输家。输家将从赢家那里接收一个权重。
第二种是变异,其中选择中的输家会根据错误结果的数量接收轻微的修改。(适应度由正确答案和错误答案决定)。因此,如果网络输出大量错误,它将接收较大的修改;而如果有许多正确答案,我们接近一个可接受的目标,修改将会较小。
那么,问题来了:我如何防止我的ffann在局部最大值处卡住?
我是否应该将当前的遗传算法修改为更高级的、包含更多变量的算法?
我是否应该创建额外的变异或交叉?
或者我是否应该尝试将变异变量修改为更大或更小的值?
这是一个很大的话题,如果我遗漏了任何可能需要的信息,请在评论中指出
编辑:将变异的数值调整为更适合的值后,我得到了更好的回答率,但离理想值还很远:
- 正确率10%,误差范围1%
- 正确率33%,误差范围10%
- 正确率43%,误差范围20%
- 正确率65%,误差范围30%
- 正确率73%,误差范围40%
目前网络是一个非常简单的三层结构,具有3个输入,唯一隐藏层中有2个神经元,输出层有一个神经元。
使用的激活函数是Tanh,将值置于-1和1之间。
选择类型的交叉非常简单,工作原理如下:
[a1, b1, c1, d1] // 由于正确答案最多被选为赢家[a2, b2, c2, d2] // 输家
输家将从赢家那里接收一个值,直接向下移动,因为我认为数组中权重的位置对其性能有影响。
变异非常简单,在输家的权重数组中随机选择一个权重,增加一个非常小的值(当前约为0.01到0.001之间),有50/50的几率为负值。
以下是训练数据的一些示例:
1, 8, -7 // -7代表 + (1+8)3, 7, -3 // -3代表 - (3-7)7, 7, 3 // 3代表 * (7*7)3, 8, 7 // 7代表 / (3/8)
回答:
在GA中使用生态位技术。一个有用的替代方案是生态位技术。每种解决方案的得分(我想是某种形式的二次误差)在考虑到整个种群的相似性后进行调整。这保持了种群内部的多样性,避免了过早收敛和陷入局部最优解的陷阱。
请看这里:
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.100.7342