您将如何训练 RL Tic Tac Toe(实际上是任何棋盘游戏)应用程序来学习如何成功玩(赢得游戏),而无需人类与 RL 对抗?
显然,如果我必须坐下来和它玩“真正的”游戏,那么训练 AI 需要更长的时间。有没有办法让培训自动化?
我猜想创建“人类玩家”来训练只在棋盘上随机选择位置的 AI 不会帮助 AI 正确学习,因为它不会遇到不使用策略来试图击败它的东西。
您将如何训练 RL Tic Tac Toe(实际上是任何棋盘游戏)应用程序来学习如何成功玩(赢得游戏),而无需人类与 RL 对抗?
显然,如果我必须坐下来和它玩“真正的”游戏,那么训练 AI 需要更长的时间。有没有办法让培训自动化?
我猜想创建“人类玩家”来训练只在棋盘上随机选择位置的 AI 不会帮助 AI 正确学习,因为它不会遇到不使用策略来试图击败它的东西。
该方法将根据游戏的某些功能而有所不同:
有多少玩家(两个用于井字游戏和许多经典游戏)。
无论是“完美信息”游戏(对于国际象棋和井字游戏是),还是是否有重要的隐藏信息(对于大多数形式的扑克来说都是如此)
游戏是否是零和游戏。任何具有简单赢/输/平结果的游戏都可以被视为零和。
游戏的分支复杂性。井字游戏的分支因子相对较低,最多为 9,并且每转一圈就减少一个。围棋游戏的分支因子约为 250。
游戏的动作复杂性。像万智牌这样的纸牌游戏具有巨大的复杂性,即使每回合可能的动作数量非常少。
上述特征和其他特征对哪些算法和方法最有效(或完全有效)的细节产生了很大影响。由于这非常广泛,我不会对此进行深入讨论,如果您更进一步并尝试实现一些自我游戏学习代理,我建议您针对特定游戏提出单独的问题。
可以概述一种适用于许多游戏的通用方法:
您需要有一个可编程的 API 来运行游戏,它允许代表玩家(称为“代理”)的代码接收游戏的当前状态、传递所选动作并返回该动作的结果。结果应包括是否有任何玩家赢或输,并更新游戏的内部状态,为下一个玩家做好准备。
有几种学习算法适用于控制代理和通过经验学习。一种流行的选择是强化学习 (RL),但也可以使用遗传算法 (GA)。
这里的关键是不同类型的代理如何解决自我游戏的问题:
GA 很自然地做到了这一点。你创建了一群代理人,让他们互相比赛,选择获胜者来创造下一代。GA 方法的主要问题是它们在复杂性方面的扩展性如何——通常不如 RL。
使用 RL,您可以让当前代理发挥您迄今为止创建的最佳代理 - 这是最通用的方法。或者对于某些游戏,您可以让它使用相同的预测模型同时玩双方 - 这是因为预测对手的动作是游戏的重要组成部分。
无需进入代码行,您需要的自我游戏是:
用于自动化和评分的游戏 API
一个或多个可以使用 API 的代理
一个系统,它获取代理之间的博弈结果并将其反馈给它们,以便可以进行学习:
在具有锦标赛选择的 GA 中,这可能只是将参考(获胜者的 id)保存到列表中,直到列表变得足够大以成为下一代的父母。其他选择方法也是可能的,但一般方法是相同的——玩游戏是为了帮助填充下一代代理。
在 RL 中,通常每个游戏状态与下一个结果状态或结果赢/平/输(转换为奖励值,例如 +1/0/-1)一起保存到内存中。此内存用于计算和更新来自任何给定状态的未来结果的估计(或在某些变体中直接用于决定从任何给定状态采取的最佳行动)。随着时间的推移,当前状态和下一个状态之间的这种联系为智能体提供了一种学习更好的早期游戏动作的方法,最终为每个玩家带来胜利。
RL 中的一个重要“技巧”是找出模型的方法并更新规则以反映玩家的相反目标。在解决单代理环境中的最优控制的代理中,这不是一个考虑因素。您要么需要让预测算法从当前代理的角度预测未来奖励,要么使用全局评分系统并重新定义其中一个代理以尝试最小化总奖励 - 后一种方法适用于两个玩家零和游戏,因为两个玩家可以直接共享相同的估计器,只是将它用于不同的目的。
循环中的大量重复。GA 的重复单位通常是一代——对所有现有代理的完整评估(尽管也有变体)。RL 的重复单元通常更小、单独的情节,如果需要,可以在每一轮调用循环的学习部分。所有情况下的基本迭代是:
纯粹的反应式学习代理可以在简单的游戏中表现出色,但通常您还希望代理向前看以更直接地预测未来的结果。您可以将学习模型(如 RL)的输出与前瞻性规划方法相结合,以获得两全其美的效果。
前向搜索方法包括minimax / negamax和Monte Carlo Tree Search。这些可以通过多种方式与学习代理相结合——例如,在使用RL 模型的规划阶段,它们也可以用于帮助训练 RL 模型(这就是它在 Alpha Zero 中的使用方式)。