使用遗传算法神经网络

问题描述:

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

我的计划如下(如有更改,很多)。我的输入神经元会使用一个可能包含任何正数的数据集(包括小数点后两位,所以它们实际上是浮点数),但最可能是0到20000之间。因为重要性在于数字相互之间的价值相比,而不是他们有多大,他们会首先被除以所有值的最高数量将被输入。他们会将它们乘以权重(任何积极或消极的浮动),然后去他们的隐藏层。隐藏层中的每个神经元将加总它的所有输入,直到它们完成计算。然后他们将通过物流功能运行并输出。

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

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

谢谢,(和遗憾,这应该是在理论计算机科学,但我认为它不适合在那里)

+0

我不记得细节,但在这本书中:http://www.amazon.com/Techniques-Programming-Premier-Press-Development/dp/193184108X,作者几乎完成了你所描述的任务,即使用基因突变的权值来优化神经网络。 – 2011-02-19 02:27:47

+0

看到您提出的解决方案和更传统的过程(可能甚至是非神经过程)之间的性能比较会很有趣。 – Predictor 2011-02-19 15:52:13

(人工)神经网络(人工神经网络)是出了名的难以优化和遗传算法(GAs)是一个合理的好方法(主要是因为其他方面的工作能力非常有限)。当然,也有替代品可以很好地工作,但是它们对于正确编程和调整(使用模拟退火和学习动力进行反向传播)更加复杂和微妙。我知道你们正在做这个项目,主要是为了与这些事情一起玩。

您可能想看看进化神经控制器(ENC),这是一个应用遗传算法(或进化算法)来训练复杂导航任务的ANN的领域(例如,行星间空间任务是其中的一个应用我亲自做过研究)。

对于ANN部分,我建议你不要限制自己的物流功能(我知道sigmoid是受生物神经元启发的,但这并不意味着它们始终是最好的)。还有许多其他功能,物流功能的部分用途是因为它们使反向传播更快更简单。但是,径向基函数也可以起到很好的效果(国际海事组织和我所看到的,人工神经网络的最成功的应用是使用径向基函数,即RBF-NN)。通常,人们使用高斯函数,超球函数以及经常使用的三角函数(称为模糊网络,另一类庞大的人工神经网络)。

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

我已经亲自完成了我上面描述的任务,并且对于某些问题(减小尺寸和高复杂度,即没有明显的最佳解决方案)非常有效。

最后,不要指望它很容易工作。通常情况下,它需要人口规模和一代人的数量远远高于你期望的数量(毕竟,进化是一个非常缓慢的过程!)。所以,不要尝试10个人的人口并跑了50代,而且很遗憾地说“哦,我猜这不行......”。尝试按人口数千人的顺序进行更多的尝试,并根据您正在应用的问题的规模,进行数千至数十万代的尝试。

+0

我对你说的很了解,并且非常详细的答复,但我有一个问题。关于随机数的产生,什么是最好的随机数发生器,将产生包括小数在内的浮点随机数,而不仅仅是整数(.net,标准C库,增强等)。 – contrapsych 2011-02-19 20:29:05

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