尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ML-Agents 学习环境设计指南:从场景搭建到训练闭环的完整实践

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),仅供参考
返回列表