利用Deep Reinforcement Learning训练王者荣耀超强AI

Mastering Complex Control in MOBA Games with Deep Reinforcement Learning

      • (一)知识背景
      • (二)系统架构
      • (三)算法结构
        • 3.1 Target Attention
        • 3.2 利用LSTM学习技能连招释放
        • 3.3 Decoupling of Control Dependencies
        • 3.4 Action Mask
        • 3.5 Dual-Clip PPO
      • (四)实验配置

        2019年12月20号,腾讯AI Lab发布了一篇paper,称他们利用深度强化学习技术训练了出了一个超强AI,该AI能轻松击败顶尖水平的职业选手。在论文的最后贴出了AI与多名职业选手的交战情况:

从上图可知,每位选手使用自己最擅长的英雄与AI进行1V1对战,无一例外都输给了AI,除了TS的Nuan Yang使用韩信拿下了一个AI人头外,其余玩家都没能击杀AI一次。那么腾讯到底是怎样训练自己AI的呢?在发布的这篇paper中介绍了整个训练系统的框架以及算法流程,下面就来关注一下腾讯是如何完成自己超强AI训练的吧。

(一)知识背景

        当前使用AI玩对抗性游戏的主要分两种:以星际为首的RTS游戏,和以DOTA为首的MOBA游戏。两种游戏侧重的学习难点不同:对于星际类的游戏来说,单个unit的行为较为简单,主要学习的是如何进行兵力组选择和进攻策略;而对于DOTA类的游戏来说,对于一个英雄的操作来说是相当复杂的(涉及到技能连招,攻击目标选择,走位等等),因此这类游戏主要学习的是单英雄的操控。
论文中介绍,训练AI的方法同样也是基于actor-critc的神经网络,但在此基础上针对性的做出了一些改进:

  1. 利用人类先验知识来减少动作探索空间。
  2. 将一个人为操作下的多个子操作独立开来。
  3. 设定攻击目标选定网络,用于选定攻击目标。
  4. 使用改进PPO算法,论文中称为dual-clip PPO。
  5. 使用LSTM来学习英雄技能连招的释放。
  6. 在系统设计方面,为了快速产生大规模的数据样本,使用多个不同游戏场景同时产生数据并存到Memory Pool中,并使用多个RL学习器并行学习。

在训练完成后,期望训练AI能够完成进攻、诱导、防御、欺骗和技能连招释放的能力。由于游戏中英雄之间技能相差非常大,因此对每个英雄来说都需要训练一个独立的控制AI。对于每一个英雄,AI Lab使用18,000个CPU核以及48张P40显卡(¥14600一张)进行训练学习。每张GPU每秒可训练80000个样本数据,算下来每天训练的数据等于人类500年的学习量。

(二)系统架构

        为了加快训练速度,这就需要加大batch size。针对这个问题,AI Lab设计了四个特别的模块,这些模块之间彼此独立:Reinforcement Learning Learner、AI Server、Dispatch Module 和 Memory Pool。

AI Server 是为了获取样本数据而设计的模块,在Server中涵盖了AI与环境之间交互的所有逻辑。Server会产生多组episodes,在这些episodes中我方AI使用来自RL Learner的行为策略,而对手的行为则是使用Boltzman 探索算法(一种基于游戏状态特征提取的算法)进行预测。

Dispatch Module 的用于对Server 产生的sample数据(回报、特征、行为选择概率等)进行收集,将这些数据进行压缩后存储到Memory Pool中去。一个Dispatch Module可以连接多个AI Server以便于接收多个Server的输出数据以增加Dispatch Moudule的利用率(毕竟压缩加传输速度要远远快于Server生成一个episode的速度)。

Memory Pool 主要用于对训练数据的存储。它使用一个循环队列来存储数据,根据数据生成时间进行排序。由于是循环队列模式,因此支持变长样本。

RL learner 是一个分布式的训练环境,由于需要大规模的batch size,多个RL learners分别去获取Memory Pool中的样本数据,并将这些Learners捆绑在一起(当成一个大的RL Learner)。那么每个Learner都会得到不同的梯度结果,如何去统一这些梯度结果呢?该论文使用 ring allreduce algorithm 对所有梯度值进行平均。将平均后的值当成每一个Leaner的梯度进行计算。

