Fast-WAM: Do World Action Models Need Test-time Future Imagination?

2,487 字 · English 518 词 · 约 10 分钟阅读

论文信息 - 作者:Tianyuan Yuan, Zibin Dong, Yicheng Liu, Hang Zhao - 通讯作者:Hang Zhao(赵行) - 单位:IIIS, Tsinghua University(清华大学交叉信息研究院)& Galaxea AI - 投稿方向:NeurIPS 2026(投稿中,under review) - arXiv ID:2603.16666 - 代码:https://github.com/yuantianyuan01/FastWAM(含 LIBERO/RoboTwin 训练和评估代码) - 项目主页:https://yuantianyuan01.github.io/FastWAM/ - 模型权重:https://huggingface.co/yuanty/fastwam


一、核心问题

World Action Models(WAM)通过同时建模未来视觉观测和动作预测,在具身控制中展现出了超越传统 Vision-Language-Action(VLA)模型的潜力。然而,几乎所有现有 WAM 都遵循 "想象再执行"(imagine-then-execute) 范式:先通过迭代视频去噪生成未来观测,再基于想象的未来预测动作。这带来了严重的测试时延迟问题(通常 >800ms),但从未有人系统研究过:显式的未来想象是否真的必要?

本文提出了一个根本性的问题:WAM 的收益究竟来自 (1) 训练时的视频建模目标(帮助学习更好的世界表征),还是来自 (2) 推理时的显式未来生成(提供额外的预见信息)?现有 WAM 将这两个因素耦合在一起,无法区分。


二、核心思路 / 方法

2.1 关键设计:解耦训练与推理

Fast-WAM 的核心思想是:训练时保留视频联合训练(video co-training),推理时跳过未来预测,直接从世界表征中生成动作。

图1:三种代表性 WAM 范式对比

图1:三种代表性 WAM 范式对比。

子图 (A) Joint-modeling WAM(联合建模): 未来视频 token 和动作 token 在共享模型中被一起去噪。Action token 和 video token 通过共享注意力交互,动作生成与未来视频建模在整个去噪过程中耦合。代表工作:Motus、Unified World Models。

子图 (B) Causal WAM(因果式): 先独立生成未来视频(第一阶段去噪),再将生成的未来表征作为条件输入给动作预测模块(第二阶段去噪)。动作预测以冻结的去噪视频为条件。代表工作:LingBot-VA、Vidar。

子图 (C) Fast-WAM(本文方法): 训练时保留视频去噪和动作去噪两个分支(通过 Mixure-of-Transformer 架构共享注意力),但推理时完全移除未来视频分支。仅保留第一帧观测的干净 latent token,通过 video DiT 进行一次前向编码,产生世界表征 $z(o, l)$,然后仅对 action token 进行去噪生成动作。推理延迟从 810ms 降至 190ms。

2.2 架构:Mixture-of-Transformer (MoT)

图2:Fast-WAM 模型架构和注意力掩码

图2:Fast-WAM 模型架构(左)与结构化注意力掩码(右)。

架构组件(图2 左):

注意力掩码(图2 右):

训练时(Training Mask)的 token 分组和交互规则:

推理时(Inference Mask):未来视频分支完全移除,仅保留 clean first-frame tokens。Action tokens 仅 attend 自己和 first-frame tokens。

2.3 受控变体设计

为了回答核心问题,作者在同一框架下实现了三种受控变体:

变体 训练 推理 映射到现有工作
Fast-WAM 视频 + 动作联合训练 仅动作去噪(first-frame 编码) 本文提出
Fast-WAM-Joint 视频 + 动作联合训练,action 可 attend 全部 video tokens 视频 + 动作联合去噪 Motus 等
Fast-WAM-IDM 视频 + 动作联合训练,teacher-forcing(50% 概率对 cond-video 加噪) 先视频去噪,再基于冻结视频做动作去噪 LingBot-VA 等
Fast-WAM w.o. video co-train 仅动作训练(架构不变,去掉 $\mathcal{L}_{\text{vid}}$) 仅动作去噪 消融对照

三、训练目标

Fast-WAM 使用 Flow Matching 目标联合训练动作和视频分支。

3.1 Flow Matching 公式

给定目标变量 $y$(动作 chunk 或未来视频 latent),从高斯噪声 $\epsilon \sim \mathcal{N}(0, I)$ 和时间步 $t \in (0,1)$ 构造插值样本:

$$y_t = (1-t) y + t \epsilon$$

模型预测速度场(velocity field):

$$\mathcal{L}_{\text{FM}}(y) = \mathbb{E}_{y, \epsilon, t} \left[ \| f_\theta(y_t, t, o, l) - (\epsilon - y) \|_2^2 \right]$$

