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 模拟执行逻辑如下:
- 调用 Academy 的
OnEnvironmentReset
委托。 - 调用场景中每个 Agent 的
OnEpisodeBegin()
函数。 - 通过调用场景中每个 Agent 的
CollectObservations(VectorSensor sensor)
函数,收集有关场景的信息。
更新他们的 Sensor 并收集观测向量。 - 根据每个 Agent 的策略决定他们下一步的动作。
- 调用每个 Agent 的
OnActionReceived()
函数,传递 Agent 根据策略选择的动作。 - 如果已经到达了设定的
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)。