← 上级:RL-04.实现框架与实践 · 评估:RL-06.评估环境与工具链
所有自研 RL 代码建议先统一 环境交互契约,再叠算法。本文约定与 Gymnasium 对齐的接口与训练循环骨架。
一、最小交互模板
1 | import gymnasium as gym |
| 调用 | 返回值 | 说明 |
|---|---|---|
reset(seed=) |
obs, info |
新 episode 起点 |
step(action) |
obs, reward, terminated, truncated, info |
一步转移 |
done 的拆分(Gymnasium ≥0.26):
| 标志 | 含义 |
|---|---|
terminated |
MDP 自然终止(失败/成功) |
truncated |
时间步上限等外部截断 |
Bootstrap 时:$y = r + \gamma Q(s’)$ 仅在 非终止 时使用 $Q(s’)$;truncated 时通常仍 Bootstrap(任务可继续)。
二、Space 类型
1 | env.observation_space # Box / Discrete / Dict / Tuple |
| 类型 | 示例环境 | Agent 处理 |
|---|---|---|
Discrete(n) |
CartPole 动作 0/1 | 直接索引 |
Box(low, high, shape) |
连续观测/动作 | 归一化、裁剪 |
Dict |
多模态 | 分头编码再拼接 |
1 | import numpy as np |
三、训练循环抽象
1 | def train_loop(env, agent, total_steps: int): |
| 钩子 | 职责 |
|---|---|
select_action |
$\varepsilon$-greedy / $\pi_\theta$ 采样 |
store |
写 Q 表 / Replay / Rollout |
maybe_update |
满足 warmup、batch 条件时更新 |
on_episode_end |
日志、$\varepsilon$ 衰减 |
四、Wrapper 常用链
1 | from gymnasium.wrappers import RecordEpisodeStatistics |
| Wrapper | 作用 |
|---|---|
RecordEpisodeStatistics |
info["episode"] 含 return、length |
NormalizeObservation |
运行均值方差归一化 |
NormalizeReward |
奖励缩放 |
FrameStack |
Atari 堆叠 4 帧 |
TimeLimit |
步数上限(内置) |
自定义 Wrapper 继承 gymnasium.Wrapper,重写 step / reset。
五、向量化环境
1 | from gymnasium.vector import SyncVectorEnv |
| 类 | 适用 |
|---|---|
SyncVectorEnv |
同进程多环境,调试方便 |
AsyncVectorEnv |
多进程,提高采样吞吐 |
PPO/A2C 常用 $N$ 个并行 env 收集 Rollout。
六、随机种子
1 | def set_seed(seed: int): |
记录 seed 于 config,便于 RL-06 复现。
七、与算法模块的接口
建议 Agent 基类最小接口:
1 | class Agent: |
Off-Policy(DQN)在 store 后每步可 update;On-Policy(PPO)在 Rollout 满 $T$ 步后批量 update。
八、小结
- 统一 reset / step / done 语义后再写算法。
terminatedvstruncated影响 Bootstrap。- 下一篇:PyTorch 实现要点