为什么自玩井字游戏不完美?

人工智能 强化学习 自我游戏
2021-10-18 10:32:47

我训练了一个 DQN,它通过与自己对战来学习井字游戏,输/平/赢的奖励为 -1/0/+1。每 500 集,我通过让它与随机玩家播放一些集(也是 500 集)来测试进度。

如图所示,网络很快学会了对抗随机玩家获得 0.8-0.9 的平均奖励。但是在6000集之后表现似乎恶化了。如果我在 10000 集之后手动玩网络游戏,它会播放得很好,但绝不是完美的。

假设没有隐藏的编程错误,有什么可以解释这种行为的吗?与针对固定环境训练网相比,自我游戏有什么特别之处吗?

这里有更多细节:网络有两层,有 100 个和 50 个节点(以及一个有 9 个节点的线性输出层),使用 DQN 和一个具有 4000 个状态转换的重播缓冲区。显示的 epsilon 值仅在自我游戏期间使用,在针对随机玩家探索进行评估期间关闭。自我游戏实际上是通过训练两个具有相同架构的独立网络来实现的。为简单起见,一个网始终是 player1,另一个始终是 player2(因此他们学到的东西略有不同)。然后使用 player1 网络与为 player2 生成移动的随机玩家进行评估。

谢谢

TicTacToeSelfPlay结果

2个回答

RL 智能体在很多方面都无法正确学习,因此不幸的是,您将面临一些实验,甚至可能是寻找错误。但是,根据您在问题和评论中给出的描述,我可以对去哪里进行一些观察和猜测:

  • 您对随机玩家的平均奖励指标是明智的。在这种情况下,您还可以使用完美玩家(理想情况下随机选择任何最佳移动),您会看到最大平均回报为零 - 这将有助于了解您的代理是否已经学习了完全最佳的行为,因为它会一直得分为零。一般来说,对于更复杂的游戏,无法使用完美的玩家进行测试,但正如您在这里学习的那样,它可能会对您有所帮助。

  • 您的 DQN 可能无法拟合价值函数。在这种情况下,您可以通过从最佳自我游戏玩家(所有值将是 -1、0 或 1)获取价值函数并使用监督学习方法(与您的代理分开)来测试这一点。你应该能够得到非常接近于零的损失——如果你不能做到这一点,那么你的网络架构可能有问题。

  • 在您进行训练时,即使您使用的是 Q-learning 的变体(即使在探索其他动作时也会学习最佳策略),您的 DQN 并没有学习最佳游戏。那是因为您使用了两个代理。在 DQN 中,算法不知道还有其他学习代理,它会将任何其他代理视为环境的一部分。这意味着代理将花费一些精力来尝试为彼此设置游戏以犯下探索错误。这可能导致非最佳选择和一点点不稳定。尽管您在这里被困在岩石和坚硬的地方之间,但您的 epsilon 衰减应该对此有所帮助。你想学习off-policy和探索,但被迫减少探索。有几种方法可以解决这个问题,我将在下面进一步解释。. .

  • 10,000 场比赛可能还不够。在我对井字游戏代理所做的实验中,对于一个天真的学习者来说,似乎需要 20,000 到 50,000 次游戏。如果您做了一些使学习效率低下的事情,则可能需要更多。此外,我发现当添加更复杂的学习方法(在我的例子中使用资格跟踪)时,代理似乎很快就接近最优,但实际上存在需要很长时间才能消除的缺陷,只要运行一个更天真的算法。当缺陷被发现并修复后,它会扰乱价值函数一段时间,我看到我的指标波动与你的相似。

  • 使用 NN 的 Q 学习本质上是不稳定的。DQN 实现了一些想法来解决这个问题,但它并不完美。需要调整批量大小和/或在为 TD 目标计算获取网络冻结副本之间的时间步长的情况并不少见。最初的稳定性和较差的性能看起来也很像这种不稳定性。

关于您使用两个相反的代理,我可以看到两个可能的改进:

  1. 在每场比赛中交替训练一个或其他代理,不要同时训练两个。这将意味着每个智能体都在学习如何在没有探索性动作的情况下与其他智能体进行对抗。

  2. 将网络组合成单个代理描述。由于这是一个零和游戏,您可以使用玩家 A 的网络来计算价值,而让玩家 B 尝试在其轮次中最小化行动价值。这意味着使用minargmin函数代表玩家 B 轮到玩家 A 使用的步骤minargmin,包括在 Q 值更新中 - 这通常很容易添加到 Q 学习的内部循环中,并且应该提高学习效率(本质上是你是硬编码知识,这是一个零和游戏并利用这种对称性)。

这两个想法都将使您从关心 epsilon 的值或衰减它中解放出来-您可能可以将其固定在例如 0.1

最后,作为测试您的代理是否能够应对一般学习最佳游戏的测试,您可以让它针对已经最佳的代理进行学习。这显然不是您可以为更复杂的游戏做的事情,但可能会帮助您调试代理代码和网络的超参数 - 它将您的问题分为“它可以学习这个”和“它可以通过自我学习吗?玩”。

由于 epsilon 被限制,网络 1 和 2 可以自由地专门针对准完美对手产生井字游戏的众所周知的非失败行为,而无需对随机(换句话说,坏)对手的任何非失败或获胜行为进行编码. 我建议在训练网络 1(第一推动者)并减少 epsilon-1 时,将第二推动者的 epsilon-2 保持在明显高于 0 的值,实际上为什么不固定。反之亦然,用于训练 2nd mover。