离策略算法(Off-Policy)¶
离策略方法能够利用由不同策略收集的历史经验数据进行学习,通过经验回放缓冲区(Replay Buffer)极大地提升了采样效率。本页涵盖连续动作空间的 Actor-Critic 方法和离散动作空间的基于值的方法。
连续动作空间¶
以下算法适用于连续动作空间的控制任务,如机器人操控、运动控制等。
SAC¶
Soft Actor-Critic(软演员-评论家)
基于最大熵框架的离策略 Actor-Critic 算法,通过自动调节温度参数来平衡回报最大化和策略熵最大化,在连续控制任务中表现卓越。
Haarnoja et al., "Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor", 2018. arXiv:1801.01290
稳定性: Core 动作空间: Continuous
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 3e-4 | Actor 和 Critic 的学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 256 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
tau | 0.005 | 目标网络软更新系数 |
ent_coef | "auto" | 熵系数(auto 表示自动调节) |
target_entropy | "auto" | 目标熵(auto 为 -dim(A)) |
learning_starts | 10_000 | 开始训练前的随机采样步数 |
train_freq | 1 | 每采集几步训练一次 |
YAML 配置示例¶
algorithm: sac
algo_kwargs:
learning_rate: 3e-4
buffer_size: 1_000_000
batch_size: 256
gamma: 0.99
tau: 0.005
ent_coef: "auto"
learning_starts: 10_000
Python API 示例¶
from rl_training.core import SAC
model = SAC(
env_id="Ant-v4",
learning_rate=3e-4,
buffer_size=1_000_000,
batch_size=256,
ent_coef="auto",
)
model.train(total_timesteps=1_000_000)
最佳实践
- 使用
ent_coef="auto"可自动调节探索与利用的平衡,是最推荐的设置。 - SAC 是连续控制任务的首选算法,采样效率高、训练稳定。
- 增大
buffer_size可以存储更多历史经验,有助于提升稳定性。
TD3¶
Twin Delayed DDPG(双延迟深度确定性策略梯度)
通过双 Q 网络、延迟策略更新和目标策略平滑三项改进来解决 DDPG 中的值函数过估计问题。
Fujimoto et al., "Addressing Function Approximation Error in Actor-Critic Methods", 2018. arXiv:1802.09477
稳定性: Core 动作空间: Continuous
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 3e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 256 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
tau | 0.005 | 目标网络软更新系数 |
policy_delay | 2 | 策略更新延迟步数 |
target_policy_noise | 0.2 | 目标策略平滑噪声 |
target_noise_clip | 0.5 | 目标噪声裁剪范围 |
exploration_noise | 0.1 | 探索噪声标准差 |
YAML 配置示例¶
algorithm: td3
algo_kwargs:
learning_rate: 3e-4
buffer_size: 1_000_000
batch_size: 256
gamma: 0.99
tau: 0.005
policy_delay: 2
target_policy_noise: 0.2
target_noise_clip: 0.5
Python API 示例¶
from rl_training.core import TD3
model = TD3(
env_id="HalfCheetah-v4",
learning_rate=3e-4,
policy_delay=2,
target_policy_noise=0.2,
)
model.train(total_timesteps=1_000_000)
最佳实践
- TD3 使用确定性策略,适合低维连续控制但不天然支持探索。
exploration_noise是性能的关键,过大过小都不行,需要针对任务调整。- 与 SAC 相比,TD3 不自动调节探索,但在某些任务上更稳定。
DDPG¶
Deep Deterministic Policy Gradient(深度确定性策略梯度)
将 DQN 的思想扩展到连续动作空间,通过确定性策略和经验回放来学习连续控制策略。是 TD3 和 SAC 的前身。
Lillicrap et al., "Continuous control with deep reinforcement learning", 2015. arXiv:1509.02971
稳定性: Experimental 动作空间: Continuous
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-3 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 128 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
tau | 0.001 | 目标网络软更新系数 |
exploration_noise | 0.1 | OU 噪声或高斯噪声标准差 |
noise_type | "ou" | 噪声类型(ou 或 gaussian) |
YAML 配置示例¶
algorithm: ddpg
algo_kwargs:
learning_rate: 1e-3
buffer_size: 1_000_000
batch_size: 128
gamma: 0.99
tau: 0.001
exploration_noise: 0.1
noise_type: "ou"
Python API 示例¶
from rl_training.experimental import DDPG
model = DDPG(
env_id="Pendulum-v1",
learning_rate=1e-3,
buffer_size=1_000_000,
exploration_noise=0.1,
)
model.train(total_timesteps=100_000)
最佳实践
- 推荐优先使用 TD3 或 SAC,它们解决了 DDPG 的多种已知问题。
- 如果使用 DDPG,批归一化(Batch Normalization)可以帮助稳定训练。
- OU 噪声在某些任务上优于高斯噪声,但差异通常不大。
D4PG¶
Distributed Distributional DDPG(分布式分布型 DDPG)
将分布型值函数、N 步回报、优先经验回放和分布式采样集成到 DDPG 框架中,显著提升性能和采样效率。
Barth-Maron et al., "Distributed Distributional Deterministic Policy Gradients", 2018. arXiv:1804.08617
稳定性: Experimental 动作空间: Continuous
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 256 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
n_step | 5 | N 步回报步数 |
num_atoms | 51 | 分布型值函数的原子数 |
v_min | -10.0 | 值分布下界 |
v_max | 10.0 | 值分布上界 |
num_actors | 8 | 并行 Actor 数量 |
YAML 配置示例¶
algorithm: d4pg
algo_kwargs:
learning_rate: 1e-4
buffer_size: 1_000_000
batch_size: 256
n_step: 5
num_atoms: 51
v_min: -10.0
v_max: 10.0
num_actors: 8
Python API 示例¶
from rl_training.experimental import D4PG
model = D4PG(
env_id="Humanoid-v4",
learning_rate=1e-4,
n_step=5,
num_atoms=51,
num_actors=8,
)
model.train(total_timesteps=5_000_000)
最佳实践
- D4PG 在分布式设置下效果最佳,单 Actor 时优势不明显。
v_min和v_max应根据任务的回报范围合理设置。- N 步回报 (
n_step=5) 可以加速信用分配。
TQC¶
Truncated Quantile Critics(截断分位数评论家)
在 SAC 框架中引入分布型评论家,通过截断最高分位数来缓解过估计问题,在连续控制基准上取得 SOTA 表现。
Kuznetsov et al., "Controlling Overestimation Bias with Truncated Mixture of Continuous Distributional Quantile Critics", 2020. arXiv:2005.04269
稳定性: Experimental 动作空间: Continuous
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 3e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 256 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
tau | 0.005 | 软更新系数 |
n_critics | 5 | 评论家网络数量 |
n_quantiles | 25 | 每个评论家的分位数数量 |
top_quantiles_to_drop | 2 | 截断的最高分位数数量 |
YAML 配置示例¶
algorithm: tqc
algo_kwargs:
learning_rate: 3e-4
buffer_size: 1_000_000
batch_size: 256
n_critics: 5
n_quantiles: 25
top_quantiles_to_drop: 2
Python API 示例¶
from rl_training.experimental import TQC
model = TQC(
env_id="Ant-v4",
n_critics=5,
n_quantiles=25,
top_quantiles_to_drop=2,
)
model.train(total_timesteps=3_000_000)
最佳实践
top_quantiles_to_drop是最关键的超参数,截断过多会导致低估。- 多个评论家增加了计算开销但提升了值估计质量。
- 在 MuJoCo 基准上通常优于标准 SAC。
CrossQ¶
CrossQ
通过跨批归一化(Cross-Batch Normalization)简化 SAC 的训练流程,无需目标网络,减少超参数数量并保持竞争性能。
Bhatt et al., "CrossQ: Batch Normalization in Deep Reinforcement Learning", 2024. arXiv:2302.01855
稳定性: Experimental 动作空间: Continuous
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 256 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
ent_coef | "auto" | 熵系数 |
critic_bn | true | 是否使用批归一化 |
n_critics | 2 | 评论家数量 |
YAML 配置示例¶
algorithm: crossq
algo_kwargs:
learning_rate: 1e-4
buffer_size: 1_000_000
batch_size: 256
gamma: 0.99
ent_coef: "auto"
critic_bn: true
Python API 示例¶
from rl_training.experimental import CrossQ
model = CrossQ(
env_id="HalfCheetah-v4",
learning_rate=1e-4,
critic_bn=True,
)
model.train(total_timesteps=1_000_000)
最佳实践
- CrossQ 不需要目标网络,减少了内存开销和超参数调优工作。
- 超参数鲁棒性是其主要优势,适合快速原型开发。
- 在某些任务上性能与 SAC 持平甚至更优。
REDQ¶
Randomized Ensemble Double Q-learning(随机集成双 Q 学习)
通过维护一个较大的 Q 网络集成并在每次更新时随机选取子集来计算目标值,提高更新频率而不引入显著过估计。
Chen et al., "Randomized Ensembled Double Q-Learning: Learning Fast Without a Model", 2021. arXiv:2101.05982
稳定性: Experimental 动作空间: Continuous
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 3e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 256 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
n_critics | 10 | 集成 Q 网络总数 |
subset_size | 2 | 每次更新随机选取的 Q 网络数 |
utd_ratio | 20 | 更新-数据比率 |
YAML 配置示例¶
algorithm: redq
algo_kwargs:
learning_rate: 3e-4
buffer_size: 1_000_000
batch_size: 256
n_critics: 10
subset_size: 2
utd_ratio: 20
Python API 示例¶
from rl_training.experimental import REDQ
model = REDQ(
env_id="Walker2d-v4",
n_critics=10,
subset_size=2,
utd_ratio=20,
)
model.train(total_timesteps=300_000)
最佳实践
- 高
utd_ratio是 REDQ 采样高效的关键,但增加了计算成本。 subset_size=2在大多数任务上是最优选择。- 适合采样成本高但计算资源充足的场景。
RLPD¶
Reinforcement Learning with Prior Data(带先验数据的强化学习)
在在线强化学习中高效融入离线先验数据,通过简单的回放缓冲区混合策略在在线学习中充分利用离线数据。
Ball et al., "Efficient Online Reinforcement Learning with Offline Data", 2023. arXiv:2302.02948
稳定性: Experimental 动作空间: Continuous
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 3e-4 | 学习率 |
buffer_size | 1_000_000 | 在线回放缓冲区大小 |
batch_size | 256 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
offline_ratio | 0.5 | 离线数据在批中的占比 |
prior_data_path | 必填 | 先验数据路径 |
utd_ratio | 20 | 更新-数据比率 |
YAML 配置示例¶
algorithm: rlpd
algo_kwargs:
learning_rate: 3e-4
buffer_size: 1_000_000
batch_size: 256
offline_ratio: 0.5
prior_data_path: "data/prior_transitions.npz"
utd_ratio: 20
Python API 示例¶
from rl_training.experimental import RLPD
model = RLPD(
env_id="Ant-v4",
prior_data_path="data/prior_transitions.npz",
offline_ratio=0.5,
utd_ratio=20,
)
model.train(total_timesteps=300_000)
最佳实践
offline_ratio控制在线和离线数据的混合比例,0.5 是较好的起点。- 即使先验数据质量一般,RLPD 也能从中获益。
- 结合 REDQ 的高 UTD 比率使用效果最佳。
NAF¶
Normalized Advantage Functions(归一化优势函数)
将 Q 函数参数化为状态值加上二次型优势项,使得连续动作空间的最优动作可以解析求解,避免了策略网络的训练。
Gu et al., "Continuous Deep Q-Learning with Model-based Acceleration", 2016. arXiv:1603.00748
稳定性: Experimental 动作空间: Continuous
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-3 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 128 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
tau | 0.001 | 目标网络软更新系数 |
learning_starts | 1000 | 开始训练前的随机步数 |
YAML 配置示例¶
algorithm: naf
algo_kwargs:
learning_rate: 1e-3
buffer_size: 1_000_000
batch_size: 128
gamma: 0.99
tau: 0.001
Python API 示例¶
from rl_training.experimental import NAF
model = NAF(
env_id="Pendulum-v1",
learning_rate=1e-3,
buffer_size=1_000_000,
)
model.train(total_timesteps=100_000)
最佳实践
- NAF 的二次型假设限制了其在复杂任务上的表现。
- 适用于低维连续控制的简单任务。
- 推荐优先考虑 SAC 或 TD3。
CURL¶
Contrastive Unsupervised RL(对比无监督强化学习)
通过对比学习从原始像素输入中提取高效的状态表示,显著提升基于像素的强化学习性能。
Srinivas et al., "CURL: Contrastive Unsupervised Representations for Reinforcement Learning", 2020. arXiv:2004.04136
稳定性: Experimental 动作空间: Continuous
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-3 | 学习率 |
encoder_learning_rate | 1e-3 | 编码器学习率 |
buffer_size | 100_000 | 回放缓冲区大小 |
batch_size | 128 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
curl_latent_dim | 128 | 对比表示维度 |
encoder_tau | 0.05 | 编码器动量更新系数 |
YAML 配置示例¶
algorithm: curl
algo_kwargs:
learning_rate: 1e-3
encoder_learning_rate: 1e-3
buffer_size: 100_000
batch_size: 128
curl_latent_dim: 128
encoder_tau: 0.05
Python API 示例¶
from rl_training.experimental import CURL
model = CURL(
env_id="dm_control/cheetah-run",
learning_rate=1e-3,
curl_latent_dim=128,
encoder_tau=0.05,
)
model.train(total_timesteps=500_000)
最佳实践
- CURL 专为像素输入设计,非像素环境无需使用。
- 对比学习的增强方式对性能有显著影响,默认使用随机裁剪。
- 在 DMControl 100k 基准上显著优于朴素 SAC。
DrQ¶
Data-regularized Q(数据正则化 Q)
通过对观测图像施加简单的随机增强(如移位)来正则化 Q 函数学习,无需修改算法结构即可大幅提升像素观测下的性能。
Kostrikov et al., "Image Augmentation Is All You Need: Regularizing Deep Reinforcement Learning from Pixels", 2020. arXiv:2004.13649
稳定性: Experimental 动作空间: Continuous
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-3 | 学习率 |
buffer_size | 100_000 | 回放缓冲区大小 |
batch_size | 128 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
aug_type | "shift" | 增强类型 |
aug_K | 2 | Q 目标中的增强数 |
aug_M | 2 | Q 值中的增强数 |
YAML 配置示例¶
algorithm: drq
algo_kwargs:
learning_rate: 1e-3
buffer_size: 100_000
batch_size: 128
aug_type: "shift"
aug_K: 2
aug_M: 2
Python API 示例¶
from rl_training.experimental import DrQ
model = DrQ(
env_id="dm_control/walker-walk",
learning_rate=1e-3,
aug_type="shift",
aug_K=2,
)
model.train(total_timesteps=500_000)
最佳实践
- DrQ 的核心思想非常简单:图像增强即可显著提升性能。
- 随机移位(shift)是最有效且计算成本最低的增强方式。
- 推荐将 DrQ-v2 作为 DrQ 的升级版本优先使用。
DrQ-v2¶
DrQ-v2
DrQ 的改进版本,将底层算法从 SAC 切换到 DDPG 并引入多项工程改进,在 DMControl 基准上取得 SOTA 表现。
Yarats et al., "Mastering Visual Continuous Control: Improved Data-Augmented Reinforcement Learning", 2021. arXiv:2107.09645
稳定性: Experimental 动作空间: Continuous
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 256 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
n_step | 3 | N 步回报 |
exploration_noise | 0.2 | 探索噪声标准差 |
feature_dim | 50 | 编码器输出特征维度 |
encoder_tau | 0.01 | 编码器动量更新系数 |
YAML 配置示例¶
algorithm: drq_v2
algo_kwargs:
learning_rate: 1e-4
buffer_size: 1_000_000
batch_size: 256
n_step: 3
exploration_noise: 0.2
feature_dim: 50
encoder_tau: 0.01
Python API 示例¶
from rl_training.experimental import DrQV2
model = DrQV2(
env_id="dm_control/humanoid-walk",
learning_rate=1e-4,
n_step=3,
feature_dim=50,
)
model.train(total_timesteps=2_000_000)
最佳实践
- DrQ-v2 是当前像素观测连续控制的首选算法之一。
- 使用 N 步回报 (
n_step=3) 和噪声调度可以进一步提升性能。 - 基于 DDPG 而非 SAC,训练速度更快。
离散动作空间(基于值)¶
以下算法适用于离散动作空间的任务,如 Atari 游戏、棋盘游戏等。
DQN¶
Deep Q-Network(深度 Q 网络)
使用深度神经网络来逼近 Q 函数,通过经验回放和目标网络来稳定训练。是深度强化学习的奠基之作。
Mnih et al., "Human-level control through deep reinforcement learning", Nature, 2015.
稳定性: Core 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 32 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
target_update_interval | 10_000 | 目标网络更新频率(步数) |
exploration_fraction | 0.1 | 探索率衰减占总步数的比例 |
exploration_initial_eps | 1.0 | 初始探索率 |
exploration_final_eps | 0.05 | 最终探索率 |
learning_starts | 50_000 | 开始训练前的随机步数 |
YAML 配置示例¶
algorithm: dqn
algo_kwargs:
learning_rate: 1e-4
buffer_size: 1_000_000
batch_size: 32
gamma: 0.99
target_update_interval: 10_000
exploration_fraction: 0.1
exploration_final_eps: 0.05
learning_starts: 50_000
Python API 示例¶
from rl_training.core import DQN
model = DQN(
env_id="Breakout-v5",
learning_rate=1e-4,
buffer_size=1_000_000,
batch_size=32,
target_update_interval=10_000,
)
model.train(total_timesteps=10_000_000)
最佳实践
- DQN 是离散动作空间最基础的算法,推荐作为基线使用。
- 足够长的
learning_starts对于稳定训练初期至关重要。 - 如果需要更好的性能,考虑使用 Rainbow DQN 的各种改进。
DiscreteSAC¶
Discrete SAC(离散 SAC)
将 SAC 的最大熵框架扩展到离散动作空间,通过对离散动作分布计算精确熵来避免连续 SAC 中的重参数化技巧。
Christodoulou, "Soft Actor-Critic for Discrete Action Settings", 2019. arXiv:1910.07207
稳定性: Core 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 3e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 64 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
tau | 0.005 | 目标网络软更新系数 |
ent_coef | "auto" | 熵系数 |
target_entropy_ratio | 0.98 | 目标熵占最大熵的比例 |
YAML 配置示例¶
algorithm: discrete_sac
algo_kwargs:
learning_rate: 3e-4
buffer_size: 1_000_000
batch_size: 64
gamma: 0.99
tau: 0.005
ent_coef: "auto"
target_entropy_ratio: 0.98
Python API 示例¶
from rl_training.core import DiscreteSAC
model = DiscreteSAC(
env_id="CartPole-v1",
learning_rate=3e-4,
ent_coef="auto",
target_entropy_ratio=0.98,
)
model.train(total_timesteps=500_000)
最佳实践
- 对于离散动作空间,DiscreteSAC 是比 DQN 更好的开箱即用选择。
- 自动熵调节 (
ent_coef="auto") 简化了超参数调优。 target_entropy_ratio控制探索强度,接近 1.0 时探索更积极。
Double DQN¶
Double DQN(双 DQN)
通过解耦动作选择和动作评估来解决标准 DQN 中的 Q 值过估计问题。使用在线网络选择动作,目标网络评估值。
van Hasselt et al., "Deep Reinforcement Learning with Double Q-learning", 2015. arXiv:1509.06461
稳定性: Experimental 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 32 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
target_update_interval | 10_000 | 目标网络更新频率 |
exploration_final_eps | 0.05 | 最终探索率 |
YAML 配置示例¶
algorithm: double_dqn
algo_kwargs:
learning_rate: 1e-4
buffer_size: 1_000_000
batch_size: 32
target_update_interval: 10_000
exploration_final_eps: 0.05
Python API 示例¶
from rl_training.experimental import DoubleDQN
model = DoubleDQN(
env_id="Pong-v5",
learning_rate=1e-4,
target_update_interval=10_000,
)
model.train(total_timesteps=10_000_000)
最佳实践
- Double DQN 几乎在所有场景下都优于标准 DQN,是最基本的改进。
- 可以与其他 DQN 改进(Dueling、PER 等)组合使用。
Dueling DQN¶
Dueling DQN(决斗 DQN)
将 Q 网络的输出分解为状态值 V(s) 和优势函数 A(s,a) 两个分支,使网络能够更好地学习哪些状态更有价值。
Wang et al., "Dueling Network Architectures for Deep Reinforcement Learning", 2015. arXiv:1511.06581
稳定性: Experimental 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 32 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
target_update_interval | 10_000 | 目标网络更新频率 |
dueling_type | "avg" | 优势聚合方式(avg 或 max) |
YAML 配置示例¶
algorithm: dueling_dqn
algo_kwargs:
learning_rate: 1e-4
buffer_size: 1_000_000
batch_size: 32
target_update_interval: 10_000
dueling_type: "avg"
Python API 示例¶
from rl_training.experimental import DuelingDQN
model = DuelingDQN(
env_id="SpaceInvaders-v5",
learning_rate=1e-4,
dueling_type="avg",
)
model.train(total_timesteps=10_000_000)
最佳实践
- Dueling 架构在动作数量多的环境中效果尤为明显。
- 使用
avg聚合方式在实践中更稳定。
Noisy DQN¶
Noisy DQN(噪声 DQN)
用参数化的噪声层替代 epsilon-greedy 探索,使网络能够学习到状态相关的探索策略。
Fortunato et al., "Noisy Networks for Exploration", 2017. arXiv:1706.10295
稳定性: Experimental 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 32 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
sigma_init | 0.5 | 噪声初始标准差 |
noise_type | "factorized" | 噪声类型(factorized 或 independent) |
YAML 配置示例¶
algorithm: noisy_dqn
algo_kwargs:
learning_rate: 1e-4
buffer_size: 1_000_000
batch_size: 32
sigma_init: 0.5
noise_type: "factorized"
Python API 示例¶
from rl_training.experimental import NoisyDQN
model = NoisyDQN(
env_id="MontezumaRevenge-v5",
sigma_init=0.5,
noise_type="factorized",
)
model.train(total_timesteps=50_000_000)
最佳实践
- Noisy 网络消除了对 epsilon 调度的需要。
factorized噪声计算效率更高,通常推荐使用。- 在需要深度探索的任务(如 Montezuma's Revenge)中尤为有效。
N-step DQN¶
N-step DQN(N 步 DQN)
使用 N 步回报替代单步 TD 目标,加速信用分配并减小偏差,但会引入一定的方差。
基于 Sutton & Barto 的 N 步时序差分方法。
稳定性: Experimental 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 32 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
n_step | 3 | N 步回报步数 |
target_update_interval | 10_000 | 目标网络更新频率 |
YAML 配置示例¶
algorithm: nstep_dqn
algo_kwargs:
learning_rate: 1e-4
buffer_size: 1_000_000
batch_size: 32
n_step: 3
target_update_interval: 10_000
Python API 示例¶
from rl_training.experimental import NStepDQN
model = NStepDQN(
env_id="Qbert-v5",
n_step=3,
learning_rate=1e-4,
)
model.train(total_timesteps=10_000_000)
最佳实践
n_step=3~5在大多数 Atari 游戏中效果较好。- N 值过大会引入较大方差,在随机性高的环境中需谨慎。
Prioritized DQN¶
Prioritized DQN / PER(优先经验回放 DQN)
根据 TD 误差为回放缓冲区中的转换赋予优先级,使高 TD 误差的样本更频繁地被采样,加速学习。
Schaul et al., "Prioritized Experience Replay", 2015. arXiv:1511.05952
稳定性: Experimental 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 32 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
alpha | 0.6 | 优先级指数 |
beta_start | 0.4 | 重要性采样权重初始值 |
beta_end | 1.0 | 重要性采样权重终值 |
prior_eps | 1e-6 | 防止零优先级的最小值 |
YAML 配置示例¶
algorithm: prioritized_dqn
algo_kwargs:
learning_rate: 1e-4
buffer_size: 1_000_000
batch_size: 32
alpha: 0.6
beta_start: 0.4
beta_end: 1.0
Python API 示例¶
from rl_training.experimental import PrioritizedDQN
model = PrioritizedDQN(
env_id="Breakout-v5",
alpha=0.6,
beta_start=0.4,
)
model.train(total_timesteps=10_000_000)
最佳实践
alpha=0退化为均匀采样,alpha=1为完全优先级采样。beta应从较低值逐步退火到 1.0 以补偿采样偏差。- PER 在稀疏奖励环境中效果尤为显著。
Rainbow DQN¶
Rainbow DQN
将六项 DQN 改进集成到一个算法中:Double DQN、Dueling、PER、N-step、Noisy Networks 和 C51 分布型值函数。
Hessel et al., "Rainbow: Combining Improvements in Deep Reinforcement Learning", 2017. arXiv:1710.02298
稳定性: Experimental 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 6.25e-5 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 32 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
n_step | 3 | N 步回报 |
num_atoms | 51 | C51 原子数 |
v_min | -10.0 | 值分布下界 |
v_max | 10.0 | 值分布上界 |
alpha | 0.5 | PER 优先级指数 |
sigma_init | 0.5 | Noisy 网络噪声初始值 |
YAML 配置示例¶
algorithm: rainbow_dqn
algo_kwargs:
learning_rate: 6.25e-5
buffer_size: 1_000_000
batch_size: 32
n_step: 3
num_atoms: 51
v_min: -10.0
v_max: 10.0
alpha: 0.5
sigma_init: 0.5
Python API 示例¶
from rl_training.experimental import RainbowDQN
model = RainbowDQN(
env_id="Breakout-v5",
n_step=3,
num_atoms=51,
sigma_init=0.5,
)
model.train(total_timesteps=10_000_000)
最佳实践
- Rainbow 是 Atari 基准上最强的 DQN 变体之一。
- 学习率建议设为较低值(如
6.25e-5),以适应多项改进的组合。 v_min和v_max需根据任务回报范围调整。
C51 DQN¶
C51 / Categorical DQN(分类 DQN)
不预测 Q 值的期望,而是学习完整的值分布。使用固定数量的原子来参数化离散概率分布。
Bellemare et al., "A Distributional Perspective on Reinforcement Learning", 2017. arXiv:1707.06887
稳定性: Experimental 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 32 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
num_atoms | 51 | 分布原子数 |
v_min | -10.0 | 值分布下界 |
v_max | 10.0 | 值分布上界 |
YAML 配置示例¶
algorithm: c51_dqn
algo_kwargs:
learning_rate: 1e-4
buffer_size: 1_000_000
batch_size: 32
num_atoms: 51
v_min: -10.0
v_max: 10.0
Python API 示例¶
from rl_training.experimental import C51DQN
model = C51DQN(
env_id="Pong-v5",
num_atoms=51,
v_min=-10.0,
v_max=10.0,
)
model.train(total_timesteps=10_000_000)
最佳实践
num_atoms=51是论文推荐值,增加原子数可以提高精度但增加计算量。v_min和v_max的设置对性能有重要影响,需要覆盖实际回报范围。
QR-DQN¶
Quantile Regression DQN(分位数回归 DQN)
使用分位数回归来学习值分布,相比 C51 无需设定值分布的上下界,参数化更灵活。
Dabney et al., "Distributional Reinforcement Learning with Quantile Regression", 2017. arXiv:1710.10044
稳定性: Experimental 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 5e-5 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 32 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
n_quantiles | 200 | 分位数数量 |
target_update_interval | 10_000 | 目标网络更新频率 |
YAML 配置示例¶
algorithm: qr_dqn
algo_kwargs:
learning_rate: 5e-5
buffer_size: 1_000_000
batch_size: 32
n_quantiles: 200
target_update_interval: 10_000
Python API 示例¶
from rl_training.experimental import QRDQN
model = QRDQN(
env_id="Asterix-v5",
n_quantiles=200,
learning_rate=5e-5,
)
model.train(total_timesteps=10_000_000)
最佳实践
- QR-DQN 无需手动设置
v_min/v_max,使用更方便。 - 增加
n_quantiles可以更精确地逼近值分布。 - 通常优于 C51 DQN,推荐作为分布型 DQN 的首选。
IQN¶
Implicit Quantile Network(隐式分位数网络)
将分位数视为连续变量进行采样,使网络能够学习完整的分位数函数而非固定数量的分位数。
Dabney et al., "Implicit Quantile Networks for Distributional Reinforcement Learning", 2018. arXiv:1806.06923
稳定性: Experimental 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 5e-5 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 32 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
n_quantile_samples | 64 | 训练时采样的分位数个数 |
n_target_quantile_samples | 64 | 目标分位数采样个数 |
embedding_dim | 64 | 分位数嵌入维度 |
YAML 配置示例¶
algorithm: iqn
algo_kwargs:
learning_rate: 5e-5
buffer_size: 1_000_000
batch_size: 32
n_quantile_samples: 64
n_target_quantile_samples: 64
embedding_dim: 64
Python API 示例¶
from rl_training.experimental import IQN
model = IQN(
env_id="Seaquest-v5",
n_quantile_samples=64,
embedding_dim=64,
)
model.train(total_timesteps=10_000_000)
最佳实践
- IQN 在 Atari 上通常优于 QR-DQN 和 C51。
- 训练时的分位数采样数影响值估计精度和计算成本的平衡。
- 支持风险敏感决策,可以通过调整采样分位数范围来实现。
FQF¶
Fully Parameterized Quantile Function(全参数化分位数函数)
在 IQN 的基础上进一步学习最优的分位数位置(概率),使分位数分布自适应地集中在值分布的关键区域。
Yang et al., "Fully Parameterized Quantile Function for Distributional Reinforcement Learning", 2019. arXiv:1911.02140
稳定性: Experimental 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 5e-5 | 值网络学习率 |
fraction_lr | 1e-5 | 分位数位置网络学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 32 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
n_quantiles | 32 | 分位数数量 |
embedding_dim | 64 | 嵌入维度 |
YAML 配置示例¶
algorithm: fqf
algo_kwargs:
learning_rate: 5e-5
fraction_lr: 1e-5
buffer_size: 1_000_000
batch_size: 32
n_quantiles: 32
embedding_dim: 64
Python API 示例¶
from rl_training.experimental import FQF
model = FQF(
env_id="BeamRider-v5",
n_quantiles=32,
fraction_lr=1e-5,
)
model.train(total_timesteps=10_000_000)
最佳实践
- FQF 是分布型 RL 方法的最新发展,理论上优于 IQN。
fraction_lr通常设为主学习率的 ⅕ ~ 1/10。- 较少的分位数(32)加上自适应位置,通常比 IQN 的固定 64 个分位数更高效。
R2D2¶
Recurrent Replay Distributed DQN(循环回放分布式 DQN)
将 LSTM 循环网络集成到分布式 DQN 框架中,通过存储和回放序列来处理部分可观测环境。
Kapturowski et al., "Recurrent Experience Replay in Distributed Reinforcement Learning", 2018. arXiv:1807.04742
稳定性: Experimental 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 64 | 小批量大小(序列数) |
gamma | 0.997 | 折扣因子 |
sequence_length | 80 | 训练序列长度 |
burn_in_length | 40 | 隐藏状态预热长度 |
lstm_hidden_size | 512 | LSTM 隐藏层大小 |
num_actors | 256 | 并行 Actor 数量 |
YAML 配置示例¶
algorithm: r2d2
algo_kwargs:
learning_rate: 1e-4
buffer_size: 1_000_000
batch_size: 64
gamma: 0.997
sequence_length: 80
burn_in_length: 40
lstm_hidden_size: 512
num_actors: 256
Python API 示例¶
from rl_training.experimental import R2D2
model = R2D2(
env_id="MontezumaRevenge-v5",
sequence_length=80,
burn_in_length=40,
lstm_hidden_size=512,
num_actors=256,
)
model.train(total_timesteps=50_000_000)
最佳实践
- R2D2 面向大规模分布式训练设计,单机性能有限。
burn_in_length用于在序列开始时恢复 LSTM 隐藏状态。- 适合需要长期记忆的部分可观测环境。
DRQN¶
Deep Recurrent Q-Network(深度循环 Q 网络)
在 DQN 的全连接层之前加入 LSTM 层,使得智能体能够处理部分可观测的马尔可夫决策过程。
Hausknecht & Stone, "Deep Recurrent Q-Learning for Partially Observable MDPs", 2015. arXiv:1507.06527
稳定性: Experimental 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-4 | 学习率 |
buffer_size | 500_000 | 回放缓冲区大小 |
batch_size | 32 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
sequence_length | 10 | 训练序列长度 |
lstm_hidden_size | 256 | LSTM 隐藏层大小 |
YAML 配置示例¶
algorithm: drqn
algo_kwargs:
learning_rate: 1e-4
buffer_size: 500_000
batch_size: 32
sequence_length: 10
lstm_hidden_size: 256
Python API 示例¶
from rl_training.experimental import DRQN
model = DRQN(
env_id="FlickeringPong-v0",
sequence_length=10,
lstm_hidden_size=256,
)
model.train(total_timesteps=5_000_000)
最佳实践
- DRQN 是处理 POMDP 的最简单 DQN 扩展。
- 对于大规模 POMDP 任务,推荐使用更先进的 R2D2。
sequence_length应覆盖环境中信息隐藏的时间跨度。
Agent57¶
Agent57
首个在所有 57 款 Atari 游戏上超越人类平均水平的智能体。通过自适应的元控制器在探索和利用之间切换。
Badia et al., "Agent57: Outperforming the Atari Human Benchmark", 2020. arXiv:2003.13350
稳定性: Experimental 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-4 | 学习率 |
buffer_size | 1_000_000 | 回放缓冲区大小 |
batch_size | 64 | 小批量大小 |
gamma | 0.997 | 折扣因子 |
num_policies | 32 | 混合策略数量 |
beta_range | [0.0, 0.3] | 内在奖励权重范围 |
discount_range | [0.99, 0.9999] | 折扣因子范围 |
ucb_window | 90 | UCB 滑窗大小 |
YAML 配置示例¶
algorithm: agent57
algo_kwargs:
learning_rate: 1e-4
buffer_size: 1_000_000
batch_size: 64
gamma: 0.997
num_policies: 32
beta_range: [0.0, 0.3]
discount_range: [0.99, 0.9999]
Python API 示例¶
from rl_training.experimental import Agent57
model = Agent57(
env_id="Pitfall-v5",
num_policies=32,
beta_range=[0.0, 0.3],
)
model.train(total_timesteps=100_000_000)
最佳实践
- Agent57 需要非常大的计算量,适合充足计算资源下的研究使用。
- 自适应策略混合是其核心,
num_policies越多探索和利用的粒度越细。 - 在困难探索任务(如 Pitfall、Montezuma's Revenge)上效果显著。
SPR¶
Self-Predictive Representations(自预测表示)
通过自监督时序预测学习高质量状态表示,在 Atari 100k 基准上取得 SOTA 表现,显著提升采样效率。
Schwarzer et al., "Data-Efficient Reinforcement Learning with Self-Predictive Representations", 2020. arXiv:2007.05929
稳定性: Experimental 动作空间: Discrete
关键超参数¶
| 参数 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-4 | 学习率 |
buffer_size | 100_000 | 回放缓冲区大小 |
batch_size | 32 | 小批量大小 |
gamma | 0.99 | 折扣因子 |
projection_dim | 256 | 投影头维度 |
prediction_depth | 5 | 预测未来步数 |
spr_coef | 2.0 | SPR 损失权重 |
encoder_tau | 0.01 | 目标编码器动量系数 |
YAML 配置示例¶
algorithm: spr
algo_kwargs:
learning_rate: 1e-4
buffer_size: 100_000
batch_size: 32
projection_dim: 256
prediction_depth: 5
spr_coef: 2.0
encoder_tau: 0.01
Python API 示例¶
from rl_training.experimental import SPR
model = SPR(
env_id="Pong-v5",
projection_dim=256,
prediction_depth=5,
spr_coef=2.0,
)
model.train(total_timesteps=100_000)
最佳实践
- SPR 在 Atari 100k(低数据量)基准上表现最佳。
prediction_depth控制时序预测的步数,通常 3~5 步即可。- 自预测表示学习可以与其他 DQN 改进组合使用。