深度教堂

  • 榜单数据10-16 17:00
  • 论文数据10-16 13:30
  • 周报10-17 11:22

CS285 HW4 实验报告:学习动态模型 + MPC/CEM 规划

未发布阅读约 33 分钟人工撰写已核查

CS285HW4

本报告迁移自原课程材料,经 AI 事实核查未发现存疑项,未逐页人工审核;结论与证据请以页面列出的原始文件为准。

实验目标

HW4 的主线是基于模型的强化学习,它把 RL 拆成两件事:(1) 学一个动态模型 $f_\theta$ 去拟合真实转移;(2) 用模型做规划选出让已知奖励最大的动作。整份作业按难度分成 6 个问题:

实验设置

环境本作业用到 cs285 定制的三个连续控制环境(注册见 cs285/envs/__init__.py)。下面逐一给出状态空间、动作空间、奖励、有效视野(ep_len)与目标,所有维度均已通过实例化环境读取 observation_space/action_space 并对照各环境源码核验(cheetah.py/obstacles_env.py/reacher_env.py),非人为估计。
随机种子1
关键配置无

本报告迁移自 CS285 课程材料 [1]。

本报告是 模块 08(基于模型的强化学习) 的动手配套。我们在 MuJoCo 的 cheetah / reacher / obstacles 三个环境上实现 Model-Based RL:先拟合预测状态增量的动态模型,再用随机打靶或 CEM 做 MPC,并通过 on-policy 数据聚合迭代。本站公开证据包括训练曲线、损失图和 rollout 视频;Q3–Q6 做了显式降规模。Q6 比较的三个设置同时改变了 rollout 长度和部分 SAC 更新预算,因此只按联合设置解读。

本报告要回答的问题

  • 动态模型的预测误差(MPE)如何随网络容量与训练步数变化?(Q1)
  • 只训练在随机数据上的模型,配合 MPC 能否显著超过随机策略?(Q2)
  • on-policy 数据聚合是否能逐轮提升回报(obstacles/reacher/cheetah)?(Q3)
  • 三个规划超参——ensemble 大小、候选动作序列数 NN、规划视野 HH——各自怎样影响性能?(Q4)
  • CEM 是否优于随机打靶,迭代次数 2 vs 4 的差别?(Q5)
  • 这些实测现象如何回扣模块 08 的理论:模型误差沿视野复合、ensemble 降低认知不确定性、MPC 重规划、规划预算权衡。

一句话结论

本次运行观察到:Q1 三个配置的 MPE 为 1.26 / 0.21 / 0.028;Q2 中模型 + MPC 的 Eval 为 −46、随机采集回报为 −167;Q3 曲线总体上升;Q4/Q5 的已测配置存在性能排序;Q6 的三组末轮回报为 38/162/634。上述结果与模块 08 的机制预期相容,但多数为单种子、降规模比较。尤其 Q6 按作业命令运行,各设置的 SAC 更新预算并不相同(该配置未随本站公开,无法在本页核对),不能把差异识别为 rollout 长度的单一因果效应。

证据口径 / 复现契约

  • 环境: Python 3.9.23;torch 1.13.1;gym 0.25.2;MuJoCo 2.3.3;NumPy 1.x;CPU。
  • 重复与误差条: 训练 seed=1,单种子;std 来自同一策略少量评测轨迹,部分设置仅 1 条、因此 std=0。
  • 预算: Q3–Q6 均显式降规模;逐项官方/本次预算见 §4 与对应小节。
  • checkpoint / 视频: 正文 run 未保存模型;视频来自独立短训后保存的模型与统计量,并从多个渲染 seed 取最好轨迹。它验证可执行行为,不估计成功率。
  • **公开证据:**训练曲线、损失图和三段 rollout 视频均在本页 evidence/ 目录;原始日志、代码和 checkpoint 不随本站发布。

【单种子趋势】【有限配置消融】【存在预算混杂】 Q6 各设置的 sac_n_iter 更新预算按作业命令并不相同(配置未公开),不能识别 rollout 长度的独立因果效应。

1. 作业目标与要求

HW4 的主线是基于模型的强化学习,它把 RL 拆成两件事:(1) 学一个动态模型 fθf_\theta 去拟合真实转移;(2) 用模型做规划选出让已知奖励最大的动作。整份作业按难度分成 6 个问题:

问题要实现 / 验证的东西本报告是否覆盖
Q1训练动态模型、对比不同架构/训练量下的预测误差 MPE✅ 3 个配置
Q2用学到的模型 + MPC(随机打靶)做单轮动作选择✅ obstacles
Q3on-policy 数据聚合的多轮 MBRL✅ obstacles/reacher/cheetah(降规模)
Q4消融:ensemble 大小 / 候选序列数 NN / 规划视野 HH✅ reacher 8 组(降规模)
Q5随机打靶 vs CEM(迭代 2/4)✅ cheetah 3 组(降规模)
Q6MBPO(用模型给 SAC 造数据)✅ cheetah rollout 0/1/10(降规模)

需要自己补全的关键代码点(skeleton 中标为 TODO):动态模型的前向 + 标准化 + 训练步(ff_model.py)、集成的分片训练与统计量更新(mb_agent.py)、MPC 的候选采样 / 逐条打分 / CEM 迭代 / 只执行首步(MPC_policy.py)、以及 MBPO 的模型内 rollout(mbpo_agent.py)。三个评测环境(obstacles / reacher / cheetah)的状态/动作/奖励/视野与任务目标详见下一节 §2 环境与任务介绍。

2. 环境与任务介绍

本作业用到 cs285 定制的三个连续控制环境(注册见 cs285/envs/__init__.py)。下面逐一给出状态空间、动作空间、奖励、有效视野(ep_len)与目标,所有维度均已通过实例化环境读取 observation_space/action_space 并对照各环境源码核验(cheetah.py/obstacles_env.py/reacher_env.py),非人为估计。

先说最关键的一点:奖励函数是”已知且可查”的