3.2 联合目标

3.3 训练细节


四、实验与结果

4.1 仿真基准:LIBERO 和 RoboTwin

LIBERO 结果(4 个 suite,40 个任务,2000 次评估试验):

方法 Embodied PT. Spatial Object Goal Long Average
OpenVLA ✓ 84.7 88.4 79.2 53.7 76.5
π₀ ✓ 96.8 98.8 95.8 85.2 94.1
π₀.₅ ✓ 98.8 98.2 98.0 92.4 96.9
LingBot-VA ✓ 98.5 99.6 97.2 98.5 98.5
Motus ✓ 96.8 99.8 96.6 97.6 97.7
Fast-WAM ✗ 98.2 100.0 97.0 95.2 97.6
Fast-WAM-Joint ✗ 99.6 99.4 98.2 96.8 98.5
Fast-WAM-IDM ✗ 98.8 97.8 97.8 97.6 98.0
Fast-WAM w.o. co-train ✗ 89.2 99.2 95.4 90.0 93.5

关键发现:

RoboTwin 结果(50+ 双手机器人任务,100 次试验/任务):

方法 Embodied PT. Clean Rand. Average
π₀ ✓ 65.92 58.40 62.2
π₀.₅ ✓ 82.74 76.76 79.8
Motus ✓ 88.66 87.02 87.8
Motus (from WAN2.2) ✗ 77.56 77.00 77.3
LingBot-VA ✓ 92.90 91.50 92.2
LingBot-VA (from WAN2.2) ✗ 80.60 -- 80.6
Fast-WAM ✗ 91.88 91.78 91.8
Fast-WAM-Joint ✗ 90.84 90.32 90.6
Fast-WAM-IDM ✗ 91.16 91.34 91.3
Fast-WAM w.o. co-train ✗ 82.76 84.80 83.8

关键发现:

4.2 真机实验:毛巾折叠

图3:真机毛巾折叠任务

图3:真机毛巾折叠任务(Galaxea R1 Lite 平台)。任务要求双臂协调操作柔性物体(毛巾),需要长期规划(长 horizon)和精确的闭环操控。演示数据量:60 小时遥操作数据。

真机结果:

图4:真机实验结果——成功率 vs 完成时间 + 推理延迟对比

图4:真机实验结果,左图为成功率 vs 平均完成时间散点图(越靠左上越好),右图为推理延迟对比。

左图解读(成功率 vs 完成时间):

右图解读(推理延迟):

4.3 核心结论

三组实验(LIBERO、RoboTwin、真机)一致表明:去掉 video co-training 导致的性能退化远大于在推理时跳过未来想象。WAM 的主要价值在于训练时通过视频预测目标塑造更好的世界表征,而非推理时的显式未来生成。


五、关键洞察与技术亮点

  1. "预训练"来自视频模型而非具身数据: Fast-WAM 无需任何 embodied pretraining 即达到 SOTA 水平。其世界建模能力继承自 Wan2.2-5B 的视频生成预训练权重,通过 video co-training 将这些知识迁移到具身控制任务。

  2. Structured Attention Mask 是关键设计: 通过精确控制 token 间的注意力流(action token 不能看未来 video token,clean first-frame 不 attend 任何 token),确保动作分支确实在"预测"而非"窥探",同时让两个分支共享视觉锚点。

  3. KV-Cache 推理优化: Fast-WAM 推理时使用 prefill_video_cache 将 first-frame 的 video DiT 编码结果缓存为逐层 K/V,action 去噪的每一步只需计算 action token 的 attention(以缓存 video K/V 为条件),避免重复编码视频。

  4. Flow Matching 统一框架: Action 和 video 使用相同的 flow matching 公式和 logit-normal 噪声调度,简化了实现和超参调优。

  5. Action Chunk = 32 的设计: 每 32 步 action 对应 9 帧视频(4× 时间下采样后),action 维度与 video 时间维度对齐,确保时间一致性。


六、代码实现解读

