如何与自我游戏的不稳定作斗争?

人工智能 强化学习 卷积神经网络 深度学习 epsilon-贪婪策略 自我游戏
2021-10-26 02:47:13

我正在研究一个神经网络,它可以玩一些棋盘游戏,比如黑白棋或井字游戏(零和游戏,两个玩家)。我正在尝试为所有游戏设置一个网络拓扑 - 我特别不想为可用操作的数量设置任何限制,因此我只使用状态价值网络。

我使用卷积网络——一些受 Alpha Zero 启发的残差块,然后是全局池化和线性层。对于给定的游戏状态,网络输出一个介于 0 和 1 之间的值——它的值。

对于每一个可能的动作,代理都会选择一个导致具有最高值的状态的动作,它使用 epsilon 贪婪策略。

每场比赛结束后,我都会记录状态和结果,并创建一个回放记忆。然后,为了训练网络,我从回放内存中采样并更新网络(如果做出导致当前状态的移动的玩家赢得了游戏,则状态的目标值为 1,否则为 0)。

问题是,经过一些训练后,模型作为其中一名玩家表现得相当好,但作为另一名玩家却输了(它比随机代理更差)。起初,我认为这是训练代码中的一个错误,但经过进一步调查,这似乎不太可能。它成功地训练了两个玩家对抗随机代理,当我只使用自我游戏时问题出现了。

我想我已经找到了一些解决方案 - 最初我针对随机玩家训练模型(一半游戏作为第一个玩家,一半作为第二个玩家),然后当模型知道哪些动作更好或更坏时,它开始对自己进行训练。我用这种方法取得了相当不错的结果——在井字游戏中,在 10k 场比赛之后,我对作为起始玩家的随机玩家有 98.5% 的胜率(大约 1% 平局),作为第二个玩家有 95% 的胜率(再次大约3% 平局)——它找到了一个近乎最优的策略。它似乎也适用于黑白棋和突破(在 10k 场比赛后,双方玩家都赢了 80% 以上的随机玩家)。它并不完美,但也没有那么糟糕,尤其是在只玩了 10k 游戏的情况下。

我相信,当从一开始就进行自我训练时,其中一名球员获得了显着的优势并在每场比赛中重复该策略,而另一名球员则在寻找反击方面苦苦挣扎。最后,与失败者对应的状态通常设置为 0,因此模型知道,每当轮到失败者时,它应该返回 0。我不知道如何处理这个问题,有没有具体方法?我还尝试将 epsilon(在 eps-greedy 中)最初设置为某个较大的值,例如 0.5(随机移动的 50% 机会),然后在训练期间逐渐减小它,但这并没有真正帮助。

2个回答

AlphaZero论文提到了一个“评估”步骤,似乎可以处理与您类似的问题:

...我们针对当前最佳网络评估每个新的神经网络检查点fθ在将其用于数据生成之前...每次评估包含 400 场比赛...如果新玩家以 > 55% 的优势获胜(以避免仅根据噪音进行选择),那么它将成为最佳玩家αθ,并随后用于自我对战生成,也成为后续比较的基线

AlphaStar 中,他们使用了一整套不断相互对抗的特工联盟。

当处于具有竞争代理的环境中时,从每个代理的角度来看,环境变得非马尔可夫。发生这种情况是因为每个代理都在不断地调整自己的策略以适应其他人的行为,因此之前发生在一对 (s,a) 上的转换导致正奖励,可能会在未来的游戏迭代中导致零奖励或负奖励。

我没有看到提到,但我想你正在使用一些 DQN 变体来训练网络,因为你使用了重放缓冲区。要使用此框架,您假设从代理的角度来看,环境遵循 MDP。但是,正如我在上面所说的,回放缓冲区中的一些元组可能不能代表有效的训练数据,因此用它训练的相应网络变得不稳定。

一个解决方案可能是使用分散执行的集中训练的想法,结合一些策略梯度 (PG) 算法,如 REINFORCE 或 Actor-Critic。由于 PG 是 on-policy 算法,用于训练网络的数据是由当前策略生成的,因此您没有重播缓冲区问题。另一方面,由于是on-policy,因此样本效率低下。集中训练可能有助于提高样本效率(它实际上是部分可观察环境的一个很好的解决方案,但据我了解,您的游戏并非如此)。样本效率低下的另一个解决方案是使用非策略 PG,例如在重要性抽样框架中使用具有各自经验的过去策略。

一些相关参考:

混合合作竞争环境的多智能体 Actor-Critic:https ://arxiv.org/abs/1706.02275

离策略梯度:https ://lilianweng.github.io/lil-log/2018/04/08/policy-gradient-algorithms.html#off-policy-policy-gradient