如何设计和训练神经网络来玩纸牌游戏(类似于万智牌)?

人工智能 神经网络 游戏-ai 整洁的 纸牌游戏
2021-10-24 20:39:50

介绍

我目前正在编写一个引擎来玩纸牌游戏,因为这个特定的游戏还没有引擎。

关于游戏

游戏类似于万智牌有一个指挥官,他有健康和能力。玩家有一个能量池,他们用它来将奴才和咒语放在棋盘上。随从有生命值、攻击值、成本等。卡也有能力,这些不容易一一列举。牌是从手上打出来的,新牌是从一副牌中抽出来的。这些都是有助于神经网络考虑的方面。

主意

我希望之后能够在游戏中引入神经网络,并让它学会玩游戏。因此,我正在以对 AI 玩家有帮助的方式编写引擎。有选择点,在这些点上,会显示一个有效选项列表。随机选择将能够玩游戏(虽然不是很好)。

我学到了很多关于神经网络(主要是 NEAT 和 HyperNEAT)的知识,甚至构建了自己的实现。神经网络通常应用于图像识别任务或控制简单的代理。

问题/疑问

我不确定是否或如何应用神经网络来使用具有复杂协同作用的卡片进行选择。我怎样才能为这个游戏设计和训练一个神经网络,以便它可以考虑所有变量?有没有通用的方法?

我知道Keldon 为 RftG 写了一个很好的 AI,它具有相当多的复杂性,但我不确定他是如何设法构建这样一个 AI 的。

有什么建议吗?可行吗?这方面有什么好的例子吗?输入是如何映射的?

4个回答

我认为您提出了一个很好的问题,尤其是关于 NN 输入和输出如何映射到 MtG 等纸牌游戏机制的 WRT,在这种机制中,可用的动作随上下文而有很大差异。

我没有提供真正令人满意的答案,但我玩过 Keldon's Race for the Galaxy NN-based AI - 同意它非常棒 - 并研究了它如何解决这个问题。

Keldon 的 AI 的最新代码现在可以在github上搜索和浏览。

ai 代码在一个文件中。它使用 2 个不同的 NN,一个用于“评估手牌和活动牌”,另一个用于“预测角色选择”。

您会注意到它在非神经网络代码上使用了相当多的数量来对游戏机制进行建模。非常混合的解决方案。

游戏状态到评估 NN 的映射在这里完成。各种相关特征都是 one-hot-encoded,例如当回合可以出售的商品数量。


将复杂游戏映射到神经网络的另一个出色案例研究是由 Deepmind 与暴雪娱乐合作创建的星际争霸 II 学习环境。本文概述了星际争霸游戏如何映射到 NN 可以解释的一组特征,以及 NN 代理如何向游戏模拟发出动作

是的。这是可行的。

问题概述

该系统的设计目标似乎是通过将一个或多个人工网络与纸牌游戏引擎结合使用来获得制胜战略优势。

这个问题显示了对摩根斯坦和冯诺依曼的博弈论中所概述的博弈基础知识的普遍认识

  • 在游戏过程中的特定时间点,玩家可能需要执行一个动作。
  • 根据游戏规则,有一组有限的移动选项。
  • 一些选择走法的策略比其他策略在多次游戏中产生更高的获胜记录。
  • 可以使用人工网络来产生比随机移动选择更频繁地获胜的游戏策略。

游戏玩法的其他特征可能不那么明显。

  • 在每个移动点都有一个游戏状态,任何参与提高游戏成功率的组件都需要该状态。
  • 除了不知道对手何时会虚张声势之外,在纸牌游戏中,洗牌的秘密顺序可以引入相当于虚拟玩家的动作,其动作近似随机。
  • 在三人或三人以上的游戏中,合作伙伴或潜在合作伙伴的信号可以在任何时候为确定获胜游戏策略增加复杂性。根据编辑,这款游戏似乎没有这么复杂。
  • 诸如恐吓之类的心理因素也可以在赢得比赛中发挥作用。引擎是否向对手展示面孔是未知的,所以这个答案将跳过。

常用方法提示

有一种映射输入和输出的通用方法,但是在 Stack Exchange 答案中有太多解释。这些只是一些基本原则。

  • 所有可以显式完成的建模都应该完成。例如,虽然人工网络理论上可以学习如何计算牌(跟踪每张牌的可能位置),但简单的计数算法可以做到这一点,因此使用已知算法并将这些结果输入人工网络输入。
  • 将与最佳输出相关的任何信息用作输入,但不要将任何不可能与最佳输出相关的信息用作输入。
  • 在训练期间和自动游戏期间,对数据进行编码以减少输入向量中的冗余。抽象和泛化是实现这一目标的两种常用方法。特征提取可以用作抽象或概括的工具。这可以在输入和输出上完成。一个例子是,如果在这个游戏中,J > 10 的方式与 A > K、K > Q、Q > J 和 10 > 9 相同,那么将卡片编码为从 2 到 14 或从 0 到 12 的整数减一。将花色编码为 0 到 3 而不是四个文本字符串。

