你想要实现的是一个学习玩飞扬小鸟的游戏。为此,您需要一个神经网络和一个遗传算法,这两件事一起工作。
关于您对输出的担忧,您不必知道该操作是否会受益,我将很快解释原因。
神经网络部分
所以,你需要知道如何构建一个神经网络,我不知道你对它的了解,但我建议从基础开始。在这种情况下,您需要一个前馈神经网络,因为您只需从当前飞扬的鸟场景/帧中获取输入(例如鸟的 y 位置、与关闭管道的距离等)并将其馈入在我们刚刚确定的唯一输出神经元中输出 1 或 0(跳转或不跳转)的网络。
在 python 中,您可以从头开始实现神经网络,或者使用为您完成所有繁琐工作的神经网络框架。
- 从头开始,您需要使用 numpy 进行矩阵计算,并且您需要学习矩阵乘法、点积和所有花哨的东西(您可以让 numpy 处理矩阵计算,但始终了解它是如何在幕后工作的有助于理解你在做更高级的事情时可能遇到的新问题)
- 使用TensorFlow for python 之类的框架,您唯一需要做的就是为您要使用的网络找到正确的结构。你不必担心激活是如何工作的,或者前馈是如何执行的(但同样,在使用神经网络时知道是一件好事)
遗传算法部分或“学习”
我说“学习”是因为乍一看它可能看起来像是在学习,但实际上并非如此。遗传算法的工作原理类似于“适者生存”,其中“更聪明”的鸟类,即在当前一代中得分较高的鸟类,将有机会生下拥有相同大脑的小鸟孩子作为他们的父母,要么进行一些最小的修改,要么混合他们父母的大脑。
这种“学习”的过程,也就是遗传算法,是这样工作的:
- 创建一代,比如说 200 只鸟,每只鸟都有一个随机权重的大脑,所以在第一次运行时,它们都非常……不聪明
- 游戏开始,游戏的每一帧,鸟的大脑都会接收一些从当前帧获取的数据作为输入(鸟的 y 位置,与管道的距离......)
- 每只鸟的大脑(神经网络)使用该数据执行前馈,并输出一开始是非常随机的结果,假设一只鸟为 0.75
- 此时你认为 0.75 大于 0.5,所以你把它当作 1,代表“跳跃”,而如果是 0.3,那么 0,小鸟什么都不做,一直下落
- 很快这只鸟就会死,因为他不知道自己在做什么,所以他很可能会撞到管道或地面。
- 在所有的鸽子都遇到了它们的命运之后,您会看到一些鸽子比其他鸽子飞得更远,因此您选择例如 5 只表现最好的鸽子。
- 现在你尝试通过混合和修改它们的大脑,仅使用被选中的 5 只的大脑来创建新一代的 200 只鸟
- 现在新鸟有一个全新的大脑,在某些情况下可能比以前的更好,所以这些鸟中的一些可能会达到更高的分数,从而进一步进入关卡。
- 从第 6 点开始重复
在实践中,您在 python 中的“perform_genetic_algorithm”函数将不得不选择得分最高的鸟类,并且听起来很狂野,混合他们的大脑并修改它们,希望一些修改会提高鸟类的表现。
我想不出输出,因为你真的不知道拍打的动作是否会对你有利
上面的机制解释了为什么你基本上不关心输出,除了对游戏引擎说:“嘿,小鸟决定拍打,做吧”。不管是不是正确的行动,都没有关系,因为更聪明的鸟自然会走得更远,因此更有可能被下一代选择。
希望现在一切都更清楚了。
以下是构建神经网络和理解遗传算法的一些有用链接:
- 如何构建神经网络:我将其链接,因为它包含有关如何在 python 中构建非常基本的神经网络的所有有用信息。在您的情况下,您将不得不忽略有关反向传播、损失和错误计算以及 SGD 的所有部分,只看前馈部分。
- 如何构建神经网络 - 2:这是构建神经网络的另一个示例,我发现它非常有用,可能它比前面的链接更简单、更直接,但同样,这种基于遗传的学习不需要反向传播部分.
- 遗传算法视频教程:这是一个很长但解释性很强的视频播放列表,深入探讨了遗传算法的本质以及如何实现一个
- 遗传算法优化:关于遗传算法的其他来源