Skip to main content

DDPG Pusher-v5 Demo

使用纯 PyTorch 实现 DDPG,在 MuJoCo 的 Pusher-v5 环境中训练一个七维机械臂把物块推向目标区域。

项目简介

Pusher-v5Reacher-v5 更难:动作维度更高,奖励也更稀疏一些,因此这里更适合把它当成一个 DDPG baseline 项目,而不是一个保证快速收敛的“秒通”示例。

这个项目保持了和 ddpg-reacher-v5 一致的代码结构,方便你横向比较不同 MuJoCo 连续控制任务在同一种算法下的训练表现。

代码结构

ddpg-pusher-v5/
├── figs/
│ └── pusher-baseline.gif
├── index.mdx
└── train_ddpg_pusher_v5.py

环境要求

pip install gymnasium[mujoco] torch numpy tqdm imageio

如果你本地已经有仓库里的 conda 环境,推荐直接使用:

source /home/jj/anaconda3/etc/profile.d/conda.sh
conda activate easy-robotics

快速开始

默认命令会在 Pusher-v5 上训练,并把 actor 权重保存到 artifacts/ddpg_pusher_v5_actor.pt

python projects/ddpg-pusher-v5/train_ddpg_pusher_v5.py

如果你想训练后直接跑几回合策略演示:

python projects/ddpg-pusher-v5/train_ddpg_pusher_v5.py \
--total-steps 250000 \
--demo-episodes 2 \
--demo-render

如果只是先做一次快速冒烟测试:

python projects/ddpg-pusher-v5/train_ddpg_pusher_v5.py \
--total-steps 40 \
--start-steps 10 \
--batch-size 8 \
--buffer-size 200 \
--eval-interval 20 \
--eval-episodes 1 \
--device cpu

如果你想训练结束后离屏导出一个 gif:

python projects/ddpg-pusher-v5/train_ddpg_pusher_v5.py \
--total-steps 250000 \
--record-path projects/ddpg-pusher-v5/figs/pusher-baseline.gif

最终效果

使用默认 seed=42 训练 250000 步后录制得到,对应 final_eval_return=-33.37

DDPG Pusher-v5 baseline 效果

默认参数

这个 demo 针对 Pusher-v5 预设了一组更偏向 baseline 的超参数:

参数默认值说明
--env-idPusher-v5默认环境
--total-steps250000总训练步数
--start-steps10000纯随机探索步数
--batch-size256每次更新的 batch 大小
--buffer-size300000回放缓冲区容量
--exploration-noise0.2高斯探索噪声比例
--eval-interval25000评估间隔
--eval-episodes10每次评估回合数
--demo-episodes0训练后是否额外跑 demo
--record-pathNone如果设置则额外导出 gif 或 mp4
--record-episodes1录制多少个 episode
--record-fps20导出媒体帧率
--record-frame-skip3每隔多少环境步采一帧
--save-pathartifacts/ddpg_pusher_v5_actor.pt模型保存路径

实现要点

  • 仍然使用单文件纯 PyTorch 实现,便于和 Reacher-v5 项目做一一对照
  • Actor 输出经过 tanh 映射回环境动作范围 [-2, 2]
  • Critic 输入为 (obs, action) 拼接后的向量
  • 时间截断 truncated 不会被当作真正终止,目标值仍然继续 bootstrap
  • 如果设置 --record-path,脚本会在离屏 rgb_array 模式下导出 gif 或 mp4

训练建议

  • Pusher-v5 相比 Reacher-v5 更难,DDPG 对超参数更敏感
  • 如果默认设置效果一般,可以先把 --total-steps 提高到 400000
  • 也可以尝试更强的连续控制算法,比如 TD3 或 SAC 作为对照基线