(三)算法结构

        训练AI使用基于actor-critc的神经网络,其输入有3个:游戏画面向量fif_ifi,所有种类单位的状态向量集fuf_ufu和游戏状态向量fgf_gfg(包括游戏进行时间、炮台数量等游戏环境信息);输出动作有6个:技能按钮的选择、移动摇杆x偏移、移动摇杆y偏移、技能摇杆x偏移、技能摇杆y偏移和选择哪一个目标对象。论文在普通actor-critic的基础上针对性的做出了一些改进:

  1. 设定攻击目标选定网络,用于选定攻击目标。
  2. 使用LSTM来学习英雄技能连招的释放。
  3. 将一个人为操作下的多个子操作独立开来。
  4. 利用人类先验知识(action mask)来减少动作探索空间。
  5. 使用改进PPO算法,论文中称为dual-clip PPO。

整个算法结构如下图,下面针对每一个点进行阐述:

3.1 Target Attention

        为了实现任务目标的选取,算法中构建了一个目标选择模块(target attention)。整个算法流程如上图所示:首先需要提取出图片特征fif_ifi、向量特征fuf_ufu以及游戏状态信息fgf_gfg,其中fif_ifi由卷积层hih_ihi提取而得,fuf_ufufgf_gfg都是由全连接层提取而得。其中,每个unit都有一个fuf_ufu向量,但由于unit的数量是会变的(比如兵线和炮塔的数量都会随着时间变化),因此通过max-pooling的方法将同一类的unit映射为一个定长向量。此外,每一个fuf_ufu向量在经过若干层全连接层后都会被拆分成两个输出——一个输出representation of unit用于代表该类单位的特征用于后面的action选择,另一个输出attention keys将被用于帮助target attention做决策。这里可以理解为:由于Attention模块是直接接收了fuf_ufu向量作为输入的,因此可认为,在选择哪一个敌方单位作为target的时候,目标选择模块会根据每一类unit的当前状态信息attention keys作为参考来进行决策。

3.2 利用LSTM学习技能连招释放

        当有了每类unit的表征信息representation of unit后,我们将所有的表征向量、图片向量huh_uhufuf_ufu经过了一个convolution层得到的结果)和游戏状态向量hgh_ghgfgf_gfg经过一个全连接层后得到的结果)全部联合起来,并输入一个LSTM网络,该网络用于5个基本行为决策(包含了如何进行技能连招搭配):技能按钮的选择、移动摇杆x偏移、移动摇杆y偏移、技能摇杆x偏移、技能摇杆y偏移。由于LSTM具有处理时序信息的能力,因此它能够学会释放技能Button的选择顺序。

3.3 Decoupling of Control Dependencies

        这个部分主要功能是将一个人为操作分解为若干个独立的子操作。这部分的思想和简单:人为在释放技能的时候不但要选择释放哪一个技能,还需要拖动技能按钮来选择释放方向,这是一个人为操作。但如果把这个人为操作直接当作一个action的话,action space会非常大(技能按钮和方向的组合),因此将一个人为操作分解为多个独立的子行为(技能选择是一个action,释放方向又是另一个独立的action),这样就减少了动作空间。

3.4 Action Mask

        action mask的引入是为了对动作空间进行剪枝以降低探索收敛的难度。action mask是指利用一些人类的先验知识来告诉AI"不应该"做什么。由于在王者的游戏环境中,动作空间非常巨大,因此探索空间也就很大,这时候加入人为只是的引导就能够使AI在学习的时候进行"有效探索"。举例来说,如果一个AI在靠近野区墙壁的时候,企图探索"往墙壁里面行进"这个行为时,action mask会直接告诉AI这个action是不必要的,一定不会有好的reward效用,因此AI就会放弃这一次的"无用探索"。

3.5 Dual-Clip PPO

        在传统的PPO算法中,为了避免计算出的修正系数πθ(a∣s)πθold(a∣s)\frac{\pi_{\theta}(a|s)}{\pi_{{\theta}old}(a|s)}πθold(as)πθ(as)过大(下面用r(θ)r(\theta)r(θ)表示修正系数),会进行一个"上限"限定,当超过这个上限就直接被clip掉,公式如下:
