ML-Agents最近新增的MA-POCA算法可让任何人在一群代理上训练合作行为。这种新算法采用了集中式学习与分散式执行。一个中心裁判(一张神经网络)负责评估所有代理的状态,进而对其表现进行打分,而多个分散的执行程序(每个代理一个)负责控制代理。如此一来,每个代理可根据自己的感知进行决策,同时评估其行为在整个群体中的作用。下图展示了MA-POCA的集中式学习和分散式执行。
MA-POCA算法的一个新颖之处在于,它使用了一种称为attention networks(注意力网络)的特殊神经网络结构,可以处理不定量输入。这意味着裁判可以评估任意数量的代理,而MA-POCA也因此特别适用于游戏中的合作行为。代理可在任何时候加入或退出小组——类似于游戏角色在团战中的复活与死亡。MA-POCA的设计是为了让代理能够做出利他性决定,让团队利益最大化。这种利他行为很难通过人工编程实现,但可在其他代理为团队做贡献的先例中学习。最后,大多数多代理强化学习算法默认让所有代理在同一时间点选择下一个行动,但在真实游戏中,多代理同时决策很有可能会产生掉帧。这也是为什么MA-POCA不会采取这种方法,而是支持异步的代理行为决策。为了展示MA-POCA在游戏中的效果,我们创建了DodgeBall训练环境——包括有趣的团队竞技游戏,和一个完全使用ML-Agent训练的AI。
DodgeBall训练环境内含第三人称躲避球游戏,玩家需要尽可能多地捡起球、再扔向对手。它包括两种游戏模式:淘汰赛和夺旗。在淘汰赛中,一组玩家需要淘汰另一组玩家——玩家被击中两次即视作淘汰。在夺旗中,玩家需要夺取并带回对方的旗帜,并且只有在自己的旗帜未丢失时才能得分。在夺旗模式下,玩家若被球击中则会掉落旗帜并被击晕10秒,然后在基地重生。玩家在两种模式下最多可以持有四个球,还需要冲刺躲避袭击、翻越矮墙。
强化学习下的代理会观察环境并采取可最大化奖励的行为。代理训练中的观测、行动和奖励方法将在下方介绍。
DodgeBall的代理借助以下三种数据源来观察周遭环境:
DodgeBall还采用了混合行为,即连续性与间断性行为的混合。代理采用三种连续性动作进行移动:前向、横向和转向运动;以及两种间歇性动作:投球与冲刺。这些动作形成的运动空间对应人类玩家在夺旗和淘汰赛中的动作。
同时,我们故意简化了代理的奖励等级,赋予输赢大体量的奖惩,给特定游戏表现设定一些较小的奖励。
淘汰赛:
夺旗:
虽然为代理设置众多小奖励可以鼓励其采取我们想要的行为,但过于详细的规则容易剥夺代理的决策自由。举例来说,如果淘汰赛中为捡球设置奖励,代理可能更在意捡球而不是攻击对手。只有当奖励尽可能地“稀少”,代理才能自由地制定策略,即便训练周期更长。
因为同样的奖励可以有许多种赢取方法,这也方便我们找出最好的策略,比如代理是应该囤积球,还是带球移动,方便随手抓取?是站在一起形成队形,还是分头搜寻敌人?这些问题在不同的游戏设计下有不同的答案:如果球很少,代理就会长时间地拿着球、防止敌人得到它们。如果代理知道敌人的位置,他们就会尽量一起行动。这也就是说,AI可以自行适应游戏中的修改,无须我们修改代码,新环境可以训练出新行为。
与训练单个代理相比,训练一组代理进行合作要复杂得多。为了辅助代理组的管理,我们编写了DodgeBallGameController.cs 脚本,其作用是初始化和重置场地(包括球的生成和代理位置的重置)。脚本会将代理分配到各自的SimpleMultiAgentGroup ,并计算每组应得的奖励。例如,下图展示了DodgeBallGameController.cs脚本如何处理投球命中时的情形。
在这段代码中,投球者在击中对手后会得到一些奖励——但只有当最后一个对手被消灭后,整个小组才能得到合作的奖励。
MA-POCA在SimpleMultiAgentGroup中与在单个代理中的处理方式不同。MA-POCA会将所有观测结果整合起来用于集中培训。除了个人奖励外,它还负责处理整个小组的奖励——无论有多少代理加入或离开了小组。你可以在TensorBoard中监测代理组获得的总奖励。
由于淘汰赛和夺旗都是对抗性游戏,我们决定同时采用MA-POCA与self-play(自对奕)来让代理与过去的自己对阵、学习如何获胜。类似其它的ML-Agents自对弈游戏,我们可以借助ELO评分的增长来监测代理的学习进度。在经过数千万个训练步骤后,代理的游戏水平完全可以比肩真人。
下方视频展示了淘汰赛中代理水平随时间推移而进步。可以看到在训练早期,代理学会了投球,但由于瞄准能力很差,所以投球方向较为随机。经过4千万次时间步后,代理的瞄准能力有了改善,但仍倾向于随机徘徊,被动地碰上敌人。在遇到对手时,代理通常会选择逐个击破。最后在另外1.2亿次时间步后,代理变得更为积极自信,并制定了复杂的战略,像是以一定队形冲入敌方阵地。
下方则是代理们在夺旗游戏中的表现:在训练初期,代理花了1千4百万次时间步学会了投球,但尚不会夺取旗帜。在3千万步时,代理学会了抢夺敌方旗帜并返回基地,但除了扛旗的代理外,其他代理的作用并不明显。然而在8千万步时,代理展现出了有趣的策略。
未持有敌方旗帜的代理有时会守卫基地,有时会截击持有我方旗帜的敌人,或者在敌方基地守株待兔,在对手回来时进行射击。如果是己方持有旗子,代理可能会在基地等待队友夺回旗子,直到得分。下方视频突出显示了代理制定出来的有趣策略。注意,所有这些行为都是代理在数百次的自对弈迭代中学习到的,没有人为干预。
DodgeBall环境完全开源,可在此处下载。欢迎大家前来一试。 如果你希望在机器学习和游戏的交叉领域中工作,我们正好有几个职位空缺,欢迎大家前来应聘。
最后,也希望各位不吝向我们反馈。所有关于Unity ML-Agents工具包的反馈可填入这张调查表,也能直接向ml-agents@unity3d.com发送电子邮件。如果遇到任何问题,请不要犹豫,访问ML-Agents GitHub问题页面与我们联系。如有其他一般性意见或问题,请在Unity ML-Agents论坛上告诉我们。