使用遗传神经网络学习棋盘游戏

数据挖掘 Python 神经网络 游戏
2022-03-07 21:58:02

我从来没有真正做过任何实际的机器学习,这对我来说只是一个爱好。

我正在尝试创建一个使用神经网络来学习棋盘游戏“7 Wonders”的过程。这是我希望这个实验完成的方式:

  1. 获取所有输入(我已经计算了其中的 1278 个)。
  2. 通过具有任意数量隐藏层的神经网络发送输入,随机初始化权重,并计算所有可能采取的行动的值(231 个输出,在任何给定时间有一些有效或无效。如果选择的行动无效,则选择基于 q 值的下一个最佳输出。)
  3. 对于第一轮,在 100 场比赛的整个游戏中使用相同的隐藏层及其偏差/权重,并获得这组偏差/权重产生的平均分数(适应度)。
  4. 少量改变隐藏层的偏差/权重。
  5. 使用新的偏差/权重集再运行 100 场比赛。如果这组产生更好的分数,使用这个新组作为下一代(新的成功的一代)。否则,根据原始父项变异一个新集合。

据我了解,到目前为止我所描述的是随机梯度下降。这可能会产生次优的最小值,因此为避免这种情况,我想通过执行相同的过程来介绍新父母进行交配。在 2 位父母的任意代数之后,结合他们的偏见/权重,并将上述过程重新应用于新孩子。我会重复这个过程,直到一个孩子几乎总是赢得比赛。

我的问题如下:

  1. 我描述的这个实验有意义吗?
  2. 我正在尝试用 Python 编写这一切。我一直在尝试使用 sklearn MLPClassifier,但我似乎无法弄清楚如何随机初始化我的隐藏层,也无法弄清楚如何手动操作隐藏层。我并没有尝试使用监督方法(据我所知)训练 MLP,这似乎是 sklearn 中的这个类的用途。这是一个很好的图书馆吗?有没有人对此有不同的图书馆建议?
1个回答

据我了解,到目前为止我所描述的是随机梯度下降。

没有任何方法生成梯度或没有提及使用梯度,这不是梯度下降。你选择“变异”这个词加上“父母”和“品种”这样的词会让我相信你最初想使用某种遗传算法 (GA) 来训练你的神经网络。一般来说,使用这样的 GA 不是梯度下降,而是它的替代方案。

使用 GA 来训练神经网络是可行的,并且可能出于您正在考虑的相同原因使用:您没有神经网络正确输出的数据集,但您可以在某个分数上将网络排名为更好或更差,并且目标是最大化该分数。

一种接近您想要的算法是NEAT,并且有一个称为NEAT-Python的实现。

需要记住的一些事项:

  • NEAT 在允许控制神经网络架构和权重时效果最佳。这是它相对于更简单的手动 GA/神经网络组合的主要创新。

  • NEAT 可能无法很好地扩展到具有许多输入和输出的复杂问题。您不会找到很多基于 NEAT 的国际象棋或围棋机器人。

考虑到这一点,您可能会发现其他更有效的自我学习和玩游戏代理的方法:

  • 树搜索算法。对于具有完美信息的两人零和游戏,您可能可以使用Negamax,或者对于更高级的方法,您可以使用Monte Carlo Tree Search

  • 强化学习(RL)这是一个需要研究的大课题,但简而言之,这将为您提供一种使用梯度下降来训练神经网络的方法。RL 部分将是一个“外部”组件,它收集数据,然后以类似于监督学习的方式使用这些数据。大多数神经网络框架都有大量用于 RL 的预制代理和示例代理。

著名的 Alpha Zero结合使用了这两种方法,实际上是一个相对简单的算法核心有一个通用代理的 Python 实现,您可以使用它并从中读取代码。

为了更直接地解决您的问题:

我描述的这个实验有意义吗?

是的,当要解决的问题是可以评估的任务时,您已经描述了一种众所周知的训练神经网络的方法,而不是直接逼近的函数。其他方法是可能的,并且可能更适合您的游戏(只是猜测,这取决于游戏)。

我正在尝试用 Python 编写这一切。我一直在尝试使用 sklearn 的MLPClassifier[...] 这是一个很好的库吗?有没有人对此有不同的图书馆建议?

您可能想要一些较低级别的东西,以便您可以直接访问包含权重的变量。我建议使用TensorFlow/ Keras或PyTorch这两个也有例子,包括通过自我游戏和 RL 训练的游戏代理,以防你决定改变你的方法。

PyGAD 是一个应用遗传算法来训练 TensorFlow 或 PyTorch 神经网络的 Python 库示例因此您可以直接使用它,也可以从中学习它的工作原理并适应您的游戏。