自学完强化学习理论后,实现 DQN 和 PPO 两种经典算法,在 CartPole、LunarLander、Pendulum 三个环境中从样本效率、收敛稳定性、动作空间适配性三个维度做系统对比。
- Experience Replay:打破样本时序相关性
- Target Network:固定目标 Q 值,切断自举循环,解决训练不稳定问题
- Epsilon-Greedy:探索-利用平衡
- GAE 优势估计:偏差-方差权衡
- Clip 机制:策略更新的信任域约束,避免一步迈太大
- 支持 discrete(Categorical)和 continuous(高斯分布)两种动作空间
| 环境 | DQN | PPO | 结论 |
|---|---|---|---|
| CartPole-v1(离散,简单) | 487/500 | 372 | 都能收敛,DQN 略优 |
| LunarLander-v3(离散,复杂) | 205 (Solved) | 28(未收敛) | off-policy 样本效率优势明显 |
| Pendulum-v1(连续) | 无法处理 | 收敛至 -650 | PPO 的核心优势:支持连续动作空间 |
- DQN CartPole:奖励先升后降 → 学习率过高 + Buffer 太小,调低 lr 并增大 Buffer 后稳定
- PPO Pendulum:初始完全没收敛 → 奖励量级(-1600)导致 value loss 压倒 actor loss,归一化 returns 后解决
├── dqn.py # DQN 算法实现
├── ppo.py # PPO 算法实现(支持离散/连续)
├── utils.py # 训练日志工具
├── app.py # Gradio 可视化界面
├── train_dqn_cartpole.py # DQN CartPole 训练脚本
├── train_dqn_lunar.py # DQN LunarLander 训练脚本
├── train_ppo_cartpole.py # PPO CartPole 训练脚本
├── train_ppo_lunar.py # PPO LunarLander 训练脚本
├── train_ppo_pendulum.py # PPO Pendulum 训练脚本
├── plots/ # 训练曲线图
└── requirements.txt
pip install -r requirements.txt
# 训练
python train_dqn_cartpole.py
python train_ppo_pendulum.py
# 可视化
python app.pyPython / PyTorch / Gymnasium / Gradio | Claude Code + GLM-5.1(辅助开发)