当前位置: 首页 > 工具软件 > ml-agents > 使用案例 >

设计训练环境【ML-Agents 官方文档翻译(ML-Agent 1.9.1,Unity 2018-2020)】

乌翰学
2023-12-01

Designing a Learning Environment

本节将介绍设计学习环境的一般性建议,概述 ML-Agents Unity SDK 中关与场景设置相关的方面。
关于 Agent 设计将在 Designing Agents 章节中专门阐述(包含设计Agent,观测,行为和奖励,为Multi-Agent场景定义团队和模仿学习),不在本节做详细介绍。

为了帮助理解 ML-Agents Toolkit 提供的全部功能,建议查阅 API documentation
此外,我们的 example environments 中也有许多不错的资源,
这些示例提供了 ML-Agents Toolkit 几乎所有特性的示例用法。

The Simulation and Training Process

训练和模拟将按照 ML-Agents 中 Academy 类设定的步骤进行。
Academy 协同场景中的 Agent,逐步进行模拟。

训练过程中,外部的 Python 训练进程与 Academy 通信,在 Episode 逐次执行的同时收集数据并优化其神经网络模型参数。
当训练完成后,你可以将训练得到的模型文件添加到 Unity 项目中供后续的推理阶段使用。

ML-Agents Academy 类协同 Agent 模拟执行逻辑如下:

  1. 调用 Academy 的 OnEnvironmentReset 委托。
  2. 调用场景中每个 Agent 的 OnEpisodeBegin() 函数。
  3. 通过调用场景中每个 Agent 的 CollectObservations(VectorSensor sensor) 函数,收集有关场景的信息。
    更新他们的 Sensor 并收集观测向量。
  4. 根据每个 Agent 的策略决定他们下一步的动作。
  5. 调用每个 Agent 的 OnActionReceived() 函数,传递 Agent 根据策略选择的动作。
  6. 如果已经到达了设定的 Max Step 或 Agent 将自身标记为 EndEpisode()
    则调用 Agent 的 OnEpisodeBegin() 函数。

创建一个训练环境(Environment),需要扩展 Agent 类并根据训练环境实现上述函数。

Organizing the Unity Scene

在 Unity 场景中训练和使用 ML-Agents Toolkit,需要根据场景中需要多少不同的 Agent 派生相应个数的 Agent 子类。
Agent 实例应该附加到该 Agent 所代表的 GameObject 上。

Academy

Academy 是一个单例类,协调 Agent 和其决策过程。
同一时间只有同一个 Academy 实例存在。

Academy resetting

将自定义的函数注册到 Academy 的 OnEnvironmentReset 事件中,可以在每个 Episode 开始时调整训练环境。

public class MySceneBehavior : MonoBehaviour
{
    public void Awake()
    {
        Academy.Instance.OnEnvironmentReset += EnvironmentReset;
    }

    void EnvironmentReset()
    {
        // Reset the scene here
    }
}

比如,你可以将 Agent 放置到其起始位置或将目标移动到随机位置。
当在 Python 中调用 UnityEnvironment 类的 reset() 方法时,环境将重置。

重置时应该适当的改变训练环境,以适应不同的情况。
例如训练一个解迷宫的 Agent,训练过程中每个 Episode 都应该更改迷宫本身。
否则,无法训练出通用的解谜宫 Agent,只能学会解决某个特定的迷宫。

Multiple Areas

在示例环境中,可以看到场景中实例化了多个训练区域。
这通常可以加快训练速度,同时收集多个训练区域的数据。
多个训练区域是通过实例化多个具有相同 Behavior Name 的 Agent 来实现的。
所以,如果可能的话,在设计应当考虑让场景支持多个区域。

查看示例,可以看到多训练区域的实际使用。
此外,Making a New Learning Environment 也演示了其使用方法。

Environments

若要在 Unity 中创建训练环境,必须先搭建一个场景,以便场景能够被 Python 的训练进程控制。
搭建场景的注意事项包括:

  • 开始训练时,Unity 训练场景必须能够自动启动。
  • 对于训练时的每个 Episode,Academy 都必须重置场景的有效起始点。
  • Episode 必须有一个明确的结尾 —— 要么设置 Max Steps,要么调用 Agent 的 EndEpisode() 手动结束。

Environment Parameters

课程式学习(Curriculum Learning)和环境参数随机化(Environment Parameter Randomization)是控制环境中特定参数的两种训练方法,确保在每一步都将环境参数更新为正确的值是很重要的。
为此,我们公开了一个名为 EnvironmentParameters 的 C# 类,用于检查这些训练配置中定义的参数值。
请参阅我们的 文档 了解课程式学习(Curriculum Learning)和环境参数随机化(Environment Parameter Randomization)的详细内容。

我们建议利用 Academy.Instance.EnvironmentParameters 从 Agent 的 OnEpisodeBegin() 函数中修改环境。
参见 WallJump 示例中的展示用法(位于 WallJumpAgent.cs

Agent

Agent 类表示场景中的某个 Actor,它能收集观测(Observation)并做出动作(Action)。
Agent 类通常挂在场景中代表了参与者的 GameObject 上 —— 例如,足球游戏中的球员或驾驶模拟中的汽车。
每个 Agent 都必须有适当的 Behavior Parameters

通常,创建一个 Agent 时,应该继承 Agent 类并实现 CollectObservations(VectorSensor sensor)OnActionReceived() 方法:

  • CollectObservations(VectorSensor sensor) 收集 Agent 对环境的观测。
  • OnActionReceived() 执行 Agent 根据策略选择的动作,并给当前状态分配一个奖励。

Agent 的 Behavior Parameters 属性的配置,取决于这些函数如何实现。

同时还必须确定 Agent 是否完成任务或超时。
当 Agent 已经完成任务(或不可挽回地失败)时,可以在 OnActionReceived() 函数中调用 EndEpisode(),手动终止当前 Episode。
也可以将Agent的 Max Steps 属性设置为一个正数,这样 Agent 就会在完成这么多步骤的模拟后结束 Episode。
您可以使用 Agent.OnEpisodeBegin() 函数为再次启动 Agent 做好准备。

请参阅 Agents 以获得关于设计和编码自己的 Agent 的详细指导。

Recording Statistics

我们为开发者提供了一种机制来记录 Unity 环境中的统计数据。
这些统计数据是在训练过程中汇总和生成的。
要记录统计数据,请参阅 C# 的 StatsRecorder 类。

参见 FoodCollector 示例以了解用法(位于FoodCollectorSettings.cs)。

 类似资料: