从零手写 7 个经典 RL 算法(DQN 系列 + REINFORCE/AC/PPO 系列),每个算法一个独立目录、自包含脚本、详细中文 README。 适合强化学习入门与进阶实践;所有算法均可在 CPU / Apple Silicon MPS / NVIDIA CUDA 上运行。
按"价值 → 策略"两支递进组织,每个目录独立可运行:
| # | 算法 | 类别 | 环境 | 目录 |
|---|---|---|---|---|
| 1 | DQN | Value-based | CartPole / Atari | dqn/ |
| 2 | Double DQN | Value-based | CartPole | double_dqn/ |
| 3 | Dueling DQN | Value-based | CartPole | dueling_dqn/ |
| 4 | PER DQN | Value-based | CartPole | per_dqn/ |
| 5 | REINFORCE | Policy-based | CartPole | reinforce/ |
| 6 | Actor-Critic | Policy-based | CartPole | actor_critic/ |
| 7 | PPO | Policy-based | CartPole / HalfCheetah-v4 | ppo/ |
阅读顺序推荐:dqn → double → dueling → per → reinforce → actor_critic → ppo(每个 README 都明确写了"与上一步的差异")。
- 在 Apple Silicon MPS 上 122 回合 / 约 12.3 万步 达标
- 达标时评估回报 3689.9(5 回合确定性均值,达标线 3000)
- 最终评估 3 回合平均回报 3678.6(3624.3 / 3685.5 / 3726.1)
- 总耗时 约 12 分钟(Apple Silicon MPS 实测 12m8s;如未达标,最长 1M 步 ≈ 100 分钟)
| 算法 | 收敛回合 | 评估满分 | 备注 |
|---|---|---|---|
| DQN | 1400 | 500/500 | MLP 网络 |
| Double DQN | 同 DQN | 同 DQN | 缓解过估计 |
| Dueling DQN | 同 DQN | 同 DQN | V/A 分解 |
| PER DQN | 同 DQN | 同 DQN | 优先回放 |
| REINFORCE | 600 | 500/500 | 蒙特卡洛 |
| Actor-Critic | 数百 | 500/500 | 单步 TD 自举 |
| PPO | 数百 | 500/500 | 裁剪目标 + GAE |
# 1. 创建虚拟环境并装依赖
python3 -m venv rl
rl/bin/pip install -r requirements.txt
# 2. 跑一个最简单的 CartPole DQN(约 1400 回合收敛)
cd dqn
../rl/bin/python dqn_cartpole.py
# 3. 跑 PPO + HalfCheetah(默认 1M 步,提前达标自动结束)
cd ../ppo
../rl/bin/python ppo_halfcheetah.py --checkpoint-every 20更详细的可复现步骤:ppo/REPRODUCE.md
每个算法脚本都具备:
- 可复现性:固定随机种子、完整训练状态保存(网络 + 优化器 + 归一化统计量)
- 可视化:
--render-every弹窗演示、--eval-only加载模型观看 - 断点续训:
--resume接着上次训练继续(保存完整训练状态) - 中断保护:Ctrl+C 自动保存检查点;
--checkpoint-every N定期落盘 - 设备自适应:自动选择 CUDA → Apple Silicon MPS → CPU,可用
RL_DEVICE=cpu强制 - 训练日志:PPO 训练期间输出 3 份 JSONL 诊断日志
*_steps.jsonl:每步(reward / 熵 / value / log_prob / 动作模长 / done)*_updates.jsonl:每次更新(policy/value/entropy loss、KL、clip_fraction、explained_variance、grad_norm、ratio mean/max、bootstrap_value、fps 等 19 字段)*_episodes.jsonl:每回合(回报、长度、滑动均值)
.
├── dqn/ # 基础 DQN(MLP + Nature DQN 卷积)
├── double_dqn/ # Double DQN(解耦选动作与评估)
├── dueling_dqn/ # Dueling DQN(V/A 分解)
├── per_dqn/ # PER DQN(SumTree 优先回放 + IS 权重)
├── reinforce/ # REINFORCE 蒙特卡洛策略梯度
├── actor_critic/ # Actor-Critic(共享特征层)
├── ppo/ # PPO(CartPole 离散 + HalfCheetah 连续)
│ ├── ppo_cartpole.py
│ ├── ppo_halfcheetah.py
│ └── REPRODUCE.md # 复现 ~3680 评估回报的具体步骤
├── requirements.txt
├── rl/ # Python 虚拟环境(不提交,见 .gitignore)
├── LICENSE
├── Dockerfile
└── .github/workflows/ci.yml
详见 ppo/REPRODUCE.md。简版:
cd ppo
../rl/bin/python ppo_halfcheetah.py --checkpoint-every 20
# 预期:122 回合达标,最终评估回报 ~3680-
rl-training-platform —— 配套的 RL 训练实验管理平台 (Spring Boot 3 + Vue 3 + MySQL 8 + Redis 7 + InfluxDB 2.7,Docker Compose 一键部署,含 API 文档与部署运维手册)。
本仓库的
ppo/ppo_halfcheetah.py会自动加载该平台的python_worker/rl_reporter.py, 用--platform-url http://<host>:8080 --exp-id <id>即可把训练指标上报到平台,在 Vue + ECharts 看板上实时看曲线。
如果你在毕设 / 课程项目 / 工作中用了这个仓库:
@misc{rl-pytorch,
author = {junxiaoguang},
title = {Classic RL Algorithms in PyTorch: From DQN to PPO},
year = {2026},
url = {https://github.com/junxiaoguang/rl-pytorch}
}