Unity的机器学习代理

图片

这篇关于Unity机器学习代理的文章是由技术创新者,Unity的活跃开发人员,许多Unity游戏,图形项目和书籍的顾问,经理和作者Michael Lanham撰写的。

Unity开发人员已实现了对机器学习的支持,尤其是增强学习,以为游戏和模拟开发人员创建深度增强学习(DRL)SDK。 幸运的是,由丹尼·兰格(Danny Lange)领导的Unity团队已成功实施了可靠的现代DRL引擎,能够带来令人印象深刻的结果。 Unity使用近端策略优化(PPO)模型作为DRL引擎的基础; 该模型要复杂得多,并且在某些方面可能有所不同。

在本文中,我将向您介绍在游戏和模拟中创建DRL代理的工具和SDK。 尽管该工具具有新颖性和强大功能,但它易于使用,并且具有辅助工具,可让您随时随地学习机器学习概念。 要使用本教程,您需要安装Unity引擎。

安装ML-Agent


在本节中,我将简要讨论安装ML-Agents SDK所必须采取的步骤。 该材料仍处于测试阶段,并且可能因版本而异。 请按照下列步骤操作:

  1. 在计算机上安装Git; 它可以从命令行运行。 Git是一个非常流行的源代码管理系统,并且Internet上有很多关于跨平台安装和使用Git的资源。 安装Git之后,请通过创建任何存储库的克隆来确保它能正常工作。
  2. 打开命令提示符或常规shell。 Windows用户可以打开Anaconda窗口。
  3. 转到要放置新代码的工作文件夹,然后输入以下命令(Windows用户可以选择C:\ ML-Agents):

      git clone https://github.com/Unity-Technologies/ml-agents 
  4. 因此,您可以在计算机上克隆ml-agents存储库并创建一个具有相同名称的新文件夹。 您也可以在文件夹名称中添加版本号。 就像几乎整个人工智能世界一样,团结正在不断变化,至少目前如此。 这意味着新的变化不断出现。 在撰写本文时,我们正在将存储库克隆到ml-agents.6文件夹中:

      git clone https://github.com/Unity-Technologies/ml-agents ml-agents.6 
  5. 为ml-agents创建一个新的虚拟环境并指定版本3.6,如下所示:

      #Windows 
     conda创建-n ml-agents python = 3.6
     
     #Mac
    将文档用于您的首选环境 
  6. 使用Anaconda再次激活您的环境:

     激活ml代理 
  7. 安装TensorFlow 在Anaconda中,可以使用以下命令完成此操作:

      pip install tensorflow == 1.7.1 
  8. 安装Python软件包。 在Anaconda中,输入以下内容:

    cd ML-Agents #from root folder cd ml-agents or cd ml-agents.6 #for example cd ml-agents pip install -e . or pip3 install -e . 
  9. 因此,您将安装所有必需的Agents SDK程序包。 这可能需要几分钟。 不要关闭窗户,它将很快派上用场。

因此,我们为ML-Agent安装并配置了Unity Python SDK。 在下一节中,我们将学习如何设置和训练Unity提供的众多环境之一。

代理商培训


现在,我们可以立即着手开展业务,并探索使用深度强化学习(DRL)的示例。 幸运的是,新代理的工具包中有几个示例可以演示引擎的功能。 打开Unity或Unity Hub,然后执行以下步骤:

  1. 单击“项目”对话框顶部的“打开项目”按钮。
  2. 找到并打开UnitySDK项目文件夹,如屏幕截图所示:


    打开Unity SDK项目
  3. 等待项目加载,然后打开编辑器底部的“项目”窗口。 如果打开一个窗口,要求您更新项目,则选择是或继续。 当前,所有代理代码都向后兼容。
  4. 找到并打开GridWorld场景,如屏幕截图所示:


    打开GridWorld场景的示例
  5. 在“层次结构”窗口中选择GridAcademy对象。
  6. 转到“检查器”窗口,然后在“大脑”字段旁边单击图标以打开“大脑选择”对话框:

  7. 选择GridWorldPlayer的大脑。 这个大脑属于玩家,也就是说,玩家(您)可以控制游戏。
  8. 单击编辑器顶部的“播放”按钮,然后观察环境。 由于现在已将游戏设置为控制玩家,因此可以使用WASD键移动立方体。 任务是将蓝色立方体移至绿色+符号,同时避开红色X。

在游戏中变得舒适。 请注意,该游戏只能在特定时间段内运行,并且不基于回合制。 在下一节中,我们将学习如何使用DRL代理运行此示例。

大脑里有什么?


