ML-Agents 学习环境设计指南:从场景搭建到训练闭环的完整实践
ML-Agents 学习环境设计指南从场景搭建到训练闭环的完整实践【免费下载链接】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 Toolkit 官方文档《Designing a Learning Environment》系统讲解如何把一个普通 Unity 场景改造成可用于强化学习训练的学习环境Learning Environment。你将掌握Academy 如何编排训练循环、如何组织场景与多训练区域、如何使用EnvironmentParameters配合课程学习与环境参数随机化、如何用StatsRecorder在 TensorBoard 中监控环境内统计指标并了解从 Agent 到训练闭环的完整设计思路。文中所有结论均可在当前仓库的 Runtime 源码与示例环境中验证。一、训练与仿真流程Academy 如何驱动一个 EpisodeML-Agents 中训练与仿真都以步step为单位推进由 Academy 类统一编排。Academy 是场景中的单例它不直接写游戏逻辑而是通过事件与场景中所有 Agent 同步协作保证所有 Agent 先观测、再决策、后行动的严格顺序。从 Academy.cs 的EnvironmentStep()实现可以看到每个环境步内部依次触发AgentPreStep、AgentIncrementStep、AgentSendState收集观测、DecideAction策略决策、AgentAct执行动作。官方文档将其概括为以下循环调用 Academy 的OnEnvironmentReset委托仅在回合开始/重置时对场景中每个 Agent 调用OnEpisodeBegin()收集场景信息对每个 Agent 调用CollectObservations(VectorSensor sensor)并更新其传感器、汇总观测使用每个 Agent 的 Policy 决定下一步动作对每个 Agent 调用OnActionReceived()传入 Policy 选出的动作若 Agent 达到Max Step或自行调用EndEpisode()则触发该 Agent 的OnEpisodeBegin()进入下一回合。训练时外部 Python 训练进程通过通信器与 Academy 交换数据运行一系列回合episode来收集经验并优化神经网络模型训练完成后把导出的模型文件放进 Unity 项目即可用于推理。开发者需要做的是继承Agent类按需实现上述方法。从源码看Academy的步进默认挂载在FixedUpdate阶段Academy.cs 中的AcademyFixedUpdateStepper可通过AutomaticSteppingEnabled属性关闭自动步进、改由用户手动调用Academy.EnvironmentStep()这为回合制等特殊时序场景提供了灵活性。二、组织 Unity 场景Academy、多区域与环境重置2.1 Academy唯一编排者Academy 是单例同一时刻只存在一个实例Academy.cs 中通过LazyAcademy模式实现。首次访问Academy.Instance时触发初始化注册环境参数与统计通道、尝试与 Python 训练进程建立通信并决定当前是训练模式还是推理模式Academy.cs。2.2 Academy 重置在每回合开始前改造环境要在每个 episode 开始时改变环境例如重置 Agent 到初始位置、把目标随机摆放把自定义方法挂到 Academy 的OnEnvironmentReset委托上public class MySceneBehavior : MonoBehaviour { public void Awake() { Academy.Instance.OnEnvironmentReset EnvironmentReset; } void EnvironmentReset() { // Reset the scene here } }外部训练进程调用 Python 端UnityEnvironment的reset()方法时就会触发环境重置。设计重置逻辑时要思考哪些因素应该变化以便训练结果具备泛化性。例如训练一个走迷宫 Agent如果每个 episode 都用同一个迷宫Agent 学到的只是这一个迷宫的解法而不是迷宫这一类问题。2.3 多训练区域Multiple Areas并行收集经验许多示例环境会在场景中实例化多份训练区域从而并行收集大量经验、显著加速训练。实现方式很简单在同一场景中放置多个 Behavior Name 相同的 Agent 即可相同 Behavior Name 的 Agent 共享同一套策略。设计场景时应尽量考虑支持多区域。两种常见的多区域做法手动复制把整个训练区域Floor/Agent/目标物做成 Prefab在场景中实例化多份、彼此不重叠自动复制使用TrainingAreaReplicator组件位于 TrainingAreaReplicator.cs指定Base Area、复制份数与区域间距运行时自动复制。更详细的从零搭建与多区域步骤见 Learning-Environment-Create-New.md。三、训练环境Environment的三个硬性要求当你创建训练环境时场景必须能被外部训练进程完全控制文档明确了三点要求自动启动Unity 应用被训练进程启动后训练场景必须自动开始运行可重置每个训练回合开始时Academy 必须把场景重置到合法的初始状态回合必须有终点要么设置Max Steps要么由每个 Agent 在完成任务后手动调用EndEpisode()结束回合。这三点缺一不可——没有明确终点的回合会让训练无法形成完整的 episode 结构进而无法正确计算累积回报。四、环境参数Environment Parameters衔接课程学习与参数随机化课程学习Curriculum Learning与环境参数随机化Environment Parameter Randomization是两种通过控制环境参数来提升训练效果的方法。为了让 Unity 端及时拿到训练配置中定义的参数值ML-Agents 暴露了EnvironmentParametersC# 类。从 EnvironmentParameters.cs 的源码可以看到它内部通过EnvironmentParametersChannel这一 Side Channel 接收训练进程发来的参数核心 API 包括GetWithDefault(string key, float defaultValue)按 key 读取参数不存在时返回默认值RegisterCallback(string key, Actionfloat action)注册回调参数更新时自动触发Keys()列出所有已收到值的参数 key。文档建议在 Agent 的OnEpisodeBegin()中通过Academy.Instance.EnvironmentParameters读取并应用参数。WallJump 示例是标准用法——它根据no_wall_height、small_wall_height、big_wall_height三个参数在运行时调整墙的高度见 WallJumpAgent.csm_ResetParams Academy.Instance.EnvironmentParameters; // ... var height m_ResetParams.GetWithDefault(big_wall_height, 8); wall.transform.localScale new Vector3(localScale.x, height, localScale.z);参数值来自训练配置相关细节见 Training-ML-Agents.md 中关于 environment parameters 的部分。五、Agent观测、行动与回合生命周期Agent类代表场景中能观测环境并执行动作的角色通常挂载在代表该角色的 GameObject 上足球比赛中的球员、车辆仿真中的汽车。每个 Agent 都必须配置合适的Behavior Parameters。创建 Agent 时通常继承Agent类并实现两个核心方法CollectObservations(VectorSensor sensor)收集 Agent 对环境的状态观测OnActionReceived()执行 Policy 选出的动作并为当前状态分配奖励。这两个方法的具体实现决定了该 Agent 的Behavior Parameters如何配置尤其是向量观测的 Space Size 与动作维度。回合生命周期方面你需要在OnActionReceived()中判断任务完成/失败并调用EndEpisode()手动终止回合或把Max Steps设为正值让 Agent 在走过指定步数后自动结束回合OnEpisodeBegin()则用于为下一回合重置 Agent。关于 Agent 编程的完整细节观测生成方式、动作定义、奖励设计、多智能体分组等见 Learning-Environment-Design-Agents.md。六、录制统计指标让环境内部状态进入 TensorBoardStatsRecorder允许从 Unity 环境内部记录统计值这些值会在训练过程中被聚合与呈现。从 StatsRecorder.cs 源码看核心 API 是public void Add( string key, float value, StatAggregationMethod aggregationMethod StatAggregationMethod.Average)关键行为源码注释中亦有说明统计值通过StatsSideChannel发送最终出现在 TensorBoard summary 与 trainer gauges 中支持在 key 中用/嵌套分组例如Agent/Health与Agent/Wallet统计值只在每个summary_frequency步写入一次 TensorBoard同一窗口内多次上报的值按StatAggregationMethod聚合聚合方式共有四种StatsRecorder.csAverage默认窗口内取平均MostRecent只保留最近一次值多环境并行时仅跟踪 worker 0 的统计避免冲突Sum窗口内求和Histogram以直方图形式报告。FoodCollector 示例展示了标准用法FoodCollectorSettings.cs——在Awake()中取得Academy.Instance.StatsRecorder每 100 帧上报一次总分m_Recorder Academy.Instance.StatsRecorder; // ... if ((Time.frameCount % 100) 0) { m_Recorder.Add(TotalScore, totalScore); }注释中特别说明由于值会按summary_frequency聚合无需每帧都发送。七、设计要点总结以 Academy 为编排核心训练循环由 Academy.cs 统一驱动开发者只需实现 Agent 的回调方法重置逻辑决定泛化能力利用OnEnvironmentReset在每个 episode 开始时随机化/重置场景要素避免 Agent 只学会单一布局多区域并行相同 Behavior Name 的多个 Agent 天然共享策略、并行收集经验是官方示例中最常见的加速手段环境参数用Academy.Instance.EnvironmentParameters.GetWithDefault(key, default)在OnEpisodeBegin()中读取课程学习/参数随机化产生的值参考 WallJumpAgent.cs统计监控用Academy.Instance.StatsRecorder.Add(key, value, aggregationMethod)上报环境内部指标可在 TensorBoard 中按summary_frequency聚合查看参考 FoodCollectorSettings.cs。若需要深入了解 Agent 的观测、动作与奖励设计或从零搭建一个完整训练环境请继续阅读同一文档目录下的 Learning-Environment-Design-Agents.md 与 Learning-Environment-Create-New.md。【免费下载链接】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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

@visx/grid 网格线组件完全指南:为 visx 图表添加横向、纵向与极坐标网格

@visx/grid 网格线组件完全指南:为 visx 图表添加横向、纵向与极坐标网格

visx/grid 网格线组件完全指南:为 visx 图表添加横向、纵向与极坐标网格 【免费下载链接】visx 🐯 visx | visualization components 项目地址: https://gitcode.com/gh_mirrors/vi/visx visx/grid 是 visx 可视化组件库中专用于绘制图表网格线的…

2026/9/20 19:57:43 阅读更多 →
ADB自适应远光电子系统架构:感知、决策与执行全链路设计

ADB自适应远光电子系统架构:感知、决策与执行全链路设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 19:56:43 阅读更多 →
服务器硬件EVT/DVT/PVT三阶段实战指南

服务器硬件EVT/DVT/PVT三阶段实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 19:56:43 阅读更多 →

最新新闻

公司做网络推广哪个网站好?3年老兵揭秘真实建站报价与避坑指南

公司做网络推广哪个网站好?3年老兵揭秘真实建站报价与避坑指南

公司做网络推广哪个网站好?3年老兵揭秘真实建站报价与避坑指南 刚接手公司推广预算时,我对着“ICP备案”四个字发了半天呆,流程一头雾水,生怕填错一步就耽误上线。别慌,这行摸爬滚打10年,最懂这种焦虑。今天不聊虚的,直接拆解 建站报价 里的门道,告诉你 公司做网络推广哪个网站好…

2026/9/20 20:30:09 阅读更多 →
QuickRecorder:免费开源的 macOS 屏幕录制工具,7 种模式录课程、演示和游戏

QuickRecorder:免费开源的 macOS 屏幕录制工具,7 种模式录课程、演示和游戏

QuickRecorder:免费开源的 macOS 屏幕录制工具,7 种模式录课程、演示和游戏 【免费下载链接】QuickRecorder A lightweight screen recorder based on ScreenCapture Kit for macOS / 基于 ScreenCapture Kit 的轻量化多功能 macOS 录屏工具 项目地址:…

2026/9/20 20:29:59 阅读更多 →
KubeEdge 边云协同怎么落地:3 条命令从开荒到多节点集群

KubeEdge 边云协同怎么落地:3 条命令从开荒到多节点集群

KubeEdge 边云协同怎么落地:3 条命令从开荒到多节点集群 【免费下载链接】kubeedge Kubernetes Native Edge Computing Framework (project under CNCF) 项目地址: https://gitcode.com/GitHub_Trending/ku/kubeedge 断网时摄像头还在做推理、工厂网关还认得…

2026/9/20 20:29:59 阅读更多 →
深入 LibVLC:VLC 可嵌入多媒体引擎的 API 全景与实战指南

深入 LibVLC:VLC 可嵌入多媒体引擎的 API 全景与实战指南

深入 LibVLC:VLC 可嵌入多媒体引擎的 API 全景与实战指南 【免费下载链接】vlc VLC media player - plays everything, runs anywhere. Code here: https://code.videolan.org/videolan/vlc 项目地址: https://gitcode.com/gh_mirrors/vl/vlc LibVLC 是 VLC …

2026/9/20 20:29:59 阅读更多 →
华为擎云W515安装银河麒麟V10全攻略:从BIOS设置到驱动配置

华为擎云W515安装银河麒麟V10全攻略:从BIOS设置到驱动配置

1. 为什么要在华为擎云W515上折腾银河麒麟V10华为擎云W515 PGUV-WBY0这台机器,本质上是一台面向政企办公场景的国产台式机,核心平台是麒麟990(aarch64架构,也就是ARM64),出厂预装的是统信UOS或者银河麒麟桌…

2026/9/20 20:29:59 阅读更多 →
浙工大转专业机试全攻略:C语言与算法基础决定成败

浙工大转专业机试全攻略:C语言与算法基础决定成败

“转专业机试”这四个字,在浙工大计算机学院的语境里,分量比很多人想象的重得多。一年又一年,总有大一同学抱着“只要能转过去就行”的心态备考,结果在机房里对着编译报错发呆两小时,最后拿着一个不到及格线的成绩出来…

2026/9/20 20:29:59 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →