跳转到内容

环境接口与模拟器

标准接口(reset/step/spaces)、包装器(wrapper)、观测与奖励的预处理约定。本章介绍 Gymnasium、PettingZoo(多智能体)、以及 Isaac Gym / Brax / MJX 等 GPU 并行模拟器带来的数量级吞吐提升。

Gymnasium(原 OpenAI Gym,Farama 基金会维护)定义了 RL 环境的事实标准接口:

env = gym.make("CartPole-v1")
obs, info = env.reset(seed=0) # 回合开始
obs, reward, terminated, truncated, info = env.step(action)
env.close()
  • reset():回合开始,返回初始观测;seed 管理环境的随机性;
  • step(action):执行动作,返回观测、奖励、两个终止标志;
  • 两个终止标志是 Gymnasium 对旧 Gym 的关键修正:terminated(环境真正的终止,如死亡/到达终点)与 truncated(时间截断,如 200 步上限)。两者必须区别对待——时间截断不是环境终止,价值函数要 bootstrap;混为一谈是经典的实现 bug(价值学习会学到"200 步后世界毁灭");
  • spaces:观测与动作空间的声明(Box、Discrete、Dict 等),算法据此初始化网络。

包装器:预处理是结果的一部分

Section titled “包装器:预处理是结果的一部分”

wrapper 包装环境、修改观测/奖励/终止语义。预处理约定是结果的一部分(→ DQN 及其改进):同一算法、不同预处理,结果不可比。Atari 的标准预处理:灰度化、下采样到 84×84、帧堆叠 4 帧(给马尔可夫性提供速度信息)、奖励裁剪到 {−1,0,1}\{-1, 0, 1\}、帧跳过(frame skip,4 帧重复同一动作)。

其他常用 wrapper:观测归一化(RunningMeanStd)、奖励缩放、时间限制的语义修正(TimeLimit)、自动重置。每个 wrapper 都要记录——它们是"实现细节"(→ 评估协议与可复现性)。

PettingZoo 是多智能体版的环境标准:智能体轮流行动(turn-based)或同时行动(parallel),接口返回所有智能体的观测/奖励/终止。SuperSuit 提供多智能体的 wrapper 库。与单智能体接口的差异主要在:动作是"谁在行动 + 动作"的二元组,奖励是向量(每个智能体一个)。

传统 CPU 模拟器(MuJoCo、Atari ALE)每环境每步毫秒级,并行靠进程/线程(数千环境已是极限)。GPU 并行模拟器把环境的物理与渲染全部搬进 GPU,数千到数十万环境同时步进:

  • Isaac Gym / Isaac Lab(NVIDIA):刚体物理在 GPU 上,四足/灵巧手训练的标准平台——数千环境的并行使机器人任务的训练从天缩到分钟;
  • Brax(Google):JAX 写的可微物理引擎,全在 GPU/TPU 上;
  • MJX(MuJoCo XLA):MuJoCo 的 JAX 版本,与 Brax 同思路;
  • Isaac Gym 的意义:物理 step 与模型 step 在同一 GPU 上交替,数据传输几乎为零——这是吞吐提升的另一半来源(不只是并行数)。

配套的算法适配:GPU 环境天然配 on-policy 大批量方法(PPO + GAE,数千环境一步算一批优势),off-policy 的回放缓冲反而成为瓶颈(→ 向量化环境与分布式采样)。

环境的随机性(初始状态、随机事件)与算法的随机性(初始化、采样)要分开管理:

  • 环境种子决定"哪个关卡/初始状态"——泛化实验的留出集靠它控制;
  • 算法种子决定学习曲线的方差(→ 评估协议与可复现性);
  • 向量化环境里,每个子环境一个独立种子流——种子碰撞(两个子环境同种子)是隐蔽的吞吐损失。
  • 帧堆叠、奖励裁剪等预处理是 Atari 结果的一部分
  • GPU 模拟器把机器人任务的训练从天缩到分钟
  • 环境的随机种子管理