【问题标题】:Boosting my GA with Neural Networks and/or Reinforcement Learning用神经网络和/或强化学习提升我的 GA
【发布时间】:2011-01-28 14:55:24
【问题描述】:

正如我在之前的问题中提到的,我正在编写一个解决迷宫的应用程序来帮助我了解更多的理论 CS 科目,经过一些麻烦之后,我得到了一个可以进化一组规则的遗传算法(由布尔值处理) 以便通过迷宫找到一个好的解决方案。

话虽如此,单独的 GA 还可以,但我想用神经网络来加强它,即使我对神经网络没有真正的工作知识(没有正式的理论 CS 教育)。在对该主题进行了一些阅读后,我发现可以使用神经网络来训练基因组以改善结果。假设我有一个基因组(基因组),例如

1 0 0 1 0 1 0 1 0 1 1 1 0 0...

我如何使用神经网络(我假设是 MLP?)来训练和改进我的基因组?

除此之外,由于我对神经网络一无所知,因此我一直在研究使用我的迷宫矩阵(二维数组)来实现某种形式的强化学习,尽管我对以下算法的要求有些困惑来自我:

(来自http://people.revoledu.com/kardi/tutorial/ReinforcementLearning/Q-Learning-Algorithm.htm

1.  Set parameter , and environment reward matrix R
   2. Initialize matrix Q as zero matrix
   3. For each episode:
          * Select random initial state
          * Do while not reach goal state
                o Select one among all possible actions for the current state
                o Using this possible action, consider to go to the next state
                o Get maximum Q value of this next state based on all possible actions
                o Compute
                o Set the next state as the current state

  End Do

  End For 

对我来说最大的问题是实现奖励矩阵 R 和 Q 矩阵到底是什么,并获得 Q 值。我为我的迷宫和每一步的枚举状态使用多维数组。这将如何用于 Q-Learning 算法?

如果有人可以通过解释我需要做些什么来实现以下内容来提供帮助,最好是在 Java 中,尽管 C# 也很好,可能还有一些源代码示例,将不胜感激。

【问题讨论】:

  • 这是一个非常复杂的主题。你所谈论的事情通常是在人工智能大学课程的一个完整学期中解决的。我不确定它们是否可以在 Stackoverflow 问题和答案中得到正确解决,但我肯定有兴趣看到人们尝试。我从来没有完全理解其中一些算法。
  • 附带说明,如果您愿意花一些钱购买一本非常好的关于该主题的教科书,那么我建议:amazon.com/Artificial-Intelligence-Modern-Approach-3rd/dp/…
  • 我已经看过那本书几次,虽然它提供了一个不错的主题理论背景,但理解它如何实现却让我很生气。如果有人可以根据我提供的信息写出一个可行的基本解决方案,即使它是伪代码,我也会很乐意尝试实现它并给出一个可接受的答案。
  • 您是在尝试解决特定的迷宫,还是一般的迷宫?一个简单的强化学习算法将能够解决特定的迷宫,但解决迷宫通常需要更复杂的算法,特别是可能更复杂的状态空间和可能的动作空间。
  • 我错过了什么吗? Djikstra 的算法可以用来解迷宫...

标签: java computer-science artificial-intelligence theory neural-network


【解决方案1】:

正如一些 cmets 所指出的,您的问题确实涉及大量的背景知识和主题,这些知识和主题几乎无法在 stackoverflow 上雄辩地涵盖。但是,我们可以在这里尝试的是解决您的问题的建议方法。

首先:您的 GA 是做什么的?我看到一组二进制值;这些是什么?我认为它们是:

  • 不好:一系列“右转”和“左转”指令。为什么这很糟糕?因为你基本上是在做一个随机的、蛮力的尝试来解决你的问题。你不是在进化基因型:你是在改进随机猜测。
  • 更好:每个基因(基因组中的位置)都代表将在表型中表达的特征。基因组和表型之间不应该存在一对一的映射!

让我举个例子:在我们的大脑中有 10^13 个神经元。但是我们只有大约 10^9 个基因(是的,这不是一个确切的值,请耐心等待)。这告诉我们什么?我们的基因型不编码每个神经元。我们的基因组对蛋白质进行编码,然后这些蛋白质将构成我们身体的组成部分。

因此,进化通过选择表型的特征直接作用于基因型。如果我每只手有 6 个手指,如果这能让我成为一个更好的程序员,让我有更多的孩子,因为我在生活中更成功,那么,我的基因型将被进化选择,因为它包含 能力给我一个更健康的身体(是的,那里有一个双关语,考虑到这里大多数人的平均极客与可重复性比率)。

现在,想想你的 G​​A:你想要完成什么?您确定不断发展的规则会有所帮助吗?换句话说——在迷宫中的表现如何?最能帮助你成功的事情是什么:拥有不同的身体,或者记住正确的出路?也许您可能想重新考虑您的基因型并让它编码记忆能力。也许在基因型中编码可以存储多少数据,以及您的代理可以多快访问它——然后根据他们走出迷宫的速度来衡量适应度。 另一种(较弱的)方法可能是对您的代理用来决定去哪里的规则进行编码。带回家的信息是,编码特征,一旦表达,就可以通过适应度来选择。


现在,关于神经网络问题。要记住的一件事是 NN 是过滤器。他们收到一个输入。对其执行操作,并返回一个输出。这是什么输出?也许您只需要区分真/假条件;例如,一旦您将迷宫地图输入 NN,它就会告诉您是否可以从迷宫中出来。你会怎么做这样的事情?您需要正确编码数据。

这是关于 NN 的关键点:您的输入数据必须正确编码。通常人们对其进行规范化,也许对其进行缩放,也许您可​​以对其应用 sigma 函数以避免值太大或太小;这些是处理错误度量和性能的细节。您现在需要了解的是 NN 是什么,以及您不能将其用于什么。

现在解决您的问题。你提到你也想使用神经网络:怎么样,

  • 使用神经网络来引导代理,并且
  • 使用遗传算法进化神经网络参数?

改写如下:

  • 假设您有一个机器人:您的 NN 正在控制左右轮,并作为输入接收下一堵墙的距离以及到目前为止它已经行进了多少(这只是一个示例)
  • 首先生成随机基因型
  • 将基因型变成表型:第一个基因是网络敏感性;第二个基因编码学习率;第三个基因……以此类推
  • 现在你已经有了一个神经网络,运行模拟
  • 看看它的表现如何
  • 生成第二个随机基因型,进化第二个 NN
  • 看看第二个人的表现如何
  • 获得最佳个体,然后对其基因型进行突变或与失败者重组
  • 重复

这里有一篇关于这件事的优秀阅读:Inman Harvey Microbial GA

我希望我对这些问题有所了解。 NN 和 GA 并不是解决所有问题的灵丹妙药。在某些情况下,他们可以做很多事情,而在另一些情况下,他们只是错误的工具。 (仍然!)我们要获得最好的,要做到这一点,我们必须很好地理解它们。

玩得开心!很高兴知道这些事情,让日常生活变得更有趣:)

【讨论】:

  • 稍作修正。人类基因组中大约有 10^9 个碱基对。大约有 20,000 到 25,000 个基因。构建一个我说不出来的大脑需要多少,
【解决方案2】:

可能找不到“迷宫基因”,

遗传算法正在尝试建立一个属性向量和一个“过滤系统”,以通过某种“适者生存”算法来决定哪一组属性最适合。

找到迷宫出路的最简单方法是始终沿墙向左(或向右)移动。

Q 算法似乎与local maxima 存在问题,这是我记得的解决方法,如果结果没有改善,我会通过踢(向矩阵添加随机值)。

编辑:如上所述,回溯算法比 GA 或 NN 更适合此任务。 描述了如何结合这两种算法hereNeuroGen 描述了 GA 如何用于训练 NN。

【讨论】:

    【解决方案3】:
    • 尝试为您的神经网络使用免费的开源 NerounDotNet C# 库,而不是实现它。

    • 对于强化学习库,我目前正在寻找一个,尤其是针对 Dot NET 框架的..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 2020-11-24
      • 2016-07-11
      • 2014-05-29
      • 2020-05-15
      相关资源
      最近更新 更多