Reinforcement Learning in Unity

Unity中的强化学习 Reinforcement Learning in Unity

强化学习是一种人工智能技术,通过奖励理想的行为来训练agent执行任务。在强化学习过程中,agent会探索其环境,观察事物的状态,并根据这些观察结果采取行动。如果行动能得到更好的状态,agent会收到积极的奖励。如果导致不太理想的状态,那么agent不会收到奖励或负面奖励(惩罚)。当在训练期间学习时,agent会优化其决策,以便随着时间的推移获得最大的回报。

ML-Agents使用称为Proximal Policy Optimization(PPO)的强化学习算法。PPO使用神经网络来逼近目标函数,该目标函数将agent的观察结果映射为其在给定状态下可以采取的最佳行动。ML-Agents PPO算法使用TensorFlow实现,并在单独的Python进程中运行(通过socket与正在运行的Unity应用程序进行通信)。

注意:如果您不是主要研究学习机器和强化学习,只想训练agent完成任务,则可以将PPO训练视为黑箱(black box)。在Unity以及Python训练方面有一些与训练相关的参数可供调整,但你不需要深入了解算法本身就可以成功创建和训练agent。训练部分(https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Training-PPO.md)提供了运行训练过程的分步骤。

模拟和训练过程

培训和模拟由ML-Agents Academy类协调进行。Academy与场景中的Agent和Brain对象一起工作以逐步完成模拟。当Academy已经达到其最大步数或场景中的所有agent完成时,一个episode完成。

在训练期间,外部Python训练进程与Academy进行交流,在收集数据并优化其神经网络模型的同时运行一系列episodes。分配给agent的Brain类型决定了它是否参与训练。External brain与外部进程沟通来训练TensorFlow模型。训练成功完成后,你可以将训练好的模型文件添加到Unity项目中,以便与Internal brain一起使用。

ML-Agents Academy类按如下方式编排agent模拟循环:

1. 调用您的Academy子类的AcademyReset()函数。
2. 调用场景中每个agent的AgentReset()函数。
3. 调用场景中每个agent的CollectObservations()函数。
4. 使用每个agent的Brain类来决定agent的下一个动作。
5. 调用Academy子类的AcademyAct()函数。
6. 为场景中的每个agent调用AgentAction()函数,传递agent Brain选择的动作。(如果agent已完成,则不会调用此函数。)
7. 如果agent已达到其最大步数或者将其自身标记为完成,则调用agent的AgentOnDone()函数。或者,你可以将agent设置为在episode结束之前完成重新启动。在这种情况下,Academy调用AgentReset()函数。
8. Academy达到自己的最大步数时,通过调用Academy子类的AcademyReset()函数再次开始下一个episode。

要创建训练环境,请扩展Academy和Agent类以实现上述方法。Agent.CollectObservations()和Agent.AgentAction()函数是必需的; 其他方法是可选的 - 你是否需要实现它们取决于你的具体情况。

注意:Python
PPO训练进程用于在训练期间与Academy进行通信并控制Academy的API也可用于其他目的。
例如,您可以使用API将Unity用作您自己的机器学习算法的模拟引擎。有关更多信息,请参阅Python
API。

组织Unity场景

要在Unity场景中训练和使用ML-Agents,场景必须包含一个Academy子类以及所需的Brain对象和Agent子类。场景中的任何Brain实例都必须附加到Unity场景层次结构中Academy的子级GameObjects上。Agent实例应附加到代表该Agent的GameObject。

Scene Hierarchy

你必须为每个agent分配一个Brain,但是你可以在多个agents之间共享Brain。每个agent都将独立进行观察并采取行动,但会使用相同的决策逻辑,对于Internal
brain
,则使用相同的经过训练的TensorFlow模型。

Academy

Academy对象总体协调agents及其决策过程。只能将一个Academy对象放置在场景中。

你必须创建Academy类的子类(因为基类是抽象的)。创建Academy子类时,可以实现以下方法(全部都是可选的):

  • InitializeAcademy(): 初次启动时准备环境。
  • AcademyReset(): 为下一个训练集准备环境和agent。根据需要使用此功能在场景中放置和初始化实体。
  • AcademyStep(): 为下一个模拟步骤准备环境。在为当前步骤调用任何AgentAction()方法之前,Academy类将调用此函数。你可以使用此功能在agent采取行动之前更新场景中的其他对象。请注意,agent已经收集了他们的观察结果,并在Academy调用此方法之前选择了一个操作。

