人工智能的长期目标是解决高难度的真实世界难题。为了实现这一目标,研究者在近几十年的时间里将游戏作为研究 AI 发展的基石。从双陆棋(1992)到国际象棋(1997)再到 Atari 游戏(2013),在 2016 年,AlphaGo 凭借深度强化学习和蒙特卡洛树搜索战胜了围棋世界冠军。近些年来,强化学习(RL)也在更多类型的任务上得到了应用,比如机器人操作、文本摘要以及《星际争霸》和《Minecraft》等视频游戏。
相比于国际象棋或围棋等之前的 AI 里程碑,复杂视频游戏更具备现实世界问题那样的复杂性和连续性。而 Dota 2 是 Valve Corporation 于 2013 年发行的一款多人实时战略游戏,该游戏在 2013 年到 2019 年之间的同时在线玩家数在 500 000 到 1 000 000 之间。
该游戏也有很多全职的职业玩家;其 2019 年国际冠军赛的奖金池已经超过了 3500 万美元(这是全世界电子竞技游戏中最多的)。该游戏由于一局时间较长、部分可观测性以及高维度的观察和动作空间,这些给强化学习带来了严峻的挑战。另外,Dota 2 的规则也很复杂——该游戏已经历经超过十年的活跃开发,其游戏逻辑使用了数十万行代码来实现。
要为这样复杂的环境创造合适的智能体,关键是要将现有的强化学习系统扩展至前所未有的规模,这需要在数以千计的 GPU 上执行几个月的训练。为了实现这一目标,OpenAI 构建了一个分布式的训练系统,训练出了名为 OpenAI Five 的 Dota 2 游戏智能体。2019 年 4 月,OpenAI Five 击败了一支 Dota 2 世界冠军战队(OG 战队),这是首个击败电子竞技游戏世界冠军的 AI 系统。OpenAI 也将该系统开放给了 Dota 2 社区进行对战试玩;在超过 7000 局游戏中,OpenAI Five 的胜率为 99.4%。
论文地址:https://cdn.openai.com/dota-2.pdf
OpenAI 表示,训练过程还面临着另外一个难题:游戏环境和代码一直在不断升级和变化。为了避免在每次变化之后再从头开始训练,他们开发出了一套工具,能以最低的性能损失继续完成训练——OpenAI 将其称之为「手术(surgery)」。在超过 10 个月的训练过程中,OpenAI 大约每两周执行一次手术。这套工具让 OpenAI 可以经常改进他们的智能体,这只需要很短的时间——比典型的从头开始训练方法要短得多。随着 AI 系统解决的问题越来越大,越来越难,进一步研究不断变化的环境和迭代开发就显得至关重要了。
Dota 2 难在哪儿?
Dota 2 游戏对战发生在一个方形的地图中,两支队伍各自保卫位于对角线上的己方基地。每支队伍的基地都有一个远古遗迹(ancient);
当某方的远古遗迹被敌方摧毁时,游戏便宣告结束。每支队伍由 5 位玩家组成,每位玩家控制一个英雄单位,每个英雄都有自己独特的技能;
游戏期间,每方都有持续派出的「小兵(creep)」单位,但这些小兵不由玩家控制,它们会按路径向敌方基地前进,并会攻击任何出现在其攻击范围内的敌方单位和建筑;
玩家可从小兵收集金币和经验等资源,然后可通过购买物品和升级来提升英雄的战斗力。
为了玩 Dota 2,AI 系统必须解决多种难题:
长时间对局。Dota 2 游戏一般会以 30 帧每秒的速度持续大约 45 分钟。OpenAI Five 每 4 帧选择一个动作,则每局比赛需要执行大约 20000 步。比较一下,国际象棋一般持续 80 步,围棋是 150 步。
部分可观察的状态。每支队伍都只能看见己方单位和建筑附近的部分游戏状态;地图中的其余部分都是隐藏起来的。如果要玩得好,需要基于不完整的数据进行推断以及建模敌方的行为。
高维度的动作和观察空间。Dota 2 有一个很大的地图,地图中有 10 个英雄、几十个建筑、几十个非玩家单位,另外还有神符、树和侦查守卫(眼)等长尾的游戏特征。
OpenAI Five 每个时间步骤会观察大约 16 000 个值(大部分是浮点数和有数百种可能性的类别值)。同时,OpenAI 对动作空间进行了离散化处理;其模型在每个时间步骤从 8000 到 80000(具体数量取决于英雄)个动作选择一个。相比之下,国际象棋每次观察需要大约 1000 个值(这些值大都是有 6 个可能性的类别值),围棋大约需要 6000 个值(全都是二元值)。围棋的分支因子(branching factor)大约是 35 个可行动作,围棋的大约是 250。
另外需要说明,OpenAI Five 在玩常规模式的游戏时还有两个限制条件:
英雄池只有 17 个英雄——在常规游戏时,玩家是在比赛前从 117 个英雄中选择一个,而 OpenAI Five 目前只支持其中 17 个;
不支持能让玩家同时暂时控制多个单位的物品(幻象神符、支配头盔、幻影斧、死灵书)。OpenAI 移除这些物品的原因是控制多个单位会引入额外的技术复杂性。
训练系统
让 AI 玩 Dota
为了将「以超人级水平玩这个复杂游戏」的模糊问题转换成一个可以优化处理的详细目标,OpenAI 提出了以下框架。
尽管 Dota 2 引擎的运行频率是 30 帧每秒,但 OpenAI Five 每隔 4 帧(称为一个时间步骤)才采取一个动作。在每个时间步骤,OpenAI Five 都从游戏引擎接收一个观察,其中编码了作为人类玩家可以看到的所有信息,比如单位血量、位置等。然后,OpenAI Five 向游戏引擎返回一个离散的动作,其中编码了一个所需的移动、攻击等。
当然,某些游戏机制是用人工编写的逻辑控制的,而不是使用策略。这其中包括:英雄购买物品、获得技能的指令、对独特的信使单位的控制、英雄应当保留物品。OpenAI 表示,他们相信用 AI 方法替代人工编写规则最终能让智能体取得更好的表现,但即便如此,现有的智能体就已经取得了超人类的表现。
在训练期间,环境中的某些属性经过了随机化处理,包括游戏中的英雄和英雄购买的物品。因为在与人类对手对战时会出现各种不同的战略和情况,所以为了保证稳健性,必须进行足够多样化的训练。
OpenAI 将策略 π 定义为从观察历史映射到动作的概率分布的函数,并将其参数化为了一个有大约 1.59 亿个参数(θ)的循环神经网络。该神经网络主要由单层的 4096 单元的 LSTM 构成(见图 1)。给定一个策略,OpenAI 玩游戏的方式是在每个时间步骤不断重复地将当前观察传递为输入,然后从输出的分布采样一个动作。
图 1:简化版的 OpenAI Five 模型架构
为了控制一支队伍的五个英雄,OpenAI 为每个英雄都使用了同一策略函数(具有相同的参数 θ)的不同副本。因为 Dota 2 中的可见信息和战争迷雾(迷雾中友方单位附近的区域是可见的)是全队共享的,所以每位英雄的观察几乎都是相同的。
不过,OpenAI Five 并不直接使用屏幕上的像素信息,而是使用了一个数据数组集来近似人类玩家可获得的信息。这样的近似是不完美的;人类玩家能够获得的很多片段信息都没有被编码在观察中。另一方面,尽管 OpenAI 已经尽力确保模型获得的所有信息都是人类可以获得的所有信息,但人类在每个时间步不可能同时看完所有可用信息——人类必须主动点击地图和状态指示器的不同部分才行。
对策略进行优化
OpenAI 的目标是找到能最大化与人类职业玩家对战时获胜的概率的策略。在实践中,研究者对奖励函数执行了最大化操作,这个奖励函数还包含一些其它信号,比如角色死亡、收集资源等。
另外,他们还应用了多种技术以在计算奖励函数时利用该问题的零和多玩家(zerosum multiplayer)结构。比如说,通过减去敌方队伍所获得的奖励,使得智能体的奖励被对称化处理(symmetrize)。
OpenAI 团队在该项目一开始就构建好了这个奖励函数,因为团队对游戏的有一定的了解。尽管随着游戏版本更新,这个奖励函数也有过些许变化,但他们发现初始的奖励选择效果已经很好。而之后增加的奖励信号对训练成功而言也非常重要。
对于策略的训练则使用了近端策略优化(PPO),这是 Advantage Actor Critic 的一种变体。这种优化算法使用了通用优势估计(GAE),这是一种标准的基于优势的方差缩减技术,可稳定和加速训练。OpenAI 使用了一个中心化的共享式的 LSTM 模块来训练网络。这一模块会向不同的全连接层提供输入,从而得到策略和价值函数输出。
图 2:系统概况:该训练系统由 4 种主要类型的机器构成
OpenAI 使用了从 Dota 2 收集的自我博弈(self-plaer)经验来训练策略;在 16 个时间步的样本上使用了带有截断式的反向传播的 Adam 优化器。
系统使用「Rollout」运行自我博弈。它们以接近 1/2 的实时时间运行这些游戏,因为 OpenAI 团队发现以这样的速度能并行运行略多于两倍的游戏,从而增大总吞吐量。
「Rollout」能以异步的方式发送正在进行的游戏中的数据,而不是等到整局游戏结束才发送数据进行优化。
整个系统运行在自定义的分布式训练平台 Rapid 上,基于谷歌的云平台上。为了执行快速 GPU 训练,研究者还使用了 blocksparse 软件库。
通过「手术」实现连续迁移
当然随着项目推进,代码和游戏环境也在逐渐变化。为了解决从头开始训练的问题,OpenAI 提出了一种名为「手术(surgery)」的新方法。
「手术」可被视为一套工具集,它能够对旧模型执行离线操作,从而得到与新环境兼容的新模型。即便这个新模型的参数向量与旧模型的大小和语义不同,但它也仍然能以同样的水平执行游戏策略。然后,OpenAI 使用有新参数向量的新模型开始在新环境中进行训练。在环境、观察和动作空间都不变的最简单情况下,其标准简化为:坚持让新策略实现与旧策略一样的从所观察状态到动作的概率的函数:
这是保留变换的 Net2Net 风格的函数的一个特例。OpenAI 已经开发出了能尽可能准确地实现公式(1)的工具(如添加观察、扩展层和其它情况);而当对环境、观察空间或动作空间的修改类型无法完全满足准确实现的标准时,也可以近似地实现它。
表 1:在 OpenAI Five 训练期间执行过的所有成功的「手术」和重大的环境改变
「手术」能在无损性能的同时实现连续的训练(见图 4)。
图 4:在正在开发中的环境中训练
实验和评估
OpenAI Five 是从 2018 年 6 月 30 日到 2019 年 4 月 22 日的单次训练过程的产物。经过十个月的 770±50 PFlops/s·days 计算量的训练之后,其在三局两胜制比赛中击败了 Dota 2 冠军战队,并在持续多日的在线展示中击败了 99.4% 的人类玩家。
为了有效地利用这种水平的算力,整个系统进行了三个方向的扩展。第一,批大小为 100 万到 300 万的时间步(将其分组为长度在 16 的展开式 LSTM 窗口)。第二,使用了超过 1.5 亿参数的模型。第三,OpenAI Five 的训练用去了 180 天(由于重启和恢复,实际时间超过 10 个月)。
相比于 AlphaGo,OpenAI Five 的批大小大 50 到 150 倍,模型大 20 倍,训练时间长 25 倍。但同期也有另一些研究能在规模与这一项目匹敌或甚至规模更大一些,比如 DeepMind 的《星际争霸 2》智能体研究《Grandmaster level in StarCraft II using multi-agent reinforcement learning》以及 OpenAI 的一项机器人研究《Solving Rubik's Cube with a Robot Hand》。
人类评估
在训练期间,OpenAI Five 与许多业余玩家、职业玩家和职业战队进行了比赛,以便跟踪记录研究进展。
4 月 13 日,OpenAI Five 与 Dota 2 现世界冠军 OG 战队进行了一场高水平的竞技比赛,在三局两胜比赛中获胜(2-0),这表明 OpenAI Five 确实能学习到最高水平的操作技术。
但是,机器学习系统通常不能很好地应对意料之外的情况。尽管在展示比赛中胜过世界冠军确实能说明 OpenAI Five 能力出色,但这不能证明其能够广泛地理解人类社区可能面临的各种难题。
为了探索 OpenAI Five 能否被稳定地用于创造性或分布外的玩法,OpenAI 启动了 OpenAI Five Arena(竞技场),在 2019 年 4 月 18-21 日期间开放给公众进行在线挑战。OpenAI Five 与 3193 支队伍共进行了 7257 局比赛,胜率为 99.4%。29 支队伍在总共 42 场比赛中击败了 OpenAI Five。
尽管人类评估才是最终目标,但也需要在训练期间对智能体进行自动化的评估。OpenAI 的做法是以 TrueSKill 评分系统为指标,比较一些固定的参照。图 3 给出了 OpenAI Five 的 TrueSkill 评分随时间的变化情况。
图 3:OpenAI Five 的 TrueSkill 评分在训练期间的变化情况
通过 Rerun 验证「手术」的效果
为了验证新提出的「手术」方法所能节省的时间和资源,OpenAI 在 2019 年 5 月 18 日到 2019 年 6 月 12 日之间训练了另一个智能体,但仅使用了最终的环境、模型架构等。OpenAI 称这个训练过程为 Rerun,其没有经历蜿蜒曲折的游戏规则变化、对神经网络参数的修改、对超参数的在线实验等等。
Rerun 完成了两个月的 150 ± 5 PFlops/s·days 计算量的训练(见图 4)。这个时间跨度显著长于「手术」变化的频率(每 1-2 周一次)。简单比较来看,如果在 20 次重大手术之后的每一次都从头开始训练,则该项目需要耗时 40 个月,而不是 10 个月(在实际操作时,一般更倾向于做更少的改变)。手术的另一个优势是总是会有能力出色的智能体可供评估,这能显著收紧实验改变的迭代周期。对于 OpenAI Five 的目标(探索全新任务和构建全新环境)而言,持续性的训练具有显著的重大优势。
图 4:OpenAI Five 与 Rerun 的训练过程
当然,在环境是预构建的和一开始就被很好理解的环境中,对「手术」的需求会很小。Rerun 消耗的资源仅有 OpenAI Five 的 20%:如果能提前获取最终训练环境,就没有必要在不同的游戏版本上开始训练。
Rerun 的最终性能比 OpenAI Five 更好,与 OpenAI Five 最终版对战的胜率超过 98%。OpenAI 团队的想法是希望验证最终的代码和超参数可以重现 OpenAI Five 的性能,因此他们就此停止了训练。他们相信 Rerun 还能实现进一步的提升,不仅包括能够继续提升的性能,还有学习率和视野范围等没有最终确定的超参数。
「手术」过程让 OpenAI 能成功地每周修改环境。但是,OpenAI Five 最终达到的水平还是逊于从头开始训练的模型所能实现的水平。学习如何在长时间训练的同时又不影响最终性能是一个很有潜力的未来研究方向。
最后,尽管目前构想的「手术」还远不够完美,有了合适的工具,这种方法能在无需为重启训练的同时,将特定的变化整合进长时间运行的实验中。