Model-Based RL 在本作业里只学动态模型(转移 st+1s_{t+1});奖励通过 env.get_reward(s,a) 解析计算,不需要再学一个奖励模型。三个环境的 get_reward 都支持 batch 输入——这正是 MPC 能在”想象”里对 NN 条候选动作序列批量算总回报的前提。下表”奖励”列即逐字来自各环境的 get_reward 源码。

2.1 obstacles-cs285-v0(纯 numpy 2D 导航)

项内容(源码核验)
状态空间dim⁡(O)=4\dim(\mathcal O)=4:[ xcur, ycur, xgoal, ygoal ][\,x_{\text{cur}},\,y_{\text{cur}},\,x_{\text{goal}},\,y_{\text{goal}}\,]——当前位置 + 目标位置(_get_obs 里 concatenate([self.current, self.end]))。坐标范围约 [−0.99,0.99][-0.99,0.99]。
动作空间连续 dim⁡(A)=2\dim(\mathcal A)=2(Δx,Δy\Delta x,\Delta y),action_space 为 Box(−0.99,0.99)\text{Box}(-0.99,0.99)。执行时 step 先 clip(a,-1,1) 再 /10/10,故单步实际位移每轴 ∈[−0.1,0.1]\in[-0.1,0.1]。
奖励(已知)r=−∥cur−goal∥2r=-\lVert \text{cur}-\text{goal}\rVert_2(get_reward 中 -dist)。无显式撞墙惩罚项:障碍/边界通过”非法移动被阻挡(原地不动)+ 出界或到达即 done=1”来体现,不进入奖励。
视野 ep_len100(run_hw4_mb.py 对本环境硬编码;注册的 max_episode_steps=500 被其覆盖)。
目标在带 5 个矩形障碍与边界的平面里,把智能体从随机起点导航到目标点(∥⋅∥<0.1\lVert\cdot\rVert<0.1 视为到达)。

2.2 reacher-cs285-v0(7-DOF Sawyer 机械臂,MuJoCo)

项内容(源码核验)
状态空间dim⁡(O)=20\dim(\mathcal O)=20:关节位置 qpos[7] + 缩放关节速度 qvel[7]/10 + 末端(finger)3D 位置 site_xpos[3] + 目标 3D 位置 site_pos[3](_get_obs)。
动作空间连续 dim⁡(A)=7\dim(\mathcal A)=7(7 个关节的力矩/控制量),范围 [−1,1][-1,1](实例化读得 action_space.low=-1, high=1)。
奖励(已知)r=−10 ∥hand−target∥2r=-10\,\lVert \text{hand}-\text{target}\rVert_2(get_reward 中 -10*dist)。无控制代价项;done 恒为 False(定长回合)。
视野 ep_len200(硬编码;注册 max_episode_steps=500)。
目标驱动 7-DOF 机械臂,让末端 finger 尽快贴近每回合随机采样的 3D 目标点(x ⁣∈ ⁣[−0.3,0.3],y ⁣∈ ⁣[−0.2,0.2],z ⁣∈ ⁣[−0.25,0.25]x\!\in\![-0.3,0.3],y\!\in\![-0.2,0.2],z\!\in\![-0.25,0.25])。

2.3 cheetah-cs285-v0(HalfCheetah,MuJoCo)

项内容(源码核验)
状态空间dim⁡(O)=21\dim(\mathcal O)=21:关节位置 qpos[9] + 关节速度 qvel[9] + 躯干质心 com_torso[3](_get_obs)。其中 obs[2]=躯干角、obs[6..8]=前腿/胫/足角、obs[9]=前向速度 xvelx_{\text{vel}}(被奖励函数使用)。
动作空间连续 dim⁡(A)=6\dim(\mathcal A)=6(6 个关节力矩),范围 [−1,1][-1,1](实例化读得)。
奖励(已知)r=xvel−姿态惩罚r=x_{\text{vel}}-\text{姿态惩罚}:前向速度奖励 run=xvel;若前腿角 >0.2>0.2/前胫角 >0>0/前足角 >0>0 则各扣 penalty_factor=10(get_reward)。无二次控制代价项。
视野 ep_len500(硬编码;注册 max_episode_steps=1000)。
目标让”半只猎豹”在保持前腿姿态合规的前提下尽可能快地向前跑(最大化累计前向速度)。

为什么这三个环境是好的 MBRL 试金石?

三者在维度、动力学复杂度、奖励形状上层层递进:obstacles 是 4 维纯 numpy 导航(连 MuJoCo 都不需要,最易学模型);reacher 是 20 维接触较弱的机械臂到点(奖励光滑、稠密);cheetah 是 21 维、含接触与失稳的高动态运动(奖励含不连续的姿态阈值惩罚,对模型误差最敏感)。这正好覆盖了”模型好学 → 难学”、“规划易 → 难”的谱系,让 Q1–Q5 的结论更有说服力。

2.4 任务清单(要回答/验证什么)

作业按难度分成 6 问,全部建立在”学动态模型 + 用已知奖励做采样式规划”之上:

问题环境要验证的核心问题
Q1 动态模型质量cheetah不同网络容量 × 训练步数下,动态模型的预测误差 MPE 如何变化?(评估指标,见 §6)
Q2 单轮 MPCobstacles只在随机数据上训一个模型,配合 MPC(随机打靶)能否显著超过随机策略?
Q3 多轮 MBRL三个on-policy 数据聚合能否让回报逐轮上升?
Q4 消融reacher三个规划超参——ensemble 大小 / 候选序列数 NN / 规划视野 HH——各自如何影响性能?
Q5 规划器对比cheetah随机打靶 vs CEM(迭代 2 / 4)谁更强?
Q6 MBPOcheetah用模型造短 rollout 喂给 SAC:模型内 rollout 长度 0 / 1 / 10 谁的样本效率更高?(见 §11)

3. 环境搭建与踩坑

依赖复用已有的 conda 环境 cs285(Python 3.9),核心版本来自本机真实解释器:

包版本作用
python3.9.23解释器(miniconda3/envs/cs285)
torch1.13.1动态模型网络与优化
gym0.25.2环境接口(旧 step API,4 元组)
mujoco2.3.3物理后端(新 mujoco 绑定,非 mujoco_py)
numpy1.xMPC 全程在 numpy 域做批量前推

