2026/9/20 15:30:24

Unity ML-Agents 3D Ball 示例端到端实战:从环境配置、PPO 训练到模型嵌入

Unity ML-Agents 3D Ball 示例端到端实战:从环境配置、PPO 训练到模型嵌入 人工智能强化学习深度学习机器学习游戏开发AI 应用【免费下载链接】ml-agentsThe Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinforcement learning and imitation learning.项目地址https://gitcode.com/gh_mirrors/ml/ml-agents点击查看免费下载3D Balance Ball3D Ball是 Unity ML-Agents Toolkit 中最具代表性的入门示例环境一个平台上的 Agent 需要学会保持小球不掉落。本文以仓库内 Sample.md 为主线完整讲解如何打开示例场景、理解 Agent 的观测与动作设计、用mlagents-learn训练新模型、用 TensorBoard 观察训练曲线并把训练产出的.onnx模型嵌入回 Unity 场景帮助你掌握一套可复用到任何示例环境乃至自建环境的完整工作流。关于 3D Ball 示例本示例使用3D Balance Ball环境场景中包含多个 Agent 立方体平台和若干小球它们彼此是完全相同的副本。每个 Agent 立方体通过绕水平轴x或垂直轴z旋转努力保持头顶的小球不掉落。在该环境中Agent 立方体是一个Agent智能体只要它每保持小球平衡一个仿真步就会获得一个正奖励一旦小球掉落则会获得负奖励并被惩罚。训练的目标就是让所有 Agent 都学会把小球稳稳地顶在头顶上。[!TIP] 你可以把这篇教程当作一个通用模板用同样的流程去训练仓库中的任何一个示例环境如 Crawler、Hallway、FoodCollector 等。仓库中该示例的完整文件位于 Project/Assets/ML-Agents/Examples/3DBall/ 目录下其清单文件 mlagents-sample.json 声明了示例名称、描述和入口场景Scenes/3DBall.unity是 Unity 包管理器与编辑器识别该示例的关键配置。环境准备打开示例场景要使用示例环境必须先完成 ML-Agents 的高级安装Advanced Installation即克隆整个仓库并打开其中的Project文件夹。这一点很关键如果只通过 Package Manager 安装com.unity.ml-agents包是无法访问示例场景的详见 Configure example environments。具体步骤如下在 Unity Hub 中点击Add→Add project from disk打开文件浏览器定位到你本地克隆的ml-agents仓库选择其中的Project文件夹并点击Open选择受支持的 Unity 编辑器版本并启动项目。项目打开后即可在Project窗口的Assets/ML-Agents/Examples下访问所有示例环境。3D Ball 示例的入口场景位于Assets/ML-Agents/Examples/3DBall/Scenes/3DBall.unity对应仓库路径 Project/Assets/ML-Agents/Examples/3DBall/Scenes/3DBall.unity直接双击打开该场景即可。[!NOTE] 在 Unity 中场景里一切对象的基类是GameObject它本质上是一个容器承载行为、图形、物理等各类组件。选中场景中的 GameObject在Inspector窗口中即可查看其挂载的所有组件。理解一个 Unity 强化学习环境一个 Agent 是能够在环境中自主观察并交互的演员而一个 Unity 环境就是包含一个或多个 Agent 对象、以及 Agent 会与之交互的其他实体如小球、平台的场景。打开 3D Balance Ball 场景后你首先会注意到场景里有多个 Agent 立方体。每一个立方体都是一个独立的 Agent但它们共享同一个 Behavior行为。3D Ball 这样设计是为了加速训练12 个 Agent 同时与环境交互相当于并行地为训练贡献样本。Agent 组件Agent 是在环境中进行观察并采取行动的实体。在 3D Balance Ball 中Agent 组件被挂在 12 个 Agent GameObject 上。基础 Agent 对象有一些会影响其行为的属性属性说明Behavior Parameters每个 Agent 都必须有一个 BehaviorBehavior 决定了 Agent 如何做决策。Max Step定义在 Agent 的回合episode结束前最多可以经历多少个仿真步。在 3D Balance Ball 中Agent 每 5000 步会重置一次回合。Behavior Parameters向量观测空间在做决策之前Agent 需要先收集关于自身状态在世界中的观测。向量观测Vector Observation是一个浮点数向量其中包含 Agent 做决策所需的全部相关信息。3D Balance Ball 示例的 Behavior Parameters 使用Space Size观测空间大小为8。这意味着 Agent 的特征向量包含 8 个元素Agent 立方体旋转的x、z分量以及小球的相对位置x、y、z分量和相对速度x、y、z分量。这些观测在源码 Ball3DAgent.cs 的CollectObservations方法中逐项写入public override void CollectObservations(VectorSensor sensor) { if (useVecObs) { sensor.AddObservation(gameObject.transform.rotation.z); sensor.AddObservation(gameObject.transform.rotation.x); sensor.AddObservation(ball.transform.position - gameObject.transform.position); sensor.AddObservation(m_BallRb.linearVelocity); } }可以看到 8 个观测依次是自身旋转 z1 个、自身旋转 x1 个、小球相对位置向量3 个、小球速度向量3 个恰好组成 8 维特征向量。从源码结构看useVecObs开关对应3DBall场景与Visual3DBall场景的差异——后者不勾选该选项改用视觉观测。Behavior Parameters动作空间Agent 以**动作Action**的形式获得指令。ML-Agents 工具包将动作分为两类连续continuous和离散discrete。3D Balance Ball 示例使用的是连续动作即一个可以连续变化的浮点数向量。具体而言它的动作Space Size为2两个数值分别控制 Agent 施加到自身的x和z方向旋转量从而保持小球平衡。这一点同样可以在 Ball3DAgent.cs 的OnActionReceived中看到actionZ与actionX取自actionBuffers.ContinuousActions[0]和[1]经2f * Mathf.Clamp(..., -1f, 1f)映射到实际旋转幅度且当平台旋转超过 ±0.25 弧度时不再继续旋转。该方法的其余部分还定义了本环境的奖励逻辑这是理解训练目标的关键当小球相对平台下坠超过 2 个单位或水平偏离超过 3 个单位时Agent 获得-1f奖励并结束回合EndEpisode否则每步获得0.1f的存活奖励。OnEpisodeBegin则负责在回合开始时随机化平台初始倾角±10°和小球初始位置±1.5 范围保证训练数据的多样性同时通过Academy.Instance.EnvironmentParameters读取mass、scale等环境参数为后续课程式训练curriculum预留了扩展点。[!NOTE] 现代版本中连续与离散动作可以同时存在于同一个 Agent 上由ActionSpec统一描述相关定义可参考 ActionSpec.cs 与 BrainParameters.cs。运行预训练模型Unity 为所有示例 Agent 都附带了预训练模型.onnx文件并借助Sentis推理引擎在 Unity 内部直接运行这些模型关于推理引擎的细节参见 Inference Engine。下面以 3D Ball 的预训练模型为例在Project窗口中进入Assets/ML-Agents/Examples/3DBall/Prefabs文件夹展开3DBall并点击Agent预制体即可在Inspector窗口中查看该预制体。注意3DBall场景中的 12 个平台都是由3DBall预制体实例化出来的。与其逐个修改 12 个平台不如直接修改3DBall预制体一处改动全局生效。在Project窗口中将位于Assets/ML-Agents/Examples/3DBall/TFModels的3DBall模型拖拽到 Agent GameObject 的Behavior Parameters (Script)组件下的Model属性中。此时你会发现Hierarchy窗口中每个3DBall下的Agent的Behavior Parameters上都已经带上了3DBall这个Model。注意也可以借助 Scene Hierarchy 的搜索栏一次性选中多个 GameObject 批量修改。将该模型的Inference Device推理设备设为CPU。点击 Unity 编辑器顶部的Play按钮。现在你就可以看到平台借助预训练模型成功保持小球平衡了。仓库中 TFModels 目录下提供了3DBall.onnx、3DBallHard.onnx、Visual3DBall.onnx三个预训练模型分别对应普通 3DBall、加难版 3DBallHard 与视觉版 Visual3DBall 三个场景对应场景文件也都在 Scenes 目录中。用强化学习训练新模型Unity 为这些环境提供了预训练模型但任何你自己创建的环境都需要从零开始训练 Agent来生成新的模型文件。本节演示如何使用 ML-Agents Python 包中自带的强化学习算法完成这一过程。ML-Agents 提供了mlagents-learn命令它接受一系列参数来配置训练与推理两个阶段。训练环境打开命令行或终端窗口。导航到你克隆ml-agents仓库的目录。注意如果按默认的 安装指南 安装了mlagents-learn你可以从任意目录运行该命令。执行训练命令mlagents-learn config/ppo/3DBall.yaml --run-idfirst3DBallRunconfig/ppo/3DBall.yaml是 Unity 提供的默认训练配置文件路径。仓库中的config/ppo文件夹包含了所有示例环境的训练配置包括 3DBall。--run-id是本次训练会话的唯一名称用于区分不同的训练实验。当屏幕显示Start training by pressing the Play button in the Unity Editor消息时点击 Unity 编辑器中的Play按钮训练即开始在编辑器内进行。训练配置详解config/ppo/3DBall.yaml是本次训练实际使用的完整配置见 3DBall.yamlbehaviors: 3DBall: trainer_type: ppo hyperparameters: batch_size: 64 buffer_size: 12000 learning_rate: 0.0003 beta: 0.001 epsilon: 0.2 lambd: 0.99 num_epoch: 3 learning_rate_schedule: linear network_settings: normalize: true hidden_units: 128 num_layers: 2 vis_encode_type: simple reward_signals: extrinsic: gamma: 0.99 strength: 1.0 keep_checkpoints: 5 max_steps: 500000 time_horizon: 1000 summary_freq: 12000各核心参数的作用如下trainer_type使用的强化学习算法这里为ppoPPO 属于 on-policy 算法。仓库还提供sac、poca等配置见 config/sac 与 config/poca。hyperparametersPPO 的核心超参数。batch_size64与buffer_size12000控制每次更新使用的样本规模learning_rate0.0003为学习率并配合learning_rate_schedule: linear线性衰减beta0.001是熵正则化系数控制探索程度epsilon0.2为 PPO 的裁剪阈值lambd0.99为 GAE 广义优势估计的衰减系数num_epoch3表示每次更新遍历数据的轮数。network_settings神经网络结构。hidden_units128与num_layers2定义隐层规模与层数normalize: true会对观测做归一化显著提升训练稳定性vis_encode_type: simple指定视觉观测的编码方式。reward_signals奖励信号配置。extrinsic即环境外部奖励对应 Ball3DAgent.cs 中的SetRewardgamma0.99为折扣因子strength1.0为奖励权重。keep_checkpoints最多保留 5 个模型检查点。max_steps本次训练最大步数为 500000 步达到后训练自动结束并保存模型。time_horizon1000即每 1000 步做一次优势估计截断限制单条轨迹长度。summary_freq12000即每 12000 步打印一次训练统计并写入 TensorBoard。训练成功启动后的输出如果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 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平均奖励会随着训练推进不断上升——从日志可见步数从 1000 到 10000平均奖励从约 1.24 一路攀升到约 27.28。如果平均奖励长期停滞甚至下降通常意味着超参数需要调整或奖励设计存在问题。这段日志也印证了前面的环境配置Vector Observation space size (per agent): 8与观测空间设置一致Unity brain name: 3DBallLearning说明 Behavior 名为3DBallLearning训练产物将输出到./results/first3DBallRun/3DBallLearning。从实现层面看mlagents-learn的入口位于 learn.py它会解析命令行参数并组装RunOptions通过validate_existing_directories检查resume/force等目录状态然后创建SubprocessEnvManager与TrainerController启动训练learn.py。想要深入理解训练循环的读者可以从该文件入手继续阅读。[!NOTE] 除了在 Unity 编辑器中训练也可以使用可执行文件build 产物进行训练详见 Using an Executable。观察训练进度按上一节方式开始训练后ml-agents目录下会生成一个results目录用于存放本次训练的全部产出。如需更细致地观察训练过程可以使用TensorBoard。在命令行运行tensorboard --logdir results然后在浏览器中访问localhost:6006即可查看 TensorBoard 汇总统计如下图所示。在本示例中最重要的统计指标是Environment/Cumulative Reward累计奖励它会随着训练推进不断上升并最终收敛到接近100——这是 Agent 在单个回合内能够累积的最大奖励值。将模型嵌入 Unity 环境训练完成后训练进程会保存模型控制台会打印Saved Model消息。此时可以把模型加入 Unity 项目供生成该模型的兼容 Agent 使用。[!WARNING] 看到Saved Model消息后不要直接手动关闭 Unity 窗口。要么等待训练进程自动关闭窗口要么在命令行按CtrlC结束训练。如果手动关闭窗口包含训练模型的.onnx文件将不会被导出到ml-agents文件夹中。如果你用CtrlC提前结束了训练并希望恢复训练可以运行同一条命令并附加--resume标志mlagents-learn config/ppo/3DBall.yaml --run-idfirst3DBallRun --resume从 learn.py 的实现可以看到--resume会从results/run-id/training_status.json加载训练状态从而从上次的检查点继续训练而不是从头开始。相应地--force标志则可以强制覆盖已有的run-id目录即从零开始。训练好的模型位于results/run-identifier/behavior_name.onnx其中behavior_name是对应 Agent 的Behavior Name本示例为3DBallLearning。该文件对应模型的最新检查点。接下来把训练好的模型嵌入 Agent步骤与前面运行预训练模型一节类似将模型文件移动到Project/Assets/ML-Agents/Examples/3DBall/TFModels/目录下。打开 Unity 编辑器选择3DBall场景。选中3DBall预制体中的 Agent 对象。在编辑器的Project窗口中将behavior_name.onnx文件拖拽到Ball3DAgent的Inspector窗口中的Model属性上。点击编辑器顶部的Play按钮。现在场景中的平台将使用你亲自训练出的模型来平衡小球。附加资源如果不熟悉 Unity 引擎本身可参阅 Background: Unity 页面获取入门指引如果对机器学习不太了解可参阅 Background: Machine Learning 获取概览与指引想了解仓库中其他示例环境的完整清单可参阅 Example learning environment reference想深入了解训练配置文件中每个参数的完整语义与取值范围可参阅 Training Configuration File。赞分享人工智能强化学习深度学习机器学习游戏开发AI 应用【免费下载链接】ml-agentsThe Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinforcement learning and imitation learning.项目地址https://gitcode.com/gh_mirrors/ml/ml-agents点击查看免费下载相关推荐Unity ML-Agents 示例环境完全指南环境配置、3D 球训练工作流与全部示例参考Unity ML Agents 示例环境完全指南环境配置、3D 球训练工作流与全部示例参考 ML Agents Toolkit 附带一套可直接运行的 Unit人工智能强化学习深度学习机器学习游戏开发AI 应用Unity ML-Agents 示例学习环境完全参考从 Basic 到 DungeonEscape 的场景配置与训练指南Unity ML Agents 示例学习环境完全参考从 Basic 到 DungeonEscape 的场景配置与训练指南 本文是 Unity ML Agent人工智能强化学习深度学习机器学习游戏开发AI 应用ML-Agents 示例环境配置完全指南从仓库克隆到场景训练全流程ML Agents 示例环境配置完全指南从仓库克隆到场景训练全流程 本指南围绕 Unity ML Agents Toolkit 官方文档 Examples s人工智能强化学习深度学习机器学习游戏开发AI 应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考