Unity机器学习:教MO代理跳过墙

过去几年中,强化学习(RL)取得了重大突破:从在原始像素训练中首次成功使用强化学习到开放AI强盗主义者的训练,需要越来越复杂的环境来取得进一步的进步,这有助于团结来了。

Unity ML-Agents工具是Unity游戏引擎中的新插件,可让您将Unity用作培训MO代理的环境构造函数。

从踢足球到散步,从墙壁跳下和训练AI狗打木棍,Unity ML-Agents Toolkit为训练人员提供了广泛的条件。

在本文中,我们将研究Unity MO代理的工作方式,然后我们将教这些代理之一来跳过墙。

图片


什么是Unity ML-Agents?


Unity ML-Agents是Unity游戏引擎的新插件,可让您创建或使用现成的环境来培训我们的代理商。

该插件包含三个组件:



第一个- 学习环境Learning Environment),其中包含Unity和环境元素的场景。

第二个是Python API,其中包含RL算法(例如PPO-近端策略优化和SAC-软角色关键)。我们使用此API来启动培训,测试等。它通过第三个组件(外部通信器)连接到学习环境


学习环境包括什么


培训内容包括各种元素:



第一代理是舞台演员。我们将通过优化称为“大脑”的组件来培训他,在其中记录必须在每种可能状态下执行的操作。

第三个要素,学院,管理代理及其决策过程,并处理来自Python API的请求。为了更好地了解其作用,让我们回顾一下RL过程。可以将其表示为如下所示的循环:



假设代理需要学习如何玩平台游戏。在这种情况下,RL过程如下所示:

  • 代理从环境接收状态S 0-这将是我们游戏的第一帧。
  • 代理基于状态S 0执行动作A 0并向右移动。
  • 环境进入新状态S 1
  • 代理因未死而获得R 1奖励正奖励 +1)。

RL周期形成状态,动作和奖励的序列。代理商的目标是使预期的总回报最大化。



因此,学院向代理发送指令并在其执行过程中提供同步,即:

  • 收集意见;
  • 按照规定的指示选择行动;
  • 动作执行;
  • 如果已达到步骤数或已达到目标,则重置。


我们教特工跳墙


现在我们知道Unity代理的工作原理,我们将训练一个人跳墙。

已经训练好的模型也可以在GitHub上下载

跳墙学习环境


这种环境的目标是教代理如何到达绿色地砖。

考虑以下三种情况:

1.没有墙,我们的经纪人只需要走到瓷砖上即可。

图片

2.代理需要学习如何跳跃才能到达绿色瓷砖。

图片

3.最困难的情况:墙太高,特工无法越过,因此他需要首先跳到白块上。

图片

我们将根据墙的高度向代理介绍两种行为方案:

  • 无墙或墙高低时的SmallWallJump
  • 在高墙的情况下发生BigWallJump

这就是奖励系统的样子:



在我们的观察中,我们没有使用规则的帧,而是使用14个reykast,每个raykast都可以检测到4个可能的物体。在这种情况下,可以将雷卡斯特感知为可以确定它们是否通过物体的激光束。

我们还将在程序中使用全球代理商职位。

图片

在我们的空间中可能有四个选择:



目标是获得平均奖励为0.8的绿色瓷砖

因此,让我们开始吧!


首先,打开UnitySDK项目

在示例中,您需要查找并打开WallJump场景

如您所见,舞台上有很多代理,每个代理都来自同一预制件,并且它们都有相同的“大脑”。

图片

与经典的深度强化学习一样,在启动游戏的多个实例(例如128个并行环境)之后,现在我们只需复制并粘贴代理以具有更多不同的状态。而且,由于我们要从头培训代理,因此首先需要从代理中删除“大脑”。为此,请转到prefabs文件夹并打开Prefab。

接下来,在Prefab层次结构中,您需要选择代理并转到设置。

在“行为参数”中,您需要删除模型。如果我们可以使用多个GPU,则可以将CPU中的推理设备用作GPU。

图片

在“墙跳代理”组件中,必须删除没有墙的案例以及低墙和高墙的大脑。

图片

之后,您可以从头开始培训代理。

对于我们的第一次培训,我们只需更改两种行为场景的培训步骤总数:SmallWallJump和BigWallJump。因此,我们只需30万步就可以实现目标。为此,在config / trainer config.yaml中,将SmallWallJump和BigWallJump案例的max_steps更改为3e5。

图片

为了培训我们的代理,我们将使用PPO(近端策略优化)。该算法包括与环境交互以及使用其更新决策策略方面的经验积累。更新后,先前的事件将被丢弃,并且根据更新后的策略,已经进行了后续数据收集。

因此,首先,使用Python API,我们需要调用一个外部通信器,以便它指示学院启动代理。为此,请打开ml-agents-master所在的终端并键入:

mlagents-learn config/trainer_config.yaml — run-id=”WallJump_FirstTrain” — train

该命令将要求您启动Unity场景。为此,请按编辑器顶部的►。

图片

您可以使用以下命令在Tensorboard中观看对代理的培训:

tensorboard — logdir=summaries

培训结束后,您需要将ml-agents-master / models中包含的已保存模型文件移动到UnitySDK / Assets / ML-Agents / examples / WallJump / TFModels中然后,再次打开Unity编辑器,然后选择WallJump场景,在该场景中打开完成的WallJumpArea对象

之后,选择代理,然后在其行为参数中将SmallWallJump.nn文件拖到模型占位符中。

图片

同时移动:

  1. SmallWallJump.nn(无墙大脑占位符)。
  2. SmallWallJump.nn在Small Wall Brain占位符处。
  3. BigWallJump.nn(无墙大脑占位符)。

图片

之后,按编辑器顶部的►按钮即可完成操作!座席训练配置算法现已完成。

图片

实验时间


最好的学习方法是不断尝试带来新的东西。现在我们已经取得了良好的结果,我们将尝试提出一些假设并进行检验。


将折现系数降低到0.95


因此我们知道:

  • 伽玛值越大,折扣越低。也就是说,代理人更关心长期奖励。
  • 另一方面,伽玛值越小,折扣越大。在这种情况下,代理的优先级是短期补偿。

这个实验的想法是,如果我们通过将色域从0.99减少到0.95来增加折扣,那么短期奖励将是代理商的优先事项-这可能有助于他迅速采取最佳行为策略。



有趣的是,在越过低矮墙的情况下,代理商会努力达到相同的结果。这可以通过以下事实来解释:这种情况非常简单:座席只需要移至绿色瓷砖,并且如果需要的话,可以在前方有墙的情况下跳转。



另一方面,在“大墙跳”的情况下,这会变得更糟,因为我们的经纪人更关心短期奖励,因此不了解他需要爬上白块才能跳过墙。

神经网络复杂性增加


最后,我们假设如果增加神经网络的复杂性,我们的代理是否会变得更聪明。为此,请将隐藏级别的大小从256增加到512。

我们发现在这种情况下,新代理的性能比第一个代理差。这意味着增加网络的复杂性对我们没有意义,因为否则学习时间也会增加。



因此,我们训练了特工跳墙,仅此而已。回想一下,要比较结果,可以在此处下载经过训练的模型

图片

All Articles