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

con*_*ych 9 c++ clr neural-network genetic-algorithm

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

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

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

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

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

Mik*_*son 7

(人工)神经网络(ANNs)众所周知难以优化,而遗传算法(GA)是这样做的一种相当好的方法(主要是因为其他一切在其工作效果方面往往非常有限).当然,也有一些替代方案也能很好地工作,但它们更复杂,更精确地编程和调整(使用模拟退火和学习动力进行反向传播).我知道你正在做这个项目主要是为了解决这些问题.

你可能想看看进化神经控制器(ENC),这是一个使用遗传(或进化)算法训练人工神经网络进行复杂导航任务的领域(例如,行星间空间任务是我的应用之一)亲自完成研究).

对于ANN部分,我建议你不要局限于物流功能(我知道sigmoid是从生物神经元启发的,但这并不意味着它们一直是最好的).还存在许多其他功能,部分使用物流功能是因为它们使反向传播更快更简单.但是,Radial-Basis函数也可以创造奇迹(IMO和我所见,人工神经网络的大多数成功应用都使用Radial-Basis函数,即RBF-NN).通常,人们使用高斯函数,超球函数和非常常见的三角函数(称为模糊网络,另一类巨大的人工神经网络).

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

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

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