RL-04.实现框架与实践

← 系列入口:RL-00.系列概述 · 上一篇:RL-03.算法分类与选型

选好算法族之后,落地关键是统一的交互循环可复现的工程骨架。本文描述从 reset/step 到参数更新的标准流程,并概括 PyTorch 实现中与监督学习不同的注意点。

RL 训练循环示意


一、标准训练循环

几乎所有 RL 程序都遵循同一骨架:

RL 标准训练循环(含更新条件与 episode 分支)

步骤 职责
reset() 新 episode 初始状态
step(a) 执行动作,返回 obs, reward, terminated, truncated, info
存储 写入 Q 表、Replay Buffer 或 Rollout(见 RL-05
更新 按算法计算 loss 或 TD 误差并更新参数

Gymnasium 接口细节见 RL-06.评估环境与工具链


二、环境与 Agent 的职责边界

组件 负责 不负责
Environment 状态转移、奖励、终止条件 学习策略
Agent $\pi$ 或 $Q$ 的表示与更新 修改环境规则
Wrapper 观测预处理、奖励塑形、帧堆叠 核心动力学

奖励塑形(Reward Shaping)可加速学习,但改变最优策略风险需警惕;记录实验时应注明是否塑形。


三、表格型实现要点(Q-Learning 示例)

最小逻辑(NumPy 伪代码级):

1
2
3
4
5
6
7
8
9
# Q: shape (n_states, n_actions)
for episode in range(num_episodes):
s = env.reset()
while not done:
a = epsilon_greedy(Q[s], eps)
s_next, r, done, _ = env.step(a)
Q[s, a] += alpha * (r + gamma * Q[s_next].max() - Q[s, a])
s = s_next
eps *= eps_decay

要点:

  • $\varepsilon$ 衰减:探索率从高到低
  • 学习率 $\alpha$:过大震荡,过小收敛慢
  • 状态离散化:连续观测需分箱或特征构造

四、深度 RL 实现要点(PyTorch)

4.1 网络角色

算法 常见网络
DQN $Q_\phi(s,a)$ 或 $Q_\phi(s)$ 输出各动作 Q
PPO Actor $\pi_\theta(a
SAC 随机 Actor + 双 Q Critic

4.2 与监督学习的差异

方面 监督学习 RL
标签 固定 $y$ Bootstrap 目标($r+\gamma Q(s’)$)或回报 $G_t$
数据 i.i.d. 假设 强相关 → 需 Replay 或 On-Policy Fresh 数据
目标网络 少见 DQN 等需定期 soft/hard update
稳定性 相对稳 需 clip、梯度范数、归一化奖励

4.3 DQN 更新梗概

$$
\mathcal{L} = \mathbb{E}\left[ \left( r + \gamma \max_{a’} Q_{\bar{\phi}}(s’,a’) - Q_\phi(s,a) \right)^2 \right]
$$

  • Replay Buffer 采样 mini-batch
  • 目标网络 $Q_{\bar{\phi}}$ 计算 TD 目标
  • 每隔 $C$ 步同步 $\bar{\phi} \leftarrow \phi$

4.4 PPO 更新梗概

  • 收集长度为 $T$ 的 Rollout
  • 算优势 $\hat{A}_t$(常 GAE)
  • 多 epoch 小批量优化 clipped surrogate

五、框架选型

框架 定位 适用
自写 PyTorch 完全掌控 学习、改算法
Stable-Baselines3 高质量基线 快速对比、生产原型
CleanRL 单文件实现 读源码、教学
RLlib 分布式 大规模采样

建议路径:CleanRL 读一遍 → SB3 跑 baseline → 再自写改 loss


六、常见坑与调试

现象 可能原因 排查
回报不升 $\varepsilon$ 太大、学习率、奖励尺度 画学习曲线、归一化 reward
训练发散 Q 过估计、目标网络未更新 Double DQN、降低 lr
策略崩溃(PPO) clip 过小/过大、advantage 未标准化 查 GAE、batch 大小
复现失败 种子、环境版本、Wrapper 固定 seed,锁 gymnasium 版本
GPU 空转 环境步进在 CPU、batch 过小 向量化环境 SyncVectorEnv

日志:至少记录 episode return、长度、loss、$\varepsilon$;用 TensorBoard 或 W&B。


七、超参直觉(起步默认值)

超参 典型范围 说明
$\gamma$ 0.99(稀疏奖励 0.995+) 长期任务折扣高
学习率 1e-4 ~ 3e-4(Adam) DQN/PPO 常用
Replay 容量 1e5 ~ 1e6 视内存
Batch 32 ~ 256 DQN
PPO clip 0.1 ~ 0.3 常用 0.2
熵系数(SAC/PPO) 0 ~ 0.01 鼓励探索

细调见规划篇 RL-04-06-超参与调优.md


八、本模块二级文档(已发布)

文档 内容
RL-04-01-训练循环与接口约定 Gymnasium API、向量化
RL-04-02-PyTorch实现要点 模块、目标网络、gather
RL-04-03-表格型算法实现 NumPy Q-Learning / SARSA
RL-04-04-DQN实现 CartPole 完整 DQN
RL-04-05-PPO实现 Rollout + GAE + clip
RL-04-06-超参与调优 调参顺序与 config

九、阅读顺序


十、小结

  • 实现 = 环境循环 + 存储 + 按算法更新
  • 深度 RL 重点:Bootstrap 目标、Replay/Rollout、目标网络与稳定性技巧
  • 先跑通 SB3 baseline,再改自研代码,对比曲线验证。
-------------本文结束感谢您的阅读-------------