踩坑 1(最关键):共享包名 cs285 的”影子包”遮蔽

多个作业使用同一个顶层包名;运行前需要确认解释器解析到当前作业目录。本站不发布环境安装日志,因此这里只保留问题与检查原则,不把安装输出作为公开证据。

踩坑 2:用新 mujoco 绑定,不装 mujoco_py

cheetah/reacher 用 gym.envs.mujoco.mujoco_env(gym 0.25 已适配新 mujoco Python 绑定)。直接 import mujoco_py 会 ModuleNotFoundError——这是预期的,不需要它。三个环境实测均可加载:obstacles(obs 4)、reacher(obs 20)、cheetah(obs 21)。obstacles 是纯 numpy 环境,连 mujoco 都不需要。

踩坑 3:纯 CPU + 降规模

本次统一使用 CPU。为控制运行预算,Q3/Q4/Q5 缩减了 n_iter、num_agent_train_steps_per_iter、候选数 NN、batch_size 与 eval_batch_size;因此这里只比较本站公开曲线中的本次设置,不声称复现外部参考成绩。

仅加的一处非算法改动(实验记录用)

为把动态模型的 MPE 数值落盘(原代码只把它画进 itr_0_predictions.png 的标题、不打印),在 rl_trainer.log_model_predictions 里加了一行 print(MPE) 与 np.save(itr_0_mpe.npy)。不改变任何训练/规划逻辑,纯粹为了让报告能引用真实 MPE。

4. 实验 setting(真实超参)

下表为各问题本次实际使用的超参(来自 run_hw4_mb.py 的 argparse 默认 + 我们的运行命令)。降规模的项用 红色标出原官方值。

超参含义Q1Q2Q3Q4Q5
env环境cheetahobstacles三个reachercheetah
n_iteron-policy 迭代轮数11obs 10 / rea 8 / che 8 (原12/15/20)6 (原15)4 (原5)
num_agent_train_steps_per_iter每轮模型梯度步500 或 520obs 20 / rea 500 / che 500 (原—/1000/1500)400 (原1000)500 (原1500)
ensemble_size集成模型数 NensN_{ens}111{1,3,5}1
mpc_horizon HH规划视野—10obs/rea 10 / che 15{5,10,15,30}15
mpc_num_action_sequences NN候选动作序列数—1000obs 1000 / rea·che 500 (原1000){100,500,1000}500 (原1000)
mpc_action_sampling_strategy规划方法randomrandomrandomrandomrandom / cem
cem_iterations MMCEM 迭代次数————{2,4}
cem_num_elites JJCEM 精英数————5(默认)
batch_size_initial首轮随机数据量200005000obs 5000 / rea·che 3000—(首轮用 batch_size)3000 (原5000)
batch_size每轮 on-policy 采集—1000obs 1000 / rea·che 1500 (原5000)8001500 (原5000)
eval_batch_size每轮评测采集—400obs 400 / rea·che 200 (原400)200 (原400)200 (原400)
n_layers×size网络结构1×32 / 2×2502×250(默认)
learning_rateAdam 学习率10−310^{-3}(默认)
add_sl_noise / seed训练加噪 / 随机种子开启 / 1(单种子单次)

5. 代码实现讲解

5.1 动态模型:预测”标准化的状态增量”

模型不直接预测 st+1s_{t+1},而是预测状态差 Δt+1=st+1−st\Delta_{t+1}=s_{t+1}-s_t,并且是它的标准化版本。原因有二:预测增量比预测绝对状态更容易(增量幅度小、跨状态更平稳);标准化让各维度梯度尺度均匀。前向里先把输入 obs/action 标准化,网络输出 Δ^norm\widehat{\Delta}^{\text{norm}},再反标准化加回 sts_t 得到 s^t+1\widehat s_{t+1}(对应 PDF 公式 6):

(此处的实现代码或复现命令不在本站发布。)

训练目标也放在标准化空间:把真实增量标准化后与网络输出算 MSE(PDF 公式 5)。

(此处的实现代码或复现命令不在本站发布。)

为什么把 loss 放标准化空间,而不是直接对 s^t+1\widehat s_{t+1} 算?

cheetah 的 21 维状态里,有的维度(位置)量级大、有的(速度/角度)量级小。若直接对原始状态算 MSE,大量级维度会主导梯度,小量级维度学不动。把目标标准化到 ~N(0,1)\mathcal N(0,1) 后,每个维度对 loss 的贡献均衡,网络能同时学好所有维度。统计量 obs/acs/delta_mean/std 由 mb_agent.add_to_replay_buffer 用整个 replay buffer 实时估计。

5.2 集成(ensemble):分片训练 + 预测平均

集成的价值在于用”模型间的分歧”刻画认知不确定性。实现上两点:(1) 采样时一次取 batch_size × ensemble_size 条数据,训练时等分切片给每个模型,让它们看到不重叠的 minibatch(bootstrap 式多样性);(2) 规划打分时对所有模型的预测回报取平均。

(此处的实现代码或复现命令不在本站发布。)

(此处的实现代码或复现命令不在本站发布。)

5.3 随机打靶:向量化的 H 步前推

随机打靶就是:均匀采 NN 条长度 HH 的动作序列,用模型把每条序列在”想象里”推演 HH 步、累加已知奖励,选总回报最高的那条。效率关键:不要写 N×HN\times H 的双层 python 循环,而是把 NN 条候选当成一个 batch,只做一层 HH 的循环——每步同时推进全部 NN 条:

(此处的实现代码或复现命令不在本站发布。)

为什么这样能快 100×?

朴素写法对每条候选、每一步各调一次模型,共 N×HN\times H 次前向,每次 batch=1;向量化后只有 HH 次前向,每次 batch=NN。神经网络对 batch 是高度并行的,HH 次 batch=1000 的前向远快于 1000H1000H 次 batch=1 的前向。这也是本报告能在纯 CPU 上把消融跑完的前提。

5.4 MPC:只执行第一步,然后重规划

