神经网络的输入/输出编码以学习基于网格的游戏

人工智能 神经网络 深度学习 游戏-ai
2021-10-22 21:16:42

我正在编写一个简单的玩具游戏,目的是在其上训练一个深度神经网络。游戏规则大致如下:

  • 游戏有一个由六角形单元组成的棋盘。
  • 两位玩家都有相同的棋子集合,他们可以选择在棋盘上自由放置。
  • 放置不同类型的棋子会根据它们的位置和配置相互奖励积分(或减少对手的积分)。
  • 谁的积分多谁就赢。

还有其他规则(关于回合、棋子的数量和类型等),但在这个问题的上下文中它们并不重要。我想设计一个可以通过自我对抗来迭代学习的深度神经网络。我的问题是关于输入和输出的表示。特别是:

  • 由于碎片的模式很重要,我想至少有一些卷积层。该板可以有各种尺寸,但原则上非常小(在我的测试中为 6x10,由几个单元扩展)。是否有意义?我可以使用哪种池?
  • 如何代表双方?这篇关于围棋的论文中,作者使用了两个输入矩阵,一个用于白棋子,一个用于黑棋子。它也可以在这种情况下工作吗?但请记住,我有不同类型的棋子,比如 A、B、C 和 D。我应该使用 2x4 输入矩阵吗?它对我来说似乎很稀疏而且效率很低。我担心卷积层太稀疏而无法工作。
  • 我认为输出可能是代表棋盘位置的矩阵上的概率分布,加上一个单独的概率数组,指示要播放的棋子。不过,我也需要表现出转的能力,这点很重要。我怎样才能做到这一点而不稀释其在其他概率中的重要性?
  • 最重要的是,我是只执行获胜的动作还是失败的动作?执行获胜动作很容易,因为我只是将期望的概率设置为 1。但是当失败时,我该怎么办?将移动概率设置为 0 并将所有其他移动概率设置为相同的值?此外,通过最终得分差异强制执行移动是否有意义,即使这会违背输出的含义(大致是概率)?

另外,我在 node.js 中开发了游戏引擎,考虑使用 Synaptic 作为框架,但我不确定它是否可以与卷积网络一起使用(我怀疑是否有办法修复与本地感知场相关的权重)。有关与节点兼容的其他库的任何建议?

2个回答
  • 为了表示这些片段,您应该能够使用单个输入矩阵。只需为不同类型的棋子指定一个整数。白子可以是正整数,黑子可以是负数。

  • 您可以将 sigmoid 用于棋盘位置置信度,将线性激活用于棋子标识符。pass将是另一个 sigmoid 输出。我认为您不必担心通过被稀释。由于这是一个非常有价值的动作,因此得分将在很大程度上取决于通过输出,并且会有很大的梯度。如果您需要以高频率选择传球动作以进行强化学习,那么只需在随机选择函数中将更高的概率归因于传球动作。

  • 最终得分差异对移动的可取性有很大影响。较大的分数差异应该会对功能产生很大的影响。因此,您可能希望在损失函数中包含分数差异的大小。

这就是深度 Q 学习所做的工作。也许你也想调查一下。

您不需要转换层,因为您不提供图片作为输入(见下文)。或者,您可以尝试使用棋盘的图片(不同的棋子具有不同的形状)。这也可以。然后我会选择 2 个卷积层,步幅 1,内核大小等于半块大小。我会尝试使用单个最大池。

与其他答案不同,我建议使用 3d 张量作为输入,通道数等于不同的部分。其他两个维度相等将对应于板上的单元数。您 NN 中的各种转换将无法很好地区分多个整数。这就是为什么最好对片段类型进行一次性编码。

我将只使用具有 n+1 个分量的向量作为输出:n 表示所有可能的移动,1 表示通过。它将编码每一步的预期奖励,而不是概率。

不知道你所说的强制行动是什么意思。但是,当您要使用 Q-learning 之类的方法对其进行训练时,每隔一段时间以一定的概率(比如 10% 的时间)进行一次完全随机的移动是有意义的。查找https://en.wikipedia.org/wiki/Reinforcement_learning