L(θ)=min(r(θ)A^t,clip(r(θ),1−ε,1+ε)A^t)L(\theta) = min(r(\theta)\hat{A}_t, clip(r(\theta), 1-\varepsilon, 1+\varepsilon)\hat{A}_t) L(θ)=min(r(θ)A^t,clip(r(θ),1ε,1+ε)A^t)
这样是work的,但是却忽略了A^t\hat{A}_tA^t为负时的情况,由于取得是min()min()min(),因此若A^t\hat{A}_tA^t为负时会变成梯度绝对值越大越被选择,这样就就违背了"梯度上限"的设计初衷。为此,该论文在原本的clip基础上又做了一次负值的下限clip:
L(θ)=max(min(r(θ)A^t,clip(r(θ),1−ε,1+ε)A^t),cA^)L(\theta) = max(\ min(r(\theta)\hat{A}_t,\ clip(r(\theta),\ 1-\varepsilon,\ 1+\varepsilon)\hat{A}_t),\ c\hat{A}) L(θ)=max( min(r(θ)A^t, clip(r(θ), 1ε, 1+ε)A^t), cA^)
其中,ccc是一个超参数,用于限定clip下限,下图(a)为原本的PPO算法,(b)为dual-PPO算法。

(四)实验配置

        至此,算法和系统部分就介绍完了,最后我们来看一看王者训练模型时的一些参数设置吧:

  • ε\varepsilonε in dual-PPO →\rightarrow 0.2
  • ccc in dual-PPO →\rightarrow 3
  • γ\gammaγ in actor-critic →\rightarrow 0.997
  • Learning rate of Adam Optimizer →\rightarrow 0.0001
  • Using GAE (generalized advantage estimator) to calculate the reward which λ\lambdaλ →\rightarrow 0.95

其中,GAE是一种有效减少梯度估计方差的方法,现在已经被广泛应用在各种策略梯度估计的方法上。以上便是这篇论文介绍的全部内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C和指针之编译出现warning: implicit declaration of function ‘matrix_multiply‘ is invalid in C99问题

1、问题 在我的mac上编译一个c文件,出现下面错误2、原因和解决办法 是因为我用vim的时候,把函数名少写了一个字符导致,把这个函数名改正就行了。

5. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 接口以及场景压测

1. 前言通过之前的学习,我们已经掌握了crank的配置以及对应http基准工具bombardier、wrk、wrk2的用法,本篇文章介绍一下如何将其用于实战,在实际的项目中我们如何使用crank来完成压测任务。2. 项目背景目前有一个项目,我们希望通过…

Pytorch快速入门笔记

Pytorch 入门笔记1. Pytorch下载与安装2. Pytorch的使用教程2.1 Pytorch设计理念及其基本操作2.2 使用torch.nn搭建神经网络2.3 创建属于自己的Dataset和DataLoader2.3.1 编写Dataset类2.3.2 编写Transform类2.3.3 将Transform融合到Dataset中去2.3.4 编写DataLoader类2.4 使用…

详解用65行javascript代码做Flappy Bird

点击查看特效JavaScript做Flappy Bird游戏,代码仅仅65行资源包括:javascript源码:phaser.min.js;main.js;index.html素材:两张图片!素材PS:素材源码下载来我的前端群570946165&#…

C和指针之数组编程练习5 (矩阵相乘)

1、问题 5.如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C。这个矩阵的每个元素是由下面的公式决定的: 例如: 结果矩阵中14这个值是通过2-2加上-6-3得到的,编写一个函数,用于执行两个矩阵的乘法。函数的原型如下: void matrix_mul…

我的技术回顾因ABP框架触发DevOps云原生之路-2020年

我的技术回顾:2015年:我的技术回顾那些与ABP框架有关的故事-2015年2016年:从ABP框架国内社区发展回顾.NET技术变迁-2016年2017年:我的技术回顾那些与ABP框架有关的故事-2017年2018年:我的技术回顾那些与ABP框架有关的故…

半身头像

画的好丑。。。继续加油 转载于:https://www.cnblogs.com/manlurensheng/p/4102631.html

Swift - 操作SQLite数据库(引用SQLite3库)