规划出最优 HH 步序列后,只执行第一个动作,下一时刻拿到真实新状态再重新规划(receding horizon control)。这是抵消模型误差累积的核心技巧:

(此处的实现代码或复现命令不在本站发布。)

5.5 CEM:迭代收紧采样分布

随机打靶只采一次;CEM 则迭代 MM 次:每轮选 top-JJ 精英序列,用它们的均值/方差拟合一个对角高斯,作为下一轮的采样分布——把搜索预算逐步集中到”看起来好”的区域。可选的动量系数 α\alpha 让分布更新更平滑,避免过早收敛:

(此处的实现代码或复现命令不在本站发布。)

5.6 on-policy 数据聚合(主循环)

rl_trainer 已把逻辑串好:首轮用随机策略收 batch_size_initial 条数据,之后每轮用当前最新模型驱动的 MPC去环境采新数据、并入 replay buffer、在增长的 buffer 上再训练模型。因为 MBRL 在实践中对 on-policy 数据高度依赖(随机数据覆盖不到我们真正关心的状态区域),这个聚合循环是性能逐轮提升的关键。

6. Q1:动态模型质量(架构 × 训练量)

【受控配置对比】【单种子】 网络容量与训练步数同时变化的配置不应拆成单因素因果效应。

固定收集 20000 条随机数据,训练单个动态模型,比较三种配置的训练末 loss(标准化空间 MSE)与模型预测误差 MPE(沿一条固定 10 步动作序列,模型预测状态与真实状态的均方误差)。数字来自 itr_0_losses.npy 与 itr_0_mpe.npy。

配置网络梯度步训练末 Loss最小 LossMPE ↓说明
q1_cheetah_n5_arch2x2502×25050.67740.67741.2648大网但严重欠训
q1_cheetah_n500_arch1x321×325000.16760.15570.2122小网但训练充分
q1_cheetah_n500_arch2x2502×2505000.12270.11490.0279大网 + 训练充分(最佳)

图 1:Q1 动态模型质量对比。MPE(对数轴)随”容量↑、训练量↑“单调下降:欠训 2×250(5步) 1.26 → 充分训 1×32(500步) 0.21 → 充分训 2×250(500步) 0.028。

Q1 三配置的 MPE 与训练末 Loss 柱状对比

为什么 2×250-500步 最好?(本质)

两个因子共同决定模型质量:容量(能不能表达复杂动力学)与优化充分度(有没有训到位)。n5 尽管网络大,但只走 5 步梯度,loss 还在 0.68,远没收敛 → MPE 最差;1x32 训了 500 步但容量太小,loss 卡在 0.17;只有大容量 + 充分训练才把 loss 压到 0.11、MPE 压到 0.028。这正对应 PDF 的预期:“第一条命令 loss 应在 500 步内降到 0.2 以下”——我们的 1×32 达到 0.17、2×250 达到 0.12,均达标。

6.1 训练损失监控:动态模型 loss vs 梯度步 / 迭代

Model-Based RL 的核心训练信号不是回报、也不是上面的 MPE,而是动态模型自身的监督训练损失——标准化状态增量的单步 MSE ∥norm⁡(Δt+1)−fθ(st,at)∥2\lVert \operatorname{norm}(\Delta_{t+1})-f_\theta(s_t,a_t)\rVert^2(见 §5.1)。这是优化器真正在最小化的目标。我们从两个粒度监控它:(A) 单轮内每一梯度步的 loss(来自 itr_0_losses.npy,每轮落盘的全部中间 loss);(B) 多轮 on-policy 迭代里每轮末的 loss(来自 tfevents 的 Training_Loss 标量,每迭代一点),并与该环境的 Eval 回报叠放,观察”loss 与性能”的关系。

图 2:动态模型训练损失监控。左(A):iteration 0 内每一梯度步的 loss(对数轴),三条 run 都在 ~500 步内从 ≈1.0 单调收敛到平台——cheetah Q3 降到 0.085、cheetah Q1 2×250 到 0.123、reacher 到 0.167(reacher 20 维、动力学更难,平台更高)。右(B):多轮聚合中每轮末的训练 loss(左轴)与 cheetah 的 Eval 回报(右轴,红色虚线)。三个环境的每轮 loss 都基本走平甚至略升(obstacles 从 0.34 升到 0.41),而 cheetah 回报却从 −13 一路升到 ≈200——训练 loss 的绝对值与规划性能显著解耦。

动态模型训练损失:单轮内每梯度步收敛(左)与多轮迭代 loss vs 回报(右)

这张图和 Q1 的 MPE 图(图 1)有什么本质区别?别混为一谈

  • 图 1 的 MPE 是”评估指标”,不是训练 loss。 MPE 在训练之后沿一条固定的 10 步动作序列做开环多步 rollout,累计”预测状态 vs 真实状态”的误差——它衡量多步外推的准确性,正是规划真正依赖的能力,且会受误差沿视野复合(§12.1)放大。
  • 本图(图 2)是”训练损失”,即优化目标本身。 它是单步、在标准化增量空间、在训练/buffer 分布上算的 MSE。它衡量的是”模型有没有在当前数据上被训到位”,不含多步复合。
  • 为什么 loss 收敛 ≠ 规划变好? 右图给出直接证据:cheetah 每轮 loss 稳在 0.06–0.11、obstacles 甚至上升,但回报持续改善。原因是每轮 on-policy 聚合把新的、更难拟合的状态(好策略才会到达的区域)加入 buffer,抬高了 loss 的绝对水平;真正让规划变好的是这些数据让模型在关键状态区域更准(体现为 MPE/回报改善),而非训练 loss 数字下降。所以在 MBRL 里,训练 loss 只能判断”这一轮训练是否正常收敛”,判断”规划好不好”必须看 MPE 与回报。

7. Q2:MPC 动作选择(obstacles 单轮)

只跑 1 轮:先用随机策略收 5000 步数据、训 20 步模型,再用该模型驱动的 MPC(随机打靶,H=10H=10、N=1000N=1000) 去评测。对比 Train_AverageReturn(随机动作)与 Eval_AverageReturn(MPC)。