6.1 整体架构数据流

                          ┌─────────────────────────────────┐
                          │        FastWAM (6B total)        │
                          │                                  │
   Observation ──────────►│  Video VAE (frozen)              │
   (multi-cam)            │  ├─ encode → video latents       │
                          │  └─ first-frame latents ─────────┼──► prefill_video_cache()
                          │                                  │        │
   Language ─────────────►│  T5 Encoder (frozen)             │        │
   Instruction            │  └─ text embeddings ─────────────┼── cross-attn ──┐
                          │                                  │        │        │
                          │  ┌───────────────────────────────┘        │        │
                          │  │  Video DiT (30 layers, dim=3072)       │        │
                          │  │  └─ pre_dit() → tokens + freqs         │        │
                          │  │                                        ▼        │
                          │  │           ┌─────────────────────────────────┐   │
                          │  │           │       MoT (30 layers)           │   │
                          │  │           │  ┌───────────┬───────────────┐  │   │
                          │  │           │  │Layer i:   │               │  │   │
                          │  │           │  │ Q/K/V_cat │ Mixed Attn    │  │   │
                          │  │  ───────► │  │ [video+   │ (structured   │  │   │
                          │  │           │  │  action]  │  mask)        │  │   │
                          │  └─ kv_cache │  │   ──► split → post_block  │  │   │
                          │              │  └───────────┴───────────────┘  │   │
                          │              └─────────────────────────────────┘   │
                          │                                  │                 │
   Action Chunk (H=32) ──►│  Action DiT (30 layers, dim=1024)                  │
                          │  ├─ pre_dit() → action tokens + freqs              │
                          │  └─ post_dit() ← action_tokens ─────────────────────┘
                          │
                          │  Training only (┅┅┅):
                          │  ┌─ Video denoising loss (future frames)
                          │  └─ Action denoising loss (Flow Matching)
                          └─────────────────────────────────┘

6.2 关键代码文件映射

论文概念 代码位置 说明
Fast-WAM 主模型 src/fastwam/models/wan22/fastwam.py FastWAM 类,包含训练/推理全流程
MoT 混合注意力 src/fastwam/models/wan22/mot.py MoT 类,实现逐层 video+action 混合注意力
Action DiT src/fastwam/models/wan22/action_dit.py ActionDiT 类,1B 动作专家
Fast-WAM-Joint src/fastwam/models/wan22/fastwam_joint.py Joint modeling 变体(action attend 全部 video)
Fast-WAM-IDM src/fastwam/models/wan22/fastwam_idm.py IDM 变体(teacher-forcing + 两阶段推理)
Video DiT src/fastwam/models/wan22/wan_video_dit.py Wan2.2 DiT 骨干
训练器 src/fastwam/trainer.py 训练循环、DeepSpeed 集成
数据处理 src/fastwam/datasets/lerobot/ LeRobot 格式数据集加载和预处理
模型配置 configs/model/fastwam.yaml 模型超参、scheduler、loss 权重
运行时工厂 src/fastwam/runtime.py create_fastwam() 从配置构建模型

6.3 训练流程(FastWAM.training_loss)

training_loss(sample)
│
├─ build_inputs(sample)
│  ├─ VAE.encode(video) → input_latents [B, C, T_latent, H_lat, W_lat]
│  ├─ extract first_frame_latents (if fuse_vae)
│  ├─ T5 context + optional proprio encoding
│  └─ action + action_is_pad
│
├─ Video branch:
│  ├─ sample noise_video, timestep_video
│  ├─ add_noise(input_latents) → noisy_latents
│  ├─ replace first frame with clean latents
│  └─ target_video = scheduler.training_target(input_latents, noise)
│
├─ Action branch:
│  ├─ sample noise_action, timestep_action
│  ├─ add_noise(action) → noisy_action
│  └─ target_action = scheduler.training_target(action, noise)
│
├─ pre_dit (video + action):
│  ├─ video_expert.pre_dit(noisy_latents) → tokens, freqs, t_mod, context
│  └─ action_expert.pre_dit(noisy_action)  → tokens, freqs, t_mod, context
│
├─ MoT forward (30 layers):
│  for each layer:
│    build Q/K/V per expert → concat → mixed_attention(structured_mask)
│    → split → post_block (self-attn + cross-attn + MLP) per expert
│
├─ post_dit:
│  ├─ video_expert.post_dit(tokens_out["video"]) → pred_video
│  └─ action_expert.post_dit(tokens_out["action"]) → pred_action
│
└─ Loss:
   ├─ loss_video = MSE(pred_video, target_video) [masked by image_is_pad]
   ├─ loss_action = MSE(pred_action, target_action) [masked by action_is_pad]
   └─ loss_total = λ_video * loss_video + λ_action * loss_action

6.4 推理流程(FastWAM.infer_action —— 核心 Fast Path)

