从零开始的Unity机器学习之旅(二)——入门指南
上一步:安装本指南逐步介绍了在Unity中打开我们的示例环境,在其中训练Agent并将训练后的模型嵌入Unity环境的端到端过程 。阅读完本教程后,您应该能够训练任何示例环境。如果您不熟悉 Unity Engine,请查看我们的 Background: Unity页面以获取有用的指导。此外,如果您不熟悉机器学习,请查看我们的Background: Machine Learning页面,以获取简要的概述信息和有用的指导。
在本指南中,我们将使用由许多立方体和球组成的agent(它们都是彼此的拷贝副本)的3D平衡球环境。每个agent的立方体都试图通过水平或垂直旋转来防止其上面的小球掉落。在这种环境中,Agent可以从平衡小球过程的每一步中获得奖励。Agent也会因为丢球而受到负面奖励的处罚。训练过程的目标是让agent学会平衡方块上面的球。
让我们开始吧!
安装
如果尚未安装,请按照安装说明进行操作。然后,打开包含所有示例环境的Unity项目:
[*] 启动Unity Hub
[*] 在“项目”对话框中,选择窗口顶部的“添加”选项。
[*] 使用打开的文件对话框,在ML-Agents Toolkit(从Git克隆)
git clone --branch release_1 https://github.com/Unity-Technologies/ml-agents.git 中找到Project文件夹,然后单击“打开”。
[*]在“项目”窗口中,切换到 Assets/ML-Agents/Examples/3DBall/Scenes文件夹并打开3DBall场景文件。
了解什么是Unity环境
Agent是观察环境并与环境互动的自主参与者 。在Unity的上下文中,环境是一个场景,其中包含一个或多个Agent对象,当然还有一个与Agent交互的其他实体。
3DBall场景
注意:在Unity中,场景中所有内容的基本对象都是 GameObject。GameObject本质上是包含其他所有内容的容器,包括行为,图形,物理等。要查看组成GameObject的组件,请在“场景”窗口中选择GameObject,然后打开“检查器”窗口。检查器会显示GameObject上的每个组件。
打开33D Balance Ball场景后,您可能会注意到的第一件事是它不是只有一个,而是包含多个Agent方块。场景中的每Agent方块都是一个独立的,但是它们共享相同的行为。球这样做可以加快3D平衡的训练速度,因为所有十二Agent都同时参与训练。
Agent
Agent是在环境中观察并采取行动的参与者。在3D平衡球环境中,Agent组件被挂载在十二个“特工”游戏对象上。基本Agent对象具有一些影响其行为的属性:
Behavior Parameters-每个代理都必须有至少拥有一个行为。行为决定了Agent如何做出决定。
[*]Max Step-定义在Agent的情节结束之前可以执行多少个模拟步骤。在3D平衡球项目中,Agent经过5000步后重新启动。
行为参数:向量观察空间
在做出决定之前,Agent会收集其对世界状况的观察数据。向量观测值是浮点数的向量,其中包含用了Agent进行决策的相关信息。
上面3D平衡球示例的行为的参数使用Space Size为8,里面表示Agent的观测特征向量包含八个元素:其中x与z表示立方体的旋转、后续的2个 x,y以及z表示球的相对位置和速度。
行为参数:行为
Agent以动作数组形式给出指令。ML-Agents工具包将动作分为两类:连续和离散。3D平衡球示例用连续变化的数字向量表示其连续行为。更具体地说,它使用一个Space Size 为2的行为数组来控制方块的x和z方向旋转,以保持球在其头部上保持平衡。
运行完成训练的模型
示例中已经包含了预先训练好的模型(.onnx文件),我们可以使用 Unity Inference Engine在Unity内部运行这些模型。在本节中,我们将为3D Ball示例使用训练好的模型。
[*]在“项目”窗口中,导航到 Assets/ML-Agents/Examples/3DBall/Prefabs文件夹。展开3DBall并单击Agent预制体。您可以在Inspector 窗口中看到Agent预制件。
注意:3DBall场景中的平台是使用3DBall 预制件创建的。无需单独更新所有12个平台,只需要更新 3DBall预制。
3DBall预制体
[*]在Project窗口中,将位于 Assets/ML-Agents/Examples/3DBall/TFModels 的3DBall.nn文件拖到“Agent Inspector”窗口中 Behavior Parameters (Script)组件的Model属性 中 。
使用3DBall.nn
[*] 你应该注意到,每个3DBall下的Agent中Behavior Parameters组件的Model属性现在都引用了3DBall。 注意:您可以使用Scene Hierarchy中的搜索栏一次选择所有游戏对象来修改一个场景中的多个游戏对象的属性。
[*] 将用于此模型的Inference Device设置为CPU。
[*] 单击Unity编辑器中的Play按钮,您将看到平台使用预训练的模型平来平衡方块上的球。
通过强化学习训练新模型
尽管我们在这个环境中提供了一个训练好的模型,您自可以在任何环境中头开始训练Agent以生成新的模型文件。在本节中,我们将演示如何使用ML-Agents Python软件包中的强化学习算法来完成此任务。我们提供了一个方便的命令mlagents-learn,该命令用于配置训练和推理阶段的参数。
训练环境
[*] 打开命令或终端窗口。
[*] 导航到克隆ml-agents存储库的文件夹(或激活配置好的python虚拟环境)。注意:如果使用默认(没有使用Python虚拟环境)安装,则应该可以从任何目录运行mlagents-learn。
[*] 运行
mlagents-learn config/trainer_config.yaml --run-id=first3DBallRun
[*]config/trainer_config.yaml是我们提供的默认培训配置文件,路径在git工程目录下。其中包括针对我们所有示例环境(包括3DBall)的培训配置。
[*]run-id 是此培训课程的唯一名称。
[*] 当屏幕上显示消息“通过在Unity编辑器中按播放按钮开始训练”时,您可以在Unity中按播放按钮以在编辑器中开始训练。
如果mlagents-learn运行正确并开始训练,您应该会看到以下内容:
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
Vector Action space type: continuous
Vector Action space size (per agent):
Vector Action descriptions: ,
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
summary_path: ./summaries/first3DBallRun
memory_size: 256
use_curiosity: False
curiosity_strength:0.01
curiosity_enc_size:128
model_path: ./models/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打印到屏幕上的值随着训练的进行而增加。这是训练成功的积极信号。
注意:您可以使用可执行文件而不是编辑器进行训练。为此,请按照使用可执行文件的说明进行操作 。
观察培训进度
一旦mlagents-learn按照上一节中所述的方式开始使用培训,该ml-agents目录将包含一个summaries 目录。为了更详细地观察训练过程,可以从命令行运行TensorBoard:
tensorboard --logdir=summaries然后localhost:6006在浏览器中导航到以查看TensorBoard摘要统计信息,如下所示。在本节中,最重要的统计数据是Environment/Cumulative Reward在整个培训过程中应增加的统计数字,最终收敛到100,这是Agent可以累积的最大报酬。
训练信息
Unity中使用训练好的模型
培训过程完成后,培训结果将保存成模型文件(Saved Model消息指示),您可以将其添加到Unity项目中,并与兼容的Agent(生成模型的Agent)一起使用。注意:Saved Model消息出现 后,不要立刻关闭Unity窗口。需要等待培训自动关闭窗口,或者在命令行提示符按下Ctrl+C。如果您手动关闭窗口,则.nn包含训练模型的文件不会导出到ml-agents文件夹中。
如果您早已退出训练Ctrl+C并想恢复训练,请再次运行相同的命令(--run-id需要一样),并附加以下--resume标志:
mlagents-learn config / trainer_config.yaml --run-id = first3DBallRun --resume你的训练模型将在models/<run-identifier>/<behavior_name>.nn这里 <behavior_name>为的名称Behavior Name相对应的模型的Agent。该文件对应于您模型的最新训练结果。现在,您可以通过以下步骤,把这个训练模型应用到您的Agent上。
[*]将模型文件移到中 Project/Assets/ML-Agents/Examples/3DBall/TFModels/。
[*]打开Unity编辑器,然后如上所述选择3DBall场景。
[*]选择3DBall预制代理对象。
[*]将<behavior_name>.nn文件从编辑器的“项目”窗口拖到Ball3DAgent检查器窗口中的model属性栏中。
[*]按下编辑器顶部的“播放”按钮。
感谢作者,成功的训练了一个自己的网络,放上去和其他的小盒明显不一样,动的幅度稍微大了一些[赞]
页:
[1]