微信号:Unity-GreaterChina

介绍:Unity官方开发者平台,分享最前沿的技术文章和开发经验,精彩的Unity活动和社区相关信息.

Unity ML-Agents模仿学习示例解析

2018-08-04 13:45 Unity

作为机器学习领域非常引人关注的一种学习方式,模仿学习的出现也是受到了如强化学习相同的热捧。在ML-Agents v0.3版本中,Unity加入了模仿学习的训练方式,为广大开发者提供很大的便利。


我们已经为大家分享过关于Unity ML-Agents强化学习的内容,今天本文将由Unity技术经理鲍健运重温Unity机器学习代理工具ML-Agents模仿学习的直播内容


下面《使用Unity ML-Agents快速掌握模仿学习》的直播视频。



什么是模拟学习

有很多开发者都咨询过这个问题,甚至还会追问“模仿学习与强化学习的区别是什么?”

 

Alexandre Attia和Sharone Dayan在今年1月发表的《模仿学习全面概述》中,做出了定义:模仿学习是学习者尝试模仿专家行为,从而获取最佳性能的一系列任务。这里的“学习者”相应在Unity ML-Agents中就是Agent(代理)。这篇论文中,对于现今比较流行的一些模仿学习算法进行了回顾,展示主要特征,并针对性能和缺点做出对比。

 

如果你像全面了解模仿学习的概况,可以访问这片论文:

https://arxiv.org/abs/1801.06503


下图很清楚地解释模仿学习的工作原理。



下图列举出了强化学习与模仿学习的主要区别,归根结底就是:强化学习是通过“奖励”来驱动的;模仿学习是通过“示范”来驱动

 

如何创建模仿学习训练与实现环境

构建一个模仿学习的其实并不复杂,主要分成下面的步骤:

  1. 创建Teacher和Student二个Brain

  2. 确认Teacher的Brain设置为 Player模式,确定 “Broadcast” 广播功能为启用状态

  3. 设置Student的Brain为External模式

  4. 对应设置Teacher和Student的Agent

  5. 在python/trainer_config.yaml中设置Student的Brain

    ·      trainer 参数为 imitation

    ·      brain_to_imitate设置为Teacher的Brain名字

    ·      batches_per_epoch设置每个时刻进行多少次训练

    ·      调高max_steps,可使得在较长时间内进行训练

  6. 训练准备

    ·      (v0.3)通过Build Settings生成APP用于训练

    ·      (v0.4)直接编辑器内训练

  7.  通过命令行工具输入进行训练

    ·      (v0.3)通过python3 python/learn.py <env_name> --train –slow 启动APP进行训练

    ·      (v0.4)通过python3 python/learn.py --train –slow在编辑器内训练

  8. 操作Teacher观察输出

  9. 观察Student查看模仿情况

  10. 一旦Student有比较好的模仿,Ctrl+C结束训练

  11. 将生成的二进制文件(.bytes)放回Unity工程,将Student的Brain Type改为Internal,重新运行查看其模仿学习训练结果


Unity ML-Agents 模仿学习示例项目

在Unity ML-Agents项目中,打开ML-Agents → Examples → BananaCollectors → Scenes → BananaIL场景,我们会发现如下图中的游戏视图布局。


在Hierarchy中,Academy下面有二个Brain:TeacherBrain和StudentBrain,分别对应了“示范”作用的代理和处理“学习”的代理。



玩家可以通过WASD键,操作戴帽子的Teacher在香蕉地图中移动收集香蕉。收集到黄色的好香蕉会加分,收集到紫色的烂香蕉会减分。还能按空格键攻击其它的代理,冻结它的行动。


在下图中展示的是模仿学习训练的一个片段:当操作Teacher顺时针或逆时针旋转时,从右边的俯视角度可以发现,其它的“学习者”会跟着旋转。


Hover Racer模仿学习示例项目

简单的操作、循环的赛道、固定的奖惩等游戏设计,说明Hover Racer项目非常适合作为模仿学习训练和应用。

 


注意:由于Hover Racer项目中涉及到第三方提供的资源,并未授权允许分发,所以项目不能提供给到大家,只能以图文解释的形式给各位参考。


1

Camera与Cinemachine

从Hierarchy中可以发现,项目中有二个Cinemachine的Virtual Camera作为跟随相机,分别对应到场景中的二个摄像机。



摄像机都是通过调整Viewport Rect参数的方式进行显示的分割。



我们可以看见在Game View呈现出如下图的效果。左边是玩家操作的飞船,右边是AI操作的飞船。AI的既是通过机器学习训练载体,又是最后用于呈现模仿学习训练结果。



2

Ship Player与Ship ML

这是二艘飞船在Hierarchy中的结构,对于飞船控制的脚本Vehicle Movement和机器学习代理的脚本Racing Agent都在Ship Player或Ship ML上面。用于进行射线检测的相关采集对象则包含在其子节点Rays中。



下面4张图片分别展示了飞船左边4个用于进行射线检测的发射点,而右边的部分,即Ray 1到Ray 4与左边的是完全对称的。



在Ray上面主要使用的是ShipRaycaster组件,通过Raycast方法获取从飞船到赛道的距离,在Agent类中会收集这个参数结果,作为重要的观察量。



3

RacingAgent 组件

作为ML-Agents的Agent类的派生类,RacingAgent主要用于实现机器学习代理的主要行为。

 

将Agent进行基本的初始化,设置飞船的起始位置,设置飞船移动操作、射线检测、UI(显示分数)和刚体(速度的管理与控制)的引用。


 

AgentAction方法,用于控制飞船的移动操作,可以看到只要是飞船的操作都可以产生0.1分的奖励,即在强化学习环境下是“鼓励”机器对飞船进行操作。



