c++ - 将遗传算法用于神经网络

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

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

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

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

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

谢谢,(抱歉,如果这应该属于理论计算机科学,但我认为它不适合那里)

最佳答案

(人工)神经网络 (ANN) 是出了名的难以优化,而遗传算法 (GA) 是一种相当不错的优化方法(主要是因为其他所有方法的工作效果往往非常有限)。当然,也有一些替代方案也能很好地工作,但它们更复杂、更微妙,无法正确编程和调整(使用模拟退火和学习动量的反向传播)。我知道你做这个项目主要是为了玩弄这些东西。

您可能想看看进化神经 Controller (ENC),这是一个使用遗传(或进化)算法来训练 ANN 以完成复杂导航任务的领域(例如,星际空间任务是我亲自做过研究)。

对于 ANN 部分,我建议您不要将自己局限于逻辑函数(我知道 sigmoid 的灵感来自生物神经元,但这并不意味着它们一直都是最好的)。还存在许多其他功能,使用物流功能的部分原因是它们使反向传播更快、更简单。但是,Radial-Basis 函数也能创造奇迹(IMO,据我所知,大多数成功的 ANN 应用都使用 Radial-Basis 函数,即 RBF-NN)。通常,人们使用高斯函数、超球面函数,并且经常使用三角函数(称为模糊网络,另一大类 ANN)。

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

我个人已经完成了我上面描述的事情,并且它对某些问题非常有效(缩小尺寸和高复杂性,即没有明显的最佳解决方案)。

最后,不要指望它会那么容易工作。通常,它需要的种群规模和世代数量远远高于您的预期(毕竟,进化是一个非常缓慢的过程!)。所以,不要尝试 10 个个体的种群并运行 50 代,然后悲伤地说“哦,我猜这行不通……”。当然,根据您要应用它的问题的规模,按人口中数千人的数量级和几千到十万代的顺序尝试更多。

关于c++ - 将遗传算法用于神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5048381/

相关文章:

c# - CLR 存储过程与 C# 抛出错误

c# - 在哪里可以找到 RemotingServices.CreateTransparentProxy 实现?

.net - 泛型的设计与实现第 2 部分

python - Keras 二元分类 - Sigmoid 激活函数

c++ - 等级 2 导致所有机架集体中止

c++ - 重载运算符。 Const 参数会产生一些问题

c++ - 如何仅在C/C++项目中处理宏而不进行编译?

c++ - 在其他组件上使用 QTableView 缓慢滚动

machine-learning - NEAT 算法中调整的适应度

keras - Dense 期望 2d,但在 LSTM 中得到 3d