1

我正在使用机器学习制作国际象棋引擎,但在调试它时遇到了问题。我需要帮助找出我的程序出了什么问题,如果有任何帮助,我将不胜感激。

我进行了研究,并从多个成功的项目中借鉴了想法。这个想法是使用强化学习来教 NN 区分强弱位置。

我收集了 300 万个 Elo 超过 2000 的游戏,并使用我自己的方法来标记它们。在研究了数百场比赛后,我发现,可以肯定的是,在任何一场比赛的最后 10 个回合中,平衡都不会改变,获胜的一方具有很强的优势。因此,我从最后 10 个回合中选择了位置并制作了两个标签:一个代表白色获胜,一个代表黑色获胜。我没有包括任何平局位置。为了避免偏见,我为双方选择了偶数个标有胜利的位置,并为下一轮选择了偶数个双方的位置。

我用一个长度为 773 个元素的向量表示的每个位置。棋盘上的每一格,连同易位权和下一回合,我都用 1 和 0 编码。我的顺序模型有一个包含 773 个神经元的输入层和一个包含一个神经元的输出层。我在第 1、2 和 3 层分别使用了具有 1546、500 和 50 个隐藏单元的三层隐藏层深度 MLP,每层的 dropout 正则化值为 20%。隐藏层与非线性激活函数 ReLU 连接,而最终输出层具有 sigmoid 输出。我使用二元交叉熵损失函数和所有默认参数的 Adam 算法,学习率除外,我设置为 0.0001。

我使用了 3% 的职位进行验证。在前 10 个 epoch 中,验证准确率逐渐从 90% 上升到 92%,仅落后于训练准确率 1%。进一步的训练导致过度拟合,训练准确率上升,验证准确率下降。

我在多个位置上手动测试了训练好的模型,结果很糟糕。总体而言,该模型可以预测哪一方获胜,如果那一方有更多的棋子或棋子靠近转换方格。它也给下一个回合的一方带来了小优势(0.1)。但总体来说意义不大。在大多数情况下,它非常偏爱黑色(约 0.3)并且没有正确考虑设置。例如,它将起始位置标记为 ~0.0001,就好像黑方几乎有 100% 的机会获胜。有时,不相关的职位转换会导致评估的不可预测的变化。每边的一个国王和一个后通常被视为白棋的失势(0.32),除非黑王在某个方格上,即使它并没有真正改变棋盘上的平衡。

我为调试程序所做的工作:

  1. 为了确保我没有犯任何错误,我逐步分析了每个位置是如何记录的。然后我在训练之前从最终的 numpy 数组中挑选了十几个位置,并将其转换回来以在常规棋盘上分析它们。

  2. 我在同一个游戏中使用了不同数量的位置(1 和 6)来确保使用太多相似的位置不是快速过拟合的原因。顺便说一句,在我的数据库中,即使每个游戏的一个位置也会产生 300 万个数据集,根据一些研究论文,这应该足够了。

  3. 为了确保我使用的位置不会太简单,我对它们进行了分析。其中 130 万有 36 分(骑士、主教、车和后;棋子不包括在计数中),140 万 - 19 分,只有 30 万 - 少。

4

1 回答 1

0

你可以尝试一些事情:

  1. 尽可能添加单元测试和断言。例如,如果您知道某个值永远不会变为负数,请添加一个断言以检查该条件是否真的成立。
  2. 打印所有张量的形状,以检查您是否真的创建了您想要的架构。
  3. 检查您的模型是否优于一些简单的基线模型。
  4. 你说你的模型过拟合,所以也许简化它/添加正则化?
  5. 检查您的模型在最简单的位置上的表现。例如,它可以识别将死吗?
于 2019-10-26T12:16:08.680 回答