图像识别工作只是远程相关,与直接使用的纸牌游戏不同,除非您需要从视觉图像中识别纸牌,在这种情况下,可能需要 LSTM 来查看其他玩家选择的动作。学习制胜策略很可能会受益于 MLP 或 RNN 设计,或者它们的衍生人工网络设计之一。

人工网络会做什么和训练示例

这些类型的人工网络的主要作用是从示例数据中学习一个函数。如果您拥有真实游戏的移动序列,那么这对您的项目来说是一笔巨大的财富。其中很大一部分对培训非常有帮助。

您如何安排示例以及是否以及如何标记它们值得考虑,但是如果没有纸牌游戏规则,则很难给出任何可靠的方向。是否有合作伙伴,是否基于得分,是否取得胜利的步数以及其他十几个因素提供了做出这些决定所需的场景参数。

向上学习

我可以给出的主要建议是阅读,不要阅读网络上的一般文章,而是阅读一些您可以理解的有关上述主题的书籍和一些论文。然后找到一些您可以下载的代码,并在您充分理解术语以知道要下载什么后尝试。

这意味着书籍搜索和学术搜索比一般的网络搜索更有可能引导您朝着正确的方向前进。一般网络空间有成千上万的装腔作势者,用大量错误解释人工智能原理。书籍和学术文章出版商对作者的尽职调查要求更高。

这是完全可行的,但输入的映射方式很大程度上取决于纸牌游戏的类型以及游戏方式。

我会考虑几种可能性:

  1. 在这个游戏中时间重要吗?过去的举动会影响未来的举动吗?在这种情况下,最好使用循环神经网络(LSTM、GRU 等)。
  2. 您希望神经网络从您收集的数据中学习,还是自己学习?如果靠自己,怎么做?如果你收集自己玩游戏数十或数百次的数据,将其输入神经网络,让它向你学习,那么你正在做一种叫做“行为克隆”的事情。但是,如果您希望 NN 自行学习,您可以通过以下两种方式进行:

    a)强化学习——强化学习允许神经网络通过与自己多次对抗来学习

    b) NEAT/遗传算法- NEAT 允许神经网络使用遗传算法进行学习。

然而,再一次,为了更具体地了解神经网络的输入和输出应该如何编码,我必须更多地了解纸牌游戏本身。

您肯定希望您的网络了解有关游戏的关键信息,例如 AI 代理有哪些牌(它们的值和类型)、法力池、桌上有多少牌及其值、回合数等等。这些事情你必须自己弄清楚,你应该问自己的问题是“如果我添加这个值来输入它会如何以及为什么会改进我的系统”。但首先要了解的是,大多数 NN 都设计为具有恒定的输入大小,我认为这在这个游戏中很重要,因为玩家手上或桌上的牌数可能不同。例如,你想让 NN 知道它有什么牌,假设玩家手中最多可以有 5 张牌,每张牌可以有 3 个值(法力、攻击和生命值),所以你可以将其编码为 5 *3 向量,其中前 3 个值代表卡号 1,依此类推。但是如果玩家目前有 3 张牌,一个简单的方法是为最后 6 个输入分配零,但这可能会导致问题,因为有些牌可能有 0 法力消耗或 0 攻击。所以你需要弄清楚如何解决这个问题。您可能会寻找可以处理可变输入大小的 NN 模型,或者弄清楚如何将输入编码为恒定大小的向量。

其次,输出也是恒定大小的向量。在这种类型的游戏中,它可以是一个向量,对代理可以采取的动作进行编码。假设我们有 3 个动作:放一张牌、跳过回合和让步。所以它可以是一个热编码器,例如如果你有 1 0 0 输出,这意味着代理应该放一些卡。要知道应该放哪张牌,您可以在输出中添加另一个元素,该元素将产生 1 到 5 范围内的数字(5 是手中牌的最大数量)。

但是训练神经网络最重要的部分是你必须想出一个适合你的任务的损失函数。也许像均方损失或 L2 这样的标准损失函数会很好,也许您需要更改它们以满足您的需求。这是您需要进行研究的部分。我以前从未使用过 NEAT,但正如我正确理解的那样,它使用一些遗传算法来创建和训练 NN,而 GA 使用一些适应度函数来选择个体。所以基本上你需要知道你将使用什么指标来评估你的模型表现如何,并且基于这个指标你将改变模型的参数。

PS。用神经网络可以解决这个问题,但是,神经网络不是魔术,也不是所有问题的通用解决方案。如果您的目标是解决这个特定问题,我还建议您深入研究博弈论及其在 AI 中的应用。我想说,解决这个问题需要来自不同人工智能领域的复杂知识。

但是,如果您的目标是学习神经网络,我建议您完成更简单的任务。例如,您可以实现适用于基准数据集的 NN,例如,对 MNIST 数据集中的数字进行分类的 NN。这样做的原因是很多文章都是关于如何在这个数据集上进行分类的,你会学到很多东西,而且你会从实现简单的事情中学得更快。