← 系列入口:RL-00.系列概述 · 上一篇:RL-03.算法分类与选型
选好算法族之后,落地关键是统一的交互循环与可复现的工程骨架。本文描述从 reset/step 到参数更新的标准流程,并概括 PyTorch 实现中与监督学习不同的注意点。

一、标准训练循环
几乎所有 RL 程序都遵循同一骨架:

| 步骤 | 职责 |
|---|---|
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 | # Q: shape (n_states, n_actions) |
要点:
- $\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-05.专属数据结构
- 评估与工具:RL-06.评估环境与工具链
- 案例驱动:RL-07.应用实战
十、小结
- 实现 = 环境循环 + 存储 + 按算法更新。
- 深度 RL 重点:Bootstrap 目标、Replay/Rollout、目标网络与稳定性技巧。
- 先跑通 SB3 baseline,再改自研代码,对比曲线验证。