使用强化深度学习玩MOBA游戏-滕达

2021-04-07

多人在线竞技游戏( Multi-player Online Battle Aren,MOBA),是一个控制操作非常复杂的强化学习问题。在MOBA游戏1 v 1场景下涉及的状态和动作空间,要远比传统的1 v 1游戏,例如棋类游戏,复杂的多。所以,这也导致在这个问题中很难搜索到达到人类水平的控制策略。本文将介绍MOBA游戏的一些背景知识,从计算复杂度、系统设计、算法设计、训练方法、评价标准和优化方法上比较OpenAI和腾讯AI实验室在制作DotA2和王者荣耀人机AI中的异同点。

4. Dota2算法设计

4.1 观察空间设计

前文提到Dota2观测到的状态空间上有近16000个变量,表4.1列举了所有实际观察到的变量,图4.1从感官上列举了人类玩家在游戏中观察的变量,可用以下公式进行简要的汇总:

全局数据(22) + 每个单位详细数据(45) * 189个单位((5英雄+30小兵+21建筑 + 30守卫+ 1鸡) * 2 + 15 * 野怪) + 每个英雄额外数据(25) * 10个英雄 + Modifier(即buff效果,3) * (10英雄 * 10个/英雄 + 179非英雄 * 2个/非英雄) + 每个英雄额外数据(25) * 10个英雄 + 己方英雄额外数据(213) * 5个英雄 + 技能(8) * 10个英雄 * 6个技能/英雄 + 物品(14) * 10个英雄 * 16个物品/英雄 + 附近地图信息(8) * 8 * 8 + 上一次动作信息(310) + 神符(16) * 6 + 小地图(9) * 10 * 10 = 16004

 image.png

表4.1 人类玩家在Dota2中的观测空间

4.2 动作空间设计

Dota 2游戏的输入是通过键盘和鼠标来控制英雄实现的,包括了移动,攻击,释放技能,使用道具等,但这里的输入包括了许多在屏幕上点击拖拽的操作,涉及在空间和时间上进行连续变化的操作,如何合理的进行离散化是动作设计的主要难点。

OpenAI Five在动作上的处理是将各种动作抽象为一个带参数的函数形式,通过不同的函数类型配合不同的参数来模拟不同的动作,可以简单理解如下:

这里的 p 代表primary action,共30种,可以按照动作的目标,分为6类,如表4.3所示,三种参数的含义分别是:

Delay: 延迟,0-3的整数,用于控制对应动作的生效时间,0对应当前帧,3对应当前这个timestep的最后一帧;

Unit selection: 所有可能的189个单位,进行选择,如果选定的单位无效,返回空动作;

Offset: 一个二维的网格,大小为9*9=81,网格中心为施法者自己或者unit selection的对象。

通过上述的设计,完整的动作空间应该包括 30 * 4 * 189 * 81 = 1837080种组合,但实际上大部分情况下,由于动作或者动作目标的限制,许多动作是无效的,在实际的比赛中,平均来说,动作空间的大小在8000 - 80000的范围内)。

 image.png

表4.3 动作目标分类

4.3 奖励设计

reward的设计和权重调整是强化学习中至关重要的一环,AI的设计者需要通过设计reward来引导AI完成某个具体目标以及达到特定具体行为模式。

在解决Dota 2的问题时,为了简化credit assignment的问题,reward是基于事件(包括单个英雄和整个队伍)和加权重的方式实现的,这样的好处是便于理解,和人类的直觉比较接近。

零和:游戏玩法本身是零和的,一方的胜利意味着另外一方的失败,因此折算到所有的reward上,都是零和的,每个英雄在指定事件上获得的reward分数会减去对手全队在同样事件上的平均得分;

 image.png

表4.3 Dota2 奖励设计

在王者荣耀中,奖励设计包括自奖励和全局奖励,考虑到时间惩罚因素,最终奖励是自奖励和全局奖励在时间上的差分:

 image.png

表4.4 王者荣耀奖励设计

4.4 神经网络结构

这些结构化的观察和动作空间在很大程度上决定了所使用的神经网络架构。OpenAI Five使用五个复制神经网络,每个神经网络负责team中的一位英雄的观察和行动。从高层次上讲,该网络包括三个部分:首先处理观察值,并将其汇总到单个向量中,然后由单层大型LSTM处理,然后对LSTM的输出做线性映射产生输出。如下图所示:

 image.png

图4.1 Dota2 AI网络结构图

不同的数据类型有不同的处理方式:

连续型:仅作归一化,无学习处理;

类别型:做嵌入表示;

空间数据:主要是小地图和邻近环境,2层卷积;

无序集合:譬如己方\敌方英雄,小兵,野怪等单位的状态变量,先经过2层全连接

然后分为两路:(1)全集合表示,经过一层max pooling,用于表示该集合的平均状态(2)元素嵌入表示,直接用全连接的输出作为对应单位的嵌入表示

