注:本文章为官方文档翻译,如有侵权行为请联系作者删除
入门指南–原文链接
本指南介绍了在 Unity 中打开我们的一个ML-Agent示例学习环境、在其中训练Agent以及将训练好的模型嵌入到 Unity 环境中的端到端流程 。阅读本教程后,您应该能够训练任何示例环境。如果您不熟悉 Unity 引擎,请查看我们的 背景:Unity页面以获取有用的提示。此外,如果您不熟悉机器学习,请查看我们的 背景:机器学习页面以获取简要概述和有用的提示。
在本指南中,我们将使用3D 平衡球环境,其中包含许多立方体和球(它们都是彼此的副本)。每个立方体都试图通过水平或垂直旋转来防止其球掉落。在此环境中,立方体是一个 Agent(智能体),它会在平衡球的每一步中获得奖励。Agent也会因掉球而受到惩罚。训练过程的目标是让Agent学会将球在头上保持平衡。
让我们开始吧!
安装
如果尚未安装,请按照安装说明进行操作。然后,打开包含所有示例环境的 Unity 项目:
- 通过菜单导航到“包管理器”窗口
Window -> Package Manager
。 - 导航到 ML-Agents 包并单击它。
- 找到
3D Ball
示例并单击Import
。 - 在Project(项目) 窗口中,转到
Assets/ML-Agents/Examples/3DBall/Scenes
文件夹并打开3DBall
场景文件。
理解 Unity 环境
Agent是一个自主的实体,它观察并与环境交互。在 Unity 上下文中,环境是包含一个或多个Agent对象的场景,当然还有Agent与之交互的其他实体。
注意: 在 Unity 中,场景中所有内容的基础对象都是 GameObject 。 GameObject 本质上是其他所有内容的容器,包括行为、图形、物理等。要查看组成 GameObject 的组件,请在场景窗口中选择 GameObject,然后打开 Inspector(检测器) 窗口。Inspector 会显示 GameObject 上的每个组件。
打开 3D Balance Ball 场景后,您可能首先注意到的是,它包含的Agent立方体不止一个,而是多个。场景中的每个Agent立方体都是一个独立的Agent,但它们都具有相同的行为。3D Balance Ball 这样做是为了加快训练速度,因为所有 12 个Agent都会并行参与训练。
Agent
Agent 是观察环境并在环境中采取行动的参与者。在 3D Balance Ball 环境中,Agent 组件放置在 12 个“Agent”游戏对象上。基本 Agent 对象具有一些影响其行为的属性:
- 行为参数— 每个Agent必须有一个行为。行为决定了Agent如何做出决策。
- 最大步数— 定义 Agent 的 一次迭代(episode) 结束前可以进行多少模拟步数。在 3D Balance Ball 中,Agent 会在 5000 步后重新启动。
行为参数:矢量观察空间(Vector Observation Space)
在做出决策之前,Agent会收集关于其所在世界的状态的观察信息。矢量观察是一个浮点数向量,其中包含Agent做出决策的相关信息。
3D平衡球示例的行为参数使用了一个 值为8的Space Size
(即一个8维的向量)。这意味着包含Agent观察结果的特征向量包含八个元素:Agent立方体的旋转的 x
和 z
分量以及球相对位置x
、 y
、 z
和速度的 x
、 y
和 z
分量。
行为参数:动作
Agent以动作的形式获得指令。ML-Agents Toolkit 将动作分为两种类型:连续动作和离散动作。3D 平衡球示例被编程为使用连续动作,这些动作是一组浮点数,可以连续变化。更具体地说,它使用二维向量来控制施加于自身的x
和z
旋转量,以使球在头上保持平衡。
运行预先训练好的模型
我们为Agent 提供了预先训练好的模型(.onnx
文件 ) ,并使用 Sentis在 Unity 中运行这些模型。在本节中,我们将使用预先训练的模型进行演示。
- 在Project窗口中,转到
Assets/ML-Agents/Examples/3DBall/Prefabs
文件夹。展开3DBall
并单击Agent
预制件。您应该在Inspector窗口中看到Agent
预制件 。
注意:3DBall
场景中的平台是使用 3DBall
预制件创建的。您可以通过更新3DBall
预制件而快速更新12个场景。
- 在Project窗口中,将位于
Assets/ML-Agents/Examples/3DBall/TFModels
文件夹中的 3DBall 模型拖动到 Agent GameObject 组件 Inspector 窗口中的Model
属性下。
- 你应该注意到在 层次结构窗口中,每个3DBall预制件的
Agent
节点下的Behavior Parameters
脚本现在都包含一个 标记为3DBall
的Model
对象。 注意:您可以使用场景层次结构中的搜索栏一次选择场景中的多个游戏对象来修改它们。 - 将用于该模型的Inference Device设置为
CPU
。 - 单击Unity 编辑器中的Play按钮,您将看到平台使用预先训练的模型平衡球体。
使用强化学习训练一个新模型
虽然我们为该环境中的Agent提供了预先训练的模型,但您自己创建的任何环境都需要从头开始训练Agent以生成新的模型文件。在本节中,我们将演示如何使用 ML-Agents Python 包中的强化学习算法来实现这一点。我们提供了一个方便的命令mlagents-learn
,它接受用于配置训练和推理阶段的参数。
训练环境
- 打开命令行或终端窗口。
- 导航到您克隆
ml-agents
存储库的文件夹。注意:如果您遵循默认安装,那么您应该能够从任何目录运行mlagents-learn
命令。 - 运行
mlagents-learn config/ppo/3DBall.yaml --run-id=first3DBallRun
config/ppo/3DBall.yaml
是我们提供的默认训练配置文件的路径。该config/ppo
文件夹包含我们所有示例环境(包括 3DBall)的训练配置文件。run-id
是训练的唯一名称。- 当屏幕上显示 “Start training by pressing the Play button in the Unity Editor” 消息时,您可以按下 Unity编辑器中的 “Play” 按钮开始训练。
如果正常运行并开始训练,您应该会看到类似以下的内容:
INFO:mlagents_envs:
'Ball3DAcademy' started successfully!
Unity Academy name: Ball3DAcademy
INFO:mlagents_envs:Connected new brain:
Unity brain name: 3DBallLearning
Number of Visual Observations (per agent): 0
Vector Observation space size (per agent): 8
Number of stacked Vector Observation: 1
INFO:mlagents_envs:Hyperparameters for the PPO Trainer of brain 3DBallLearning:
batch_size: 64
beta: 0.001
buffer_size: 12000
epsilon: 0.2
gamma: 0.995
hidden_units: 128
lambd: 0.99
learning_rate: 0.0003
max_steps: 5.0e4
normalize: True
num_epoch: 3
num_layers: 2
time_horizon: 1000
sequence_length: 64
summary_freq: 1000
use_recurrent: False
memory_size: 256
use_curiosity: False
curiosity_strength: 0.01
curiosity_enc_size: 128
output_path: ./results/first3DBallRun/3DBallLearning
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 1000. Mean Reward: 1.242. Std of Reward: 0.746. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 2000. Mean Reward: 1.319. Std of Reward: 0.693. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 3000. Mean Reward: 1.804. Std of Reward: 1.056. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 4000. Mean Reward: 2.151. Std of Reward: 1.432. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 5000. Mean Reward: 3.175. Std of Reward: 2.250. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 6000. Mean Reward: 4.898. Std of Reward: 4.019. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 7000. Mean Reward: 6.716. Std of Reward: 5.125. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 8000. Mean Reward: 12.124. Std of Reward: 11.929. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 9000. Mean Reward: 18.151. Std of Reward: 16.871. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 10000. Mean Reward: 27.284. Std of Reward: 28.667. Training.
请注意,屏幕上打印Mean Reward
值会随着训练的进行而增加。这是成功训练的积极信号。
注意:您可以使用可执行文件而不是编辑器进行训练。为此,请按照 使用可执行文件中的说明进行操作。
观察训练进度
一旦您按照上一节中描述的方式开始训练,results
目录中就会生成日志文件。为了更详细地观察训练过程,您可以使用 TensorBoard。从命令行运行:
tensorboard --logdir results
然后在浏览器中导航至localhost:6006
端口,查看 TensorBoard中汇总统计的数据,如下所示。就本节而言,最重要的统计数据是Environment/Cumulative Reward
,该值应在训练过程中不断增加,最终收敛接近到100
,这是Agent可以累积的最大奖励。
将模型嵌入到 Unity 环境中
一旦训练过程完成,并且训练过程保存了模型(由Saved Model
消息表示),您就可以将其添加到 Unity 项目中,并将其与兼容的Agent(生成模型的Agent)一起使用。注意: 不要在Saved Model
消息出现后立即关闭Unity窗口。请等待训练程序关闭窗口,或者终端中按下Ctrl+C
。如果您手动关闭窗口,则包含训练模型的.onnx
文件不会导出到 ml-agents 文件夹中。
如果您使用Ctrl+C
提前退出训练并想要恢复训练,请再次运行相同的命令,并附加--resume
标志:
mlagents-learn config/ppo/3DBall.yaml --run-id=first3DBallRun --resume
您训练好的模型位于 results/<run-identifier>/<behavior_name>.onnx
。其中 <behavior_name>
是与模型对应的Agent的名称。该文件对应于您的模型的最新检查点(即训练的最新结果)。您现在可以按照以下步骤将此训练好的模型嵌入到您的Agent中,这些步骤与上面“运行预先训练好的模型”描述的步骤类似。
- 将您的模型文件移入
Project/Assets/ML-Agents/Examples/3DBall/TFModels/
。 - 打开 Unity 编辑器,然后选择3DBall场景。
- 选择3DBall预制件的 Agent 对象。
- 将
<behavior_name>.onnx
文件从编辑器的项目窗口拖到检查器Ball3DAgent窗口中的model处。 - 按下编辑器顶部的 “Play” 按钮。
下一步
- 有关 ML-Agents Toolkit 的更多信息以及有用的背景知识,请查看ML-Agents Toolkit 概述 页面。
- 有关创建您自己的学习环境的“Hello World”介绍,请查看 创建新的学习环境页面。
- 要了解此工具包中提供的更复杂的示例环境,请查看 示例环境页面。
- 有关各种可用训练选项的更多信息,请查看 训练 ML-Agents页面。
鉴于作者水平有限,本文可能存在不足之处,欢迎各位读者提出指导和建议,共同探讨、共同进步。