基础Academy类还定义了可以在Unity Editor检查器中设置的几个重要属性。对于训练,这些属性中最重要的是Max Steps,它决定了每次训练持续的时间。一旦Academy的步数计数器达到此值,它将调用AcademyReset()函数开始下一个episode。

请参阅Academy(https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Design-Academy.md)了解Academy属性及其用途的完整列表。

Brain

Brain囊括了决策过程,该对象必须是Unity场景层次结构中Academy的子级。每个agent都必须分配一个Brain,但是您可以将同一个Brain与多个agents一起使用。

直接使用Brain类,而不是子类。 Brain行为取决于Brain的类型。在训练期间,将agent的Brain类型设置为“External”。要使用训练好的模型,请将模型文件导入到Unity项目中,并将Brain类型更改为“Internal”。有关使用不同类型的Brain的详细信息,请参阅Brain(https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Design-Brains.md)。如果四种内置类型不能满足您的需求,您可以扩展CoreBrain类以创建不同的Brain类型。

Brain类有几个重要的属性,您可以使用Inspector窗口进行设置。这些属性必须适合使用Brain的agent。例如,“矢量观察空间大小”属性必须与agent完全创建的特征矢量的长度相匹配。有关创建agent和正确设置Brain实例的信息,请参阅agent(https://www.jianshu.com/p/6d40059a3454)。

Agent

Agent类表示场景中的一个行动者(actor),收集观察结果并执行操作。
Agent类通常附加到场景中的GameObject对象 -例如,在足球比赛中的球员对象或车辆模拟中的车对象。 每个agent必须分配一个Brain。

要创建agent,需要扩展agent类并实现基本的CollectObservations()和AgentAction()方法:

  • CollectObservations(): 收集agent对其环境的观察。
  • AgentAction(): 执行agent大脑选择的行动并为当前状态分配奖励。

这些函数的实现决定了分配给此agent的Barin属性该怎样设置。

您还必须确定Agent如何完成任务或超时。Agent完成(或不可撤销地失败)任务后,可以手动将Agent程序设置为在AgentAction()函数中完成。还可以将Agent的Max Steps属性设置为正值,并且Agent在执行了多个步骤后会认为自己已完成。当Academy达到自己的最大步数时,它开始下一episode。如果将Agent的ResetOnDone属性设置为true,则该Agent可以在一个episode中多次尝试其任务。(使用Agent.AgentReset()函数准备Agent以再次启动。)

这里(https://www.jianshu.com/p/6d40059a3454)有更详细的介绍。

环境

ML-Agents中的环境可以是Unity中构建的任何场景。Unity场景提供了Agent进行观察,行动和学习的环境。如何将Unity场景设置为学习环境,这取决于你的目标。
你可能试图解决范围有限的特定强化学习问题,在这种情况下,你可以使用相同的场景进行训练和测试受过训练的agent。或者,您可能会训练agent在复杂的游戏或模拟中操作。在这种情况下,创建专门构建的训练场景可能更加高效和实用。

训练和测试(或正常游戏)场景都必须包含一个Academy对象来控制agent决策过程。Academy定义了几种可以针对训练场景与常规场景设置不同的属性。Academy的配置属性控制渲染和时间尺度。你可以设置训练配置以最大限度地缩短Unity花费渲染图形的时间,以加快训练速度。你可能还需要调整其他的Academy设置。 例如,Max Steps应尽可能缩短培训时间——只需要足够长的时间以便阿根廷完成任务,并在学习过程中有一些额外的时间来“漫游”。在常规场景中,你经常不希望Academy完全重置场景; 如果是这样的话,Max Steps应该设置为零。

在Unity中创建训练环境时,必须设置场景以便可以通过外部训练进程来控制场景。
考虑因素包括:

  • 训练场景必须在训练过程启动Unity应用程序时自动启动。
  • 场景必须至少包含一个External brain
  • 学院必须将场景重置为每个训练集合的有效起点。
  • 训练集必须有一个明确的结局 - 使用Max Steps或每个agent设置自己为完成状态。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容