SQLite轻量级数据库在移动应用中使用非常普遍,但是目前的库是C编写的,为了方便使用,对SQLite相关的操作用Swift进行了封装。这个封装代码使用了一个开源项目SQLiteDB,地址是:https://github.com/fahimf/sqlitedb 重要事…

如何在Clion中使用C++调用Python代码

在很多时候,我们需要在一个c工程项目中调用部分Python代码,这就需要我们实现Python和C之间的交互。交互方式有两种:1. 依靠 TCP 建立的网络通信交互;2. 嵌入式混合语言编程(Embedding Code)。这里主要介绍后…

.NET6之MiniAPI(二十四):用Polly重试

为了保障系统的稳定和安全,在调用三方服务时,可以增加重试和熔断。重试是调用一次失败后再试几试,避免下游服务一次闪断,就把整个链路终止;熔断是为了防止太多的次数的无效访问,导致系统不可知异常。Polly是…

CLion 中使用 C++ 版本的 OpenCV

配置环境: Windows 10CLion 2020OpenCV 3.4.1MinGW-w64 1. 下载 CLion 并配置好 MinGW CLion 下载地址:https://www.jetbrains.com/clion MinGW 安装包下载地址:链接:https://pan.baidu.com/s/1c00uHbcf_jGeDDrVg99jtA 提取码&…

如何理解 C# 中的 System.Void 类型?

咨询区 ordag我知道方法声明成 void 表示不返回什么东西,但我发现在 C# 中 void 不仅仅是一个关键词,而且还是一个真实的类型。void 是 System.Void 的别名,就像 int 的别名是 System.Int32 一样,但为什么不允许直接使用Void类型呢…

获得手机的ip

本文转载至 http://blog.csdn.net/showhilllee/article/details/8746114 iosip手机貌似ASI里获取ip地址的链接不可以了。也曾试过whatismyip,在其网站上的截图获取的ip是正确的,单不知道为什么在我这里却是错误的。所以,在这里分享一下获得手…

Idea maven项目不能新建package和class的解决

如图,新建的maven项目不能新建package 这是因为Java是普通的文件夹,要设置为 现在就可以了

基于文本知识库的强化学习技术——Learning to Win by Reading Manuals in a Monte-Carlo Framework

论文链接:http://people.csail.mit.edu/branavan/papers/acl2011.pdf 文章目录1. 背景介绍2. 将攻略文本引入值函数 Q(s,a)Q(s, a)Q(s,a) 评价2.1 复杂环境下使用传统 Q(s,a)Q(s, a)Q(s,a) 函数的缺陷2.2 设计 Q(s,a,d)Q(s, a, d)Q(s,a,d) 神经网络2.3 模型训练流程…

这是Blazor上传文件的最佳方式吗?

Blazor不得不说真是好东西,极大的提升了开发效率,很多的页面交互功能基本上只需要写很少的代码就能实现了,而且还是无js实现,你也绝对没有想到过,Blazor实现文件上传是有多么简单!先说结论:Blaz…

ubuntu 下安装五笔输入法

2019独角兽企业重金招聘Python工程师标准>>> 从两年开始用五笔的吧,自从我学会用五笔之后,基本上就没有用过拼音了,我记忆中使用拼音也就那么几次,好像都是在远程协助别人的时候,用他们电脑上的拼音。然后我…

openstack horizon国际化分析

2019独角兽企业重金招聘Python工程师标准>>> 参考 官网国际化介绍:https://docs.djangoproject.com/en/1.7/topics/i18n/translation/#module-django.conf.urls.i18n Django模板(网页多语种支持/国际化): http://blog.…

6. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 收集诊断跟踪信息与如何分析瓶颈

1. 前言上面我们已经做到了接口以及场景压测,通过控制台输出结果,我们只需要将结果收集整理下来,最后汇总到excel上,此次压测报告就可以完成了,但收集报告也挺麻烦的,交给谁呢……找了一圈、没找到愿意接手…

被AI人机疯狂单杀?王者荣耀AI“绝悟”亲测体验

文章目录(一) 如何评测“绝悟”的智能程度?(二)“绝悟”个体操作能力分析2.1 草丛埋伏2.2 越塔强杀2.3 技能避伤2.4 技能combo(三)“绝悟”团队意识能力分析3.1 团队支援3.2 团队控龙3.3 反野意…