为了告诉每个LSTM它控制哪个团队的英雄,我们将“unit embeddings”输出中的受控英雄的“unit embeddings”附加到“游戏状态”向量中。 五个副本LSTM中的每一个几乎所有输入都是相同的(唯一的区别是附近的地图,先前的动作以及每个单元观测值的一小部分)。 为了允许每个副本在需要时响应其他副本的不相同输入,添加了“cross-hero pool”操作,在该操作中,将5个网络的前25%的向量进行了最大池化操作。这样对于一个英雄来说,全局表示和自己状态的嵌入表示通过一个全连接层进行拼接,然后再经过一个cross-hero pool的操作来获取别的英雄的部分信息,然后输入到一个单层,4096单元的LSTM中。

4.5 策略更新

policy使用PPO来训练,优化算法使用GAE,一种基于优势的标准方差减少技术,可以稳定和加速训练。使用了一个中心化的共享式的 LSTM 模块来训练网络,这一模块会向不同的全连接层提供输入,由不同的全连接网络输出策略和Value。optimizer GPU的中央池接收游戏数据,并将其异步存储在本地的experience buffers中。每个optimizer GPU随机地从experience buffer中采样一个minibatch的数据并计算梯度,使用allreduce对池中各GPU计算出的梯度进行平均,然后将其同步应用于参数。这样,有效batch size是每个GPU上的batch size(120个样本,每个样本有16个时间步)乘以GPU的数量(峰值时最多1536个),总批大小为2,949,120个时间步(包含五个英雄的采样)。

5. 绝悟5V5算法设计

5.1 全局策略

从人为经验中来,分为开局、对线阶段、中局阶段、后局阶段,不同阶段有不同策略。

5.2 分层结构

两个层次:宏观的策略(本文主要内容)和微观的策略(和OpenAI FIVE相同,没有叙述);

两个监督学习模块:判断当前局势的“阶段分类”的Phase模块,预测英雄应该放置位置的Attention模块;

监督的label:Attention ——下一时刻玩家在攻击的位置(正在花时间的位置),Phase—— 根据turrets, baron, dragon, and base资源来设计;

信息传递:Imitated Cross-agents Communication,训练阶段输入attention的label,测试阶段输入attention的估计,能知道队友关注的位置.

 image.png

图5.1 绝悟网络结构

6.绝悟1v1算法设计

6.1新策略

为了更加高效的训练网络,提出了几项新的策略,

(1)注意力机制

(2)应用LSTM

(3)改进PPO

(4)action mask

注意力机制的引入能够有助于在游戏对战中的目标选择。LSTM被用于英雄连击时组合动作的学习,这对于造成伤害至关重要。改进PPO包括两个方面:第一,通过控制依赖项的结构,提出了多标签PPO算法;第二,提出dual-clips PPO算法,这样能够保证大批量处理过程中的收敛性。动作掩码(action mask)是在先验的游戏知识上提出的一种指导算法,它能够指导强化学习的探索过程。

image.png 

图 6.1 绝悟1v1网络结构

6.2 输入特征

下面,对照上图解释一下详细的算法流程。输入包括3个方面的特征,

图像特征fi,可观测到的属性特征fu,例如,玩家选择的英雄、对手选择的英雄、英雄的生命值等,以及可观测到的游戏状态信息fs,例如,游戏时间、被摧毁的塔。然后对这3种特征分别运用卷积、全连接+激活、全连接进行编码,生成hi、hu、hg,这里需要注意的是fu经过一系列的全连接和激活运算之后被分割成了两个部分:单元的表示hu和目标的注意力键值hkeys。

随后利用全连接和LSTM对策略进行建模,hi、hu、hg这些编码经过LSTM映射之后生成hLSTM,随后通过全连接预测出一个动作a,动作按钮包括移动、攻击、技能释放等。

到这里,就把从观测信息到施加动作整个流程给串起来了,但是,实际的训练过程中远不止这些,在很多细节处非常复杂,所以,需要进一步的详细优化。

6.3策略更新

在MOBA游戏中,一个动作往往有多个不同的标签,因此,很难对不同标签之间的关系进行建模,例如,技能类型与技能方向之间的相关性。为了解决这个问题,文中提出一种独立的对待每一个标签的方式(控制关系依赖的解耦),这样就能消除不同标签之间的相关性(多标签PPO)。

解耦之后就带来两个好处,简化策略结构增加了动作的多样性。然而,随着它带来优点的同时,它也带来了一项弊端:由于MOBA游戏中动作和状态空间巨大,动作的解耦进一步增加了训练的复杂性。为了提高训练的效率,动作掩码(action mask)就被引用进了策略的输出层。它是建立在人类玩家丰富先验知识的基础之上,加入了动作之间的相关性,这样就可以减少强化学习中的探索过程。简而言之,action mask的应用能够之间剔除一些不合理的地方,在一些不需要探索的地方就不去探索,这样能够减少训练的复杂性,这里不合理的地方 包括4个方面,物理禁区,例如,地图中的障碍物。技能和攻击的可用性,例如,在冷却时间内不可使用。被对手英雄技能或者装备控制•英雄和物品本身的一些限制。

介绍这个改进算法之间首先要简单介绍一些原始的PPO算法的思想:PPO算法是一种基于Policy Gradient的强化学习算法,根据OpenAI的解释,之前的Policy Gradient算法对步长非常敏感,策略更新过程中如果步长过小,那么策略 更新的速度会非常缓慢。反之,如果策略更新步长过大,那么策略更新波动会非常剧烈,很难收敛。