练习¶
动手练习帮助你加深理解。每组练习对应资源的一个部分,从概念理解逐步递进到实现挑战。
第一部分:强化学习¶
练习集 1:基础概念¶
1.1 贝尔曼方程推导
从动作值函数的定义出发,推导 \(Q^\pi(s,a)\) 的贝尔曼期望方程。写出所有步骤。
提示:从 \(Q^\pi(s,a) = \mathbb{E}_\pi \left[ \sum_{t=0}^{\infty} \gamma^t r_t \mid s_0 = s, a_0 = a \right]\) 开始,利用条件期望的性质将其分解为即时奖励与未来价值。
1.2 折扣因子分析
考虑一个具有两个状态的简单 MDP,转移是确定性的。智能体在每步获得奖励 +1。分别对 \(\gamma = 0.9\) 和 \(\gamma = 0.99\) 解析计算 \(V^\pi(s_0)\)。当 \(\gamma \to 1\) 时会发生什么?
延伸:在一个平均奖励设置(average reward setting)中,\(\gamma\) 的含义如何变化?考虑如下关系:
1.3 优势函数性质
证明对任意状态 \(s\) 和策略 \(\pi\),有 \(\mathbb{E}_{a \sim \pi}[A^\pi(s,a)] = 0\)。这一性质为何对方差缩减有用?
延伸:证明 GAE(广义优势估计)在 \(\lambda = 0\) 时退化为单步 TD 误差,在 \(\lambda = 1\) 时退化为蒙特卡洛回报。
1.4 MDP 建模练习
将以下真实场景建模为 MDP(定义状态空间、动作空间、转移函数和奖励函数):
(a) 机器人手臂在桌面上抓取杯子
(b) 四足机器人在崎岖地形上行走
© 自动驾驶汽车在十字路口的决策
讨论:哪些场景更适合建模为 POMDP?为什么?
练习集 2:策略梯度¶
2.1 实现 REINFORCE
用 PyTorch 从零实现 REINFORCE。在 CartPole-v1 上训练。绘制 5 个随机种子的学习曲线(回合回报 vs. 训练步数)。
进阶:添加学习的基线(baseline)并比较有无基线的学习曲线。
关键实现要点:
- 策略网络输出动作的概率分布
- 使用
log_prob计算策略梯度 - 回报的标准化处理
2.2 方差分析
实证比较策略梯度估计器在以下三种情况下的方差:
(a) 完整轨迹回报 \(R(\tau)\)
(b) 回报到终止(reward-to-go)\(\sum_{t'=t}^{T} r_{t'}\)
© 带基线的回报到终止 \(\sum_{t'=t}^{T} r_{t'} - b(s_t)\)
方法:采集大量轨迹,计算梯度并测量其方差。
延伸:推导为什么 reward-to-go 是无偏的(即证明去掉不依赖当前动作的奖励项不改变梯度期望)。
2.3 实现 PPO
实现 PPO-Clip 与 GAE。在 HalfCheetah-v4(MuJoCo)上训练。核心组件:
- 裁剪代理目标:\(L^{\text{CLIP}} = \mathbb{E}_t \left[ \min\left( r_t(\theta) \hat{A}_t, \; \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t \right) \right]\)
- 价值函数损失
- 熵奖励
- GAE 优势估计
- 多轮次小批量更新
评估标准:在 HalfCheetah 上达到 3000+ 的平均回报即为合格实现。
练习集 3:基于价值的方法¶
3.1 实现 DQN
实现带经验回放和目标网络的 DQN。在 PongNoFrameskip-v4 上训练。核心组件:
- 帧堆叠(4 帧)
- \(\epsilon\)-贪心探索与退火
- 经验回放缓冲区
- 目标网络(每 10K 步更新)
提示:注意 Atari 环境的预处理——灰度化、缩放至 84x84、跳帧等。
3.2 Double DQN
修改 DQN 以使用 Double Q-learning。比较 DQN 和 Double DQN 的 Q 值估计(绘制训练过程中的 Q 值曲线)。
核心区别在于目标值计算:
- DQN:\(y = r + \gamma \max_{a'} Q_{\theta^-}(s', a')\)
- Double DQN:\(y = r + \gamma Q_{\theta^-}(s', \arg\max_{a'} Q_\theta(s', a'))\)
分析:Double DQN 如何缓解 Q 值过估计问题?
3.3 优先级经验回放
在 DQN 基础上实现优先级经验回放(PER):
- 按 TD 误差设置采样优先级 \(p_i = |\delta_i| + \epsilon\)
- 实现重要性采样权重 \(w_i = (N \cdot P(i))^{-\beta}\)
- 比较均匀采样 vs. 优先级采样的学习曲线
- 分析:优先级采样在什么情况下帮助最大?
第二部分:世界模型¶
练习集 4:表征学习¶
4.1 训练 VAE
在简单环境的渲染帧上训练卷积 VAE(例如渲染后的 CartPole)。可视化潜空间和重建结果。
- 改变 \(\beta\)-VAE 目标中的 \(\beta\) 时会发生什么?
- 能否在潜空间中找到有意义的结构(例如杆的角度对应某个潜变量维度)?
4.2 潜空间动力学模型
扩展练习 4.1:在 VAE 之上训练潜空间动力学模型。
- 用随机策略采集轨迹
- 训练:编码器、解码器、转移模型 \(z_{t+1} = f_\phi(z_t, a_t)\)
- 评估:向前预测 10 步,可视化重建的观测
- 测量预测误差如何随滚动步长(rollout horizon)增长
- 讨论:误差累积是否呈指数增长?如何缓解?
练习集 5:规划¶
5.1 CEM 规划
用学习的动力学模型实现交叉熵方法(CEM)规划。
- 在 CartPole 转移数据上训练动力学模型
- 实现 CEM 搜索动作序列
- 使用 MPC(每步重新规划)控制环境
- 与随机策略和训练好的 RL 策略进行比较
CEM 算法流程:
- 初始化动作序列的高斯分布 \(\mathcal{N}(\mu, \sigma^2)\)
- 采样 \(K\) 个候选序列
- 用动力学模型评估每个序列的累积奖励
- 选取前 \(M\) 个最优序列,更新分布参数
- 重复迭代
第三部分:具身智能¶
练习集 6:运动控制¶
6.1 训练行走策略
使用 Isaac Gym(或 MuJoCo),用 PPO 训练四足运动策略:
- 搭建环境,使用简单四足(如 ANYmal 或 Unitree Go1)
- 设计速度跟踪的奖励函数:
- 使用域随机化(至少随机化 3 个参数:摩擦系数、负载质量、电机力矩延迟)
- 评估:绘制跟踪误差 vs. 指令速度的关系
6.2 地形课程
扩展练习 6.1,添加地形课程学习:
- 从平地开始训练
- 逐步引入斜坡、台阶、崎岖地形
- 比较有无课程学习的训练曲线
- 分析哪类地形最具挑战性
练习集 7:数据采集¶
7.1 行为克隆流水线
构建完整的行为克隆流水线:
- 采集 100 条示教(为简便可用脚本生成)完成抓取-放置任务
- 训练 BC 策略(MLP 或简单 Transformer)
- 评估成功率
- 分析失败模式——BC 在什么情况下失败?
延伸:实现 DAgger,比较纯 BC 和 DAgger 的成功率。
7.2 数据增强实验
在练习 7.1 的基础上:
- 实现 3 种数据增强(颜色抖动、随机裁剪、动作噪声)
- 分别测试每种增强对 BC 性能的影响
- 组合所有增强,测试整体效果
- 绘制:数据量 vs. 成功率(有/无增强)
第四部分:分布式 RL¶
练习集 8:扩展训练¶
8.1 向量化环境基准测试
测量环境并行度的效果:
- 用 PPO 在 CartPole 上运行,分别使用 1、4、16、64、256、1024 个并行环境
- 绘制:达到目标回报的挂钟时间 vs. 环境数量
- 绘制:样本效率(回报 vs. 总环境步数)vs. 环境数量
- 增加更多环境在何时不再有帮助?瓶颈转移到了哪里?
8.2 性能分析
对一次 RL 训练运行进行性能分析(例如 PPO 在 MuJoCo 任务上):
- 分别测量以下各项耗时:环境步进、策略推理、梯度计算、数据传输
- 识别瓶颈
- 提出并实现一项优化措施
- 测量加速比
进阶:使用 PyTorch Profiler 或 cProfile 进行详细分析,生成火焰图。
8.3 学习率缩放实验
实证验证批量大小与学习率的关系:
- 固定其他超参数,使用 PPO 训练
- 将环境数量从 64 逐步增加到 4096(每次翻倍)
- 对每个批量大小,分别测试:固定学习率、线性缩放、平方根缩放
- 绘制学习曲线并分析哪种缩放策略最稳定
通用研究练习¶
R.1 论文复现
从 经典论文 列表中选择一篇论文并复现其主要结果:
- 根据论文描述(而非已有代码)实现算法
- 运行相同的实验设置
- 将你的结果与论文报告的结果进行比较
- 撰写 1 页报告,总结你的收获,包括任何偏差
建议选择:DQN(Atari Pong)、PPO(MuJoCo HalfCheetah)或 Diffusion Policy(Push-T)
R.2 消融实验
对你实现的任一算法进行全面的消融研究:
- 识别 3-5 个设计选择(例如网络规模、学习率调度、优势估计方法)
- 独立测试每个选择
- 以清晰的表格或图表呈现结果
- 哪些设计选择影响最大?
消融报告模板:
| 消融项 | 默认值 | 变体 | 对性能的影响 |
|---|---|---|---|
| 网络宽度 | 256 | 64, 128, 512 | ... |
| GAE \(\lambda\) | 0.95 | 0.9, 0.97, 1.0 | ... |
| 裁剪系数 \(\epsilon\) | 0.2 | 0.1, 0.3 | ... |
R.3 文献综述练习
选择一个你感兴趣的具身智能子方向(如四足运动控制、灵巧操作、视觉导航),完成:
- 阅读该方向最近 2 年的 10 篇核心论文
- 绘制方法演进图(哪篇论文基于哪篇论文改进)
- 总结当前的开放问题
- 提出一个可能的研究方向并论证其可行性