我想教一个ANN来玩Hearts,但我仍然坚持如何实际进行训练。
一位朋友建议使用weka来实现实际人工神经网络,但我从未使用它,所以我倾向于自定义实现。
我编写了规则,我可以让电脑玩游戏,每回合选择随机但合法的卡片。
现在我不知道要把什么作为输入发送给ANN,以及如何提取输出(每回合减少卡数量,所以我不能让每个输出神经元成为可能的卡)以及如何教它何时进行教学。
我的猜测是将ANN作为输入:
然后让输出为13个神经元(每个玩家的最大牌数),其中我采用的激活最多的牌仍然在ANN的手中。
我也不知道什么时候教它(每次转身之后或每场比赛之后),因为拥有所有的罚款卡是有益的,但除了一张罚单之外都不好。
感谢任何和所有帮助。我真的不知道在哪里提出这个问题。
我目前在Swift中编程,但它只有200行,我知道其他一些语言,所以我可以翻译它。
答案 0 :(得分:5)
请注意,神经网络可能不是最好用的。更多关于答案的结尾,我会先回答你的问题。
现在我不知道将什么发送到人工神经网络作为输入以及如何提取输出(每回合减少卡的数量,所以我不能让每个输出神经元成为可能的卡)以及如何教它以及何时进行教学。
人工神经网络需要标记输入数据。这意味着一对(X, y)
,其中X
可以是与您的问题相关的任何(结构化)数据,y
是您希望ANN为X学习的正确答案的列表< /强>
例如,想想如何在学校学习数学。老师会在黑板上做几个练习,你会把它们写下来。这是培训数据。
然后,老师会邀请你到黑板上自己做一个。一开始你可能做得不好,但他/她会引导你朝着正确的方向前进。这是培训部分。
然后,你必须自己解决问题,希望能够学会如何。
问题是,即使这个简单的例子对于ANN来说也太复杂了。 ANN通常采用实值数字并输出一个或多个实数值。所以它实际上比学习ax + b = 0
类型方程的小学生更笨。
对于您的特定问题,很难看出它是如何适合这种格式的。总的来说,它并不是:你不能通过游戏展示人工神经网络并让它学习移动,这太复杂了。您需要使用与您相关联的正确数字标签的内容来呈现它,并且您希望ANN学习基础模式。
要做到这一点,您应该将问题分解为子问题。例如,输入当前玩家的牌并期望输出正确的移动。
以前玩过的牌,其中有哪个牌手的元数据已经玩过哪张牌
ANN应该只关心当前的玩家。我不会使用元数据或任何其他识别玩家的信息。
给它一个历史可能会变得复杂。您可能需要循环神经网络。
本回合桌面上的牌,也有相同的元数据
是的,但同样,我不会使用元数据。
ANN的手牌
也很好。
确保您输入的单位数量与您想要输入的最大卡数相同(2张可能的卡,用于手中的卡和桌上的卡)。这将是一个二进制向量,如果对应于该位置的卡片存在于手中/桌面上,则i
位置为真。
然后对移动执行相同操作:您将拥有m
个二进制输出单位,如果ANN认为您应该移动i
,那么i
将为真,其中总共m
次可能移动(如果m
取决于游戏中的各个阶段,则选择最大值)。
您的训练数据也必须采用这种格式。为简单起见,我们说在总共5张牌中最多可以有2张牌和2张牌,我们可以选择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)
我也不知道什么时候教它(每次转身之后或每场比赛之后),因为拥有所有的罚款卡是有益的,但除了一张罚单之外都不好。
您应该以我描述的格式收集大量标记的训练数据,对其进行训练,然后使用它。你需要成千上万甚至上万的游戏才能看到出色的表现。每次转弯或比赛后教学都不太可能。
这将导致非常大的神经网络。您可能尝试的另一件事是预测在当前游戏配置下谁将获胜。这将显着减少输出单元的数量,使学习更容易。例如,鉴于当前桌面和手中的牌,当前玩家获胜的概率是多少?有了足够的训练数据,神经网络就可以尝试学习这些概率。
存在明显的缺点:需要大量的训练数据集。到目前为止,没有记忆游戏如何发展(除非你使用更高级的网络)。
对于像这样的游戏,我建议你阅读有关强化学习或特定游戏的专用算法。例如,教导人工智能国际象棋没有多少运气,我怀疑你会教它玩纸牌游戏。
答案 1 :(得分:0)
首先,您需要为训练ANN创建一些好的学习数据集。如果您的预算允许,您可以请一些卡片专业人士与您分享他们如何打牌的比赛。另一种生成数据的方法可能是一些玩纸牌的机器人。然后你需要考虑如何表示与神经网络匹配的数据集。另外,我建议你不要用它们的值(0.2,0.3,0.4,...,0.10,0.11(对于插孔)来表示卡片,而是作为分开的输入。还要寻找可用于此类任务的弹性神经网络。 / p>