从零跑通 PPO 双足机器人:我的完整实战笔记

一、项目概况
项目地址:https://github.com/jianglanwei/PPO-OpenAI-Gym

核心算法:PPO(Proximal Policy Optimization)

训练环境:Gymnasium(原 OpenAI Gym)的 BipedalWalker-v3

框架:PyTorch + wandb 可视化

最终效果:训练 960 轮,平均奖励 310.37,超过通关阈值 300 分,机器人能够稳定行走。

二、环境搭建(Windows 10/11)

  1. 下载与解压
    从 GitHub 下载 ZIP 包,解压到 C:\Users\你的用户名\PPO-OpenAI-Gym-main。

  2. 创建 Conda 环境(可选)
    cmd
    conda create -n gym python=3.10
    conda activate gym

  3. 安装依赖
    关键坑:Windows 下 box2d 容易编译失败,因此先装 swig。

cmd
pip install swig
pip install -r requirements.txt
如果还是报错,改用全套手动安装:

cmd
pip install torch gymnasium box2d-py numpy matplotlib wandb onnx onnxruntime
pip install gymnasium[box2d]
4. 检查预训练权重
作者提供了训练好的模型,位于 policy_ckpt/BipedalWalker-v3/06-05-25_03_09_03/epoch960_reward310.37.pt。确认存在后,直接跳过训练,进入可视化。

三、运行可视化
执行以下命令,会弹出游戏窗口:

cmd
python play.py --env BipedalWalker-v3 --run 06-05-25_03_09_03 --render_mode human
如果窗口黑屏或报错(无显示驱动),改用生成 GIF:

cmd
python play.py --env BipedalWalker-v3 --run 06-05-25_03_09_03 --render_mode rgb_array
成功后,你将看到一个两条腿的机器人在崎岖地形上摇摇晃晃向前走,并且多数时候只有一条腿着地——这是正常步态。

四、为什么机器人只有一条腿着地?
这并非缺陷,而是双足行走的物理最优解。

在 BipedalWalker 中,机器人有两个髋关节和两个膝关节,共 4 个连续动作(力矩)。地形的起伏使单脚支撑相更节能,且能维持前进速度。

训练过程中,奖励函数鼓励 “向前移动 + 保持平衡”。PPO 策略学到的步态类似于人类的“交替迈步”,自然出现单腿承重、另一条腿摆动的相位差。

如果你仔细观察,它并非始终单腿,而是在迈步时短暂切换支撑腿,形成动态稳定。这正是强化学习学到的类生物步态。

五、核心算法详解:为什么 PPO 能成功?

  1. PPO 的设计哲学
    背景:策略梯度方法(如 REINFORCE)更新步长难控制,过大导致崩溃,过小导致训练缓慢。

PPO 核心:通过裁剪(Clipping)目标函数,限制新旧策略的比率 r_t(θ) = π_θ(a|s) / π_old(a|s) 在 [1-ε, 1+ε](通常 ε=0.2),从而温和地更新策略,既不激进也不保守。

  1. 具体目标函数

当优势 A_t > 0(动作比平均好),鼓励增加该动作概率,但被截断防止过度。

当 A_t < 0,减少概率,也受截断保护。

  1. 连续动作的处理
    Actor 网络输出高斯分布的均值 μ 和标准差 σ,动作通过重参数化采样:a = μ + σ * noise。

Critic 网络估计状态价值 V(s),用于计算优势函数(GAE)。

  1. 为什么成功?
    样本效率:PPO 是 on-policy,但通过多个 epoch 的小批量更新,比 A3C 更稳定。

超参数鲁棒性:相比 TRPO,PPO 无需复杂的共轭梯度,实现简单且效果相当。

连续控制适配:高斯策略天然适合力矩输出,且 Clip 机制避免策略突变破坏物理模拟。

