如何训练人工神经网络玩纸牌游戏?

5
我想教一个人工神经网络玩 心脏扑克,但我卡在如何进行实际训练上了。
一个朋友建议使用 weka来实现实际的人工神经网络,但我从未使用过,所以我更倾向于自定义实现。
我已经编写了规则,并可以让计算机玩游戏,在每个回合随机选择合法的牌。
现在我不知道应该将什么发送到人工神经网络作为输入,以及如何提取输出(每回合减少的牌数,因此不能让每个输出神经元成为可能的牌),以及如何教它以及何时执行教学。
我的猜测是将以下内容作为人工神经网络的输入:
  • 已经播放的牌,带有哪个玩家播放了哪张牌的元数据
  • 本轮桌面上的牌,也带有相同的元数据
  • 人工神经网络手中的牌
然后将输出设置为13个神经元(每个玩家的最大牌数),其中我会选择仍然在人工神经网络手中的最活跃的牌。
我也不太清楚应该什么时候教它(每轮之后还是每局之后),因为拥有所有罚牌很有益,但只缺一张罚牌就很糟糕。
非常感谢任何形式的帮助。我真的不知道在哪里提出这个问题。
我目前用Swift编程,但只有200行代码,我也会其他几种语言,所以我可以进行翻译。
2个回答

5
请注意,神经网络可能不是在这里使用的最好方法。关于这一点,我会在回答结尾部分详细解释,现在我先回答你的问题。
现在我不知道应该将什么作为输入发送到人工神经网络中,也不知道如何提取输出(每个回合减少的卡牌数量,因此不能让每个输出神经元成为可能的卡牌),如何进行教学以及何时进行教学。
人工神经网络需要有标签的输入数据。这意味着一对(X, y),其中X可以是与您的问题相关的任何(结构化)数据,而y是您期望人工神经网络为X学习的正确答案列表。
例如,想想你在学校如何学数学。老师会在黑板上做几个练习题,而你会把它们写下来。这就是你的训练数据。
然后,老师会邀请你去黑板上自己做一个。一开始你可能做得不好,但他/她会指导你走向正确的方向。这就是训练部分。
然后,你将不得不自己做问题,希望已经学会了。
问题是,即使是这种微不足道的例子对于人工神经网络来说也太复杂了。人工神经网络通常接受实值数字并输出一个或多个实值数字。因此,它实际上比学习关于ax + b = 0类型方程的小学生还要愚蠢。
对于你的特定问题,很难看出它如何符合这种格式。作为一个整体,它不符合:你不能向人工神经网络呈现一个游戏并让它学习移动,那太复杂了。您需要向其提供具有正确数值标签的内容,并希望人工神经网络学习底层模式。
为此,您应该将问题分解为子问题。例如,输入当前玩家的卡牌,并期望输出正确的移动。
人工神经网络只应关注当前玩家。我不会使用元数据或任何其他标识玩家的信息。
给它一个历史记录可能会变得复杂。你可能需要用到递归神经网络。
是的,但同样,我不会使用元数据。
也可以。
请确保您有尽可能多的输入单元,即您想要输入的最大卡牌数量(2 x 总可能的卡牌,用于手中的卡牌和桌面上的卡牌)。这将是一个二进制向量,其中第i个位置为真,如果对应于该位置的卡牌存在于手中/桌面上。
然后对于移动做同样的操作:您将拥有m个二进制输出单元,其中第i个将为真,如果人工神经网络认为您应该执行i移动,总共有m个可能的移动(如果m取决于游戏阶段,则选择最大值)。
您的训练数据也必须采用此格式。为简单起见,我们假设手中最多有2张牌,在桌子上最多有2张牌,共有5张牌可供选择,并且我们可以选择2种行动(比如弃牌和全押)。然后,一个可能的训练实例是:
Xi = 1 0 0 1 0 0 0 0 1 1 (meaning cards 1 and 4 in hand, cards 4 and 5 on table) 
yi = 0 1 (meaning you should go all in in this case)

我也不确定何时教它(每轮之后还是每局之后),因为拥有所有罚牌很有益,但只剩一个罚牌则很糟糕。
您应该收集大量标记的训练数据,按照我描述的格式进行训练,然后使用它。您需要成千上万的游戏才能看到良好的表现。在每次回合或游戏之后进行教学很难做得好。
这将导致非常庞大的神经网络。您可以尝试预测在当前游戏配置下谁会赢。这将显着减少输出单元的数量,使学习更容易。例如,在桌子上和手中的卡片给定的情况下,当前玩家获胜的概率是多少?通过足够的训练数据,神经网络可以尝试学习这些概率。
存在明显的缺点:需要大量的训练数据集。没有对游戏进行如何进行的记忆(除非您使用更高级的网络)。
对于这样的游戏,建议您阅读强化学习或专门针对您特定游戏的算法。例如,教授 ANN 下国际象棋可能会很困难,而且我怀疑您是否能教它玩纸牌游戏。

1
我同意这个回答中的大部分内容,但是我想补充一点,如果你使用强化学习,可能可以使用人工神经网络来建模行动价值函数。我相信这就是Tesauro在TDGammon中所做的实质。但是,尝试训练一个ANN成功地学习心脏游戏的行动价值函数将是一个巨大的挑战。(特别是在“shoot the moon”规则下。) - Chip Burwell

0
首先,您需要创建一些良好的学习数据集来训练人工神经网络。如果您的预算允许,您可以向一些专业卡牌玩家请求足够多的他们打牌的比赛记录。另一种生成数据的方法是使用一些能够打牌的机器人。然后,您需要考虑如何将打牌比赛的数据集表示为神经网络。我还建议您不要按照牌的点数(0.2、0.3、0.4、...、0.10、0.11(代表J))来表示牌,而是将其作为单独的输入。此外,寻找可用于此类任务的弹性神经网络也是一个不错的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接