使用遗传算法进行神经网络

时间:2011-02-19 02:07:46

标签: c++ clr neural-network genetic-algorithm

目前我正在开发一个使用遗传算法优化神经网络的项目。我确实意识到这可能不是优化它们的最佳方式,但我是两个新手,所以我只是想尝试使用它们。

我的计划如下(可能会有很多变化)。我的输入神经元将使用一个几乎可以有任何正数的数据集(包括最多两个位数的小数,所以它们实际上是浮点数),但最有可能在0到20000之间。因为重要性在于如何数字相互比较而不是它们有多大,它们首先除以输入的所有数值的最大数。在进入隐藏层之前,他们将乘以权重(任何正或负浮点数)。隐藏层中的每个神经元将对它们的所有输入求和,直到它们被计算完为止。然后他们将通过物流功能运行并输出。

我的环境是Visual Studio C ++ 2010 Express,我正在使用clr。

我的问题在于遗传算法及其如何工作。它将调整权重。我的问题是,当它随机改变其中一个权重(突变率)时,它可能使权重异常高或低,当乘以输入并加上其他时,会导致溢出或其他一些错误。我也不知道如何组织我的染色体。那么,通过选择权重而不是随机的位进行随机化并将它们更改为定义范围内的随机数会更好吗?基本上我正在寻找关于如何组织这个的建议而不会导致错误,使得值在保持性能的同时最终变得太大或太小。

谢谢,(对不起,如果这应该是理论计算机科学,但我认为它不适合那里)

2 个答案:

答案 0 :(得分:7)

(人工)神经网络(人工神经网络)是出了名的难以优化,和遗传算法(气)是一个相当不错的方法来这样做(主要是因为一切趋向于它如何能工作非常有限)。当然,也有一些替代方案也能很好地工作,但它们更复杂,更精确地编程和调整(使用模拟退火和学习动力进行反向传播)。我知道你正在做这个项目主要是为了解决这些问题。

您可能想看看在进化神经控制器(ENC),这是在遗传性(或进化)算法被用来训练人工神经网络为复杂的导航任务(例如帧间行星空间任务的字段是的应用之一我亲自做过研究)。

有关的神经网络的一部分,我建议你不要限制自己的物流功能(我知道,乙状结肠是从生物神经元的启发,但是,这并不意味着他们是最好所有的时间)。还存在许多其他功能,部分使用物流功能是因为它们使反向传播更快更简单。但是,径向基函数创造奇迹,以及(IMO,从我所看到的,人工神经网络的最成功的应用中使用径向基函数,即RBF-NN)。通常,人们使用高斯函数,超球函数和三角函数(称为模糊网络,另一大类人工神经网络)。

至于GA,由于你提到的原因,我不推荐你所描述的那种突变(即翻转位)。在处理实值基因时,人们不会使用这种突变。一个非常简单的基因突变的方法就是决定(以某种概率)变异的个体,然后选择它的基因中的一个要素中发生突变,然后简单地生成一个新的基因元素使用随机数发生器来代替它(RAND()) 。有了这个,你可以限制生成的基因元素的规模,以避免转变你的个体退化的问题(即一个完全错误的基因元素可以使整个个体无用)。什么是基因?嗯,对于人工神经网络,通常是一个包含网络中所有神经元的所有权重的大向量。你可以猜测,如果神经元的数量太大,人们很少会使用GA。我还建议你使用锦标赛选择来选择个人进行复制。至于交叉(即混合两个父母以生孩子),只需保持权重的顺序,并从孩子的每个元素中随机选择一个权重,并且具有相同的概率。

我亲自完成了上面描述的内容,它对某些问题(缩小尺寸和高复杂性,即没有明显的最佳解决方案)非常有效。

最后,不要指望它能够轻松地发挥作用。通常情况下,它需要一个人口规模和数量远远高于你期望的数量(毕竟,进化是一个非常缓慢的过程!)。因此,不要尝试10个人的人口,并运行50代,并遗憾地说“哦,我想它不起作用......”。当然,根据您应用它的问题的规模,在人口中成千上万的人以及数千到十万代的顺序中尝试更多。

答案 1 :(得分:3)

你的问题在于染色体表现。它被称为汉明悬崖问题。您可以使用Gray Code进行没有汉明悬崖问题的染色体表示