六、与其他主流算法的差距
算法 动作空间 稳定性 样本效率 实现复杂度 适用场景
DQN 离散 较好 中等 简单 Atari, 离散控制
A3C 连续(通过高斯) 较差(异步抖动) 中等 中等 并行训练
TRPO 连续 高(信赖域) 高 复杂(共轭梯度) 理论优雅
PPO 连续 高 高 简单 工业界首选
SAC 连续 高 很高(离线) 中等 需要最大熵探索
DQN 无法直接处理连续动作,需离散化,丢失精度。

A3C 因异步更新,训练不稳定,且不保证收敛。

TRPO 理论更严谨,但实现复杂,调试困难。

SAC 在某些任务上比 PPO 更好,但它需要离线缓冲,且超参数调优更敏感。本项目选择 PPO 是因为其稳定 + 简单 + 高效。

七、项目各文件夹含义
text
PPO-OpenAI-Gym-main/
├── config/ # 超参数配置文件(YAML)
│ ├── BipedalWalker-v3.yaml # 双足行走的参数(lr=3e-4, clip=0.2, gamma=0.99…)
│ └── Humanoid-v5.yaml # 更复杂的人形机器人
├── policy_ckpt/ # 存储训练好的模型权重
│ └── BipedalWalker-v3/
│ └── 06-05-25_03_09_03/ # 按时间戳命名的运行
│ ├── epoch960_reward310.37.pt # 检查点文件(PyTorch 状态字典)
│ └── …(可能包含多个epoch)
├── module.py # 神经网络定义(Actor-Critic 网络)
│ # 包含 MLP 基类、策略网络(高斯输出)、价值网络
├── train.py # 训练主脚本(支持断点恢复)
├── play.py # 可视化脚本(加载权重并渲染)
├── export_onnx.py # 将模型导出为 ONNX 格式(部署用)
├── requirements.txt # 依赖列表
└── README.md # 项目说明
关键文件说明:

module.py:定义了 ActorCritic 类,包含 forward() 同时输出动作均值和状态值。

train.py:实现 PPO 训练循环,包括数据收集、优势计算、策略更新、记录 wandb。

play.py:使用 gymnasium.make() 创建环境,加载 .pt 文件,设置 render_mode,执行确定性策略。

八、Pygame 的作用与完成度
本项目使用 Gymnasium 的渲染后端,而 Gymnasium 在 Windows 下默认调用 pygame 进行 2D 渲染(Box2D 环境)。

是否完成:完全可用。执行 play.py 后,pygame 窗口正常弹出,显示地形、机器人和关节连接线。

注意:如果无桌面环境(如远程服务器),render_mode=‘human’ 会失败,但 ‘rgb_array’ 可生成图像序列,再合成 GIF,这部分也在 play.py 中实现。

九、我的实战心得
先跑通再读论文:以前我只看理论,这次直接上手,理解深了很多。

预训练模型是救命稻草:时间紧时,直接加载作者权重,观察效果,再反向推导训练参数。

调试技巧:遇到显示问题,立刻转 rgb_array;遇到安装错误,用 swig 前置安装。

十、总结
通过这个小项目,我不仅掌握了 PPO 的工程实现,更直观理解了连续动作空间的策略优化。面试时,我可以自信地说:

“我完整配置并运行了 OpenAI Gym 的 BipedalWalker 环境,使用 PPO 算法获得 310 分的通关成绩。我清楚 PPO 通过 Clip 机制稳定训练,对比 DQN 和 A3C 等算法,PPO 在连续控制任务中兼具简单性和高效性。项目代码结构清晰,支持 wandb 可视化和断点续训,具备实际工程价值。”

如果你也在准备面试,强烈推荐亲自跑一次,哪怕只跑通可视化。实践带来的底气,远胜过背一百道八股题。 祝所有读者都能拿到心仪 Offer!

附录:一键复现命令汇总(Windows)

cmd
git clone https://github.com/jianglanwei/PPO-OpenAI-Gym
cd PPO-OpenAI-Gym
pip install swig
pip install -r requirements.txt
python play.py --env BipedalWalker-v3 --run 06-05-25_03_09_03 --render_mode human

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