根据 Deepmind 的介绍,AlphaStar 强化学习的骨干算法选用了“实干家-批评家”方法(Actor-Critic,AC)。为了加速训练以及取得稳定和可靠的效果,AlphaStar 使用了大规模并行的 AC 实现,另外结合了若干节约和利用有效经验的技巧来对付星际争霸2任务中学习远期回报的挑战。
AlphaStar 具体使用的 AC 算法是 2018 年 DeepMind提出的 IMPALA 算法 [5]。其设计目的是解决高度并行的大规模学习问题。运行星际争霸2这样的大型游戏环境,令 AI 与之互动产生数据,是一个昂贵的计算任务。由于在 AC 算法框架下对模型参数的求导是一个伴随剧烈波动的随机性操作,用这种方法估计出来的导数来优化策略模型,只能让策略大致上变得越来越好。这个所谓“大致”的靠谱程度,就取决于我们能不能把导数的“剧烈波动”处理得不是那么剧烈。
一个自然的想法是: 把策略多跑几遍,导数多求几次,求平均值 。并行 AC 学习算法[6]就是对上述思路的直接实现—— 由于在 AC 架构中实际产生数据,探索环境的乃是“实干家”。我们在分配计算资源时偏向它,多雇佣实干家(多分配一些相应的策略执行进程),同时生成多条执行轨迹,并通过一个中心学习者从这些多线历史中估算策略参数的导数,结果会更准确,这些实干家相当于中心学习者的分身。IMPALA 框架则更进一步,所有分身实干家都只是“傀儡执行者”,既不需要优化策略参数,也不需要计算导数,只是负责 执行生来所继承的策略 ,把经验数据忠实地记载下来,传回中心学习算法 。

即便不考虑对稳定导数计算的作用,这种做法也极大缓解了高并行复杂模型学习中的节点通讯问题。“傀儡执行者”和学习核心的关系,见上图,它们之间的通信频率比起频繁传递网络 参数要少得 多 (可以完成一个 episode 才更新一次策略参数)。而执行策略的历史数据往往比大型网络的导数(大小约为整个网络参数集)来得经济很多。
AlphaStar 还采用了几项对 AC算法的补充措施。其中重要的一项是,每个 AI 选手在训练期间,都会 把自己的对战历史保存下来 ,供 AC 算法在估计参数导数时使用,即模仿自己的优秀历史。这种在学习者“脑海”里面重放历史经验( Experience Replay )的做法,之前在估值方法与深度神经网络结合的工作中采用过( Deep Q-Learning,DQN ),并首次实现了AI在视频游戏上的突破。在直接学习策略参数的方案中,一般来说,这样做会导致估计偏差——因为 AC 算法“期望”它见到的数据是执行“本”策略得来。单采用参考历史数据的方案算出的模型改进方向,其出发点就有一点过时了。但由于从少量样本估计的模型参数的导数往往会有巨大波动。为更稳定地标定正确的学习方向,可以牺牲终点的最优特性。
还有一个措施,是把学习过的 AI 的策略精髓 抽取 出来,转移到正在学习的 AI 模型中( Policy Distillation )[7]。这个方法可以使用更紧凑的模型(参数小一个数量级)来逼近更大更复杂的模型的表现;可以合并多个策略来形成一个比其中每个个体都更可靠的策略——注意由于优秀策略的分布不是连续的,这不是一个简单平均的问题。比如考虑超级玛丽兄弟:策略A是跳起来踩扁蘑菇,策略B是发射火球然后直接前进,如何在A和B之间折衷相当困难;还可以在策略学习这个层面形成迭代:每一轮的学习都把上一轮学习到策略的精髓转移出来,在此基础上开始。由于Deepmind语焉不详,目前还不清楚这个方法是如何用于AlphaStar训练上的。
3. 神经网络模型和训练
强化学习AI算法。最终落实到具体的调整策略/模型的单个学习步骤上,也就是训练迭代的最内层循环中,还是要回归到监督学习范式,变成“针对这样的输入,鼓励(惩罚)模型产生如此的输出”的优化操作。在传统强化学习研究历史上,建立策略或者估值是理论重点。系统的状态往往被少数几个变量完美的描述,比如一个牛顿力学系统中各个刚体的位置和速度。但是在任何稍微复杂一点的问题中,数据表示问题仍然是一个挑战:即使强化学习算法非常有效,AI也必须知道当前观察到的状态与之前经历过的状态之间的联系。星际争霸游戏这类问题,其观测是十分复杂的对象(序列),于是我们也就要面对统计学习中的典型问题: 通过分析数据,建立(输入,输出)之间的联系 。
目前大家的共识是,这个问题的核心是 把输入的数据转换成一种 有效的表示 ,这个“有效”是从期望产生的输出结果的角度来评判的。具体一点说,如果我们的训练数据中有两个样本(输入A,输出A)和(输入B,输出B),后来又观测到了(输入C)。一个好的输入数据的表达应当能帮助我们估计想要的“输出C”。比如我们做完“输入A->表达A”,“输入B->表达B”和“输入C->表达C”,然后比一比相似度(表达C,表达A)和(表达C,表达B),然后从A和B当中挑选更相似的那个,用它的输出来预估C的输出。如果这种估计方式真的能得到对于C来说合适的输出,我们说这个表达方式对于这个数据分析任务来说是好的。如果能完美的完成这个相似度辨别的任务,那么很多问题就可以简化成“查询一下现在遇到的状况跟训练时碰到的哪个情况类似,照当初的经验办理”。从另一方面说,如果能将每一个原始数据样本变换到一个多维向量,这些向量之间可以用简单的做差算距离来衡量相似度,那么这个变换也算解决了衡量数据样本之间的相似度的问题。这个任务有个术语叫做“数据表示”。