由于这个问题需要很长时间,你可以阅读底部的悬崖笔记,或者阅读全文。 我正在玩遗传算法和神经网络(即使用遗传算法来进化神经网络),但我遇到了一些问题,特别是我发现进化的收敛速度非常慢,而且通常根本没有收敛到期望的结果!然而,由于设置太多(人口规模,突变率,交叉率等等),我不知道这是由于我的代码中的一些错误还是因为我对上述参数的选择不好。或者,当这种网络变得如此缓慢时,我预计结果会过早。
现在举一些例子: 训练网络以得到两个数字的总和,提供具有20个示例的训练集和具有以下设置的遗传算法:
#define MUTATION_RATE 0.5
#define MAX_PERTURBATION 1
#define POP_SIZE 500
#define CROSSOVER_RATE 0.7
#define NUM_TOUR 35
#define ELITISM 4
其中NUM_TOUR是选择运行锦标赛的个人数,ELITISM是我为当前一代中最佳个体传播的副本数量,以便将其传播到下一个锦标赛。 有了这些设置和一个只有2个输入和1个输出神经元的网络,我能够训练它,在2500代之后非常准确地给出两个数字的总和(这对我来说似乎很多,但无论如何),像:
2 + 2 = 4.01
或
1 + 5 = 5.98
使用相同的设置,以及具有2个输入,1个输出和2个神经元的1个隐藏层的网络,我尝试让它学习如何将两个数字相乘:在2500代后,我没有得到任何接近好的结果(例如:0 * 10 = 3.7
)。
我没有尝试任何其他操作,因为我想如果我不能想出一个学习如何繁殖的网络我的代码或我的设置有问题。正如我所说我正在使用锦标赛选择,交叉是通过从两个父母中的一个选择具有相同概率的每个基因来实现的,并且通过将从0到MAX_PERTURBATION的值加上或减去当前值来实现变异。
我有什么明显的错误吗?您能否指出我讨论如何优化遗传算法与神经网络的使用(什么样的交叉效果最好,哪种群体大小更好,突变率等等)或者可以给出的任何教程我的任何提示?
悬崖笔记 我正在创建一个神经网络,它可以通过遗传算法进行训练,但它的表现非常差,甚至无法学习如何将两个数相乘。完整文本中显示了一些示例:我正在寻找可以帮助我优化这一点的任何内容,或者让我意识到我的代码中可能存在错误。
我在这里上传了我的代码(C ++):http://www.megaupload.com/?d=NW8FPZ6M我知道很可能没有人会去看看它,但值得一试
答案 0 :(得分:3)
我做了很多关于神经网络进化设计的研究,我想给出一些提示。
从最简单的算法开始,而不是使用具有大量参数的GA:从随机搜索,模拟退火和进化策略开始,当交叉导致破坏性影响时,通常可以更好地使用GA!在NN设计中,交叉并不总是有效的,因为它倾向于“破坏”学习模式。您可以使用几行代码实现ES,并且已经在MATLAB中实现了模拟退火。不要只使用GA,因为它已经在MATLAB中实现。至少保持简单,删除交叉和精英和不寻常的选择机制。
此外,您必须始终将您的算法与良好的神经网络训练算法进行比较,这样您就可以知道某个特定神经网络的问题何时太难(或几乎不可能)。
答案 1 :(得分:1)
不是神经网络的专家,但在我的记忆中,神经元行为是线性的,即输出是系数乘以的输入之和。遗传算法想要找到的是这些系数。鉴于只有两个神经元,我不认为你可以计算乘法,因为输入操作数在计算过程中永远不会在一起多重,除非你将神经元输出连接到神经元系数。
我的直觉告诉我你需要更多的神经元才能做到这一点,以便虚拟大脑接近多个线性运算的乘法。也许你还必须在虚拟神经元中引入非线性操作,例如输出值钳位。
答案 2 :(得分:0)
你的比赛规模是35,非常高。比赛规模很大,人口500,你实际上每一代都要消灭你的多样性。 7将是一个相当典型的锦标赛规模,典型范围是3-11。
答案 3 :(得分:0)
我认为神经网络太小了。尝试在隐藏层中添加更多神经元,并尝试再添加一层。