CleanRL 深度强化学习算法实现总览:9 大算法、27 个单文件变体完整索引
【免费下载链接】cleanrlHigh-quality single file implementation of Deep Reinforcement Learning algorithms with research-friendly features (PPO, DQN, C51, DDPG, TD3, SAC, PPG)项目地址: https://gitcode.com/GitHub_Trending/cl/cleanrl
CleanRL 是一个以「高质量单文件实现」为核心理念的深度强化学习(Deep RL)算法库:每一个算法实现都独立成.py文件,不依赖自定义网络层或复杂抽象,同时内置实验追踪、模型管理、视频录制等面向科研的工程特性。本文以仓库的 docs/rl-algorithms/overview.md 为骨架,结合cleanrl/目录下的真实源码,完整梳理 CleanRL 当前实现的 9 类算法与其全部变体,并逐算法给出默认超参、适用场景与源码定位,帮助你快速定位"该用哪个文件、改哪些参数、对应哪篇论文"。
CleanRL 算法版图:一张总表
overview.md 以一张总表的方式列出了全部算法与其变体实现。整理如下(各变体的详细文档见对应小节):
| 算法 | 已实现的变体(源码文件) | 详细文档 |
|---|---|---|
| Proximal Policy Optimization (PPO) | ppo.py、ppo_atari.py、ppo_continuous_action.py、ppo_atari_lstm.py、ppo_atari_envpool.py、ppo_atari_envpool_xla_jax.py、ppo_atari_envpool_xla_jax_scan.py、ppo_procgen.py、ppo_atari_multigpu.py、ppo_pettingzoo_ma_atari.py、ppo_continuous_action_isaacgym/ppo_continuous_action_isaacgym.py | ppo.md |
| Deep Q-Learning (DQN) | dqn.py、dqn_atari.py、dqn_jax.py、dqn_atari_jax.py | dqn.md |
| Categorical DQN (C51) | c51.py、c51_atari.py、c51_jax.py、c51_atari_jax.py | c51.md |
| Soft Actor-Critic (SAC) | sac_continuous_action.py、sac_atari.py | sac.md |
| Deep Deterministic Policy Gradient (DDPG) | ddpg_continuous_action.py、ddpg_continuous_action_jax.py | ddpg.md |
| Twin Delayed Deep Deterministic Policy Gradient (TD3) | td3_continuous_action.py、td3_continuous_action_jax.py | td3.md |
| Phasic Policy Gradient (PPG) | ppg_procgen.py | ppg.md |
| Random Network Distillation (RND) | ppo_rnd_envpool.py | ppo-rnd.md |
| Qdagger | qdagger_dqn_atari_impalacnn.py、qdagger_dqn_atari_jax_impalacnn.py | qdagger.md |
从这张表可以看到三条清晰的演进主线:同一种算法适配不同环境范式(离散/连续动作、Atari/经典控制/MuJoCo/Procgen/IsaacGym)、同一种算法提供 PyTorch 与 JAX 双后端(如dqn_jax.py、c51_atari_jax.py)、面向吞吐量与多卡训练的高性能变体(ppo_atari_envpool.py、ppo_atari_multigpu.py)。
PPO:覆盖最广的基准算法(11 个变体)
PPO 是 CleanRL 中变体最丰富、生态最完整的算法,从经典控制到 IsaacGym 仿真,从单卡到多卡,从 PyTorch 到 JAX 均有覆盖。
核心实现ppo.py
cleanrl/ppo.py面向离散动作的经典控制环境(默认CartPole-v1),是理解其余所有 PPO 变体的地基。其核心超参在Argsdataclass 中定义:
- 环境与训练规模:
env_id="CartPole-v1"、total_timesteps=500000、num_envs=4(并行环境数)、num_steps=128(每轮 rollout 每个环境采集的步数)。 - PPO 核心超参:
gamma=0.99(折扣因子)、gae_lambda=0.95(GAE 广义优势估计系数)、num_minibatches=4(mini-batch 数)、update_epochs=4(每批数据上更新 K 轮)、clip_coef=0.2(surrogate clipping 系数)、clip_vloss=True(对价值函数使用裁剪损失)、ent_coef=0.01(熵正则系数)、vf_coef=0.5(价值函数损失系数)、max_grad_norm=0.5(梯度裁剪范数)、anneal_lr=True(学习率退火)、target_kl=None(可选的 KL 早停阈值)。 - 运行时推导参数:
batch_size、minibatch_size、num_iterations在脚本内由num_envs × num_steps与num_minibatches计算得出,无需手动指定。
从源码结构看,ppo.py采用「actor-critic 共享 MLP 骨干(两层 64 隐层 + Tanh)」的网络设计,layer_init使用正交初始化,actor 输出层用std=0.01缩小初始策略熵。策略更新部分使用Categorical分布计算策略损失,配合 GAE 与 mini-batch SGD,构成标准的 PPO-Clip 训练循环。
面向不同环境的 PPO 变体
| 变体 | 默认环境 | 关键差异 |
|---|---|---|
ppo_atari.py | BreakoutNoFrameskip-v4(total_timesteps=1e7、num_envs=8、clip_coef=0.1) | 引入cleanrl_utils.atari_wrappers(NoopResetEnv、MaxAndSkipEnv、EpisodicLifeEnv、FireResetEnv、ClipRewardEnv),使用 CNN 处理帧堆叠 |
ppo_continuous_action.py | HalfCheetah-v4(total_timesteps=1e6、num_steps=2048、num_minibatches=32、update_epochs=10、ent_coef=0.0) | 使用Normal(高斯)分布输出连续动作;环境侧叠加FlattenObservation、ClipAction、NormalizeObservation、NormalizeReward、TransformObservation/Reward(clip 到 ±10)等 wrapper,兼容 Gymnasium MuJoCo 与 dm_control |
ppo_atari_lstm.py | Atari | 在 actor-critic 中引入 LSTM 处理部分可观测(POMDP)序列 |
ppo_atari_envpool.py | Breakout-v5 | 用envpool向量环境替代 Gym 向量环境,大幅提升环境吞吐 |
ppo_atari_envpool_xla_jax.py/ppo_atari_envpool_xla_jax_scan.py | Atari | JAX 后端 + envpool,配合 XLA 编译;scan 变体用jax.lax.scan重写 rollout 以进一步降低开销 |
ppo_procgen.py | Procgen 套件 | 面向通用 RL(Procgen benchmark),可配合requirements-procgen.txt |
ppo_atari_multigpu.py | BeamRiderNoFrameskip-v4等多卡配置 | 数据并行多 GPU 训练,支持--n_gpu等参数 |
ppo_pettingzoo_ma_atari.py | PettingZoo 多智能体 Atari | 基于ppo_pettingzoo_ma_atari环境的多智能体 PPO |
ppo_continuous_action_isaacgym.py(位于cleanrl/ppo_continuous_action_isaacgym/) | IsaacGym 仿真(如 Ant、Humanoid 等) | 面向 IsaacGym 大规模并行仿真,配套独立的pyproject.toml依赖声明 |
对应基准脚本可参考 benchmark/ppo.sh、benchmark/ppo_trxl.sh,运行与复现说明见 docs/benchmark/ppo.md、docs/benchmark/ppo_atari.md。
DQN 家族:从经典 DQN 到分布强化学习
DQN:dqn.py与 Atari/JAX 变体
cleanrl/dqn.py是面向经典控制(默认CartPole-v1)的深度 Q 网络实现,其Args完整保留了 DQN 的核心机制参数:
- 网络与经验回放:
buffer_size=10000(回放池大小)、batch_size=128(采样批大小)、train_frequency=10(训练频率)。回放池来自cleanrl_utils.buffers.ReplayBuffer。 - 目标网络:
tau=1.0(硬拷贝系数)、target_network_frequency=500(每 500 步整权重拷贝一次目标网络)。 - 探索调度:
start_e=1、end_e=0.05、exploration_fraction=0.5,即在前 50% 的总步数内将 ε-greedy 探索率从 1.0 线性退火到 0.05。 - 学习启动:
learning_starts=10000(预热步数,之前只采集不学习)。
Q 网络采用 120→84 的两层 MLP(ReLU 激活)。变体方面:
dqn_atari.py:面向 Atari(BreakoutNoFrameskip-v4),使用卷积网络与 Atari wrappers;dqn_jax.py、dqn_atari_jax.py:JAX/Flax 后端实现,需参考requirements-jax.txt安装依赖。
cleanrl_utils/evals/dqn_eval.py提供独立评估函数,tests/test_classic_control.py中也有对dqn.py的冒烟测试可作运行验证。
C51(Categorical DQN):分布价值学习
cleanrl/c51.py在 DQN 基础上把「价值期望」改为「价值分布」,核心差异参数:
n_atoms=101:分布的原子(支撑点)数量;v_min=-100、v_max=100:回报分布的上下界,用于构造均匀支撑集。
其余参数(buffer_size、gamma、tau、target_network_frequency、start_e/end_e/exploration_fraction、learning_starts、train_frequency)与 DQN 一致,仅损失函数替换为分类分布投影(F.cross_entropy计算交叉熵)。变体c51_atari.py适配 Atari 像素环境,c51_jax.py、c51_atari_jax.py提供 JAX 实现。
连续控制三件套:DDPG、TD3、SAC
三个面向连续动作空间(默认 MuJoCo-v4环境)的 off-policy 算法共享相似结构:actor-critic + 经验回放 + 目标网络,默认环境均为Hopper-v4,total_timesteps=1e6、buffer_size=int(1e6)、gamma=0.99、tau=0.005、batch_size=256。
| 特性 | ddpg_continuous_action.py | td3_continuous_action.py | sac_continuous_action.py |
|---|---|---|---|
| 学习率 | learning_rate=3e-4(单优化器) | learning_rate=3e-4 | policy_lr=3e-4、q_lr=1e-3(分离优化器) |
| 探索机制 | exploration_noise=0.1(动作空间高斯噪声) | exploration_noise=0.1+ 目标策略平滑policy_noise=0.2、noise_clip=0.5 | 熵正则alpha=0.2,默认autotune=True自动调节 |
| 延迟更新 | policy_frequency=2 | policy_frequency=2 | policy_frequency=2、target_network_frequency=1 |
| 学习启动 | learning_starts=25e3 | learning_starts=25e3 | learning_starts=5e3 |
- DDPG(
ddpg_continuous_action.py)是确定性策略梯度的基础实现:单个 Q 网络 + 单个确定性 actor,靠exploration_noise探索。 - TD3(
td3_continuous_action.py)在 DDPG 之上加入论文提出的三项改进——双 Q 网络取最小(clipped double-Q)、目标策略平滑正则(policy_noise+noise_clip)、延迟策略更新(policy_frequency=2)。 - SAC(
sac_continuous_action.py)采用随机策略 + 熵正则,默认开启autotune自动学习温度系数alpha,目标熵按动作维度自适应,样本效率通常优于 DDPG/TD3。
JAX 变体为ddpg_continuous_action_jax.py、td3_continuous_action_jax.py;Atari 像素版见sac_atari.py。基准复现脚本见 benchmark/sac.sh、benchmark/td3.sh、benchmark/ddpg.sh。
PPG、RND 与 Qdagger:CleanRL 的进阶算法矩阵
PPG:Phasic Policy Gradient
cleanrl/ppg_procgen.py是唯一一个 PPG 实现,面向 Procgen 通用 RL benchmark(默认starpilot)。它把 PPO 的训练拆分为策略阶段与辅助阶段,参数上在标准 PPO 超参(num_envs=64、num_steps=256、gamma=0.999、adv_norm_fullbatch=True)之外新增:
n_iteration=32(N_pi:策略阶段迭代数);e_policy=1(E_pi:策略阶段内策略更新次数);v_value=1(E_V:策略阶段价值更新次数);e_auxiliary=6(E_aux:辅助阶段价值函数更新次数)。
其网络设计为「actor 与 critic 共享特征提取层」的经典 PPG 结构,辅助阶段仅更新价值头以最小化对策略的干扰。
RND:随机网络蒸馏
cleanrl/ppo_rnd_envpool.py面向稀疏奖励探索任务,默认环境MontezumaRevenge-v5,total_timesteps=2e9、num_envs=128、gamma=0.999、clip_coef=0.1、ent_coef=0.001。实现要点:
- 使用
envpool提供 128 路并行环境; - 训练一个随机初始化且固定不动的目标网络与一个可学习的预测网络,用两者输出特征的均方误差作为内在奖励;
- 引入
RunningMeanStd对奖励做归一化,并维护IntrinsicReward与ExtrinsicReward的加权组合(相关权重可在脚本中调整)。
Qdagger:从专家(教师)策略蒸馏
cleanrl/qdagger_dqn_atari_impalacnn.py与 JAX 版qdagger_dqn_atari_jax_impalacnn.py面向 Atari(默认BreakoutNoFrameskip-v4,total_timesteps=1e7),是 DQN 与行为克隆的结合体:
- 从 Hugging Face Hub 下载预训练教师模型(
dqn_atari的QNetwork作为TeacherModel),代码中通过hf_hub_download获取权重; - 训练学生策略时以一定概率从教师策略采样动作(
sample_action),并将教师行为克隆损失与 DQN 的 Q 学习损失联合优化,同时引入n-step自举与分布式经验回放(deque+ReplayBuffer); - 评估环节复用
cleanrl_utils/evals/dqn_eval.py的evaluate函数。
所有实现共享的通用工程参数
无论选择哪个算法文件,Args中都包含一组完全一致的通用科研参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
--seed | 1 | 实验随机种子;另可通过torch_deterministic开启确定性计算 |
--cuda | True | 是否启用 GPU |
--track | False | 是否用 Weights & Biases 追踪实验 |
--wandb-project-name/--wandb-entity | cleanRL/None | wandb 项目名与团队 |
--capture-video | False | 录制 agent 表现视频到videos/{run_name}目录 |
--save-model/--upload-model/--hf-entity | False/False/"" | 保存模型到runs/{run_name},并可上传到 Hugging Face Hub(DQN/C51/SAC/DDPG/TD3/PPO 连续动作等多数文件支持) |
从tests/目录(如 tests/test_classic_control.py、tests/test_atari.py、tests/test_mujoco.py)可以看到,这些参数与算法逻辑共同保证了脚本可以开箱即用并接受--env-id、--total-timesteps等标准 CLI 覆盖。
如何选择实现:决策速查
- 离散动作、快速验证:经典控制选
ppo.py或dqn.py;Atari 基准选ppo_atari.py/dqn_atari.py/c51_atari.py。 - 连续控制、MuJoCo/dm_control:优先
sac_continuous_action.py(样本效率高),需要确定性与复现可控时选td3_continuous_action.py,最小实现看ddpg_continuous_action.py。 - 追求环境吞吐:Atari 场景用
ppo_atari_envpool.py(envpool 向量化),进一步压榨性能可上 JAX 的ppo_atari_envpool_xla_jax.py/_scan.py。 - 多卡训练:
ppo_atari_multigpu.py。 - 稀疏奖励 / 探索困难:
ppo_rnd_envpool.py(RND + Montezuma 系列)。 - 通用 RL / 泛化能力:
ppo_procgen.py、ppg_procgen.py。 - 样本蒸馏 / 从专家学习:
qdagger_dqn_atari_impalacnn.py。 - 仿真到现实 / IsaacGym:
ppo_continuous_action_isaacgym/ppo_continuous_action_isaacgym.py。
安装依赖时可按需选用 requirements/ 下的拆分文件:基础训练用requirements.txt,Atari 用requirements-atari.txt,JAX 用requirements-jax.txt,MuJoCo 用requirements-mujoco.txt,Procgen 用requirements-procgen.txt,envpool 用requirements-envpool.txt,多智能体用requirements-pettingzoo.txt。
结语
通过 overview.md 这张索引,可以快速定位 CleanRL 在9 个算法族、27 个实现变体上的完整布局:既有从 CartPole 到 Atari、从离散到连续的横向覆盖,也有 PyTorch/JAX 双后端、envpool 加速、多 GPU、IsaacGym 仿真、稀疏奖励与专家蒸馏的纵向深入。每个变体的详细设计、超参说明与实验曲线,均可通过上述各算法文档页(ppo.md、dqn.md、c51.md、sac.md、ddpg.md、td3.md、ppg.md、ppo-rnd.md、qdagger.md)继续深入研读,并结合 docs/rl-algorithms/overview.md 交叉检索所需实现。
【免费下载链接】cleanrlHigh-quality single file implementation of Deep Reinforcement Learning algorithms with research-friendly features (PPO, DQN, C51, DDPG, TD3, SAC, PPG)项目地址: https://gitcode.com/GitHub_Trending/cl/cleanrl
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考