指标数值官方参考是否达标
Train_AverageReturn(随机策略)−167.10 ± 33.23≈ −160✅
Eval_AverageReturn(MPC)−45.99 ± 40.87−70 ~ −50✅(略优于区间上沿)
模型 MPE(itr_0)0.000202——

图 3:Q2 随机策略 vs MPC(单轮,各为一个点)。仅凭随机数据训练的模型,MPC 就把回报从 −167 提到 −46——证明 (a) 模型学到了有用的动力学、(b) MPC 规划正确。

Q2 Train vs Eval AverageReturn 单点对比

这一步验证了什么?

Train 用的是随机动作(−167),Eval 用的是同一批随机数据训出的模型去做 MPC(−46)。两者数据同源、唯一区别是”有没有用模型规划”。回报大幅提升,说明动态模型 + 随机打靶 + 已知奖励这条链路是通的,为后面的多轮聚合打底。

8. Q3:多轮 on-policy MBRL

在 obstacles/reacher/cheetah 上跑多轮聚合,每轮用最新模型的 MPC 采新数据并重训。降规模说明见 §4;这里看的是回报是否随迭代上升的趋势,而非追平官方绝对值。

环境迭代数首轮 Eval(随机模型)末轮 Eval最好 Eval趋势
obstacles10−46.0−28.3 ± 14.5−25.4↑ 上升
reacher8−2111.2−289.1−286.4↑ 大幅上升
cheetah8−13.1197.2231.8↑ 强上升

图 4:Q3 多轮 on-policy MBRL 学习曲线(降规模)。三个环境的 Eval 回报都随迭代明显上升:reacher 从 −2111 一路收敛到 ≈ −289,cheetah 从 −13 升到约 200,obstacles 从 −46 降到约 −28。曲线的抖动来自单种子 + 小 eval_batch_size。

Q3 三个环境的多轮 MBRL 学习曲线

on-policy 聚合为什么有效?

首轮的模型只见过随机数据,覆盖不到”好策略会去的状态”,所以首轮 Eval 很差(reacher −2111)。此后每轮用最新 MPC 采到的数据都更贴近”我们真正想优化的轨迹”,模型在这些区域越来越准,MPC 也就规划得越来越好——这是一个”越用越准、越准越好用”的正反馈。reacher 第 1 轮就从 −2111 跳到 −560,正是补上 on-policy 数据后模型质量的突变。受降规模影响,绝对值低于官方参考(官方 reacher −250~−300、cheetah 250~350),但上升趋势一致。

降规模说明(对照官方命令)

obstacles 用 n_iter=10(原 12);reacher 用 n_iter=8, 每轮 500 步, N=500, batch 1500(原 15/1000/1000/5000);cheetah 用 n_iter=8, 每轮 500 步, N=500, batch 1500, H=15(原 20/1500/1000/5000)。reacher/cheetah 的 eval_batch_size=200 只够 1 条评测轨迹,故末轮 std=0。

8.1 结果可视化(视频)

上面的曲线只给出回报数字,这里补上三个环境最终 MPC 控制策略在真实环境里的 rollout 视频,直观看到”学到的动态模型 + 随机打靶规划”到底把智能体控成了什么样子。说明模型来源:HW4 的训练脚本从未保存动态模型(各 run 未加 --save_params,且 MBAgent 本身没有 save())。因此我们按 §4/§8 的降规模口径为每个环境重新跑了一遍简短的 on-policy MBRL,并把学到的 FFModel.state_dict() 与归一化统计量 data_statistics 落盘,再载回构建 MPC 策略、在真实环境里逐步规划、执行、录帧(每个环境跑多个种子取较好的一条)。全部为真实 rollout,无任何脚本化/伪造轨迹;渲染脚本与 checkpoint 属于代码和训练产物,不随本站发布。

两种渲染路径(复用 HW2/HW1 pilot 管线)

cheetah / reacher 是 MuJoCo 环境,直接用环境自带的 render()(MUJOCO_GL=glfw,rgb_array)抓帧;obstacles 是纯 numpy/matplotlib 环境(连 MuJoCo 都不需要),故手写了一个帧抓取器:每一步在固定坐标轴的 Agg 画布上重绘边界、5 个矩形障碍、目标(绿星)、智能体(黑点)与蓝色轨迹尾迹,再用 fig.canvas.tostring_rgb() 取 RGB 交给 imageio。三段均以 H.264/yuv420p 编码(≤480px)。视频是截取的片段,与训练全程 ep_len 的 Eval 口径不同,因此不在视频说明中给出回报数字。

图 0:视频 1:cheetah-cs285-v0 最终 MPC 策略 rollout——“半猎豹”已学会持续向前奔跑(而非原地抽搐/翻倒)。模型为本次按降规模口径重训后存盘,渲染时用 MPC 随机打靶在真实环境中规划,并从多个渲染种子中挑选了较好的一段,不代表平均性能。重训配置、片段回报与耗时没有公开日志,本页只描述视频中可见的行为;回报数字以第 8 节的公开曲线为准。因降规模,绝对回报低于官方 250–350,但”向前跑”的定性行为已明确成形。

视频:cheetah_rollout.mp4

图 0:视频 2:reacher-cs285-v0 最终 MPC 策略 rollout——红色 7-DOF Sawyer 机械臂驱动末端 finger(蓝点)贴近每回合随机的 3D 目标(绿点)。模型为本次按降规模口径重训后存盘,渲染时用 MPC 随机打靶规划,并从多个渲染种子中挑选了较好的一段,不代表平均性能。重训配置、片段回报与耗时没有公开日志,本页只描述视频中可见的行为;回报数字以第 8 节的公开曲线为准。

视频:reacher_rollout.mp4

图 0:视频 3:obstacles-cs285-v0 最终 MPC 策略 rollout——智能体(黑点)从随机起点绕过红色障碍导航到目标(绿星),蓝线为其真实轨迹尾迹。模型为本次按降规模口径重训后存盘。因该环境是纯 numpy/matplotlib,渲染用手写帧抓取器(固定坐标轴重绘边界/障碍/目标/智能体/轨迹后编码为视频);MPC 随机打靶规划,片段从多个渲染种子中挑选,不代表平均性能。智能体很快抵达目标、回合随即结束(到达阈值触发 done),所以视频很短。重训配置、片段回报与耗时没有公开日志,本页只描述视频中可见的行为。

