倒立摆¶
倒立摆示例是推荐的第一个可运行任务。它足够小,适合 smoke test,同时覆盖完整的 GeneLab train/play 路径。
任务¶
| Task id | 描述 |
|---|---|
GeneLab-Inverted-Pendulum-v0 |
单杆平衡(rsl_rl PPO)。 |
GeneLab-Double-Inverted-Pendulum-v0 |
双连杆平衡(rsl_rl PPO)。 |
GeneLab-Inverted-Pendulum-Skrl-v0 |
单杆平衡 —— 同一个 env,skrl PPO 后端。 |
GeneLab-Inverted-Pendulum-Memory-Rnn-v0 |
"记住目标" —— 需要记忆的任务,用 LSTM 策略。 |
GeneLab-Inverted-Pendulum-Memory-Mlp-v0 |
同一任务的普通 MLP 基线 —— 结构上无法记忆。 |
安装并列出¶
不安装时:
PYTHONPATH=examples/inverted_pendulum/src \
genelab --import genelab_inverted_pendulum.tasks list tasks
运行¶
genelab play GeneLab-Inverted-Pendulum-v0 --steps 64
genelab play GeneLab-Inverted-Pendulum-v0 --vis --steps 500
genelab train GeneLab-Inverted-Pendulum-v0 --num_envs 64 --max_iterations 2
# 同一个 env,skrl PPO 后端(仅由 agent cfg 类型选择):
genelab train GeneLab-Inverted-Pendulum-Skrl-v0 --num_envs 64 --max_iterations 4800
# skrl 的 checkpoint 命名为 agent_<timesteps>.pt,位于该 run 的 checkpoints/ 目录下:
genelab eval GeneLab-Inverted-Pendulum-Skrl-v0 logs/skrl/inverted_pendulum_skrl/<run>/checkpoints/agent_<N>.pt
skrl 任务的
genelab train需要安装可选依赖skrl;注册与列出任务则不需要。
循环网络(RNN)记忆 showcase¶
GeneLab-Inverted-Pendulum-Memory-Rnn-v0 展示循环网络真正有用的场景。这是一个"记住目标"
任务:每个 episode 随机一个小车目标,但它只在最初 5 步出现在观测里,之后被抹掉。这一闪太短,
来不及在可见时把车开过去,所以策略必须记住目标、之后再去。无记忆的 MLP 在线索消失后无法
恢复目标,只能退回中点;而 LSTM 把它存进 hidden state,直接把车开到目标。(速度仍可观测,所以
唯一需要记忆的就是目标。)
这才是循环网络决定性占优的任务类别 —— 与单纯的平衡不同:平衡即使隐藏速度或负载,前馈 MLP 也能解,因为反馈镇定对未观测状态天生鲁棒。RNN 买到的是"记忆",而不仅仅是"部分可观测"。
训练两者,对比 post-cue 跟踪误差(到隐藏目标的平均距离):
genelab train GeneLab-Inverted-Pendulum-Memory-Rnn-v0 --num_envs 2048 --max_iterations 400
genelab train GeneLab-Inverted-Pendulum-Memory-Mlp-v0 --num_envs 2048 --max_iterations 400
| 策略 | 任务 | post-cue 跟踪误差(平均 |cart − target|) |
|---|---|---|
| LSTM(循环) | ...-Memory-Rnn-v0 |
≈ 0.013 —— 够到并保持隐藏目标 |
| MLP(基线) | ...-Memory-Mlp-v0 |
≈ 0.78 —— 回忆不出,卡在中点附近 |
(目标在 [-0.8, 0.8] 均匀采样;忽略目标的策略误差 ≈ 目标分布的幅度。)
为什么这次训得动(之前的记忆尝试不行)
循环 PPO 用长度为 num_steps_per_env 的 truncated BPTT。记忆 cfg 把它设成 100(整整一个
~100 步 episode),于是每个 BPTT 窗口覆盖完整的"闪现→够到"依赖,梯度能从回忆一路传回编码线索
那一步。用默认的 24 步窗口,LSTM 永远学不会把两者关联起来。
代码入口¶
| 文件 | 作用 |
|---|---|
tasks.py |
注册 robot、env、task。 |
single/env_cfg.py |
单杆 manager-based env 配置。 |
single/memory_env_cfg.py |
"记住目标" env(带遮罩的目标线索 + 跟踪奖励)。 |
single/rnn_cfg.py |
记忆任务的 LSTM + MLP PPO 配置。 |
double/env_cfg.py |
双杆 manager-based env 配置。 |
mdp.py |
示例自己的 reward / termination / 记忆任务项。 |