在围棋和扑克被AI攻克后,MOBA游戏成了新的检测强化学习的试验场。
这里主要选择了几篇经典论文,重点讲讲他们的网络/结构设计。不会设计特别深的技术细节。感兴趣请阅读原论文。
Grandmaster level in StarCraft II using multi-agent reinforcement learning
星际争霸虽然不算MOBA游戏,但还是最先讲它,因为他是最出圈的论文,被刊载在Nature2019的封面上。
创新点主要有:
这是整体的逻辑架构。可以说,这个架构为之后的MOBA AI研究提供了范式。
首先是环境部分直接对游戏进行编码,从中提取出小地图、士兵单位等信息作为状态,将这些状态作为神经网络的输入,输出相应的动作,用动作改变环境,如此循环直到游戏结束。
整个架构现在看来中规中矩。有两点值得一提。一个是在状态编码的时候把各个单位独立区分,而不像Atari游戏那样简单粗暴地直接在像素层面卷积;另一个就是在动作评估的时候依次对what、who、where、when next action进行评估,这一部分我不是很理解为什么,可能研究人员也是经过多次试错总结出来的最优方式吧。之后的研究都采用这种讲各个信息分别独立评估的方式。
网络的训练主要分两步,首先是监督学习进行“打基础”,其次用强化学习“提能力”。
监督学习很好理解,就是把人类专家的行为当作是模板,用AI对其动作概率进行预测,用KL散度作为loss,从而使得AI的行动尽可能地接近人类专家行为。
在监督学习取得一定成效后,使用强化学习加强AI的强度。这时的AI对手就是AI自己了,用不断自博弈的方式加强自身。
在强化学习的时候,用到了三个小trick:
左下角是人类玩家打法的特征向量,在训练过程中这个向量始终保持一个定值。加入这个向量的目的是为了防止AI在不断自博弈训练的时候“迷失自我”,确保最后训练出来的策略对人类玩家也是有效的。
右边三个输入分别是 特征、单位、地图,不同的信息用不同的方式进行编码,编码后一起输入上面的LSTM。用LSTM的目的就是为了“记住”过去的信息,这是这种动态序贯博弈中非常常用的方法。
LSTM是整个网络结构的关键,里面不包含人类玩家的特征向量。两者会合后就可以用ValueNet对状态进行Value值估计。另外接上MLP后,网络则是依次考虑 动作类型、动作延迟、动作队列、动作单位、目标单位、动作细节等因素。
有了动作,有了动作价值估计,强化学习的AC方法就可以搞起来了。
Dota 2 with Large Scale Deep Reinforcement Learning, 2019
这个AI迭代了好几版,网上也有不少相关的PR稿,我这里是以最终2019年论文为准的。
整体模型如果抽象出来也是异常简单。
观测到的信息加上编码处理,结合5位英雄的信息处理,一起作为LSTM的输入。LSTM就会输出各个动作以及相对应的价值。
这么说可能比较笼统,来具体看一下LSTM后的细节。
左边有三个输入,我们从上往下看。左上角是合法的行动,相当于一个mask。
Unit Embeddings 就是具体单位的信息。
现在可以认为,LSTM中保存了过去的信息、和当前的策略。
对可行的动作ID和LSTM点积,处理后得到选择的动作Chosen Action ID。将选择的动作和单位信息相结合,就得到了目标Target Unit。
此外,利用LSTM和动作参数,经过全连接层也可以评价出各个动作信息的具体值。
也就是第一张图中的Value。
这篇论文很长,也讲了很多技术,但是大多和强化学习在MOBA游戏中的应用没有特别大的关系。其中我觉得最有价值的就是这个Surgery技术,也就是“外科手术”。
这个技术的目的是在网络结构和参数改变的情况下进行Net2Net变换,增加/修改网络结构,同时还保证:
也就是对于任意的观测,新网络会输出和旧网络完全一致的决策。尽管他们网络结构、网络参数不同。
这个技术的目的就是在添加新功能、修改网络结构等情况下,不需要从头开始重新训练。
图中蓝色曲线就是从头到尾的一次训练,每一个黑点就是一次成功的Surgery。右边绿色的曲线就是在所有Suergery结束后,从头开始训练一个网络的训练曲线。
我们发现,Surgery确实没有打断训练的进程。这种技术使得中途改变网络架构成为可能。
Hierarchical Macro Strategy Model for MOBA Game AI,2018
这篇文章参考的技术其实是dota2那篇文章的前身。虽然正式发布时间比dota2那篇文章早,但技术上蛮多都是直接借鉴的。
这篇文章主要是解决用AI打MOBA游戏的三个痛点:
文章的做法就是提出“attention”进行策略的宏观调控。
事先说明一下,这里的attention和深度学习中的注意力机制没有关系。
图中深红色的地方,就是英雄“attention”集中的地方,也就是英雄们要去的地方。可以看到,作为开局分配来说,这个行动方式是合理的。
那这种attention是怎么训练出来的呢?用监督学习的方式。
在上面Task1中,使用手工编码的信息,比如大龙、男爵出现的时机,要求他们在对应时间把attention放到“对的位置”上,输出的label就是他们的attention。训练取得成效后,用完全一样的网络结构训练其他时候的attention,以此方式来体现出AI的大局观。
在实际游戏的时候,AI们会互相传递他们的attention,这样他们互相之间都能够知道队友接下来要做什么,就不会出现比如只需要一个人就能完成的任务,结果所有人都去了,导致浪费了发育的时间。
通过交换attention的方式,以此来达到“显式的合作”。
Mastering Complex Control in MOBA Games with Deep Reinforcement Learning,AAAI2020
提出了一个深度强化学习框架,从系统和算法的角度来解决这个问题。提出的算法包括几种新颖的策略,包括control dependency decoupling,action mask,target action和dual-clip PPO,借助这些策略,可以在系统中有效地训练提出的actor-critic网络。经过MOBA游戏《王者荣耀》的测试,训练有素的AI agent可以在完整的1v1游戏中击败顶尖的职业人类玩家。
系统框架也没有什么特别的地方,走的也是 环境编码-内存池-RL 的套路。和dota2一样,对单位、小地图等进行独立的编码,输出的也是多头结构——每个头对应一个可行的动作。
其中相比dota2,比较新颖的地方就是加入了上面提到的“attention”。虽然这是1v1的情形,但是用attention还是可以作为一个手工训练的引导,让AI尽可能在正确的时间关注正确的位置。
顺带一提,中间的Value也是直接LSTM过一层线性层直接计算得到的。
这就是纯手工设计的了。目的是解决奖励函数“过于稀疏”的问题,毕竟20000帧出一个reward是谁都受不了的。
在设计时还要考虑到这些reward是否稀疏。具体的设计原则论文中也没有详细说明,这里贴出来大家品一品。
Towards Playing Full MOBA Games with Deep Reinforcement Learning
模型训练的时候,采用了三步走战略。个人理解的核心步骤是第二步的策略蒸馏。
第一步,根据固定阵容提取出大量的英雄池,基本属于5v5且五五开的组合。这些专家数据都是从人类高手对局中得到的。用强化学习、监督学习的方式,得到了N个策略作为Teacher策略。存入一个replay buffer中。
第二步,将N个teacher的策略蒸馏出一个student model。这里用的就是模型蒸馏这一块的方法了。最后,成功地将N个老师的策略提取出来,让student model将它们融会贯通。论文中指出,作者们“经验性地发现”,模型大概2天就训好了,而且得到的结果和阵容不太相关。自然而然想到追加第三步。
第三步,英雄池变动。随机选择英雄池,这样一来,AI就可以像人类玩家一样,在不同的英雄配队的情况下愉快地玩耍了。
这部分主要是 student model的结构,整体框架都是大同小异。这里面也有attention的机制(毕竟是同一帮人搞的)。
我加了两条橙色的线加以划分,三个区域分别是:状态编码、值估计、动作选择。
终于写完了,整体总结花了不少功夫,有什么不足的地方请大家指出。谢谢!