如果有人仍然对这个话题感兴趣——我建议用 32 维向量对棋盘进行编码。我最近在一个专家 Checkers 数据库上训练了一个 CNN,并且能够在没有搜索的情况下达到令人惊讶的高水平游戏,这有点类似于(我怀疑)Deepmind 用来预训练 AlphaGo 的监督学习步骤。我将我的输入表示为一个 8x4 网格,集合 [-3, -1, 0, 1, 3] 中的条目分别对应于对面的国王、对面的棋子、空棋子、自己的棋子、自己的国王。因此,与其使用 160 维向量对棋盘进行编码,其中每个维度对应于一个位置块组合,不如将输入空间缩减为 32 维向量,其中每个棋盘位置由一个唯一维度表示,
至少在我看来,更有趣的问题是哪种输出编码最有利于学习。一种选择是以与输入相同的方式对其进行编码。我建议不要这样做,因为我发现将输出编码简化为一个位置(要移动的部分)和一个方向(沿着该方向移动所述部分)对学习更有利。虽然造成这种情况的原因可能更微妙,但我怀疑这是由于跳棋的巨大状态空间(类似于 50^20 棋盘位置)。考虑到我们的预测模型的目标是接受包含大量可能状态的输入,并从(最多)48 种可能性(12 件乘以 4 个可能的方向,不包括跳跃)产生一个输出(即移动),构建神经网络的首要任务应该是使其输入和输出空间的复杂性与实际游戏的复杂性相匹配。考虑到这一点,我选择将输出编码为 32 x 4 矩阵,每一行代表一个棋盘位置,每一列代表一个方向。在训练期间,我只是将其分解为一个 128 维的单热编码向量(使用 softmax 激活的 argmax)。请注意,对于给定的棋盘,这种输出编码会导致许多无效动作(例如,从棋盘的边缘和角落移出棋盘,移动到占据的位置等)——我们希望神经网络能够在给定大的棋盘时学习有效的棋局。足够的训练集。我发现 CNN 在学习有效动作方面做得非常出色。我选择将输出编码为 32 x 4 矩阵,每一行代表一个棋盘位置,每一列代表一个方向。在训练期间,我只是将其分解为一个 128 维的单热编码向量(使用 softmax 激活的 argmax)。请注意,对于给定的棋盘,这种输出编码会导致许多无效的移动(例如,从边缘和角落移出棋盘,移动到占据的位置等)——我们希望神经网络能够在给定大的棋盘时学习有效的棋局。足够的训练集。我发现 CNN 在学习有效动作方面做得非常出色。我选择将输出编码为 32 x 4 矩阵,每一行代表一个棋盘位置,每一列代表一个方向。在训练期间,我只是将其分解为一个 128 维的单热编码向量(使用 softmax 激活的 argmax)。请注意,对于给定的棋盘,这种输出编码会导致许多无效的移动(例如,从边缘和角落移出棋盘,移动到占据的位置等)——我们希望神经网络能够在给定大的棋盘时学习有效的棋局。足够的训练集。我发现 CNN 在学习有效动作方面做得非常出色。请注意,对于给定的棋盘,这种输出编码会导致许多无效的移动(例如,从边缘和角落移出棋盘,移动到占据的位置等)——我们希望神经网络能够在给定大的棋盘时学习有效的棋局。足够的训练集。我发现 CNN 在学习有效动作方面做得非常出色。请注意,对于给定的棋盘,这种输出编码会导致许多无效的移动(例如,从边缘和角落移出棋盘,移动到占据的位置等)——我们希望神经网络能够在给定大的棋盘时学习有效的棋局。足够的训练集。我发现 CNN 在学习有效动作方面做得非常出色。
我在http://www.chrislarson.io/checkers-p1上写了更多关于这个项目的文章。