使用神经网络和/或强化学习来增强我的遗传算法

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

话虽如此,单独使用遗传算法还可以,但我想用神经网络来增强它,即使我对神经网络没有真正的工作知识(没有正式的理论计算机科学教育)。在对该主题进行了一些阅读之后,我发现可以使用神经网络来训练基因组,从而提高结果。假设我有一个基因组(基因组),例如

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.  设置参数,和环境奖励矩阵R   2. 将矩阵Q初始化为零矩阵   3. 对于每个episode:          * 选择随机初始状态          * Do while not reach goal state                o 选择当前状态的所有可能动作之一                o 使用这个可能的动作,考虑进入下一个状态                o 基于所有可能的动作,获取下一个状态的最大Q值                o 计算                o 将下一个状态设置为当前状态  End Do  End For 

对我来说,最大的问题是实现奖励矩阵R以及Q矩阵到底是什么,以及获取Q值。我使用多维数组作为我的迷宫,并为每个移动使用枚举状态。这如何在Q-Learning算法中使用?

如果有人可以通过解释我需要做什么来实现以下目标来提供帮助,最好是用Java,虽然C#也不错,如果可能的话提供一些源代码示例,那将不胜感激。


回答:

正如一些评论中指出的那样,你的问题确实涉及大量的背景知识和主题,这些知识和主题很难在stackoverflow上进行雄辩的阐述。但是,我们可以在这里尝试的是提出解决你的问题的方法。

首先:你的遗传算法做什么?我看到一组二进制值;它们是什么?我将它们视为:

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

让我给你举个例子:在我们的大脑中有10^13个神经元。但我们只有大约10^9个基因(是的,这不是一个确切的值,请忍受我一会儿)。这告诉我们什么?我们的基因型并没有编码每个神经元。我们的基因组编码了蛋白质,然后这些蛋白质会去制造我们身体的组成部分。

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

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


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

这是关于神经网络的关键点:你的输入数据必须被正确编码。通常人们会对其进行归一化,也许会缩放它,也许你可以对其应用一个sigma函数来避免太大或太小的值;这些都是处理误差度量和性能的细节。你现在需要理解的是神经网络是什么,以及你不能用它做什么。

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

  • 使用神经网络来引导代理,以及
  • 使用遗传算法来进化神经网络参数怎么样?

像这样重新表述:

  • 假设你有一个机器人:你的神经网络控制着左右轮,并且作为输入,它接收到下一个墙壁的距离以及它到目前为止行驶了多少(这只是一个例子)
  • 你从生成一个随机基因型开始
  • 将基因型转化为表现型:第一个基因是网络灵敏度;第二个基因编码学习率;第三个基因..等等
  • 现在你有一个神经网络,运行模拟
  • 看看它的表现如何
  • 生成第二个随机基因型,进化第二个神经网络
  • 看看这第二个个体的表现如何
  • 获得最好的个体,然后要么突变其基因型,要么将其与失败者重新组合
  • 重复

这里有一个关于这个问题的非常棒的阅读材料:Inman Harvey Microbial GA

我希望我对这些问题有所启发。神经网络和遗传算法不是解决所有问题的灵丹妙药。在某些情况下,它们可以做很多事情,而在其他情况下,它们只是错误的工具。我们(仍然!)有责任获得最好的工具,为此我们必须很好地理解它们。

玩得开心!知道这些事情很棒,让日常生活更有趣 🙂

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注