C++ 基于遗传算法的神经网络问题

C++ 基于遗传算法的神经网络问题,c++,neural-network,genetic-algorithm,C++,Neural Network,Genetic Algorithm,因为这个问题会很长,你可以阅读底部的悬崖笔记,或者在这里阅读全文。 我在玩弄遗传算法和神经网络(即使用遗传算法进化神经网络),但我遇到了一些问题,特别是我发现进化收敛速度非常慢,而且往往根本无法收敛到期望的结果!然而,由于有这么多的设置(种群大小、变异率、交叉率等等),我不知道这是因为我的代码中有一些错误,还是因为我对上述参数选择不当。或者,在这种网络速度如此之慢是正常的情况下,我期望结果来得太早了 现在举几个例子: 训练一个网络,使之成为两个数字的总和,提供一个包含20个示例的训练集和一个具有

因为这个问题会很长,你可以阅读底部的悬崖笔记,或者在这里阅读全文。 我在玩弄遗传算法和神经网络(即使用遗传算法进化神经网络),但我遇到了一些问题,特别是我发现进化收敛速度非常慢,而且往往根本无法收敛到期望的结果!然而,由于有这么多的设置(种群大小、变异率、交叉率等等),我不知道这是因为我的代码中有一些错误,还是因为我对上述参数选择不当。或者,在这种网络速度如此之慢是正常的情况下,我期望结果来得太早了

现在举几个例子: 训练一个网络,使之成为两个数字的总和,提供一个包含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个输入、1个输出和1个隐藏层的2个神经元的网络,我试图让它学会如何将两个数字相乘:经过2500代之后,我没有得到任何好的结果(比如:
0*10=3.7

我没有尝试过任何其他操作,因为我想如果我不能建立一个学习乘法的网络,那么我的代码或设置可能有问题。正如我所说的,我正在使用锦标赛选择,交叉是通过从两个父母中的一个以相同的概率选择每个基因来实现的,变异是通过将一个值从0添加到
MAX\u扰动
到当前值来进行的

我有什么明显做错的吗?你能给我指一下任何讨论如何优化遗传算法与神经网络结合使用的教程(什么样的交叉最有效,什么样的种群规模更好,还有变异率等等)或者能给我一些提示吗


我正在创建一个神经网络,用遗传算法进行训练,但它的性能非常差,甚至不能学习如何将两个数字相乘。全文中给出了一些示例。

不是神经网络专家,但在我的记忆中,神经元的行为是线性的,即输出是输入乘以系数的总和。遗传算法想要找到的是这些系数。如果只有两个神经元,我认为不能计算乘法,因为在计算过程中,输入操作数永远不会相乘,除非将神经元输出连接到神经元系数


我的直觉告诉我你需要更多的神经元来做这件事,以便虚拟大脑通过多重线性运算来近似乘法。可能你还需要在虚拟神经元中引入一种非线性操作,比如输出值钳位。

你的比赛规模(35岁)非常大。比赛规模如此之大,人口为500人,实际上每一代人都会消灭很多多样性。7将是一个相当典型的锦标赛规模,典型范围为3-11

我对神经网络的进化设计做了很多研究,我想给出一些提示

从最简单的算法开始,而不是从一个有很多参数的遗传算法开始:从随机搜索、模拟退火和进化策略开始,当交叉导致破坏性影响时,这些策略通常比遗传算法更有效!在神经网络设计中,交叉并不总是有效的,因为它倾向于“破坏”学习模式。您可以用几行代码实现ES,并且模拟退火已经在MATLAB中实现。不要只使用遗传算法,因为它已经在MATLAB中实现了。至少保持简单,消除交叉和精英主义以及不寻常的选择机制


此外,您必须始终将您的算法与良好的神经网络训练算法进行比较,这样您就可以知道什么时候问题对于特定的神经网络来说太难(或几乎不可能)

我认为神经网络太小了。尝试在隐藏层中添加更多的神经元,也尝试再添加一层。

也有非线性响应神经元。乙状结肠很常见。如果他知道在哪里使用乘法神经元,这其实很容易…一个人有多少权重?我的专业是天然气,而不是NNs,过了一段时间我就放弃了想办法。这将影响到你的变异率是否合适的问题。每个因维都有一个与网络中的权重总数相等的权重数,因此在2个输入2个隐藏和1个输出神经元的情况下,它有6个权重。无论如何,我修复了代码中的一个错误,它导致了许多重复的个体,这解决了大部分问题,尽管我仍然在寻找关于如何为GA选择参数的一般指导原则。我明白了,我不知道这一点。无论如何,我刚刚修复了代码中的一个bug,这几乎解决了问题,尽管我仍然在寻找关于如何选择这样的参数的一般指导原则。
2 + 2 = 4.01
1 + 5 = 5.98