美文网首页Unity技术分享我爱编程
Reinforcement Learning in Unity

Reinforcement Learning in Unity

作者: 浪尖儿 | 来源:发表于2018-05-25 11:09 被阅读44次

    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设置自己为完成状态。

    相关文章

      网友评论

      本文标题:Reinforcement Learning in Unity

      本文链接:https://www.haomeiwen.com/subject/szyyjftx.html