DDPG Reacher-v5 Demo
使用纯 PyTorch 实现 DDPG,在 MuJoCo 的 Reacher-v5 环境中训练一个二维机械臂去追踪目标点。
项目简介
这个项目是一个针对 Reacher-v5 单独整理的可运行 demo。相比默认展示 InvertedPendulum-v5 的 ddpg-invertedpendulum-v5,这里直接把环境、训练步数、探索强度和模型保存路径都设成了更适合 Reacher-v5 的默认值,适合直接上手实验。
代码结构
ddpg-reacher-v5/
├── index.mdx
├── reacher-success.gif
└── train_ddpg_reacher_v5.py
环境要求
pip install gymnasium[mujoco] torch numpy tqdm imageio
如果你本地已经有仓库里的 conda 环境,推荐直接使用:
source /home/jj/anaconda3/etc/profile.d/conda.sh
conda activate easy-robotics
快速开始
默认命令会在 Reacher-v5 上训练,并把 actor 权重保存到 artifacts/ddpg_reacher_v5_actor.pt:
python projects/ddpg-reacher-v5/train_ddpg_reacher_v5.py
如果你想训练后直接跑几回合策略演示:
python projects/ddpg-reacher-v5/train_ddpg_reacher_v5.py \
--total-steps 80000 \
--demo-episodes 3 \
--demo-render
如果只是先做一次快速冒烟测试:
python projects/ddpg-reacher-v5/train_ddpg_reacher_v5.py \
--total-steps 200 \
--start-steps 50 \
--batch-size 32 \
--buffer-size 2000 \
--eval-interval 100 \
--eval-episodes 1 \
--device cpu
如果你想在训练结束后直接导出一个 gif:
python projects/ddpg-reacher-v5/train_ddpg_reacher_v5.py \
--total-steps 80000 \
--record-path projects/ddpg-reacher-v5/reacher-success.gif
最终效果
使用默认 seed=42 训练 80000 步后录制得到,对应 final_eval_return=-4.62:

默认参数
这个 demo 预设了一组面向 Reacher-v5 的默认超参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
--env-id | Reacher-v5 | 默认环境 |
--total-steps | 80000 | 总训练步数 |
--start-steps | 4000 | 纯随机探索步数 |
--batch-size | 256 | 每次更新的 batch 大小 |
--buffer-size | 100000 | 回放缓冲区容量 |
--exploration-noise | 0.2 | 高斯探索噪声比例 |
--eval-interval | 5000 | 评估间隔 |
--eval-episodes | 10 | 每次评估回合数 |
--demo-episodes | 0 | 训练后是否额外跑 demo |
--record-path | None | 如果设置则额外导出 gif 或 mp4 |
--record-episodes | 1 | 录制多少个 episode |
--record-fps | 20 | 导出媒体帧率 |
--record-frame-skip | 2 | 每隔多少环境步采一帧 |
--save-path | artifacts/ddpg_reacher_v5_actor.pt | 模型保存路径 |
实现要点
- Actor 网络输出经过
tanh后映射到环境动作范围[-1, 1] - Critic 网络输入为
(obs, action)拼接后的向量 - 经验回放使用预分配的 NumPy 环形缓冲区
- 时间截断
truncated不会被当作真正终止,目标 Q 值仍然继续 bootstrap - 训练结束后可选调用
demo_policy()跑若干回合策略演示 - 如果设置
--record-path,脚本会在离屏rgb_array模式下自动导出 gif 或 mp4
适合进一步尝试的方向
- 把
exploration-noise从0.2调到0.1或0.3,比较收敛速度 - 试试更长训练,比如
--total-steps 150000 - 在这个项目基础上继续扩展成 TD3 版本,观察稳定性差异