我想使用强化学习通过与自己对战来改进引擎。我一直在阅读有关该主题的内容,但我仍然很困惑。
请注意:强化学习是一个庞大而复杂的主题。虽然它可能会让你绕开玩游戏的机器人,但你可能想学习 RL 基础知识。一个很好的起点是Sutton & Barto强化学习:简介
游戏中除了输赢输出(1 或 0)还有什么其他奖励?
根据你的游戏,通常就是这样。实际上,对于像国际象棋这样的赢/平/输游戏,除了最后赢(+1)或输(-1)之外,每个动作的奖励都是 0。在零和游戏中,这与极小极大、字母修剪等很好地对齐。
强化学习旨在解决奖励延迟的环境。为临时的非目标增加“帮助”奖励通常会适得其反。
如果我使用其他奖励,例如每轮评估函数的输出,我该如何实现?
通常你不会。应用自玩 RL 会做的是学习一个回报(有时称为效用)函数,该函数可以预测游戏结束时您的总 +1/0/-1 奖励的期望值。您将使用它来代替当前的启发式方法进行极小极大搜索。或者,您可能会调整当前的启发式函数以在相同范围内输出,并使用 RL 优化其权重,以最佳逼近真正的最佳播放返回函数(这可能太复杂而无法准确计算)。
如何修改评估函数以在迭代后给予更好的奖励迭代?
这就是不同的 RL 方法都试图做的事情,有各种不同的求解器。没有简单的方法来解释它。您可以从简单的方法开始,例如 Q-Learning。Q-Learning 学习 Q(s,a) 的估计值(称为动作值),这是在状态 s 并采取动作 a 时的预期回报,然后遵循最优策略。它在开始时进行任意猜测,并在学习环境中进行的每一步将其细化为更接近真实值。简单的表格 Q 学习器只需通过存储一个包含所有状态和动作的大表以及迄今为止对真实值的最佳估计,并在每个新估计中进行平均来进行这种改进。
还可以将用于启发式的 RL 方法与前瞻极小极大搜索结合起来——这就是最初的 AlphaGo 所做的,以及 AlphaGo Zero 在训练期间所做的。这是一种强大的方法,因为极小极大搜索将用于仔细检查 RL 生成的启发式方法。尽管对于足够简单的游戏,RL 可以学习完美的启发式算法,并且您只需要本地搜索(下一步应该是什么)。
除非您的游戏非常简单(所有可能的状态都适合内存),否则您将需要在 RL 算法中使用某种函数逼近器。神经网络是标准选择。为那部分准备一些东西是不可避免的——尽管另一个不错的选择是定义一堆代理特征(您可能会用它们来手动构建启发式算法)并使用线性逼近器——只是所有特征的加权和。这可以很好地工作,并且已用于例如使用 RL 训练的跳棋(草稿)玩家。
事实上,如果你自己的启发式函数不是太不寻常,你可能可以把它当作一个线性逼近器,并使用 RL 来学习它的最佳权重。