本节将介绍设计学习环境的一般性建议,概述 ML-Agents Unity SDK 中关与场景设置相关的方面。
关于 Agent 设计将在 Designing Agents 章节中专门阐述(包含设计Agent,观测,行为和奖励,为Multi-Agent场景定义团队和模仿学习),不在本节做详细介绍。
为了帮助理解 ML-Agents Toolkit 提供的全部功能,建议查阅 API documentation。
此外,我们的 example environments 中也有许多不错的资源,
这些示例提供了 ML-Agents Toolkit 几乎所有特性的示例用法。
训练和模拟将按照 ML-Agents 中 Academy 类设定的步骤进行。
Academy 协同场景中的 Agent,逐步进行模拟。
训练过程中,外部的 Python 训练进程与 Academy 通信,在 Episode 逐次执行的同时收集数据并优化其神经网络模型参数。
当训练完成后,你可以将训练得到的模型文件添加到 Unity 项目中供后续的推理阶段使用。
ML-Agents Academy 类协同 Agent 模拟执行逻辑如下:
OnEnvironmentReset
委托。OnEpisodeBegin()
函数。CollectObservations(VectorSensor sensor)
函数,收集有关场景的信息。OnActionReceived()
函数,传递 Agent 根据策略选择的动作。Max Step
或 Agent 将自身标记为 EndEpisode()
,OnEpisodeBegin()
函数。创建一个训练环境(Environment),需要扩展 Agent 类并根据训练环境实现上述函数。
在 Unity 场景中训练和使用 ML-Agents Toolkit,需要根据场景中需要多少不同的 Agent 派生相应个数的 Agent 子类。
Agent 实例应该附加到该 Agent 所代表的 GameObject 上。
Academy 是一个单例类,协调 Agent 和其决策过程。
同一时间只有同一个 Academy 实例存在。
将自定义的函数注册到 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,只能学会解决某个特定的迷宫。
在示例环境中,可以看到场景中实例化了多个训练区域。
这通常可以加快训练速度,同时收集多个训练区域的数据。
多个训练区域是通过实例化多个具有相同 Behavior Name 的 Agent 来实现的。
所以,如果可能的话,在设计应当考虑让场景支持多个区域。
查看示例,可以看到多训练区域的实际使用。
此外,Making a New Learning Environment 也演示了其使用方法。
若要在 Unity 中创建训练环境,必须先搭建一个场景,以便场景能够被 Python 的训练进程控制。
搭建场景的注意事项包括:
Max Steps
,要么调用 Agent 的 EndEpisode()
手动结束。课程式学习(Curriculum Learning)和环境参数随机化(Environment Parameter Randomization)是控制环境中特定参数的两种训练方法,确保在每一步都将环境参数更新为正确的值是很重要的。
为此,我们公开了一个名为 EnvironmentParameters
的 C# 类,用于检查这些训练配置中定义的参数值。
请参阅我们的 文档 了解课程式学习(Curriculum Learning)和环境参数随机化(Environment Parameter Randomization)的详细内容。
我们建议利用 Academy.Instance.EnvironmentParameters
从 Agent 的 OnEpisodeBegin()
函数中修改环境。
参见 WallJump 示例中的展示用法(位于 WallJumpAgent.cs)
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 的详细指导。
我们为开发者提供了一种机制来记录 Unity 环境中的统计数据。
这些统计数据是在训练过程中汇总和生成的。
要记录统计数据,请参阅 C# 的 StatsRecorder
类。
参见 FoodCollector 示例以了解用法(位于FoodCollectorSettings.cs)。