深度强化学习课程文档

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

Hugging Face's logo
加入 Hugging Face 社区

并获得增强文档体验

开始

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

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

SoccerTwos
这个环境由Unity MLAgents 团队创建

什么是自我博弈?

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

一方面,我们需要找到如何让训练好的对手与你的训练智能体对抗。另一方面,如果你找到了一个训练非常好的对手,你的智能体在对手过于强大时如何改进其策略?

想象一个刚开始学习足球的孩子。与一个非常优秀的足球运动员对抗将毫无用处,因为它太难获胜,或者至少很难从他们手中抢到球。因此,孩子将不断输球,而没有时间学习好的策略。

最好的解决方案是有一个与智能体水平相当的对手,并且会随着智能体水平的提升而提升其水平。因为如果对手太强,我们就学不到任何东西;如果对手太弱,我们就会过度学习对更强大对手的无用行为。

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

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

  • 我们开始与水平相当的对手进行训练
  • 然后我们向其学习,当我们获得一些技能后,我们可以与更强大的对手继续前进。

我们在自我博弈中做同样的事情

  • 我们从使用我们的智能体的一个副本作为对手开始,这样,这个对手就处于类似的水平。
  • 我们向其学习,当我们获得一些技能后,我们使用我们训练策略的更近的副本更新我们的对手

自我博弈背后的理论并不是什么新鲜事物。它早在 50 年代就已应用于 Arthur Samuel 的跳棋程序系统,以及 1995 年 Gerald Tesauro 的 TD-Gammon。如果你想了解更多关于自我博弈的历史,请查看 Andrew Cohen 的这篇优秀的博文

ML-Agents 中的自我博弈

自我博弈已集成到 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上