infer_action(obs_image, instruction)
│
├─ VAE.encode(first_frame) → first_frame_latents
├─ random init → latents_action [1, 32, action_dim]
│
├─ video_expert.pre_dit(first_frame_latents, t=0)
│  └─ 返回 video tokens + freqs + t_mod + context
│
├─ mot.prefill_video_cache(video_tokens, ...)
│  └─ 逐层计算 video K/V,存入 kv_cache (30 层)
│     for each layer:
│       Q_video, K_video, V_video = build(video_tokens)
│       mixed = flash_attention(Q_video, K_video, V_video, self_mask)
│       video_tokens = post_block(video_tokens, mixed)
│       kv_cache[layer] = {k: K_video, v: V_video}
│
├─ Denoising loop (10 steps):
│  for each step:
│    timestep_action = schedule[t]
│    action_pre = action_expert.pre_dit(latents_action, t)
│    └─ 返回 action tokens + freqs + t_mod
│
│    mot.forward_action_with_video_cache(
│      action_tokens, kv_cache, joint_attention_mask
│    )
│    └─ for each layer:
│         Q_act, K_act, V_act = build(action_tokens)
│         K_cat = concat([kv_cache[layer].k, K_act])
│         V_cat = concat([kv_cache[layer].v, V_act])
│         mixed = flash_attention(Q_act, K_cat, V_cat, action_rows_of_joint_mask)
│         action_tokens = post_block(action_tokens, mixed)
│
│    pred_action = action_expert.post_dit(action_tokens)
│    latents_action = scheduler.step(pred_action, delta, latents_action)
│
└─ return latents_action → action chunk (32 steps)

6.5 Structured Attention Mask 实现

# fastwam.py:_build_mot_attention_mask()
def _build_mot_attention_mask(video_seq_len, action_seq_len, video_tokens_per_frame):
    mask = zeros(total_seq, total_seq)  # 全零 = 不可见

    # video → video: 由 video_expert 的配置决定
    #   "first_frame_causal" 模式: first-frame 双向,后续帧因果
    mask[:video_seq_len, :video_seq_len] = video_mask

    # action → action: 双向(action chunk 内部完全可见)
    mask[video_seq_len:, video_seq_len:] = True

    # action → first-frame video: 可访问视觉锚点
    mask[video_seq_len:, :video_tokens_per_frame] = True

    # action → future video: 不可见!(关键解耦设计)
    # 这一行被刻意留为 False

    return mask

Fast-WAM-Joint 的关键区别:mask[video_seq_len:, :video_seq_len] = True —— action 可访问全部 video token(包括未来帧),形成联合建模。

6.6 Teacher-Forcing in Fast-WAM-IDM

Fast-WAM-IDM 训练时引入了第三个分支(cond-video),以 50% 概率对其加噪:

training_loss (IDM variant):
├─ Branch A: noisy video → video denoising loss
├─ Branch B: noisy action → action denoising loss
├─ Branch C: cond video (50% noisy / 50% clean)
│
├─ 拼接 [noisy_video, cond_video] 作为 video expert 输入
├─ Action 仅 attend cond_video(不 attend noisy_video)
└─ 推理时两阶段:先去噪 video → 冻结 cond → 去噪 action

七、局限性

  1. 仅研究单步 action chunk: 论文为简化控制实验,省略了外层的自回归 rollout 循环。真实部署中需要滑动窗口式的 chunk 执行,外层 rollout 的影响未被研究。
  2. 未探索更大规模预训练: Fast-WAM 使用 Wan2.2-5B 作为骨干,未测试更大视频模型(如 Wan2.2-14B)或更多预训练数据下的 scaling 行为。
  3. 单任务毛巾折叠的真机实验范围有限: 真机仅测试了一个任务(毛巾折叠),虽然该任务有代表性(长 horizon + 柔性物体),但更多样化的真机任务(如灵巧操作、移动操作)的验证仍缺乏。
  4. Flow Matching 与 action 的兼容性未深入探讨: Action 是低维连续向量(通常 <20 维),与高维视频 latent(48 通道 × 空间 × 时间)在 flow matching 中的行为差异未被分析,可能存在更适合 action 的替代训练目标。

八、关键概念速查

概念 说明
WAM (World Action Model) 同时建模未来视觉观测和动作生成的具身策略模型
VLA (Vision-Language-Action) 直接从视觉+语言映射到动作的策略模型,不显式建模未来
Imagine-then-Execute 先想象未来 → 再基于想象执行动作的 WAM 推理范式
Video Co-training 训练时额外的视频预测/去噪目标,作为动作学习的辅助信号
MoT (Mixture-of-Transformer) 多个专家 DiT 共享混合注意力的架构
Flow Matching 通过预测速度场从噪声到数据的生成模型训练方法,替代 DDPM
Logit-normal Schedule Wan2.2 使用的噪声调度策略,从 logit-normal 分布采样时间步 t
KV-Cache 推理时将视频编码的逐层 K/V 缓存,供 action 去噪多步复用
Teacher Forcing IDM 变体中:训练时以一定概率对 cond-video 加噪,使 action 分支学会利用不同质量的视频条件
LIBERO 机器人操作仿真基准,含 4 个 suite(Spatial/Object/Goal/Long)共 40 个任务
RoboTwin 2.0 双臂协调操作仿真基准,50+ 任务,含 clean 和 randomized 两种场景