ML-Agents平台的令人惊奇的方面之一是能够快速轻松地从播放器管理切换到AI /代理管理的能力。 为此,Unity使用“大脑”的概念。 大脑可以由玩家控制,也可以由代理(学习大脑)控制。 最令人惊奇的是,您可以组装游戏并将其作为玩家进行测试,然后在RL代理的控制下进行游戏。 因此,可以使用AI来控制任何书面游戏。

在Unity中设置和启动RL代理培训的过程非常简单。 Unity使用外部Python建立学习大脑的模型。 使用Python非常有意义,因为已经围绕它构建了多个深度学习(DL)库。 要在GridWorld中训练代理,请完成以下步骤:

  1. 再次选择GridAcademy,然后在Brains字段而不是GridWorldPlayer中选择GridWorldLearning大脑:


    切换到使用GridWorldLearning Brain
  2. 选中右侧的控制框。 这个简单的参数表明大脑可以从外部进行控制。 必须启用此选项。
  3. 在“层次结构”窗口中选择trueAgent对象,然后在“检查器”窗口中,将“网格代理”组件中的Brain属性更改为GridWorldLearning脑:


    GridWorldLearning大脑工作的代理
  4. 在此示例中,我们需要Academy和Agent都使用相同的GridWorldLearning大脑。 切换到Anaconda或Python窗口,然后选择ML-Agents / ml-agents文件夹。
  5. 使用ml-agents虚拟环境在Anaconda或Python窗口中运行以下命令:

      mlagents-learn config / trainer_config.yaml --run-id = firstRun --train 
  6. 这将启动Unity PPO培训模型和具有指定配置的示例代理。 在某个时刻,命令提示符窗口将要求您使用加载的环境启动Unity编辑器。
  7. 在Unity编辑器中单击“播放”以启动GridWorld环境。 不久之后,您应该会看到代理培训并输出到Python脚本窗口:


    在学习模式下运行GridWorld
  8. 请注意,mlagents-learn脚本是构建RL模型以运行代理的Python代码。 从脚本的输出中可以看到,需要配置多个参数(超参数)。
  9. 让代理学习几千次迭代,并注意其学习速度。 事实证明,这里使用的称为PPO的内部模型是非常有效的学习模型,可以完成许多不同的任务,非常适合游戏开发。 借助功能强大的设备,代理商可以在不到一个小时的时间内完成学习。

让代理进一步学习,并探索其他方式来跟踪代理的学习过程,如下一节所述。

使用TensorBoard监控学习


使用RL模型或任何DL模型训练代理通常是一项艰巨的任务,需要注意细节。 幸运的是,TensorFlow有一套称为TensorBoard的图表工具,您可以使用它们来监视学习过程。 请按照以下步骤启动TensorBoard:

  1. 打开Anaconda或Python窗口。 激活ml-agents虚拟环境。 不要关闭正在运行训练模型的窗口; 我们需要它继续。
  2. 转到ML-Agents / ml-agents文件夹并运行以下命令:

      tensorboard --logdir =摘要 
  3. 因此,我们在自己的内置Web服务器上启动TensorBoard。 您可以使用上一条命令后显示的URL加载页面。
  4. 输入窗口中所示的TensorBoard的URL,或在浏览器中键入localhost:6006或计算机名:6006。 大约一个小时后,您应该会看到以下内容:


    TensorBoard图表窗口
  5. 上一个屏幕截图显示了图形,每个图形都显示了培训的一个独立方面。 要了解我们的代理商的培训方式,您需要处理以下每个图,因此我们将分析每个部分的输出:

  • 环境:此部分显示代理如何在整个环境中表现自己。 以下是具有首选趋势的图表的更详细视图:


“环境”部分的图形的详细图片

  • 累积奖励:这是使代理最大化的总奖励。 通常,它有必要增加,但是由于某些原因它可能会减少。 始终最好将1到-1之间的奖励最大化。 如果进度奖励超出此范围,则也需要解决此问题。
  • 剧集长度:如果该值减小,则通常是一个好兆头。 最终,情节越短,训练就越多。 但是,请记住,如果有必要,情节的长度可能会增加,因此图片可能会有所不同。
  • 经验教训:此图可以清楚地表明座席在哪个课程中; 它旨在用于课程学习。
  • 损失:此部分显示了代表保险单和价值的计算损失或成本的图表。 以下是此部分的屏幕截图,其中的箭头指向最佳设置:


    损失和首选培训

  • 策略损失:此图表确定随时间变化的策略量。 政治是定义行动的要素,在一般情况下,此时间表应趋于下降,表明政治正在做出更好的决策。
  • 价值损失:这是价值函数的平均损失。 本质上,它对代理预测其下一状态的值的能力进行建模。 最初,该值应增加,而在薪酬稳定后,该值应减小。
  • 政策:为了评估PPO中行动的质量,使用的是政策的概念,而不是模型。 下面的屏幕快照显示了策略图表和首选趋势:


    政策图表和首选趋势
  • 熵:此图显示了研究代理的大小。 该值需要降低,因为代理可以了解更多有关环境的知识,而需要的研究较少。
  • 学习率:在这种情况下,该值应逐渐线性减小。
  • 价值估算:这是所有座席州访问的平均值。 为了反映代理人不断增长的知识,此价值必须先增长然后稳定。

