ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Gymnasium MuJoCo环境实战指南:连续控制训练的完整流程

Gymnasium MuJoCo环境实战指南:连续控制训练的完整流程 Gymnasium MuJoCo环境实战指南连续控制训练的完整流程【免费下载链接】GymnasiumA standard API for single-agent reinforcement learning environments, with popular reference environments and related utilities (formerly Gym)项目地址: https://gitcode.com/GitHub_Trending/gy/Gymnasiumgym.make(Swimmer-v5)抛出Error: No registered env for id: Swimmer-v5——你装的是基础包而 MuJoCo 环境藏在可选依赖里不执行pip install gymnasium[mujoco]这批环境根本不会注册。这篇指南解决 Gymnasium 连续控制从环境注册、参数含义、最小示例、向量化提速到完整训练流程的卡点读完你能独立跑通 MuJoCo 环境实验。它到底能做什么MuJoCo环境的三个真实能力先给结论这批环境不是换了套模型的 CartPole真正的价值在三个能力上。接触动力学不是摆设。MuJoCo 引擎的卖点是对接触与约束的高效求解落到环境里就是 Pusher-v5 这类任务——机械臂末端要去推一个圆柱体接触力直接决定成败。想验证策略在接触场景下是否稳定这比纯运动控制是更硬的测试。参数全部可注入。每个 v5 环境都把奖励权重、初始噪声、帧跳过做成了构造参数gym.make时直接传。比如 Swimmer 默认隐藏头部的 x、y 坐标exclude_current_positions_from_observationTrue目的是逼策略学位置无关的动作改成False观测就从 8 维变 10 维同一个环境立刻多出两种难度。物理模型可替换。v5 环境支持xml_file参数指向你自己的 MuJoCo XML官方模型文件都在 gymnasium/envs/mujoco/assets/改摩擦系数、改肢体长度都可以从这些文件入手。把文中反复出现的三个环境按训练视角横着比一比差异比自由度多少这种说法直观得多环境观测维度动作维度单步时长提前终止上手难度Swimmer-v5820.04s无低InvertedPendulum-v5410.02s有倒杆/出界低Walker2d-v51760.008s有摔倒中单步时长是frame_skip × 引擎时间步算出来的Swimmer 是 4×0.01Walker2d 是 4×0.002。dt 越小的环境物理上越精细但同样 1000 步的回合覆盖的真实时间更短策略需要更密的决策——Walker2d 明显比 Swimmer 难训这是结构性原因之一。动手前三件必须搞清的事观测 姿势快照 速度记录。每个 MuJoCo 环境的观测空间都是Box向量是qpos广义位置关节角、质心坐标和qvel对应速度的拼接。qpos就像机器人的姿势快照qvel是此刻动得有多快。注意 Swimmer 这类环境默认剪掉 x、y 绝对坐标所以看到 8 维别以为漏了位置——那是故意的x 坐标还在info[x_position]里给你查。动作是力矩不是目标点。动作空间同样是Box每个维度对应一个关节的力矩或推杆的推力。Swimmer 是 2 维[-1,1]的两个转子力矩Walker2d 是 6 个铰链Humanoid 则是 17 维且范围缩到[-0.4, 0.4]。别想着输出我想走到哪你输出的是这一瞬间拧多大力。奖励拆开看。运动类环境的奖励基本都是正向项 − 控制代价。Swimmer 是前进速度 × 权重 − 动作平方和 × 权重Walker2d 多一项活着就加分的健康奖励。info里把reward_forward、reward_ctrl分项返回训练时把它们打进日志比只盯总奖励能更快定位问题。最小可运行示例Swimmer随机游一集装好依赖后下面这段代码直接复制执行。它干三件事确认环境注册成功、reset能拿到观测、step的五元组解构正确。# 前提已执行 pip install gymnasium[mujoco] import gymnasium as gym env gym.make(Swimmer-v5) # 不传 render_mode 即无头模式采样最快 obs, info env.reset(seed42) # 固定种子重置保证每次起点一致 print(观测形状:, obs.shape, 起始x:, info[x_position]) total 0.0 terminated truncated False while not (terminated or truncated): # Swimmer 默认 1000 步从不提前终止 action env.action_space.sample() # 随机采一个 2 维力矩 obs, reward, terminated, truncated, info env.step(action) total reward print(f总奖励 {total:.2f}终点x {info[x_position]:.3f}) env.close() # 释放渲染/物理引擎资源随机策略跑出的总奖励通常在个位数附近终点 x 坐标贴近 0——说明瞎游基本没移动。把这个数字记下来它就是你的 baseline。让Gymnasium向量化训练快起来问题一单环境采样撑不起策略梯度算法。PPO 这类算法动辄百万步单环境串行 step 是纯浪费。方案是用向量化环境envs gym.make_vec(Swimmer-v5, num_envs8, vectorization_modesync) obs, _ envs.reset() # 注意返回 (obs, infos) 二元组 actions envs.action_space.sample() # 形状 (8, 2) next_obs, rewards, terms, truns, _ envs.step(actions) print(rewards) # 形状 (8,)每个环境各自的奖励问题二开着窗口渲染采样速度腰斩以上。render_modehuman每步都要刷新窗口训练时是纯开销。方案是训练关渲染、评估再开train_env gym.make_vec(Swimmer-v5, num_envs8) # 训练无渲染 eval_env gym.make(Swimmer-v5, render_modergb_array) # 评估抓帧要出演示视频就用RecordVideowrapper 包在 rgb_array 环境外面用法见 docs/introduction/record_agent.md比实时窗口更适合服务器。问题三dt 和采样预算不匹配。frame_skip直接改变每步物理时长env gym.make(Swimmer-v5, frame_skip8) # 单步从 0.04s 变 0.08s调大它等于放慢游戏同样 1000 步覆盖更久适合探索期但做对比实验时别动它dt 一变奖励尺度跟着变。走一遍完整流程InvertedPendulum的REINFORCE下面用 InvertedDoublePendulum 的单杆简化版 InvertedPendulum-v54 维观测、1 维动作完整走一遍初始化 → 策略 → 训练 → 评估。仓库里有一版几乎同构的教程可以对照 docs/tutorials/training_agents/mujoco_reinforce.py。先说第一个会踩的坑为什么固定了种子结果还是对不上因为只给reset播种网络权重的初始化仍走全局随机流。种子要三处都设import random import numpy as np import torch import gymnasium as gym SEED 42 random.seed(SEED); np.random.seed(SEED); torch.manual_seed(SEED) env gym.make(InvertedPendulum-v5) obs, _ env.reset(seedSEED) # 环境自己的种子单独给策略是输出高斯分布均值和标准差的网络可以理解为给一张姿势快照输出该出多大力、以及敢不确定多少import torch.nn as nn from torch.distributions import Normal class Policy(nn.Module): def __init__(self): super().__init__() self.trunk nn.Sequential(nn.Linear(4, 64), nn.Tanh()) self.mean nn.Linear(64, 1) self.log_std nn.Parameter(torch.zeros(1)) # 可学习的不确定性 def dist(self, obs): return Normal(self.mean(self.trunk(obs)), torch.exp(self.log_std))训练循环是标准 REINFORCE攒整回合折扣回报按log_prob × 回报更新。注意 Gymnasium 新 API 的step返回五元组老代码里四元组解构在这里直接崩policy, opt Policy(), torch.optim.Adam(Policy().parameters(), lr3e-3) for ep in range(300): obs, _ env.reset(seedSEED ep) # 每回合换种子增加起点多样性 logps, G, done [], 0.0, False while not done: dist policy.dist(torch.tensor(obs, dtypetorch.float32)) act dist.sample().numpy() obs, r, terminated, truncated, _ env.step(act) logps.append(dist.log_prob(torch.tensor(act))) G r 0.99 * G # 反向累积折扣回报 done terminated or truncated # 杆倒(terminated)与超时(truncated)都算结束 loss -(torch.stack(logps) * torch.tensor([G] * len(logps), dtypetorch.float32)).mean() opt.zero_grad(); loss.backward(); opt.step() if ep % 50 0: print(f回合 {ep}本回合末累积回报 {G:.2f})向量化时会出现第二个坑envs.reset()返回(obs, infos)写成obs envs.reset()后torch.tensor(obs)的形状立刻不对劲。养成习惯写全解构obs, infos envs.reset(seedSEED) # 永远是二元组训练 300 个回合后InvertedPendulum 的回报通常从最初的负值爬到 200 以上回合上限 1000 步、活着每步约 1撑满回合就是高分。如果卡在 -100 附近不涨先检查是不是把done只用terminated算了——漏掉truncated会让侥幸撑到超时的回合混入高分。MuJoCo环境踩坑实录四个高频症状症状Error: No registered env for id: Swimmer-v5。根因只装了基础gymnasiumMuJoCo 环境属于可选依赖不装不注册。修复pip install gymnasium[mujoco]症状同样代码跑两次奖励曲线完全长不一样。根因只在reset里播种action_space.sample()走的仍是未播种的全局随机流。修复env.action_space.seed(42) # 采样器单独播种 obs, _ env.reset(seed42)症状无显示器的服务器上render_modehuman报错或卡死。根因默认渲染后端 glfw 需要图形界面。修复import os os.environ[MUJOCO_GL] egl # 或 osmesa必须在 import 引擎前设置症状换了环境版本号后同样的策略评估分数缩水。根因不同 v 版本的奖励权重、摩擦参数都改过v5 的变更说明写在 walker2d_v5.py 头部注释里。修复实验配置里固定环境 id 与版本号对比实验锁定同一版本。继续深入前面只覆盖了单智能体训练真正往下走有三个方向各自有入口可以直接读想换物理模型v5 环境的xml_file参数指向自定义 XML官方模型在 gymnasium/envs/mujoco/assets/ 可抄。想搞清观测里每一维是什么v5 环境暴露的observation_structure属性拆解了 qpos/qvel 组成环境文档见 docs/environments/mujoco.md。想理解向量化细节autoreset 模式、观测批量读 docs/api/vector/sync_vector_env.md 与 docs/api/vector/async_vector_env.md。到这里MuJoCo 环境从注册、参数、向量化提速到完整训练流程已经走通。下一步把示例里的 REINFORCE 换成 PPO在 Walker2d-v5 上跑 1e6 步用info里的分项奖励画出训练曲线。【免费下载链接】GymnasiumA standard API for single-agent reinforcement learning environments, with popular reference environments and related utilities (formerly Gym)项目地址: https://gitcode.com/GitHub_Trending/gy/Gymnasium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表