PyTorch Week 2: 从 Action Chunk 到 Behavior Cloning
今日学习
Week 2 的主题是 Mini-ACT / Action Chunking Transformer,目标是打通 imitation learning 数据与基础 action chunk policy 的最小闭环。
学习进度
| 天数 | 主题 | 状态 |
|---|---|---|
| W2D1 | Action Chunk Dataset | ✅ 11/11 检查通过 |
| W2D2 | Toy Arm Trajectories | ✅ 10/10 检查通过 |
| W2D3 | MLP Chunk Policy | 🔄 进行中 |
核心知识点
W2D1: Action Chunk Dataset
- 把 trajectory 切成 action chunk 样本
chunk_size与输出时间维度的关系- 不跨 trajectory 拼接 action chunk
Dataset.__len__/Dataset.__getitem__的 shape 约定
W2D2: Toy Arm Trajectories
- imitation learning / behavior cloning 的监督学习视角
- expert policy 与 demonstration trajectory
- state、target、action 的字段设计
- train / val trajectory split
关键收获
1. Action Chunking 的直觉
传统的 single-step policy 每次只预测一个动作,而 action chunk policy 一次性预测未来 K 步动作:
1 | |
这样做的好处是降低控制频率,减少误差累积。在 VLA (Vision-Language-Action) 模型中,LLM 推理一次可能几秒,如果每帧都推理就太慢了。Action chunking 让模型一次输出多步动作,在推理间隔内按序列执行。
2. Behavior Cloning = 回归问题
BC 本质上就是监督学习:
- 输入:observation
- 输出:future action chunk
[B, chunk_size, action_dim] - Loss:MSE 或 L1
1 | |
3. Demonstration Data ≠ 分类数据
分类数据是 i.i.d. 采样,shuffle 不会破坏结构。但 trajectory 数据有强时间相关性:
- trajectory 内的样本不能被打乱
- 但不同 trajectory 之间可以 shuffle
- episode boundary 必须正确处理
遇到的问题
MSE vs L2 Norm 的混淆
W2D3 的 behavior_cloning_loss 中,一开始用了 torch.norm(target - pred)(这是 L2 范数,取了平方根),而不是真正的 MSE。两种都能训练收敛,但 MSE 的梯度更标准、更可解释。
输出 Shape 约定
MLP 的输出从 [B, action_dim] 变成了 [B, chunk_size, action_dim]。需要在 forward 的最后一个全连接层输出 [B, chunk_size * action_dim] 然后 reshape:
1 | |
明日计划
继续 W2D3: MLP Chunk Policy,完成:
- 补全
behavior_cloning_loss(MSE + L1) - 实现
evaluate_on_dataset - 进入 W2D4: Behavior Cloning Training Loop
最终目标:从 imitation learning 数据训练一个能预测多步动作的策略,然后在 toy environment 里做 rollout 评估。
长期路线图
| 阶段 | 内容 | 状态 |
|---|---|---|
| Phase 1 | PyTorch 基础 (autograd → training loop) | ✅ 完成 |
| Phase 2 W1 | Mini-ACT 数据与 policy | 🔄 进行中 |
| Phase 2 W2 | Transformer ACT + temporal ensembling | 待开始 |
| Phase 3 | VLA Demo (multimodal → action) | 待开始 |
| Phase 4 | ZR-0 风格的 VLA 鼠标控制 | 最终目标 |