视频:obstacles_rollout.mp4

9. Q4:三大超参消融(reacher)

【有限配置消融】【单种子/少轨迹】 仅支持本预算下的局部趋势。

在 reacher 上分别单独改变 ensemble 大小、候选序列数 NN、规划视野 HH,其余固定(降规模基线:n_iter=6n\_iter=6、每轮 400 梯度步、N=500N=500、H=10H=10、ensemble=3)。

9.1 Ensemble 大小的影响

ensemble 大小末轮 Eval最好 Eval结论
1−399.7−294.0单模型:末轮明显更差、更不稳
3−267.1−267.1最佳
5−282.6−272.4与 3 相当(收益饱和)

图 5:Q4 ensemble 大小消融。ensemble=1 的曲线末端明显下滑,ensemble=3/5 更高;这支持本设置下集成规模与表现相关,但没有直接测量模型校准、过度自信或跨种子方差。

Q4 ensemble 大小消融曲线

9.2 候选动作序列数 NN 的影响

NN末轮 Eval最好 Eval结论
100−298.0−298.0候选太少,搜不到好序列
500−267.1−267.1最佳
1000−317.7−271.9最好值与 500 相当(收益饱和 + 单种子抖动)

图 6:Q4 候选数 NN 消融。N=100N=100 全程最差;N=500/1000N=500/1000 明显更好且彼此接近。更多候选 = 对 arg⁡max⁡\arg\max 更好的蒙特卡洛近似,但边际收益递减;N=1000N=1000 末轮的回撤(−318)主要是单种子小 eval 的噪声(其最好值 −272 与 N=500N=500 持平)。

Q4 候选序列数消融曲线

9.3 规划视野 HH 的影响(最能体现”模型误差复合”)

HH末轮 Eval最好 Eval结论
5−336.4−290.5看得太近,MPC 短视
10−267.1−267.1最佳(甜蜜点)
15−285.6−285.6略差于 10
30−356.8−356.8最差:模型误差复合压垮”看得远”的收益

图 7:Q4 规划视野 HH 消融。在已测取值中 H=10H=10 最好、H=30H=30 最差;该现象与长视野会放大模型误差的机制一致,但本实验没有分解误差来源,不能单独证明因果。

Q4 规划视野消融曲线

降规模说明(Q4)

全部为 reacher,降规模基线:n_iter=6(原 15)、每轮 400 步(原 1000)、batch_size=800、eval_batch_size=200(原 400,故 std=0)。ensemble 与 horizon 消融固定 N=500;ensemble_size=3 的那次运行同时充当三张消融图的公共基线点(H=10H=10、N=500N=500、ens=3)。

10. Q5:随机打靶 vs CEM(cheetah)

在 cheetah 上对比随机打靶与 CEM(迭代 2 / 4),其余相同(降规模:n_iter=4n\_iter=4、每轮 500 步、N=500N=500、H=15H=15)。

方法iter0 Eval(同一模型)末轮 Eval结论
随机打靶 random−13.1191.0基线
CEM(迭代 2)37.3180.7iter0 已优于随机;末轮与随机相当(迭代太少)
CEM(迭代 4)94.1432.9全程最优,末轮 ≈ 随机的 2.3 倍

图 8:Q5 随机打靶 vs CEM(cheetah,H=15H=15、N=500N=500)。CEM 迭代 4 全程碾压,末轮 432.9 远超随机打靶的 191;CEM 迭代 2 因迭代太少,末轮与随机打靶接近。

Q5 随机打靶 vs CEM 学习曲线

最干净的证据:iter0 是”同一个模型、不同规划器”的对照

第 0 轮三组使用同一随机数据与同一模型,评测规划器分别得到:随机打靶 −13.1、CEM(2) 37.3、CEM(4) 94.1。这是较干净的同模型对照,说明在该模型、采样预算与种子下更多 CEM 迭代找到更高模型预测回报并带来更高真实 Eval;它不构成“CEM 对所有目标都更强”的普遍证明。后续轮次的数据分布也随规划器改变,已不再是只差规划器的单变量对照。

降规模说明(Q5)与一处诚实提醒

cheetah,降规模:n_iter=4(原 5)、每轮 500 步(原 1500)、N=500(原 1000)、batch 1500 / batch_initial 3000(原 5000/5000)、eval_batch_size=200(故 std=0)。因此绝对值低于官方 CEM 参考(官方期望 800+)。CEM 迭代 2 在本降规模下末轮未拉开与随机打靶的差距——这与”CEM 需要足够迭代次数才能收紧分布”一致:迭代 2 收紧不充分、NN 又被砍半,优势被噪声淹没;迭代 4 才充分体现出来。

11. Q6:MBPO(用模型造 rollout 喂 SAC)

【存在混杂】 各设置的 sac_n_iter 更新预算按作业命令并不相同(配置未公开,无法在本页核对),禁止据此做 kk 的因果排序。

前面 Q1–Q5 都是”用模型直接做 MPC 规划”。Q6 换一条路——MBPO(Model-Based Policy Optimization):不拿模型去规划动作,而是用学到的 dynamics model 在”想象”里造一批短 rollout 塞进 replay buffer,再喂给一个 model-free 的 SAC 智能体去训练。这样既保留 SAC 的策略学习能力,又用模型放大数据量、提升样本效率。核心开关是 --mbpo_rollout_length k(对应 mbpo_agent.collect_model_trajectory:从真实 buffer 采起点、用 SAC actor 决策、ensemble 平均前推 kk 步、已知奖励查表)。按 PDF Q6 我们比较三档:

  • k=0k=0(model-free SAC 基线):完全不造模型数据,退化成纯 SAC(rl_trainer 里 mbpo_rollout_length>0 才会 collect_model_trajectory)。
  • k=1k=1(Dyna 单步):每个真实步额外造 1 步模型 rollout 并多做梯度更新。
  • k=10k=10(MBPO 长 rollout):造 10 步模型 rollout,样本效率最高但也最吃模型精度。

