正如我在之前的问题中提到的,我正在编写一个迷宫求解应用程序,以帮助我学习更多理论计算机科学科目。经过一番努力,我得到了一个遗传算法,它可以进化一组规则(由布尔值处理),以便找到通过迷宫的好解决方案。
话虽如此,单独使用遗传算法还可以,但我想用神经网络来增强它,即使我对神经网络没有真正的工作知识(没有正式的理论计算机科学教育)。在对该主题进行了一些阅读之后,我发现可以使用神经网络来训练基因组,从而提高结果。假设我有一个基因组(基因组),例如
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。
我希望我对这些问题有所启发。神经网络和遗传算法不是解决所有问题的灵丹妙药。在某些情况下,它们可以做很多事情,而在其他情况下,它们只是错误的工具。我们(仍然!)有责任获得最好的工具,为此我们必须很好地理解它们。
玩得开心!知道这些事情很棒,让日常生活更有趣 🙂