最近,我们为足球游戏(Google Research Football)打造了一款强大的AI——TiKick。 TiKick目前在单智能体控制和多智能体控制上均取得了SOTA的性能,也是首个能够同时操控十个球员完成整个足球游戏的AI。
TiKick(黄色方)与Google Reasearch Football的内置AI(蓝色方)对战
强化学习(RL)的目标是培养能够与环境互动并解决复杂任务的智能体。近年来强化学习已经在多个游戏中(如:Dota 2、星际争霸等)达到超人类玩家的水平。鉴于现有的简单游戏引擎已经不能满足研究人员的需求,谷歌团队推出了Google Reasearch Football(GRF)、提供了基于物理引擎的3D足球模拟,进一步推进RL算法的发展。
GRF的每场比赛由三千步组成并被分为上下半场,玩家需要操控一名或多名球员与敌方竞技,规则与一般足球游戏相同,每一步决策玩家可以在移动、传球、射门、盘球、铲球与冲刺等共19个动作中选取其一以操控球员。
具体来说足球游戏对于RL训练来说有以下难点,第一、多智能体环境,玩家可以同时操控场中的十名球员,此时组合动作空间来到 19^{10} ,算法需要在如此巨大的动作空间中搜索出合适的动作组合。第二,在足球比赛中场均进球总数极少,也就是一个算法需要做出上千步优秀的决策后才能获得来自环境的奖励,大幅增大训练难度。
GRF是一个为RL精心设计的模拟器,具体来说他具有以下优点。其一,GRF在游戏引擎中引入随机性,在具有随机性的环境中训练能够增加RL算法的鲁棒性。其二,GRF提供包含:防守反击、角球等多种学院模式,这些小场景能够帮助算法性能的快速验证。此外,GRF支持自我博弈与内置AI的难度调整,对于RL的自我博弈学习与课程学习提供支持。
上图展示GRF的四个学院场景,由左至右依序为Run to Score with Keeper、3 vs 1 with Keeper、防守反击、角球
为了促进这个全新领域的研究,Kaggle在2020年举办GRF世界锦标赛。所有参赛队在比赛过程中只可以控制场中的一名球员与敌方竞技,被控制的球员随时间变化、永远是最靠近球的那名(以下称为活跃球员),其余非活跃球员采用默认基于规则的动作。在此项比赛中WeKick团队训练出了端到端的RL智能体,在千余支队伍中脱颖而出获得了世界第一。我们搜集了数万场WeKick自我对弈的数据,并使用离线强化学习的方法从这些数据中学习。
WeKick在GRF世界锦标赛中获得世界第一 (比赛主页: )
离线强化学习算法让智能体可以从已有的数据中学习。对于一般的情况现有算法已经达到很高的性能,而我们的算法是首个能够从单智能体数据集学习出多智能体策略的算法。此外,我们的工作也是首个能够同时操控十名玩家完成全场足球竞技游戏的AI,过去的工作中多数是针对单智能体情况设计的算法、多智能体方面的工作有也只能在部份小场景下达到比较好的效果。
核心算法
TiKick使用多种技巧加速训练并提升性能,以下对我们的核心算法进行介绍。
首先,对于全新的环境,我们定义了包含球员坐标与速度、球员间相对距离等268个参数作为输入向量,并选定全连接层加上GRU作为网络结构。算法方面我们提出以下四点改进
为了获取能同时操控多名球员的策略,最直观的想法是直接利用行为克隆的方式从WeKick的数据中学习出单智能体策略,并让所有球员都使用该策略行动。其缺点也是显而易见的,由于WeKick只会操控活跃球员,而缺乏后场非活跃球员的数据,因此这样的算法学出来的团队球员间会彼此强球、且所有人都围在球的周遭、缺乏团队意识。
因为我们没有后场非活跃球员动作的数据,从数据中学习出来的策略是不可能良好的操控后场非活跃球员的。因此我们必须对条件做出一定的放宽。我们在动作集内添加第二十个动作:build-in,并赋予所有非活跃球员此动作标签(比赛中若选用build-in作为球员的动作,球员会根据内置规则采取行动)。接着我们采用多智能体行为克隆(MABC)算法训练我们的模型,目标函数如下所示
\begin{eqnarray} \begin{split} \mathcal{L}_{\text{bc}}=\mathbb{E}_{\tau\sim \mathcal{D}}\left[\frac{1}{T}\sum_{t=1}^T-\frac{1}{n}\sum_{i=1}^n \log \pi_\theta(u_t^i|o_{1:t}^i)\right] \end{split} \label{eq:bc} \end{eqnarray} \\
经过实验我们发现使用MABC训练出来的AI,所有球员倾向于只使用build-in作为其动作,我们推测原因是由于数据内样本不均衡导致(有90%的数据标签为build-in),因此我们在计算目标函数时赋予每个标签不同的权重alpha、目标函数变为
\begin{eqnarray} \begin{split} \mathcal{L}_{\alpha-\text{balance}}=\mathbb{E}_{\tau\sim \mathcal{D}}\left[\frac{1}{T}\sum_{t=1}^T-\frac{1}{n}\sum_{i=1}^n \alpha(u^i)\log\pi_\theta(u_t^i|o_{1:t}^i)\right] \end{split} \label{eq:alpha_balance} \end{eqnarray} \\
为了进一步提高性能、降低build-in被选取的概率,我们引入了先验知识,即活跃球员不应该采用build-in动作。我们添加了一项新的目标函数
\begin{eqnarray} \begin{split} \mathcal{L}_{\text{min_build_in}}=\mathbb{E}_{\tau\sim \mathcal{D}}\left[\frac{1}{T}\sum_{t=1}^T\sum_{i=1}^n -I(i,t)\log\left(1-\pi_\theta(u_\text{build_in}^i|o_{1:t}^i)\right)\right] \end{split} \label{eq:min_buildin} \end{eqnarray} \\
(其中活跃球员的 I(i,t)=1 、否则 I(i,t)=0 )
对于离线强化学习来说,最核心的思想是找出数据中质量较高的动作,并加强对这些动作的学习。因此我们进一步赋予所有数据项各自不同的权重,此权重由两个部份组成。
第一、我们从数据集中挑选出进球数较多的比赛、只利用这些高质量的数据来训练,由于奖励较为密集,能够加速收敛并提高性能。从数学上来说就是赋予进球数高的比赛 \rho(\tau)=1 的权重、赋予进球数低的比赛 \rho(\tau)=0 的权重,目标函数如下
\begin{eqnarray} \begin{split} \mathcal{L}_{\text{buffer_ranking}}=\mathbb{E}_{\tau\sim \mathcal{D}}\left[\rho(\tau)\frac{1}{T}\sum_{t=1}^T-\frac{1}{n}\sum_{i=1}^n \alpha(u^i)\log\pi_\theta(u_t^i|o_{1:t}^i)\right] \end{split} \label{eq:buffer_ranking} \end{eqnarray} \\
第二、我们训练出critic网络给所有动作打分,并利用其结果计算出优势函数。优势函数所反映的是当前动作相较于其他动作来说未来预期造成的总额外收益,因此我们给予优势函数值大的动作较高的权重,反之给予较低的权重。此处为了避免梯度爆炸与消失,我们对优势函数做出了适当的裁剪。目标函数变为
\begin{eqnarray} \begin{split} w(\mathbf{u}_t,s_{1:t}) = \text{clip}\left(\exp\left(\frac{1}{\beta}A(\mathbf{u}_t,s_{1:t})\right),w_{\min},w_{\max}\right) \end{split} \label{eq:advantage_weight} \end{eqnarray}\\
\begin{eqnarray} \begin{split} \mathcal{L}_{\text{adv}}=\mathbb{E}_{\tau\sim \mathcal{D}}\left[\rho(\tau)\frac{1}{T}\sum_{t=1}^T-\frac{w(\mathbf{u}_t,s_{1:t})}{n}\sum_{i=1}^n \alpha(u^i)\log\pi_\theta(u_t^i|o_{1:t}^i)\right] \end{split} \label{eq:AWR_loss} \end{eqnarray} \\
最终,我们的目标函数形式如下所示
\begin{eqnarray} \begin{split} \mathcal{L}_{\text{total}}= \mathcal{L}_{\text{adv}}+\eta\mathcal{L}_{\text{min_build_in}} \end{split} \label{eq:final_loss} \end{eqnarray} \\
分布式训练框架
在训练框架方面,我们实现了基于gRPC协议的分布式训练框架,核心架构图如上图所示。我们的分布式系统由一个Learner与多个Worker构成,其中Learner负责学习并更新策略,而Worker负责搜集数据,他们之间通过gRPC进行数据、网络参数的交换与共享。其中,Learner、Worker与数据服务器可以在不同的节点上运行。而在每个节点上,Worker也可以利用多进程的方式同时与多个游戏环境进行交互,或是通过I/O同步读取离线数据。通过这种并行化的执行方式,可以大幅提升数据搜集的速度,从而提升训练速度。在相同的场景下,训练CDS算法需要超过两天的时间才能收敛,而我们的分布式训练框架能在五小时内就达到相同的性能。另外,通过模块化设计,我们的框架能在不修改任何代码的情况下,一键切换单节点调试模式和多节点分布式训练模式,大大降低了算法实现和训练的难度。
实验结果
具体来说,TiKick取得以下成果。我们训练出了首个能够完成全场足球竞技的AI,并且经过实验证实采用我们的策略与GRF内置强AI对打,能有场均三分的净胜分。此外,利用我们的离线强化学习所得出的成果作为预训练模型,能加速后续RL训练的收敛速度并提升其性能。我们利用实验证明在包含角球、防守反击等多个学院场景下,我们算法的性能超越所有现有的基线算法。
首先我们对核心算法进行消融实验,发现胜率随着训练技巧的引入而上升,并且最终的方法达到94.4%的胜率与场均3分的净胜分。
上图展示TiKick与内置AI对战的胜率与净胜分
接着我们在多个小场景下与现有算法做横向对比,我们使用离线强化学习的成果作为预训练模型,并利用MAPPO算法做后续RL的训练,我们发现采用这样的方式能够加速收敛并提升性能。
如上图所示,我们的方法在五个学院场景中都击败所有其他基线算法,并且我们的算法都能够在1M步内快速收敛
接着我们与MAPPO比较性能,探讨预训练模型对最终性能与收敛速度的影响,发现使用我们的算法在各项指标上都有大幅度的提升。
最后让我们来看看几个TiKick(黄色球员)的精彩瞬间吧
TiKick对战全场视频
学院场景: 3 vs 1 with Keeper
学院场景: 角球
学院场景: 防守反击
学院场景: Run, Pass and Shoot with Keeper
学院场景: Run to Score with Keeper
更多细节请参考我们的论文:TiKick:Towards Playing Multi-agent Football Full Games from Single-agent Demonstrations
arXiv链接: arxiv.org/abs/2110.04507
GitHub链接: github.com/TARTRL/TiKick
北单在那里买请加店主微信:av616X4