Unity的机器学习代理工具
我们曾分享《游戏开发中的AI (1)-入门篇》以及《游戏开发中的AI(2)-基于Q-Learning的强化学习》。这意味着游戏可以在增强学习算法的发展中发挥着作用。作为世界上最受欢迎的创作引擎,Unity正处于机器学习与游戏的十字路口。对我们的使命而言,为机器学习研究者提供最强大的训练场景十分关键。他们能将最新的机器学习技术回馈游戏社区。作为这一努力的第一步,我们很高兴地向大家介绍Unity机器学习代理工具。
https://v.qq.com/txp/iframe/player.html?vid=f13252sck2e&width=500&height=375&auto=0
训练智能代理
机器学习正在改变从自主代理获得我们所期望的智能行为的方式。在过去,行为靠手工编码而来,而现在则是以在训练环境中不断交互的方式教给代理(机器人或虚拟化身)。从工业机器人、无人机和无人驾驶汽车到游戏角色和敌人,都在使用这种方式来进行行为学习。训练环境的质量对于可以学习的行为种类是至关重要的,而且通常需要做出一定的权衡。在虚拟环境中训练代理的典型场景需要一个单个的环境,以及一个与该环境紧密耦合的代理。代理的行为改变环境状态,并为代理提供奖励。
典型的增强学习训练周期
在Unity中,我们希望为那些不断增长的,对运用机器学习开发智能代理感兴趣的群体,设计一个更具灵活性和易用性的系统。此外,我们希望在此同时能充分利用Unity引擎和编辑器的高质量物理和图形,以及简单却强大的开发者控制特性。我们认为这样的组合可以使下列群体获得其他的解决方案可能无法提供的优势:
对研究现实竞争和合作场景中复杂多主体行为感兴趣的学术研究者。
对机器人、无人驾驶汽车和其他工业应用领域的大规模并行训练方案感兴趣的行业研究者。
对在虚拟世界创造各种具有非特定精妙行为的智能代理感兴趣的游戏开发者。
Unity的机器学习代理
我们提供的解决方案称为机器学习代理(简称ML - Agents),并且已经发布了对应SDK的开放测试版,您可以访问Github下载使用。研究者和开发者可使用ML - Agents SDK将由Unity编辑器创建的游戏和模拟程序转换成可训练智能代理的环境。在这个环境中,只需一个简单的Python API即可使用深度增强学习、演化策略或其他机器学习方法对智能代理进行训练。测试版的Unity ML – Agents已作为开源软件发布,其中包含了一套示例项目和基线算法用作新手入门。由于这是首个测试版本,我们正积极收集反馈,并鼓励任何感兴趣的人在GitHub做出贡献。有关机器学习代理工具的更多信息, 请访问:https://github.com/Unity-Technologies/ml-agents。
学习环境
如何在机器学习代理中进行学习环境配置
在任何学习环境下都有的三种主要对象是:
代理
每个代理都可以拥有一组独有的状态和观察,在环境中采取独有的行为,并在环境中获得独有的奖励。一个代理的动作由与之相联的大脑决定。
大脑
每个大脑都定义了一个特定的状态和动作空间,并负责决定每个关联的代理将采取哪些行动。当前版本支持将大脑设定为以下四种模式之一:
外部-动作决策由TensorFlow(或你选择的ML库)决定,我们的Python API负责打开套接字进行通信。
内部(实验性)-动作决策由一个已训练模型决定,该模型使用TensorFlowSharp嵌入项目。
玩家-动作决策由玩家输入决定。
启发式-动作决策由手工编码的行为决定。
学院
一个场景中的学院对象也包含了在环境中所有作为子对象的大脑。每个环境都包含单个学院对象,该对象从以下这些方面定义了环境的范围:
引擎配置-在训练和推理模式下,游戏引擎的速度和渲染质量。
跳帧-在每个代理做出一个新的决定之间要跳过多少引擎步骤。
全局迭代长度-单次迭代的持续时间。到时间后,所有代理都将被设置为完成。
所有连接着设置为外部模式大脑的代理,它们的状态和观察都会被外部通信器(External Communicator)收集,并通过我们的Python API与你选择的ML库进行通信。将多个代理设置到单个大脑,可以以批处理方式进行动作决策,从而在系统支持的情况下获得并行计算的优势。
灵活的训练场景
有了Unity 的机器学习代理工具,各种各样的训练场景都是可能的,这取决于代理、大脑和奖励的连接方式。我们很期待开发者社区会创造出各种新奇和有趣的环境。对于那些训练智能代理的新手来说,下面这些例子可以用来启发灵感。每个都是一个环境配置原型,包含如何使用ML - Agents SDK进行创建的描述。
单个代理:连接单个大脑的单个代理。传统的代理训练方式。可以以任何单人游戏为例,比如Chicken。
https://v.qq.com/txp/iframe/player.html?vid=w0554zfd0xe&width=500&height=375&auto=0同时单个代理:连接到单个大脑的多个具有独立奖赏函数的独立代理。一种传统训练场景的并行版本,可以加速和稳定训练过程。例如,训练12个机器人手臂同时打开一扇门。
https://v.qq.com/txp/iframe/player.html?vid=b0554am0prb&width=500&height=375&auto=0对抗性自我博弈:与单个大脑相连,具有反奖励函数的两个相互作用的代理。在双人游戏中,对抗性自我博弈可以让一个代理变得越来越熟练的同时,总能拥有与之完美匹配的对手:它自己。这是在训练AlphaGo时使用的策略,而最近被OpenAI用于训练打败人类的1v1 Dota 2代理。
合作性多代理:与单个或多个不同大脑相连,共享同一个奖励函数的多个相互作用的代理。在这种情况下,所有的代理都必须共同完成一个无法独立完成的任务。例如,在一个单个代理只能访问部分信息的环境中,代理间需要进行共享才能完成任务或协作解决一个问题。
竞争性多代理:与单个或多个不同大脑相连,具有反奖励函数的多个相互作用的代理。在这种情况下,代理必须相互竞争以赢得竞争,或者获得一些有限的资源。所有的团队运动都属于这种情况。
生态系统:与单个或多个不同大脑相连,具有独立奖励函数的多个相互作用的代理。这种情况可以想象为一个小世界,在这个世界里,拥有不同目标的动物相互作用,例如一个可能有斑马、大象、长颈鹿的热带草原,或者是一个都市环境中的无人驾驶模拟。
附加功能
除了由学院/大脑/代理系统所提供的灵活训练方案之外,机器学习代理工具还包括其它用于提高训练过程灵活性和解释性的功能。
监控代理的决策:由于ML-Agents的通信是双向的,我们在Unity中提供了一个代理监控(Agent Monitor)类,它可以显示已训练代理的各方面信息,比如在Unity环境中的策略和值输出。通过实时提供这些输出,研究者和开发者可以更容易地调试代理的行为。
在每个代理之上是一个价值估计,对应于代理期望的未来回报。当右侧的代理错过球时,价值估计会下降到零,因为它期望当前迭代尽快结束,因此没有额外的奖励。
课程学习(Curriculum Learning):在刚开始训练的时候,代理往往很难学习复杂的任务。课程学习是一种逐渐增加任务难度的过程,使学习更有效率。ML-Agents支持在每次重置环境时设置自定义环境参数。这使得环境中与困难或复杂性相关的元素可以根据训练的进展进行动态调整。
复杂性递增的GridWorld环境的不同可能配置
复杂的视觉观察:与其它平台不同,代理的观察可能局限于单个向量或图像,机器学习代理工具允许每个代理使用多个摄像机进行观察。这使代理能够学会从多个视觉流集成信息,例如,训练无人驾驶汽车时需要多个观察不同视角的摄像头,导航代理可能需要集成空中和第一人称视觉,或某种代理需要同时获得原始视觉输入、以及深度图或对象分割图像。
上图是相同环境的两种不同摄像机视图。当代理同时获得两者时它可以学会利用第一人称和类地图信息击败对手。
模仿学习(即将发布)——直接向代理演示我们希望它执行的行为,而非试图使其通过试错来学习,通常会更直观。在未来的版本中,ML - Agents将提供记录所有在监督学习场景中使用的状态/动作/奖励信息的能力,例如模仿学习。利用模仿学习,玩家可以向代理提供在一个环境中代理应有的行为演示,然后利用这些演示以独立的方式训练一个代理,或者将其作为一个增强学习过程的第一步。
结语
我们很高兴能发布开放测试版的Unity机器学习代理工具,这个版本仅仅是一个开始,对于那些对有兴趣将Unity作为机器学习平台的人,以及那些专注于游戏开发中机器学习潜力的人,我们计划快速迭代并为之提供额外的功能。虽然这个测试版更倾向于前者,但我们将逐渐为后者提供更多支持。如上所述,我们特别希望听到对于未来发布的Unity机器学习代理工具中想要包含哪些用例和特性的声音,我们欢迎大家对GitHub仓库发起Pull请求。请通过 ml-agents@unity3d.com与我们联系,分享反馈和想法。如果项目激起了您的兴趣,欢迎加入Unity机器学习团队!
推荐阅读
点击“阅读原文”进入Unity官方中文社区!