machine-learning - 如何在神经网络的输出中执行诸如国际象棋走棋合法性之类的规则?

标签 machine-learning tensorflow neural-network keras lstm

如何将规则(例如国际象棋规则)应用于神经网络,以便网络不会预测/训练无效的 Action ?

最佳答案

在 AlphaZero Chess 的示例中,网络的输出形状允许从任何方格开始的任何棋子的所有可能的移动。

摘自论文Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm :

A move in chess may be described in two parts: selecting the piece to move, and then selecting among the legal moves for that piece. We represent the policy π(a|s) by a 8 × 8 × 73 stack of planes encoding a probability distribution over 4,672 possible moves. Each of the 8 × 8 positions identifies the square from which to “pick up” a piece. The first 56 planes encode possible ‘queen moves’ for any piece: a number of squares [1..7] in which the piece will be moved, along one of eight relative compass directions {N, N E, E, SE, S, SW, W, N W }. The next 8 planes encode possible knight moves for that piece. The final 9 planes encode possible underpromotions for pawn moves or captures in two possible diagonals, to knight, bishop or rook respectively. Other pawn moves or captures from the seventh rank are promoted to a queen.

例如,即使g1上没有骑士,网络也允许输出移动g1-f3的正概率code>,或者对于移动 e8=Q,即使 e7 上没有棋子,或者 d1-h5 如果有皇后在 d1 中,但另一 block 挡住了对角线。

关键是它输出可能走棋的概率分布,并且由于它是通过仅允许合法走棋的情况下与自身对弈来训练的,因此它将学会输出非常低或零的非法走棋概率。

更准确地说,在进行一定数量的自玩游戏后,使用监督学习对网络进行训练,以预测给定棋盘位置的移动概率和值(value)。在 self 对弈的一开始,网络具有随机权重,它将为许多不可能的移动输出显着的概率,但经过一次或多次监督学习迭代后,移动输出概率将开始看起来更加合理。

AlphaZero 团队选择这种架构而不是在网络中强制执行规则的架构的原因很简单:输出必须采用固定大小,因为应该有固定数量的输出神经元。让不同数量的输出神经元对应不同数量的合法 Action 是没有意义的。或者,将网络内的非法移动的输出归零是没有意义的,因为这将是一个高度非标准的操作,对于运行反向传播来说可能是一场噩梦。您需要区分国际象棋走法生成器!

此外,当网络使用其策略输出来玩游戏时,它可以简单地将每个输出标准化为合法的 Action 。通过这种方式,我们在 self 对弈系统内强制执行移动合法性,但不在神经网络架构本身内强制执行。这可以借助移动生成器来完成。

由于您询问的是 keras,具体来说,您可以将这样的输出层表示为:

model.add(Dense(4672, activation='softmax'))

总结:在预测国际象棋走棋的神经网络架构中,不一定要强制走棋合法性,我们可以允许所有可能的走棋(包括非法的走棋) )并训练网络输出非法移动的低概率或零概率。然后,当我们使用移动概率进行游戏时,我们可以仅对合法的移动进行标准化以获得所需的结果,但这是发生在神经网络之外的。

关于machine-learning - 如何在神经网络的输出中执行诸如国际象棋走棋合法性之类的规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47847461/

相关文章:

javascript - Tensorboard 未在 Google Chrome 中运行

python - 如何将给定索引处的值(多个索引)插入到张量中?

artificial-intelligence - 人工神经网络的运动识别

python - 在keras中拆分图层的输出

python - 对电子邮件的优先级列表进行排名

machine-learning - 控制台输出通知 (Spyder)

python - 如何在 Python 中编码分类值

tensorflow - 用于 keras/tensorflow 中语义图像分割的多类加权损失

python - 如何用新数据更新 SVM 模型

python - 从头开始构建的简单神经网络不是学习