深度强化学习课程文档

自我博弈:在对抗性游戏中训练竞争性智能体的经典技术

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

自我博弈:在对抗性游戏中训练竞争性智能体的经典技术

既然我们已经学习了多智能体的基础知识,我们就可以深入研究了。正如引言中提到的,我们将使用 SoccerTwos(一个 2 对 2 游戏)在对抗性游戏中训练智能体

SoccerTwos
此环境由Unity MLAgents 团队创建。

什么是自我博弈?

在对抗性游戏中正确训练智能体可能相当复杂

一方面,我们需要找到如何获得一个训练有素的对手来对抗你的训练智能体。另一方面,如果你找到了一个训练得非常好的对手,当对手太强时,你的智能体将如何改进其策略?

想象一个刚开始学习踢足球的孩子。对抗一个非常好的足球运动员将是徒劳的,因为太难赢球,或者至少偶尔能拿到球。所以孩子会持续输球,没有时间学习一个好的策略。

最好的解决方案是拥有一个与智能体水平相同的对手,并且随着智能体自身水平的提升而提升其水平。因为如果对手太强,我们将一无所获;如果对手太弱,我们将过度学习对更强对手无用的行为。

这个解决方案被称为自我博弈。在自我博弈中,智能体使用自身的先前副本(其策略)作为对手。通过这种方式,智能体将与水平相同的智能体对战(有挑战性但不过分),有机会逐步改进其策略,然后随着自身变得更好而更新其对手。这是一种引导对手并逐步增加对手复杂性的方法。

这与人类在竞争中学习的方式相同

  • 我们开始与水平相似的对手进行训练
  • 然后我们从中学到东西,当我们掌握了一些技能后,我们可以与更强的对手进行比赛。

我们通过自我博弈也这样做

  • 我们从我们智能体的一个副本作为对手开始,这样,这个对手的水平就相似了。
  • 我们从中学习,当我们掌握了一些技能后,我们用我们训练策略的最新副本更新我们的对手

自我博弈背后的理论并不是新事物。它早在五十年代就被阿瑟·塞缪尔的跳棋玩家系统和 1995 年杰拉尔德·泰萨罗的 TD-Gammon 使用。如果你想了解更多关于自我博弈的历史,请查看安德鲁·科恩的这篇非常好的博客文章

MLAgents 中的自我博弈

自我博弈已集成到 MLAgents 库中,由我们即将研究的多个超参数管理。但正如文档中所解释的,主要关注点是最终策略的技能水平和泛化能力与学习稳定性之间的权衡

对抗一组缓慢变化或不变的、多样性低的对手会导致更稳定的训练。但如果变化过慢,则存在过拟合的风险。

所以我们需要控制

  • 我们多久更换一次对手,通过swap_stepsteam_change参数。
  • 保存的对手数量,通过window参数。window值越大,意味着智能体的对手池将包含更多样化的行为,因为它将包含来自训练早期阶段的策略。
  • 与当前自身对战与从池中抽取的对手对战的概率,通过play_against_latest_model_ratio参数。play_against_latest_model_ratio值越大,表明智能体将更频繁地与当前对手对战。
  • 在保存新对手之前,训练的步数,通过save_steps参数。save_steps值越大,将产生一组涵盖更广泛技能水平和可能不同游戏风格的对手,因为策略会获得更多训练。

要了解这些超参数的更多详细信息,你绝对需要查看文档的这一部分

评估智能体的 ELO 分数

什么是 ELO 分数?

在对抗性游戏中,跟踪累积奖励并不总是一个衡量学习进度的有意义指标:因为这个指标只取决于对手的技能。

相反,我们使用ELO 评分系统(以阿尔帕德·埃洛命名),它计算零和游戏中给定人群中两个玩家之间的相对技能水平

在零和游戏中:一个智能体获胜,另一个智能体失败。它是一种数学表示,在这种情况下,每个参与者的效用增益或损失正好与另一个参与者的效用增益或损失相平衡。我们称之为零和游戏,因为效用之和等于零。

这个 ELO(从一个特定的分数开始:通常是 1200)最初可能会下降,但应该在训练过程中逐步增加。

Elo 系统是根据对其他玩家的损失和平局推断出来的。这意味着玩家的评分取决于他们对手的评分以及对他们取得的结果。

Elo 定义了一个 Elo 分数,表示玩家在零和游戏中的相对技能。我们说相对是因为它取决于对手的表现。

核心思想是将玩家的表现视为一个正态分布的随机变量。

两个玩家之间的评分差异是比赛结果的预测指标。如果玩家获胜,但获胜的概率很高,那么它只会从对手那里赢得少量分数,因为这意味着它比对手强大得多。

每场比赛之后

  • 获胜的玩家从失败的玩家那里获得积分。
  • 积分的数量由两名玩家评分的差异决定(因此是相对的)。
    • 如果高评分玩家获胜 → 从低评分玩家那里获得少量积分。
    • 如果低评分玩家获胜 → 从高评分玩家那里获得大量积分。
    • 如果是平局 → 低评分玩家从高评分玩家那里获得少量积分。

因此,如果 A 和 B 的评分为 Ra 和 Rb,那么预期分数由以下公式给出

ELO Score

然后,在比赛结束时,我们需要更新玩家的实际 Elo 分数。我们使用与玩家表现过高或过低成比例的线性调整。

我们还定义了每场比赛的最大调整评级:K 值。

  • 大师级 K=16。
  • 较弱的玩家 K=32。

如果玩家 A 有 Ea 分数,但获得 Sa 分数,那么玩家的评分将使用以下公式更新

ELO Score

示例

如果我们举一个例子:

玩家 A 的评分为 2600

玩家 B 的评分为 2300

  • 我们首先计算预期分数EA=11+10(23002600)/400=0.849E_{A} = \frac{1}{1+10^{(2300-2600)/400}} = 0.849 EB=11+10(26002300)/400=0.151E_{B} = \frac{1}{1+10^{(2600-2300)/400}} = 0.151

  • 如果组织者确定 K=16 且 A 获胜,则新评分为ELOA=2600+16(10.849)=2602ELO_A = 2600 + 16*(1-0.849) = 2602 ELOB=2300+16(00.151)=2298ELO_B = 2300 + 16*(0-0.151) = 2298

  • 如果组织者确定 K=16 且 B 获胜,则新评分为ELOA=2600+16(00.849)=2586ELO_A = 2600 + 16*(0-0.849) = 2586 ELOB=2300+16(10.151)=2314ELO_B = 2300 + 16 *(1-0.151) = 2314

优点

使用 ELO 分数有多个优点

  • 积分始终平衡(当出现意外结果时,会交换更多积分,但总和始终相同)。
  • 这是一个自我修正系统,因为如果一个玩家赢了一个弱玩家,他们只会赢得少量积分。
  • 适用于团队游戏:我们计算每个团队的平均值并将其用于 Elo。

缺点

  • ELO 不考虑团队中每个人的个体贡献
  • 评分通缩:良好的评分需要长期保持技能才能维持相同的评分
  • 无法比较历史评分.
< > 在 GitHub 上更新