神经网络与遗传算法问题
Neural network with genetic algorithm question
由于这个问题会很长,你可以阅读底部的注释,或者在这里阅读全文。我正在玩遗传算法和神经网络(即使用遗传算法来进化神经网络),但我遇到了一些问题,特别是我发现进化非常缓慢收敛,并且经常不收敛到期望的结果!然而,由于存在如此多的设置(种群大小、突变率、交叉率等)……我不知道这是由于我的代码中的一些错误,还是因为我选择了前面提到的那些参数。也可能是我期待结果太早了,这种网络这么慢是正常的。
下面是一些例子:训练一个网络求两个数字的和,提供一个包含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个输出和1个隐藏层的2个神经元的网络,我试图让它学习如何乘两个数字:经过2500代后,我没有得到任何接近好的结果(如:0 * 10 = 3.7
)。
我没有尝试任何其他操作,因为我想,如果我不能想出一个学习如何乘法的网络,要么是我的代码或我的设置有问题。正如我所说的,我正在使用锦标赛选择,交叉是通过从两个父母中的一个以相同的概率选择每个基因来实现的,而突变是通过在当前值上添加或减去从0到MAX_PERTURBATION
的值来实现的。
我做错了什么吗?你能给我指出任何讨论如何优化使用神经网络遗传算法的教程吗(哪种交叉效果最好,哪种种群规模更好,以及突变率等等……)或者能给我一些建议吗?
我正在创建一个用遗传算法训练的神经网络,但它表现得很差,甚至不能学习如何将两个数字相乘。全文中给出了一些例子
我做了很多关于神经网络进化设计的研究,我想给一些提示。
从最简单的算法开始,而不是有很多参数的遗传算法:从随机搜索、模拟退火和进化策略开始,当交叉导致破坏性影响时,这些策略通常比遗传算法好得多!在神经网络设计中,交叉并不总是有效的,因为它倾向于"破坏"学习模式。你可以用几行代码实现ES,模拟退火已经在MATLAB中实现了。不要只使用遗传算法,因为它已经在MATLAB中实现了。至少保持简单,取消跨界、精英主义和不寻常的选择机制。
此外,你必须总是将你的算法与好的神经网络训练算法进行比较,这样你就会知道什么时候一个问题对特定的神经网络来说太难(或几乎不可能)。
不是神经网络方面的专家,但在我的记忆中,神经元的行为是线性的,也就是说,输出是输入乘以系数的总和。遗传算法想要找到的就是这些系数。如果只有两个神经元,我认为你无法计算乘法,因为输入操作数在计算过程中永远不会相乘,除非你将一个神经元输出连接到一个神经元系数。
我的直觉告诉我,你需要更多的神经元来做这件事,为了让虚拟大脑通过多个线性运算来近似乘法。也许你还需要在你的虚拟神经元中引入一个非线性操作,比如输出值箝位。
你的比赛规模为35,非常高。在500人的比赛中,比赛规模如此之大,实际上每一代都会消灭很多多样性。7是比较典型的比赛规模,3-11是典型的范围。
我认为神经网络太小了。
- 算法问题:查找从堆栈中弹出的所有序列
- C++向量初始化遗传算法的代理向量
- 编程作业:机器人遗传算法
- 在遗传算法中永远不会达到100%
- 多线程galib247遗传算法陷入局部极大值
- 遗传算法中的单点交叉
- 如何利用遗传算法求C中数的平方根来实现选择和交叉
- 遗传算法的选择机制
- 在遗传算法中使用二进制编码是必要的吗
- 遗传算法和神经网络:临时地址[-fallowive]
- 访问基于遗传算法的PNRG中的数组? " no match for operator[] "
- 求解线性规划中最大化问题的C++算法
- 在遗传算法中,对于非排序群体,应该如何组织轮盘选择
- WindowsCE 依赖关系问题随着算法的变化而消失
- 为什么我的遗传算法不收敛
- 为遗传算法分配和检索逐位内存值
- 神经网络与遗传算法问题
- 种群变得陈旧——遗传算法
- 如何为遗传算法生成随机数?
- 用C(++)语言将double转换为遗传算法的位数组