如何防止我的程序在局部最大值处卡住(前馈人工神经网络和遗传算法)

我正在开发一个前馈人工神经网络(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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注