6.保持代理运行直到完成,并且不要关闭TensorBoard。
7.返回到训练大脑的Anaconda / Python窗口并运行以下命令:

  mlagents-learn config / trainer_config.yaml --run-id = secondRun --train 

8.再次要求您在编辑器中单击“播放”。 这样吧。 让代理开始培训并进行几次会议。 在此过程中,观看TensorBoard窗口,并注意secondRun在图表上的显示方式。 您可以让该代理运行直到完成,但是可以根据需要停止它。

在早期版本的ML-Agent中,您必须首先将Unity可执行文件构建为游戏的学习环境,然后再运行它。 Python的外脑应该以相同的方式工作。 这种方法很难调试代码或游戏中的问题。 在新技术中,消除了所有这些困难。

既然我们已经知道设置和训练代理是多么容易,我们将进入下一部分,在该部分中,我们将学习如何在没有Python外来知识的情况下运行代理,并直接在Unity中执行它。

代理启动


Python训练很棒,但是您不能在真实游戏中使用它。 理想情况下,我们希望构建一个TensorFlow图表并在Unity中使用它。 幸运的是,创建了TensorFlowSharp库,该库允许.NET使用TensorFlow图形。 这使我们能够构建离线TFModels模型,然后将它们注入游戏中。 不幸的是,我们只能使用经过训练的模型,而不能以这种方式进行训练,至少目前还没有。

让我们用我们刚刚为GridWorld环境训练的图的例子来看看它是如何工作的。 将其用作Unity中的内在大脑。 请按照以下部分中的步骤设置和使用您的内脑:

  1. 从此处下载TFSharp插件
  2. 从编辑器菜单中,选择资产| 进口包装 定制包装...
  3. 找到您刚刚下载的资产包,然后使用导入对话框将插件加载到项目中。
  4. 从菜单中,选择编辑| 项目设置。 ``设置''窗口打开(出现在2018.3版中)
  5. 在“播放器”选项中找到“脚本定义符号”字符,并将文本更改为ENABLE_TENSORFLOW,然后启用“允许不安全代码”,如屏幕截图所示:


    设置标志ENABLE_TENSORFLOW
  6. 在“层次结构”窗口中找到GridWorldAcademy对象,并确保它使用Brains | GridWorldLearning。 在Grid Academy脚本的Brains部分中禁用Control选项。
  7. 在Assets / Examples / GridWorld / Brains文件夹中找到GridWorldLearning大脑,并确保设置了Inspector窗口中的Model参数,如屏幕快照所示:


    大脑的模型任务
  8. GridWorldLearning应该已经设置为模型。 在此示例中,我们使用GridWorld示例随附的TFModel。
  9. 单击“播放”以启动编辑器,然后查看代理如何管理多维数据集。

我们现在正在启动Unity预训练环境。 在下一节中,我们将学习如何使用上一节中训练的大脑。

受过训练的大脑负荷


所有Unity示例都具有经过预训练的大脑,可用于研究示例。 当然,我们希望能够将自己的TF图加载到Unity中并运行它们。 要加载训练图,请按照下列步骤操作:

  1. 转到ML-Agents / ml-agents / models / firstRun-0文件夹。 在此文件夹中是GridWorldLearning.bytes文件。 将此文件拖到Unity编辑器中的Project / Assets / ML-Agents / Examples / GridWorld / TFModels文件夹中:


    将字节图拖入Unity
  2. 因此,我们将图形作为资源导入到Unity项目中,并将其重命名为GridWorldLearning1。引擎这样做是因为默认模型已经具有相同的名称。
  3. 在brain文件夹中找到GridWorldLearning,在Inspector窗口中将其选中,然后将新的GridWorldLearning 1模型拖到Brain Parameters的Model字段中:


    将大脑加载到“图形模型”字段中
  4. 在此阶段,我们不需要更改任何其他参数,而是要特别注意大脑的配置方式。 目前,标准设置即可。
  5. 在Unity编辑器中单击“播放”,然后查看代理如何在游戏中成功移动。
  6. 代理在游戏中的成功取决于他的训练时间。 如果您允许他完成培训,则该代理将类似于经过全面培训的Unity代理。

Source: https://habr.com/ru/post/zh-CN454612/


All Articles