按作业命令,k=0k=0 与 k=1/10k=1/10 使用了不同的 SAC 梯度步预算 sac_n_iter(具体配置未随本站公开,无法在本页核对)。这符合“模型数据支持更多更新”的系统级配方,但也形成一个重要混杂:Q6 比较的是“rollout 长度 + 更新预算”的组合,而非只改 kk 的严格消融。要识别 kk 的独立作用,还需固定 sac_n_iter 做补充实验;本报告不补造该数据。

超参含义本次值(cheetah)
mbpo_rollout_length kk模型内 rollout 长度(本题主变量){0, 1, 10}
sac_n_iter每轮 SAC 梯度步(含造模型数据)随 kk 不同(按作业命令;具体值未公开,无法在本页核对)
n_iteron-policy 迭代轮数8 (原10)
num_agent_train_steps_per_iter每轮动态模型梯度步1000 (原1500)
batch_size_initial / batch_size首轮随机 / 每轮 on-policy 采集5000 / 5000(同官方)
sac_size×sac_n_layersSAC 网络256 × 2(同官方)
sac_batch_size / sac_learning_rateSAC 批量 / 学习率1500 / 3×10−43\times10^{-4}(同官方)
sac_init_temperature / sac_discountSAC 初始温度 / 折扣0.1 / 0.99(同官方)
eval_batch_size每轮评测采集1500(=3 条轨迹,用于 std 阴影)

三档的 Eval 回报(Eval_AverageReturn,mean ± std 来自每轮 3 条评测轨迹)汇总如下:

rollout 长度 kkiter0 Eval末轮 Eval最好 Eval趋势 / 结论
0(model-free SAC)−47.3 ± 17.438.2 ± 16.797.9 ± 9.5(it4)最弱;第 2 轮一度崩到 −4327(SAC 不稳)
1(Dyna 单步)−15.5 ± 9.7161.5 ± 10.4161.5 ± 10.4(it7)明显优于基线(末轮 ≈ 基线 4.2×)
10(MBPO 长 rollout)−3.6 ± 12.8633.9 ± 3.6633.9 ± 3.6(it7)全程最优,末轮 ≈ 基线 16.6×、单步 3.9×

图 9:Q6 MBPO 模型内 rollout 长度消融(cheetah,降规模)。阴影是同一策略 3 条评测轨迹的离散度,不是跨种子不确定性。在本次单种子运行的三个离散取值中,末轮回报依次为 38.2、161.5、633.9;k=0k=0 第 2 轮出现 −4327。纵轴裁剪到 [−250, 720],因此该异常点不在可视范围内。

Q6 MBPO 模型内 rollout 长度 0/1/10 的 Eval 回报对比

回扣模块 08:rollout 长度 kk 是”样本效率 ↔ 模型误差复合”的权衡

  • k=0k=0 退化成 model-free。 不用模型造任何数据,SAC 只能啃真实采到的那点样本;本题真实数据每轮才 5000 步,SAC 学得慢、还在第 2 轮崩了一次(−4327)——正是 model-free 在低数据量下高方差的典型表现。
  • 本设置中模型数据与更高回报相关。 模型转移不消耗真实环境步,但并非“免费真数据”:越往后越受模型偏差污染。k=1→10k=1\to10 的末轮回报从 162 到 634,支持样本效率解释;因仅单种子且训练动力学可能不同,不能把差值完全归因于 kk 的因果效应。
  • kk 不是理论上越大越好。 过长 rollout 会累积模型误差。这里只测到 k=10k=10,且更新预算同时变化,所以无法判断拐点是否出现、更不能据此断言 cheetah 动力学“相对温和”。MBPO 使用短 rollout/调度的动机正是控制这种误差,但最佳长度需实验确定。
  • 在已测试集合 {0,1,10}\{0,1,10\} 中,k=10k=10 最好;没有测试 k>10k>10 或邻近取值,不能把它称为全局最优,也不能据此定位误差拐点。更差模型通常要求更短 rollout 是合理机制判断,仍需针对环境验证。

降规模说明(Q6)与诚实提醒

cheetah,降规模:n_iter=8(原 10)、num_agent_train_steps_per_iter=1000(原 1500);batch_size(_initial)、SAC 超参与 sac_n_iter 按作业命令设置(具体配置未公开)。结果方向与作业参考预期一致,但官方参考并非同预算、同随机性的独立复现基线。单种子(seed=1)单次运行;表中 std 为同一策略 3 条评测轨迹之间的标准差。k=0k=0 第 2 轮的 −4327 保留未平滑;它说明该次运行不稳定,不足以推出 model-free SAC 一般会崩溃。

12. 理论 ↔ 实践对接(回扣模块 08)

本节把实测逐条对回 模块 08 的理论。

12.1 模型误差沿规划视野复合

开环预测 s^t′+1=s^t′+fθ(s^t′,at′)\widehat s_{t'+1}=\widehat s_{t'}+f_\theta(\widehat s_{t'},a_{t'}) 每步都把上一步的误差喂进下一步。记完整的学习转移映射为 F(s,a)=s+fθ(s,a)F(s,a)=s+f_\theta(s,a),假设 FF 对状态满足 Lipschitz 条件、常数为 LL,且单步预测误差不超过 ϵ\epsilon,递推可得到如下示意界:

