我正在编写一个简单的玩具游戏,目的是在其上训练一个深度神经网络。游戏规则大致如下:
- 游戏有一个由六角形单元组成的棋盘。
- 两位玩家都有相同的棋子集合,他们可以选择在棋盘上自由放置。
- 放置不同类型的棋子会根据它们的位置和配置相互奖励积分(或减少对手的积分)。
- 谁的积分多谁就赢。
还有其他规则(关于回合、棋子的数量和类型等),但在这个问题的上下文中它们并不重要。我想设计一个可以通过自我对抗来迭代学习的深度神经网络。我的问题是关于输入和输出的表示。特别是:
- 由于碎片的模式很重要,我想至少有一些卷积层。该板可以有各种尺寸,但原则上非常小(在我的测试中为 6x10,由几个单元扩展)。是否有意义?我可以使用哪种池?
- 如何代表双方?在这篇关于围棋的论文中,作者使用了两个输入矩阵,一个用于白棋子,一个用于黑棋子。它也可以在这种情况下工作吗?但请记住,我有不同类型的棋子,比如 A、B、C 和 D。我应该使用 2x4 输入矩阵吗?它对我来说似乎很稀疏而且效率很低。我担心卷积层太稀疏而无法工作。
- 我认为输出可能是代表棋盘位置的矩阵上的概率分布,加上一个单独的概率数组,指示要播放的棋子。不过,我也需要表现出转牌的能力,这点很重要。我怎样才能做到这一点而不稀释其在其他概率中的重要性?
- 最重要的是,我是只执行获胜的动作还是失败的动作?执行获胜动作很容易,因为我只是将期望的概率设置为 1。但是当失败时,我该怎么办?将移动概率设置为 0 并将所有其他移动概率设置为相同的值?此外,通过最终得分差异强制执行移动是否有意义,即使这会违背输出的含义(大致是概率)?
另外,我在 node.js 中开发了游戏引擎,考虑使用 Synaptic 作为框架,但我不确定它是否可以与卷积网络一起使用(我怀疑是否有办法修复与本地感知场相关的权重)。有关与节点兼容的其他库的任何建议?