Files
easy-rl/docs/chapter13/Paper-AlphaStar-Notes.md
David Young daa4d2ce6d Add AlphaStar paper notes
Add AlphaStar paper notes (DeepMind nature-2019)
2021-02-09 16:38:55 +08:00

171 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AlphaStar 论文解读
## AlphaStar以及背景简介
相比于之前的深蓝和go对于星际争霸2等策略对战型游戏使用AI与人类对战难度更大。比如在星际争霸2中操作枯燥是众所周知的要想在PVP中击败对方就得要学会各种战术各种微操和Timing。在游戏中你还得侦查对方的发展做出正确判断进行转型甚至要欺骗对方以达到战术目的。总而言之想要上手这款游戏是非常困难的对不起DeepMind就做到了。
AlphaStar是DeepMind公司与暴雪使用深度强化学习技术进行PC与星际争霸2人类玩家进行对战的产品其在近些年在星际争霸2中打败了职业选手以及99.8%的欧服玩家而被人所熟知。北京时间2019年1月25日凌晨2点暴雪与谷歌DeepMind团队合作研究的星际争霸人工智能“AlphaStar”正式通过直播亮相。按照直播安排AlphaStar与两位《星际争霸2》人类职业选手进行了5场比赛对决演示。加上并未在直播中演示的对决在人类vs AlphaStar人工智能的共计11场比赛中人类只取得了一场胜利。DeepMind也将研究工作发表在了2019年10月的《Nature》杂志上。我们也将对于这篇Paper进行深入的分析下面是论文的链接
[Vinyals, Oriol, et al. "Grandmaster level in StarCraft II using multi-agent reinforcement learning." Nature (2019): 1-5.](https://www.nature.com/articles/s41586-019-1724-z?)
## AlphaStar的模型输入输出是什么——环境设计
构建DRL模型的第一部分就是构建输入输出对于星际争霸2这个复杂的环境paper第一步做的就是将游戏的环境抽象成为许多的数据信息。
### 状态(网络的输入)
AlphaStar将星际争霸2的环境状态分为四部分分别为实体信息Entities、地图信息Map、玩家数据信息Player data、游戏统计信息Game statistics
<img src="img/img1.png" style="zoom:50%;" />
- 第一部分:实体信息,例如当前时刻环境中有什么建筑、兵种等等,并且我们将每一个实体的属性信息以向量的形式表示,例如对于一个建筑,其当前时刻的向量中包含此建筑的血量、等级、位置以及冷却时间等等信息。所以对于当前帧的全部实体信息,环境会给神经网络 $N$ 个长度为 $K$ 的向量,各表示此刻智能体能够看见的 $N$ 个实体的具体信息。(向量信息)
- 第二部分:地图信息,这个比较好理解,也就是将地图中的信息以矩阵的形式送入神经网络中,来表示当前状态全局地图的信息。(向量信息或者说是图像信息)
- 第三部分:玩家数据信息,也就是当前状态下,玩家的等级、种族等等信息。(标量信息)
- 第四部分:游戏统计信息,相机的位置(小窗口的位置,区别于第二部分的全局地图信息),还有当前游戏的开始时间等等信息。(标量信息)
### 动作(网络的输出)
AlphaStar的动作信息主要分为六个部分分别为动作类型Action type、选中的单元Selected units、目标Target、执行动作的队列Queued、是否重复Repeat、延时Delay每一个部分间是有关联的。
<img src="img/img2.png" style="zoom:50%;" />
- 第一部分:动作类型,即下一次要进行的动作的类型是移动小兵、升级建筑还是移动小窗口的位置等等
- 第二部分:选中的单元,即承接第一部分,例如我们要进行的动作类型是移动小兵,那么我们就应该选择具体“操作”哪一个小兵
- 第三部分目标承接第二部分我们操作小兵A后是要去地图的某一个位置还是去攻击对手的哪一个目标等等即选择目的地和攻击的对象
- 第四部分执行动作的队列具体说是是否立即执行动作对于小兵A我们是到达目的地后直接进行攻击还是等待
- 第五部分是否重复做动作如果需要小兵A持续攻击那么就不需要再通过网络计算得到下一个的动作了直接重复以上一个动作的相同的动作即可。
- 第六部分:延时,也就是等候多久才接收网络的输入,可以理解为我们人类玩家的一个操作的延迟等等
## AlphaStar的计算模型是什么呢——网络结构
上面我们说明了AlphaStar网络的输入和输出即状态和动作那么从状态怎么得到动作呢其网络结构是怎么样的呢
<img src="img/img3.png" style="zoom:50%;" />
### 输入部分
<img src="img/img4.png" style="zoom:50%;" />
从上图的红框可以看出模型的输入框架中主要有三个部分即Scalar features标量特征例如前面叙述的玩家的等级、小窗口的位置等等信息、Entities实体是向量即前面所叙述的一个建筑一个兵的当前的所有属性信息、Minimap地图即上面说的图像的数据。
- 对于Scalar features标量特征使用多层感知器MLP就可以得到对应的向量或者说是一个embedding的过程。
- 对于Entities使用NLP中常用的transformer作为encoder
- 对于Minimap使用图像中常用的Resnet作为encoder得到一个定长的向量。
### 中间过程
中间过程比较简单即通过一个deep LSTM进行融合三种当前状态下的embedding进行下一时刻的embedding输出并且将该结果分别送入ValueNetwork、Residual MLP以及Actoin type的后续的MLP中。
<img src="img/img5.png" style="zoom:50%;" />
### 输出部分
正如前面介绍的,输出的动作是前后有关联的,按照顺序
<img src="img/img6.png" style="zoom:50%;" />
- 首先是动作类型Action type使用Deep LSTM的embedding的向量作为输入使用residual MLP得到Action type的softmax的输出结果并传给下一个子模型进行embedding。
- 然后是延时Delay使用上一个上面的embedding的结果以及Deep LSTM的结果一起输入MLP后得到结果并传给下一个子模型进行embedding。
- 接下来是执行动作的队列Queued使用delay的结果以及embedding的结果一起输入MLP后得到结果并传给下一个子模型进行embedding。
- 然后是选中的单元Selected units使用queued的结果、embedding的结果以及Entity encoder的全部结果非平均的结果一起送入到Pointer Network中得到结果并传给下一个子模型进行embedding。这里的Pointer Netowrk为指针网络即输入的是一个序列输出是另外一个序列并且输出序列的元素来源于输入的序列主要用于NLP中在这里很适合与我们的Selected units的计算。
- 接着是目标单元Target unit和目标区域Target point两者二选一进行对于Target unit使用attention机制得到最优的动作作用的一个对象对于target point使用反卷积神经网络将embedding的向量反卷积为map的大小从而执行目标移动到某一点的对应的动作。
## 庞大的AlphaStar如何训练呢——学习算法
对于上面复杂的模型AlphaStar究竟如何来进行训练呢总结下来一共分为4个部分即监督学习主要是解决训练的初始化问题、强化学习、模仿学习配合强化学习以及多智能体学习和自学习面向对战的具体问题下面我们一一分析:
### 监督学习
在训练一开始首先使用监督学习利用人类的数据进行一个比较好的初始化。模型的输入是收集到的人类的对局的信息输出是训练好的神经网络。具体的做法是对于收集到了人类的对局数据在对于每一个时刻解码游戏的状态将每一时刻的状态送入网络中得到以上每一个动作的概率分布最终计算模型的输出以及人类数据的KL Loss并以此进行网络的优化其中在KL Loss中需要使用不同的 Loss 函数例如Action类型的输出即分类问题的loss就需要使用Cross Entropy。而对于target location等类似于回归问题的就需要计算MSE。当然还有一些细节大家可以自行阅读paper。总之经过监督学习我们的模型输出的概率分布就可以与人类玩家输出的概率分布类似。
### 强化学习
这里的目标就是通过优化策略使得期望的reward最大
$$
J(\pi_{\theta}) = \Epsilon_{\pi_{\theta}} \sum_{t=0}r(s_t,a_t)
$$
但AlphaStar的训练的模型使用不是采样的模型即off-policy的模型这是因为其使用的架构为类似于IMPALA的结构即Actor负责与环境交互并采样learner负责优化网络并更新参数而Actor和learner通常是异步进行计算的并且由于前面介绍的输出的动作的类型空间复杂所以导致我们的value function的拟合比较困难。
这里AlphaStar利用了以下的方式进行强化学习模型的构建
- 首先是采取了经典的Actor-critic的结构使用策略网络给出当前状态下的智能体的动作即计算$\pi(a_t|s_t)$ ,使用价值网络计算当前状态下的智能体的期望收益,即计算 $V(s_t) = \Epsilon \sum_{t'=t}r_{t'} = \Epsilon_{a_t}[r(s_t,a_t)+V(s_{t+1})]$。具体的计算方法是:
- 对于当前的状态 $s$ ,计算当前计算出的动作 $a$ 相对于“平均动作”所能额外获得的奖励。$A(s_t,a_t)=[r(s_t,a_t)+V(s_{t+1})]-V(s_t)$即当前动作的预期收益减去当前状态的预期收益。在AlphaStar中UPGOUpgoing Policy Update也得到了应用即UPGO使用了一个迭代变量 $G_t$ 来取代原来的动作预期收益的 $r(s_t,a_t)+V(s_{t+1})$ ,即把未来乐观的信息纳入到我们额外奖励中,上式可改写为:
$$
A(s_t,a_t)=G_t-V(s_t)
$$
$$
G_t=\left\{
\begin{aligned}
r_t+G_{t+1} && Q(s_{s+1},a_{t+1})\geq V(s_{t+1}) \\
r_t+V(s_{t+1}) && otherwise \\
\end{aligned}
\right.
$$
- 在基于上面计算得到的action更新策略梯度即 $\nabla_{\theta}J = A(s_t,a_t)\nabla_{\theta}log \pi_{\theta}(a_t|s_t)$,在我们之前的笔记中也介绍了,如果基于 $\pi_{\theta}$ 的分布不好求解,或者说学习策略 $\pi_{\theta}$ 与采集策略 $\pi_{\mu}$ 不同的话,我们需要使用重要性采样的方法,即 $\nabla_{\theta}J = E_{\pi_{\mu}}\frac{\pi_{\theta} (a_t|s_t)}{\pi_{\mu} (a_t|s_t)} A^{\pi_{\theta}}(s_t,a_t)\nabla_{\theta}log \pi_{\theta}(a_t|s_t)$。当然我们还需防止 $\frac{\pi_{\theta} (a_t|s_t)}{\pi_{\mu} (a_t|s_t)}$ 出现无穷大的情况我们需要使用V-trace限制重要性系数。这也是用于off-policy的一个更新方法在 IMPALA 论文中的4.1小节有所体现。即将重要性系数的最大值限制为1公式可表达如下
$$
\nabla_{\theta}J = E_{\pi_{\mu}}\rho_tA^{\pi_{\theta}}(s_t,a_t)\nabla_{\theta}log \pi_{\theta}(a_t|s_t)
$$
$$
\rho_t = min(\frac{\pi_{\theta} (a_t|s_t)}{\pi_{\mu} (a_t|s_t)},1)
$$
- 利用了TD($\lambda$) 来优化价值网络,并同时输入对手的数据。对于我们的价值函数 $V^{\pi_{\theta}}(s_t)=E_{\pi_{\theta}}\sum_{t'=t}\gamma^{t'-t}r(s_t,a_t)=E_{a_t\sim\pi_{\theta}(\cdot|s_t)}[r(s_t,a_t)+\gamma V(s_{t+1})]$可以使用TD的方法计算MSE损失有如下几种
- $TD(0)$ ,表达式为 $L = [(r_t+\gamma V_{t+1})-V_t]^2$ 即当前step的信息有偏小方差
- $TD(1)$也就是MC方法表达式为 $L = [(\sum_{t'=t}^\infty\gamma^{t'-t}r_{t'})-V_t]^2$即未来无穷个step的信息无偏大方差
- $TD(\lambda)$ 以上两个方法的加权平均。即平衡当前step、下一个step到无穷个step后的结果
- 已知对于 $\lambda \in (0,1)$, $(1-\lambda)+(1-\lambda)\lambda+(1-\lambda)\lambda ^2+...=1$
- $R_t = \lim_{T\rightarrow\infty} (1-\lambda)(r_t+V_{t+1})+(1-\lambda)\lambda(r_t+\gamma r_{t+1}+\gamma^2 V_{t+2})+...$
### 模仿学习
使用模仿学习额外引入了监督学习Loss以及人类的统计量 $Z$ 即对于Build order建造顺序、Build Units建造单元、Upgrades升级、Effects技能等信息进行了奖励。对于统计量 $Z$ ,本质来说是一系列的数据,将其作为输入信息输入到策略网络和价值网络中。另外对于人类信息的利用还体现在前面介绍的使用监督学习进行网络的预训练工作。
### 多智能体学习/自学习
自学习在AlphaGo中得到了应用也就是自己和自己玩Alpha对此做了一些更新即有优先级的虚拟自学习策略对于虚拟自学习就是在训练过程中每一些时间就进行存档并随机均匀的从存档中选出对手与正在训练的智能体对战。而有优先级的虚拟自学习指的是优先挑选能击败我的或者说常能打败智能体的对手进行训练对战评判指标就是概率。对于AlphaStar中其训练的agent分为了三种
- Main Agent 主智能体即正在训练的智能体及其祖先其中有50%的概率从联盟中的所有人中挑选使用有优先级的虚拟自学习策略即能打败我的概率高不能打败我的概率低有35%的概率与自己对战有15%的概率与能打败我的联盟利用者或者老的主智能体对战,通过利用了有优先级的虚拟自学习策略。
- League Exploiter联盟利用者能打败联盟中的所有智能体的agent其按照有优先级的虚拟自学习策略计算的概率与全联盟的对手训练在以70%的胜率打败所有的agent或者距离上次存档 $2 \times10^9$ step后就保存并且在存档的时候有25%概率把场上的联盟利用者的策略重设成监督学习给出的初始化。
- Main Exploiter主利用者能打败训练中的所有agent在训练的过程中随机从3个中挑1个主智能体如果可以以高于10%的概率打败该agent就与其进行训练如果不能就从其他的老主智能体中再挑选对手当以70%的胜率打败全部三个正在学习的策略主智能体,或者距上次存档 $4 \times10^9 $ 个step之后就存并且进行重设初始化的操作。
他们的区别在于:
- 如何选取训练过程中对战的对象
- 在什么情况下存档 (snapshot) 现在的策略
- 以多大的概率将策略的参数重设为监督训练给出的初始化
## AlphaStar实验结果如何呢——实验结果
### 宏观结果
<img src="img/img7.png" style="zoom:50%;" />
图A为训练后的agent与人类对战的结果天梯图具体地刚刚结束监督学习后的AlphaStar可以达到钻石级别而训练到一半20天以及训练完结40天的AlphaStar可以达到GM的级别。AlphaStar已经可以击败绝大多数的普通玩家。
图B为不同种族间对战的胜率。
图C为《星际争霸II》报告的每分钟有效行动分布情况EPM其中蓝色为AlphaStar Final的结果红色为人类选手的结果虚线显示平均值。
### 其他实验(消融实验)
AlphaStar的论文中也使用了消融实验即控制变量法来进一步分析每一个约束条件对于对战结果的影响。下面举一个特别的例子
<img src="img/img8.png" style="zoom:50%;" />
上面的图片表示的是人类对局数据的使用的情况。可以看到如果没有人类对局数据的情况下数值仅仅为149但是只要经过了简单的监督学习对应的数值就可以达到936当然使用人类初始化后的强化学习可以达到更好的效果利用强化学习加监督学习的KL Loss的话可以达到接近于完整的利用人类统计量 $Z$ 的效果。可以分析出AlphaStar中人类对局的数据对于整个model的表现是很重要的其并没有完全像AlphaGo一样可以不使用人类数据的情况。
## 关于AlphaStar的总结
### 总结
- AlphaStar设计了一个高度可融合图像、文本、标量等信息的神经网络架构并且对于网络设计使用了Autoregressive解耦了结构化的action space。
- 模仿学习和监督学习的内容,例如人类统计量 $Z$ 的计算方法
- 复杂的DRL方法以及超复杂的训练策略
- 当然了大量的计算资源Each agent was trained using 32 third-generation tensor processing units (TPUs 23 ) over 44 days. During league training almost 900 distinct players were created.