∥s^t+H−st+H∥ ≤ ϵ∑k=0H−1Lk={ϵ LH−1L−1,L≠1,Hϵ,L=1.\|\widehat s_{t+H}-s_{t+H}\| \ \le\ \epsilon\sum_{k=0}^{H-1}L^{k}= \begin{cases} \epsilon\,\dfrac{L^{H}-1}{L-1}, & L\neq 1,\\[4pt] H\epsilon, & L=1. \end{cases}

这解释了两件事:(1) Q4 中规划视野 HH 过长反而变差——收益(看得更远)敌不过复合误差;(2) MPC 只执行第一步就重规划——用真实状态定期”纠偏”,把复合误差截断在 HH 步内。

12.2 ensemble 降低认知不确定性

单模型在数据稀疏区可能给出过度自信的错误外推。集成平均可降低初始化/采样噪声,却不等价于自动对认知不确定性做保守边缘化:模型分歧只有在被显式传播或惩罚时才形成风险信号,多个模型也可能一致地错。Q4 只表明本设置中更大 ensemble 与更好表现相关,未直接测量校准或分歧惩罚。

12.3 CEM 是更聪明的黑盒优化

随机打靶在整个动作空间”撒网”,高维长视野下命中好序列的概率随 dim⁡(A)×H\dim(\mathcal A)\times H 指数衰减。CEM 用”精英拟合高斯 → 收紧采样”把预算集中到高回报区域,是 arg⁡max⁡\arg\max 的迭代逼近。Q5 中 CEM > 随机打靶、且迭代 4 > 迭代 2,正对应”迭代越多、分布收紧越充分”。

12.4 规划预算的三向权衡

MPC 的计算量 ∝N×H×(CEM 迭代)×(ensemble)\propto N\times H\times(\text{CEM 迭代})\times(\text{ensemble})。Q4/Q5 展示的是同一枚硬币的两面:NN↑、CEM 迭代↑ 提升规划质量但线性增算力;HH 有最优值(受 §12.1 限制);ensemble↑ 更稳但成倍增算力。在固定算力下如何分配这几项预算,是 MBRL 工程的核心调参。

12.5 MBPO 的 rollout 长度权衡(Q6 实测)

模块 08 还讲了 MBPO:不用模型直接规划,而是用模型造短 rollout 喂给 SAC。本作业比较 k=0/1/10k=0/1/10,单次运行末轮 Eval 为 38/162/634;因此只能说在这三个已测取值与该随机种子下结果单调,k=10k=10 的末轮数值约为 k=0k=0 的 16 倍。由于 k=0k=0 曾发生异常崩溃、没有跨种子重复,也没有测试 k>10k>10,这组数据支持但不单独证明普遍的样本效率规律,更不能确认拐点尚未出现。

13. 反思

为什么这样:预测标准化的 Δs 而非直接预测 st+1s_{t+1}

能不能不这样? 能,但会更难训。直接预测绝对状态时,网络得同时学”把 sts_t 抄过去”这件本该免费的事,且大量级维度主导 MSE。预测标准化增量把学习目标变成”小而均衡”的量,等价于给网络加了一个恒等映射的残差先验——这与 ResNet 的残差、扩散模型预测噪声是同一种”让网络只学差量”的智慧。

为什么这样:MPC 只执行第一步

能不能把规划出的 HH 步全执行完再重规划? 可以,但会更差。模型误差沿视野复合(§12.1),越靠后的规划步越不可信;开环执行完整个 HH 步等于把这些不可信的动作照单全收。只执行第一步、每步用真实状态重规划,是”信任模型一步、其余交给反馈”的最优折中——代价是算力翻 ep_lenep\_len 倍,这也是 MBRL 慢的根源。

为什么这样:ensemble 用”平均”而非”取最悲观(min)”

能不能像 offline RL 那样取 min 做保守估计? 可以,且在纯 offline、需要强不确定性惩罚时更合适(如 MOReL/COMBO)。但本作业是 online 且奖励已知、还能持续采 on-policy 数据纠偏,过度保守反而抑制探索。取平均是”消偏但不过度悲观”的中庸选择;若换到 offline 场景,把平均换成”均值 − β·标准差”往往更稳。

数据诚实性 / 本次实验的局限

  • 显式降规模。 Q3/Q4/Q5 缩减了 n_iter/梯度步/N/batch_size(见 §4 红字),故绝对回报低于官方参考(如官方 cheetah 全量可达 250–350、CEM 800+);本报告只主张趋势正确,不主张复现官方绝对值。
  • 单种子(seed=1)单次运行。 表中 std 是”同一策略多条评测轨迹之间”的方差,非跨种子方差;个别轮次波动可能含运气成分。
  • Q6(MBPO)已完整跑通(§11):cheetah 上 rollout 0/1/10 三组对照,末轮 Eval 38/162/634,趋势与官方一致;同样降规模(n_iter=8、模型步 1000),故 k=10k=10 的 634 低于官方 1000+。
  • 唯一的非算法改动是加了 MPE 的 print/np.save(§3 踩坑框),不影响任何训练/规划结果。

High-level insight

这份作业把 MBRL 的全部张力浓缩到一个数上:模型误差。学模型的每一个设计(预测标准化增量、集成、on-policy 聚合)都在压低它;用模型的每一个设计(限制视野 HH、只执行第一步重规划、CEM 收紧采样)都在防止它复合放大。理解了”如何在一个必然不完美的模型上安全地规划”,你就理解了从经典 MPC 到今天 Dreamer/TD-MPC 的整条主线——它们都在回答同一个问题:怎样既享受模型带来的样本效率,又不被模型的谎言反噬。

Claim–Evidence 对照

结论状态证据升级条件
在本次 Q1 三组联合配置比较中,大网络且训练 500 步的设置取得最低 MPE。已验证图片 ↗—
obstacles 的单轮比较中,模型驱动 MPC 的评测回报高于随机采集策略。已验证图片 ↗—
本次降规模运行中,三个环境的 on-policy 数据聚合曲线总体改善。已验证图片 ↗—
reacher 的有限配置消融中,ensemble=3、候选数 500、规划视野 10 分别取得各自比较中的最佳末轮结果。已验证图片 ↗图片 ↗图片 ↗—
本次 cheetah 规划器比较中,4 次迭代的 CEM 曲线高于随机打靶和 2 次迭代 CEM。已验证图片 ↗—
Q6 的三个已测设置中,rollout 长度为 10 的设置末轮回报最高;该结果为单种子运行,且各设置的完整配置未公开,不能据此识别 rollout 长度的独立效应。已验证图片 ↗—

证据文件

12 个文件

参考来源

  1. [1]CS 285: Deep Reinforcement Learning(UC Berkeley)(在新窗口打开)UC Berkeley · HW4 · 访问于 2026-10-17↩