跳转至

练习

动手练习帮助你加深理解。每组练习对应资源的一个部分,从概念理解逐步递进到实现挑战。

第一部分:强化学习

练习集 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\) 的含义如何变化?考虑如下关系:

\[ V^\pi(s_0) = \frac{r}{1 - \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):

  1. 按 TD 误差设置采样优先级 \(p_i = |\delta_i| + \epsilon\)
  2. 实现重要性采样权重 \(w_i = (N \cdot P(i))^{-\beta}\)
  3. 比较均匀采样 vs. 优先级采样的学习曲线
  4. 分析:优先级采样在什么情况下帮助最大?

第二部分:世界模型

练习集 4:表征学习

4.1 训练 VAE

在简单环境的渲染帧上训练卷积 VAE(例如渲染后的 CartPole)。可视化潜空间和重建结果。

  • 改变 \(\beta\)-VAE 目标中的 \(\beta\) 时会发生什么?
\[ \mathcal{L}_{\beta\text{-VAE}} = \mathbb{E}_{q(z|x)}[\log p(x|z)] - \beta \, D_{\text{KL}}(q(z|x) \| p(z)) \]
  • 能否在潜空间中找到有意义的结构(例如杆的角度对应某个潜变量维度)?

4.2 潜空间动力学模型

扩展练习 4.1:在 VAE 之上训练潜空间动力学模型。

  1. 用随机策略采集轨迹
  2. 训练:编码器、解码器、转移模型 \(z_{t+1} = f_\phi(z_t, a_t)\)
  3. 评估:向前预测 10 步,可视化重建的观测
  4. 测量预测误差如何随滚动步长(rollout horizon)增长
  5. 讨论:误差累积是否呈指数增长?如何缓解?

练习集 5:规划

5.1 CEM 规划

用学习的动力学模型实现交叉熵方法(CEM)规划。

  1. 在 CartPole 转移数据上训练动力学模型
  2. 实现 CEM 搜索动作序列
  3. 使用 MPC(每步重新规划)控制环境
  4. 与随机策略和训练好的 RL 策略进行比较

CEM 算法流程:

  • 初始化动作序列的高斯分布 \(\mathcal{N}(\mu, \sigma^2)\)
  • 采样 \(K\) 个候选序列
  • 用动力学模型评估每个序列的累积奖励
  • 选取前 \(M\) 个最优序列,更新分布参数
  • 重复迭代

第三部分:具身智能

练习集 6:运动控制

6.1 训练行走策略

使用 Isaac Gym(或 MuJoCo),用 PPO 训练四足运动策略:

  1. 搭建环境,使用简单四足(如 ANYmal 或 Unitree Go1)
  2. 设计速度跟踪的奖励函数:
\[ r = w_1 \exp(-\|v - v^{\text{cmd}}\|^2 / \sigma_v^2) - w_2 \|\tau\|^2 - w_3 \|a - a_{\text{prev}}\|^2 \]
  1. 使用域随机化(至少随机化 3 个参数:摩擦系数、负载质量、电机力矩延迟)
  2. 评估:绘制跟踪误差 vs. 指令速度的关系

6.2 地形课程

扩展练习 6.1,添加地形课程学习:

  1. 从平地开始训练
  2. 逐步引入斜坡、台阶、崎岖地形
  3. 比较有无课程学习的训练曲线
  4. 分析哪类地形最具挑战性

练习集 7:数据采集

7.1 行为克隆流水线

构建完整的行为克隆流水线:

  1. 采集 100 条示教(为简便可用脚本生成)完成抓取-放置任务
  2. 训练 BC 策略(MLP 或简单 Transformer)
  3. 评估成功率
  4. 分析失败模式——BC 在什么情况下失败?

延伸:实现 DAgger,比较纯 BC 和 DAgger 的成功率。

7.2 数据增强实验

在练习 7.1 的基础上:

  1. 实现 3 种数据增强(颜色抖动、随机裁剪、动作噪声)
  2. 分别测试每种增强对 BC 性能的影响
  3. 组合所有增强,测试整体效果
  4. 绘制:数据量 vs. 成功率(有/无增强)

第四部分:分布式 RL

练习集 8:扩展训练

8.1 向量化环境基准测试

测量环境并行度的效果:

  1. 用 PPO 在 CartPole 上运行,分别使用 1、4、16、64、256、1024 个并行环境
  2. 绘制:达到目标回报的挂钟时间 vs. 环境数量
  3. 绘制:样本效率(回报 vs. 总环境步数)vs. 环境数量
  4. 增加更多环境在何时不再有帮助?瓶颈转移到了哪里?

8.2 性能分析

对一次 RL 训练运行进行性能分析(例如 PPO 在 MuJoCo 任务上):

  1. 分别测量以下各项耗时:环境步进、策略推理、梯度计算、数据传输
  2. 识别瓶颈
  3. 提出并实现一项优化措施
  4. 测量加速比

进阶:使用 PyTorch Profiler 或 cProfile 进行详细分析,生成火焰图。

8.3 学习率缩放实验

实证验证批量大小与学习率的关系:

  1. 固定其他超参数,使用 PPO 训练
  2. 将环境数量从 64 逐步增加到 4096(每次翻倍)
  3. 对每个批量大小,分别测试:固定学习率、线性缩放、平方根缩放
  4. 绘制学习曲线并分析哪种缩放策略最稳定

通用研究练习

R.1 论文复现

经典论文 列表中选择一篇论文并复现其主要结果:

  1. 根据论文描述(而非已有代码)实现算法
  2. 运行相同的实验设置
  3. 将你的结果与论文报告的结果进行比较
  4. 撰写 1 页报告,总结你的收获,包括任何偏差

建议选择:DQN(Atari Pong)、PPO(MuJoCo HalfCheetah)或 Diffusion Policy(Push-T)

R.2 消融实验

对你实现的任一算法进行全面的消融研究:

  1. 识别 3-5 个设计选择(例如网络规模、学习率调度、优势估计方法)
  2. 独立测试每个选择
  3. 以清晰的表格或图表呈现结果
  4. 哪些设计选择影响最大?

消融报告模板:

消融项 默认值 变体 对性能的影响
网络宽度 256 64, 128, 512 ...
GAE \(\lambda\) 0.95 0.9, 0.97, 1.0 ...
裁剪系数 \(\epsilon\) 0.2 0.1, 0.3 ...

R.3 文献综述练习

选择一个你感兴趣的具身智能子方向(如四足运动控制、灵巧操作、视觉导航),完成:

  1. 阅读该方向最近 2 年的 10 篇核心论文
  2. 绘制方法演进图(哪篇论文基于哪篇论文改进)
  3. 总结当前的开放问题
  4. 提出一个可能的研究方向并论证其可行性