点击标题展开/折叠 · 面向"已采集真机数据、想用 DynaGuide 部署"的场景
你采集的数据只要是标准的 state-action episode就够用——每条 episode 是一段轨迹,每个时间步包含:观测(图像 + 本体感知 proprio)+ 对应动作。
两个模型用同一批 episode,但抽取方式不同:
| 模型 | 用数据的哪部分 | 学什么 |
|---|---|---|
| 扩散策略 (base policy) | (obs_t → action_t) 对 | 模仿:看到观测生成动作 |
| 动态模型 (dynamics model) | (obs_t, action_chunk[t:t+H]) → obs_{t+H} 三元组 | 前向预测:当前观测+动作 → 未来观测的 latent |
还需要第三份数据——但不是训练用,是推理时的引导目标:从你的数据里筛出"想引导的目标行为"的成功片段(如 20 条"抓某物体"),DynaGuide 编码它们的末态作为 z+。想避免的行为可作 z-。
部署(推理)时用。 DynaGuide 的梯度引导(classifier guidance)发生在推理时的 DDIM 去噪循环里,不在任何训练阶段。
不是。 这是最容易误解的点。DynaGuide 的梯度是对动作求的,不是对模型参数求的:
g = ∂E(a) / ∂a ← 对动作 a 求梯度(a 是正在去噪的噪声动作) 不是 g = ∂L / ∂θ ← 对参数 θ 求梯度(这才是训练/微调)
它不更新任何权重。base policy 和 dynamics model 在部署时全程冻结。梯度只是在采样时把动作往目标方向"推",跟 fine-tuning 完全是两回事。
需要,但训练的是两个模型,且都是标准监督训练(这才更新参数),跟"梯度引导"无关:
| 组件 | 要不要训 | 训练方式 | 部署时状态 |
|---|---|---|---|
| Base policy(扩散策略) | 要 | 标准监督(对 θ 反传) | 冻结 |
| Dynamics model(动态模型) | 要 | 标准监督(DINO latent MSE) | 冻结 |
| 梯度引导 | 不训 | — | 推理时对动作求梯度 |
这决定整个规划。DynaGuide 原版的 base policy 是 robomimic 的 DDIM 扩散策略,而你真机跑的是 pi0.5(flow matching)。两者引导机制不同:
| 路线 | 做法 | 难度 |
|---|---|---|
| A:忠实复现 DynaGuide | 在你的数据上训一个 robomimic DDIM 扩散策略作 base policy + 训 dynamics model → 部署引导。完全走通,但 base policy 不是 pi0.5。 | 低 |
| B:引导 pi0.5 | 用你的 pi0.5 作 base policy → 需把引导从 DDIM 公式改写成 flow matching 的速度场引导。是 VLMGuide 课题的后期目标。 | 高 |
DynaGuide 的 MultiviewDataset 要求 HDF5 格式(数据内容就是标准 episode,只是要转成这个结构):
data/ ├── demo_0, demo_1, ... │ ├── actions: [T, action_dim] │ └── obs/ │ ├── third_person: [T, H, W, 3] uint8 ← 至少一个相机 │ ├── eye_in_hand: [T, H, W, 3] uint8 ← 可选 │ ├── proprio: [T, proprio_dim] ← 本体感知 │ └── states: [T, state_dim] ← 成功判定用(可选)
把真机数据(LeRobot 或自定义格式)写脚本映射到这个结构。最容易出错处:action 维度、相机命名、图像范围 0-255。
python robomimic/scripts/train.py \ --config configs/diffusion_policy_image_calvin_ddim.json \ --dataset <你的数据.hdf5> --output <out> --name my_base_policy
改 config 里的 obs keys、action_dim 匹配你的数据。单 3090 约 24-48h。产出:冻结的 base policy checkpoint。
python train_dynaguide.py --exp_dir <out> \ --train_hdf5 <你的数据.hdf5> --test_hdf5 <验证集.hdf5> \ --cameras third_person --action_dim <你的维度> \ --proprio_key proprio --proprio_dim <你的维度> \ --num_epochs 6000 --action_chunk_length 16 --batch_size 16
DINOv2 冻结,只训 Transformer dynamics head。训练数据 = 你的 demo(成功轨迹即可;论文建议用 base policy 的 rollout 成功+失败混合更好,先用演示数据够)。单 3090 约 24-48h。
从数据里筛出目标行为的成功片段(如 20 条),存成小 HDF5。DynaGuide 编码其末态为 z+。有负目标也可准备 z-。
python run_dynaguide.py \ --agent <base_policy> --guidance <dynamics_model> \ --exp_setup_config <你的config.json> \ --scale 1.5 --ss 4 --alpha 30 ...
全程冻结,只在 DDIM 去噪时对动作求梯度引导。这里没有任何参数更新。
你的真机数据
├─(Phase1 监督训练, 更新参数)→ base policy [冻结]
└─(Phase2 监督训练, 更新参数)→ dynamics model [冻结]
│
目标行为片段 ─(Phase3)→ guidance conditions z+/z-
│
(Phase4 推理时, 对动作求梯度, 不更新参数)→ 引导后的动作