操作从下图的Player模式设置可以发现,主要就是A和D两个操作,即向左和向右移动。


 

CollectObservations就是收集观察值的操作。收集的观察值主要是:

  1. 每个射线检测器(Ray)获得飞船到赛道的距离,正常距离情况记录下,具体长度和1f(表示正常距离情况);偏离赛道方向(无法获得正常距离情况),记录1f和0f(表示非正常距离情况)

  2. 通过刚体获得当前飞船的速度和角速度,分别记录速度的x、y和z值以及角速度的y值(只有y方向角度旋转相关度高)



AgentReset重设方法,因为飞船偏离正常行径路线时,其实已经是需要进行代理状态的重设,所以在这个方法中主要是将预设好的路径点作为恢复点,当手动重设(manualReset)时,则恢复到赛道出发位置。



怎么判断失误呢?即通过碰撞检测判断飞船是否撞到了赛道上(偏离了正常的行径路线),直接给予-1的“惩罚值”。

 


因为ML-Agents中Reward的值域一般是在-1到1之间,所以说给定一个-1的“惩罚值”已经是非常大了,会对强化学习的结果产生比较大的影响。通过Done方法调用AgentReset操作,进而产生代理的重设。


在模仿学习的训练过程中,虽然Reward的结果不会产生实质的训练影响,但是以上的AgentAction、CollectObservations和AgentReset的操作是正常进行的。


4

Academy Brain

Academy作为机器学习的统筹管理器,需要管理ML-Agents项目中的Brain,而项目中所需要的Brain一定要作为子节点放在Academy下。因为ML-Agents v0.4可以进行编辑器内训练,所以Academy上的Training Configuration和Inference Configuration中除了Time Scale编辑器内训练一样,其它的参数都仅仅在生成APP模式下有用。



ExpertRaceBrain就是左边玩家操作的代理的大脑,模式为Player,并设置了具体输入操作。



StudentRaceBrain顾名思义就是学习者的大脑,即右边机器学习者的大脑,模式为External,准备通过TensorFlow进行机器学习的训练。



5

trainer_config.yaml

与强化学习不同的是,模仿学习一定需要进行外部Python参数设置,参数文件是python目录下的trainer_config.yaml文件,具体如下图所示:



Brain的名字必须与项目中学习者的名字一致,主要的是trainer为imitation,brain_to_imitate为示范的Brain名称,即ExpertRacerBrain。

 

以上的设置确认完毕后就可以开始训练了。


6

编辑器内模仿学习训练

通过机器学习相关的命令行工具(Win 10:Anaconda Prompt / macOS:Terminal),cd进入python目录。然后输入“python learn.py --train –slow”。当然,我们也可以输入“python learn.py –run-id==HoverRacer --train –slow”,指定运行ID为HoverRacer。


注意:模仿学习必须使用“--slow”,不然就是执行强化学习的超高速模式,训练的结果会不理想。


训练到一定程度之后,比如1分钟、3分钟或者更久,可以点击运行按钮或者命令行中Ctrl + C中止训练保存训练文件(python/models/ppo/editor_Academy_ppo.bytes)。


如果run-id为HoverRacer的话,会生成python/models/HoverRacer/editor_Academy_ HoverRacer.bytes。也可以根据实际情况重命名这个二进制文件,例如:1分钟的训练结果可以命名1 Minute.bytes。


7

Unity编辑器检测训练结果

这部分就和上篇强化学习文章想近了,将生成的二进制文件放到Unity工程中。


StudentRacerBrain设置为Internal模式,将Graph Model设置为1 Minute,即1分钟左右的训练结果应用到AI展示。



下面视频中展示的就是1分钟模仿学习训练的结果。



小结

Unity ML-Agents模仿学习分享到这里,希望大家学以致用,掌握运用ML-Agents在项目中。更多Unity官方技术直播课程尽在Unity Connect平台,更多Unity技术内容尽在Unity官方技术论坛(Unitychina.cn) !


推荐阅读


官方活动

ChinaJoy | 精彩Made with Unity体验,让你“酷玩一夏”

Unity将于8月3-5日在W4馆的M301号展位欢迎大家的到来。今年我们邀请到了十多家出色的开发团队,带来了横跨VR/AR,主机,移动端和PC等多个平台的酷炫前卫的Made with Unity作品,期待大家届时光临Unity展位和我们一起引爆夏日游戏狂欢![了解详情


实时优化,智造收益 - Unity Monetization开发者生态沙龙

8月3日,Unity将于举办为期半天的Unity Monetization开发者生态沙龙!本次活动将与大家共同探讨移动游戏开发与变现相关难点与痛点。[了解详情]

报名地址:

https://connect.unity.com/events/unityads


ChinaJoy|Unity Plus加强版限时特惠

8月1-10日, Unity开发者订阅Unity Plus加强版,将享受特价优惠! 原价2628元/年,现在价格仅需1890元/年。活动期限内购买Unity Plus加强版的用户,将获得好礼。[了解详情

订阅地址:

https://store.unity.com/cn/configure-plan/unity-plus


点击“阅读原文”访问Unity官方中文论坛

 
Unity官方平台 更多文章 Unity ChinaJoy 2018圆满落幕,期待来年夏日相聚! 全新优化解决方案:Amplify Impostors 在Unity中创建风格化视觉特效 直播预告|ProBuilder快速关卡建模实践 使用Unity创作《塞尔达传说:旷野之息》风格的视觉特效
猜您喜欢 Django模型1对多和多对多关系 Kafka技术内幕-日志压缩 星云大师亲诵“为教师祈愿文”,老师您辛苦了! AlphaGo 与深度学习 ✪​盘点|中国开源项目哪家强?看看阿里,百度,腾讯,360等都开源了什么