TicTacToe 游戏的最优 RL 函数逼近

人工智能 强化学习 深度学习 萨尔萨
2021-11-01 19:45:32

我将井字游戏建模为 RL 问题 - 带有环境和代理。

起初,我制作了一个“精确”代理——使用 SARSA 算法,我保存了每个独特的状态,并在给定该状态的情况下选择最佳(可用)动作。我让 2 个代理通过相互竞争来学习。

特工们学得很快——他们只用了 3 万场比赛就达到了平局。并且代理清楚地知道如何玩游戏。

然后我尝试使用函数逼近而不是保存确切的状态。我的功能是 FF-NN。我的第一个(工作)架构是 9(输入)x 36 x 36 x 9(动作)。我使用了半梯度 1-step SARSA。代理需要更长的时间来学习。在大约 50k 场比赛之后,他们仍然不如确切的代理人好。然后我在 Exact 和 NN 代理之间进行了对峙——Exact 代理从 10k 中赢得了 1721 场比赛,其余的打成平手。这还不错。

然后尝试将隐藏层中的单元数量减少到 12 个,但没有得到好的结果(即使在总共玩了 500k+ 游戏之后,调整了一些东西)。尝试过使用卷积架构,再次 - 没有得到任何结果。

我想知道是否有一些最佳函数逼近解决方案可以获得与精确代理一样好的结果。TicTacToe 对我来说似乎不是一个难题。

从概念上讲,我认为解决它所涉及的复杂性应该少得多,然后可以用 9x36x36x9 网络表示。我错了吗,这只是简单的错觉?还是有更好的方法?也许以不同的方式建模问题?

1个回答

我认为您可以将这个问题分成两部分来尝试找到解决方案。

1. 神经网络能否对期望的函数进行建模?

获取您在精确代理中学习的表格函数,并将其视为神经网络模型的训练数据,使用与在 RL 内部循环中在线使用 NN 时打算使用的相同的损失函数和其他超参数。

你可以用这个回答两个相关的问题:

  • 在适当数量的 epoch 之后,损失是否会降低到较低的值?如果是这样,那么 NN 具有学习能力并且可以足够快地学习。如果没有,您需要查看 NN 的超参数。

  • 训练有素的 NN 是否能很好地对抗精确的代理?理想情况下它的作用相同,但有可能即使损失很低,函数中的一两个关键值也会受到损害,这意味着它仍然会失败。我不完全确定在这种情况下你会做什么,但要么尝试更改超参数以增加 NN 的容量,要么尝试增加数据,以便有更多“困难”动作值的示例需要学习,看看如果问题是可以在学习中解决的。

可能您会发现您的 NN 架构很好,或者只需要进行微小的更改即可变得有用。更可能的问题在下一节中。

2. 强化学习框架是否为函数逼近正确设置?

很难做到这一点。如果天真地从表格转换为函数逼近方法,则基于自举值的方法很容易变得不稳定。一些变体是适度稳定的——最稳定的可能是蒙特卡洛方法。

如果您不想使用蒙特卡洛控制,那么这里的答案是从最初用于玩 Atari 游戏的 DQN 中获取想法:

  • 不要在线学习。在体验重放表中存储转换 - 存储(s,a,r,s,done)元组在哪里done如果是真的s是一个终端状态 - 并在每一步从中采样一个小批量。每次采样时重建价值函数的引导估计以进行训练,不要存储和重新使用从采取行动时开始的估计。

  • 可选地使用两个值估计器 - 当前学习的一个,用于选择播放并在每一步更新,以及一个用于计算 TD 目标的“目标”。通过每 N 步(例如每 100 场比赛)克隆学习网络来更新目标网络。

  • 为了避免找出 SARSA epsilon 衰减的超参数,我建议使用一步 Q 学习。您可能在 SARSA 组合 epsilon 衰减中面临的一个问题是“灾难性遗忘”,即智能体变得很好,开始仅根据优秀玩家的游戏示例训练自己,并忘记了它在训练数据中没有看到的状态值很多时间步。通过 Q 学习,您可以通过具有相对较高的最小 epsilon(例如 0.1)来避免这种情况。

事实上,通过自我游戏学习井字游戏,你可以逃脱ϵ=1Q 学习应该仍然有效 - 即它可以通过观察随机自我游戏来学习最佳游戏。这应该同样适用于表格和函数逼近代理。它不适用于更复杂的游戏,因为随机游戏需要很长时间才能发现最佳策略。