转载自公众号:敢敢AUTOHUB
1. 引言:从 VLA 到 WAM 的范式跃迁
在具身智能领域,如何让机器人理解物理世界并做出合理决策,一直是核心难题。过去两年,视觉-语言-动作模型(VLA)凭借大规模预训练和端到端推理的优势,成为机器人控制的主流范式。然而,VLA 本质上是一种"看图出动作"的条件生成模型——它基于当前观测直接预测动作序列,却缺乏对未来世界状态的显式建模能力。这意味着机器人在执行复杂长程任务时,难以预判动作的后果,也无法基于"如果我这样做,世界会怎么变"来做出更优决策。
世界动作模型(World Action Model, WAM)的出现正是为了弥补这一缺陷。WAM 的核心思想是:将视频预测(world model)与动作预测(action model)联合建模,让机器人不仅能感知当前状态,还能"想象"未来世界的演化,并据此规划动作。从 2024 年底到 2025 年初,一批优秀的 WAM 工作集中涌现——包括 Motus、Cosmos Policy、LingBot-VA、DreamZero 等——它们在仿真基准和真机实验上展现出超越传统 VLA 的性能,首次让学术界和工业界大范围意识到:WAM 可能拥有比 VLA 更强的潜力。
然而,一个根本性的问题始终悬而未决:WAM 到底为什么 work?是因为推理时模型"看到了"自己想象的未来画面(test-time imagination),还是因为训练时视频预测任务提供的密集监督信号(training-time co-training)帮助模型学到了更好的表征?Fast-WAM 正是为了回答这个问题而诞生的工作。
2. 现有 WAM 的统一范式:Imagine-then-Execute
要理解 Fast-WAM 的贡献,首先需要厘清当前 WAM 的主流做法。尽管各工作的具体实现细节不同,但它们的核心范式高度一致:
训练阶段:将 future video prediction 和 future action prediction 联合建模。模型同时学习"世界接下来会怎么变"和"机器人接下来该怎么做"。
推理阶段:模型先生成未来视频(imagination),然后基于这些想象的画面来输出动作。这就是所谓的 Imagine-then-Execute 范式。
这种范式在直觉上很合理:先"想一想"未来会怎样,再决定怎么做。但它也带来一个隐含的假设——推理时的 future imagination 是 WAM 性能的关键来源。Fast-WAM 团队对此提出了质疑。
3. 核心假设:训练时的 Co-training 才是真正的功臣
Fast-WAM 的作者观察到,future video prediction 在训练和推理时扮演着两个截然不同的角色:
角色一(训练时):video prediction 为模型 backbone 提供了极其密集的监督信号。这些监督与未来动作和环境演化高度相关,迫使 backbone 学习到对控制有价值的视觉表征——物体运动轨迹、接触关系、空间变化等。这本质上是一种 proxy task(代理任务)。
角色二(推理时):video prediction 为 action expert 提供了 guidance——action expert 基于想象的未来画面来决策,相当于一个 latent IDM(逆动力学模型)。
现有 WAM 普遍采用 Imagine-then-Execute 的推理方式,暗示了角色二的重要性。但作者提出了一个大胆的猜想:角色一(training-time co-training)才是 WAM work 的主要原因,而角色二(test-time imagination)可能是多余的。
这个猜想并非凭空而来,而是有先例可循。回顾 Pi-0.5 相对于 Pi-0 的进化:Pi-0.5 引入了 VLM backbone 的 co-training(包括 VQA 数据和自回归 discrete action token),但推理时并不要求模型先预测 discrete action token 再让 action expert 基于这些 token 做 flow matching。这说明 co-training 的核心价值在于改善 backbone 表征,而非为推理提供中间结果。Fast-WAM 将同样的逻辑推广到 video prediction 领域:video co-training 可能只是一个更好的 proxy task,而非推理时的必要环节。
4. Fast-WAM 架构设计:极简结构服务于严格解耦
为了公平验证上述假设,作者设计了一个极简的 Fast-WAM 架构。这里的设计哲学不是追求 SOTA 性能,而是构建一个可控实验平台,使得各个 component 的效果能被清晰解耦。
4.1 整体架构:Video DiT + Action DiT + MoT
Fast-WAM 的核心结构包含三个模块:
1. Video DiT(视频扩散 Transformer):基于 Wan2.2 5B 预训练模型,负责处理视频 latent tokens
2. Action DiT(动作扩散 Transformer):独立的轻量 Transformer,负责处理动作 tokens
3. MoT(Mixture of Tokens):混合注意力层,协调两个专家之间的信息交互
这三个模块在训练时通过联合优化(joint optimization)共同学习,但通过精心设计的 attention mask 控制信息流向。
4.2 MoT 混合注意力的实现
MoT 是 Fast-WAM 的核心连接件。它将 Video DiT 和 Action DiT 的 tokens 拼接后做联合注意力计算,但通过 attention mask 严格控制哪些 tokens 之间可以交互。以下是 MoT 的核心前向传播逻辑(摘自源码 src/fastwam/models/wan22/mot.py):
class MoT(nn.Module):
def forward(self, embeds_all, attention_mask, freqs_all, context_all, t_mod_all):
tokens_all = {k: v for k, v in embeds_all.items()}
for layer_idx in range(self.num_layers):
q_chunks, k_chunks, v_chunks = [], [], []
cached = {}
# 1. 每个专家独立计算 Q/K/V
for name in self.expert_order: # ["video", "action"]
expert = self.mixtures[name]
block = expert.blocks[layer_idx]
q, k, v, residual_x, gate_msa, shift_mlp, scale_mlp, gate_mlp, _ =
self._build_expert_attention_io(expert, block, tokens_all[name],
freqs_all[name], t_mod_all[name])
q_chunks.append(q)
k_chunks.append(k)
v_chunks.append(v)
cached[name] = {...} # 缓存 post-block 所需的中间变量
# 2. 拼接所有 tokens 做混合注意力
q_cat = torch.cat(q_chunks, dim=1)
k_cat = torch.cat(k_chunks, dim=1)
v_cat = torch.cat(v_chunks, dim=1)
mixed = self._mixed_attention(q_cat, k_cat, v_cat, attention_mask)
# 3. 分割输出,每个专家独立做 post-block(FFN + cross-attn)
start = 0
for name, seq_len in zip(self.expert_order, seq_lens):
mixed_slice = mixed[:, start:start+seq_len, :]
tokens_all[name] = self._apply_expert_post_block(...)
start += seq_len
return tokens_all
关键设计点在于:虽然 Q/K/V 被拼接在一起做全局注意力计算,但 attention_mask 精确控制了信息的可见性。这使得同一个架构可以通过不同的 mask 配置,模拟出多种 WAM 变体。
5. Attention Mask:解耦实验的核心武器
Fast-WAM 最巧妙的设计在于通过 attention mask 实现了多种变体的统一框架。以下是核心的 mask 构建函数(摘自 src/fastwam/models/wan22/fastwam.py):
@torch.no_grad()
def _build_mot_attention_mask(self, video_seq_len, action_seq_len,
video_tokens_per_frame, device):
total_seq_len = video_seq_len + action_seq_len
mask = torch.zeros((total_seq_len, total_seq_len), dtype=torch.bool, device=device)
# video tokens 之间:first-frame causal mask
mask[:video_seq_len, :video_seq_len] =
self.video_expert.build_video_to_video_mask(...)
# action tokens 之间:全可见(self-attention)
mask[video_seq_len:, video_seq_len:] = True
# action tokens 只能看到第一帧的 video tokens(不看 future video)
first_frame_tokens = min(video_tokens_per_frame, video_seq_len)
mask[video_seq_len:, :first_frame_tokens] = True
return mask
这段代码揭示了 Fast-WAM 的核心约束:action tokens 在训练时被显式禁止看到 future video tokens。它们只能看到当前帧(第一帧)的视觉信息和自身的动作序列。这意味着即使训练过程中 video prediction 和 action prediction 是联合优化的,action expert 也无法依赖"想象的未来"来做决策。
基于这个统一框架,作者通过修改 mask 配置实现了三种对比变体:
| 变体 | Mask 配置 | 对应的已有工作 | 核心特征 |
|---|---|---|---|
| Fast-WAM-Joint | action 可看 future video (joint denoise) | Motus, DreamZero | 推理时 video+action 联合去噪 |
| Fast-WAM-IDM | action 先看 clean future video (causal) | LingBot-VA | 推理时先生成视频再生成动作 |
| Fast-WAM | action 不看 future video | 本文提出 | 推理时跳过视频生成 |
| Fast-WAM-no-cotrain | 同上,但去掉 video loss | 消融基线 | 验证 co-training 的作用 |
6. 训练流程:联合 Flow Matching 的双流去噪
Fast-WAM 的训练基于 Continuous Flow Matching,对视频和动作分别施加独立的噪声调度,然后联合优化。以下是训练损失的核心计算流程(摘自 training_loss 方法):
def training_loss(self, sample, tiled=False):
inputs = self.build_inputs(sample, tiled=tiled)
input_latents = inputs["input_latents"] # VAE 编码后的视频 latent
action = inputs["action"] # 归一化后的动作序列
# --- 视频流:添加噪声并计算目标 ---
noise_video = torch.randn_like(input_latents)
timestep_video = self.train_video_scheduler.sample_training_t(...)
latents = self.train_video_scheduler.add_noise(input_latents, noise_video, timestep_video)
target_video = self.train_video_scheduler.training_target(input_latents, noise_video, timestep_video)
# --- 动作流:独立的噪声调度 ---
noise_action = torch.randn_like(action)
timestep_action = self.train_action_scheduler.sample_training_t(...)
noisy_action = self.train_action_scheduler.add_noise(action, noise_action, timestep_action)
target_action = self.train_action_scheduler.training_target(action, noise_action, timestep_action)
# --- 两个专家分别做 pre-processing ---
video_pre = self.video_expert.pre_dit(x=latents, timestep=timestep_video, ...)
action_pre = self.action_expert.pre_dit(action_tokens=noisy_action, timestep=timestep_action, ...)
# --- MoT 联合前向:通过 attention mask 控制交互 ---
tokens_out = self.mot(
embeds_all={"video": video_pre["tokens"], "action": action_pre["tokens"]},
attention_mask=self._build_mot_attention_mask(...),
...
)
# --- 分别计算两个流的预测和损失 ---
pred_video = self.video_expert.post_dit(tokens_out["video"], video_pre)
pred_action = self.action_expert.post_dit(tokens_out["action"], action_pre)
loss_video = weighted_mse(pred_video, target_video)
loss_action = weighted_mse(pred_action, target_action)
loss_total = lambda_video * loss_video + lambda_action * loss_action
return loss_total, {"loss_video": ..., "loss_action": ...}
几个值得注意的设计细节:
1. 独立的噪声时间步:video 和 action 使用各自独立采样的 timestep,这意味着在同一个训练 step 中,两者可能处于去噪过程的不同阶段。
2. 第一帧锁定:latents[:, :, 0:1] = first_frame_latents 确保第一帧始终是"干净的"(无噪声),作为条件输入。
3. 可配置的损失权重:loss_lambda_video 和 loss_lambda_action 允许灵活调整两个任务的相对重要性。当 loss_lambda_video = 0 时,即退化为 Fast-WAM-no-cotrain 变体。
7. 推理流程:跳过视频生成的 Action-Only 推理
Fast-WAM 最重要的工程贡献之一是 infer_action 方法——它完全跳过了 future video generation,只利用第一帧的视觉信息做动作推理。这带来了显著的延迟降低。
@torch.no_grad()
def infer_action(self, prompt, input_image, action_horizon, ...):
# 1. 编码第一帧为 latent
first_frame_latents = self._encode_input_image_latents_tensor(input_image)
# 2. Video expert 只处理第一帧(timestep=0,无噪声)
timestep_video = torch.zeros(...) # t=0 表示"干净"的状态
video_pre = self.video_expert.pre_dit(x=first_frame_latents, timestep=timestep_video, ...)
# 3. 预计算并缓存 video 的 K/V(只需一次)
video_kv_cache = self.mot.prefill_video_cache(
video_tokens=video_pre["tokens"],
video_freqs=video_pre["freqs"],
video_t_mod=video_pre["t_mod"],
video_attention_mask=attention_mask[:video_seq_len, :video_seq_len],
...
)
# 4. Action 的多步去噪循环(复用 video KV cache)
for step_t, step_delta in zip(infer_timesteps, infer_deltas):
pred_action = self._predict_action_noise_with_cache(
latents_action=latents_action,
timestep_action=step_t,
video_kv_cache=video_kv_cache, # 缓存复用
attention_mask=attention_mask,
video_seq_len=video_seq_len,
...
)
latents_action = self.infer_action_scheduler.step(pred_action, step_delta, latents_action)
return {"action": latents_action[0]}
这段推理逻辑的核心洞察是:
• Video expert 只需对第一帧做一次 forward pass,生成 KV cache
• Action expert 在多步去噪过程中复用这个 cache,无需反复运行 video branch
• Attention mask 保证 action tokens 只看第一帧 video tokens,与训练时的约束完全一致
与此对比,传统的 Imagine-then-Execute 推理需要先完整运行视频去噪(通常 20-50 步),再运行动作去噪,计算量几乎翻倍。
7.1 与 InfinityStar 等快速视频生成模型的区别
读到这里,一个自然的疑问是:如果推理时视频生成太慢是问题所在,那么使用更快的视频生成方案(比如字节跳动的 InfinityStar)是否就能解决?答案是否定的——因为 Fast-WAM 的结论指向一个更根本的层面。
InfinityStar 是一种统一时空自回归视频生成框架(NeurIPS 2025 Oral),它用离散 token 的 next-token prediction 替代了 diffusion 的多步去噪,将视频生成速度提升了约 10 倍。从工程角度看,它确实大幅缓解了 diffusion 视频模型的延迟问题。但 Fast-WAM 的实验表明,问题的本质不是"视频生成太慢",而是"推理时的视频生成本身就不必要"。
两者解决的是不同层次的问题:
| 对比维度 | InfinityStar | Fast-WAM |
|---|---|---|
| 核心目标 | 加速视频生成(用 AR 替代 Diffusion) | 证明推理时根本不需要生成视频 |
| 方法论 | 离散时空 token 自回归 | Attention Mask 解耦 + KV Cache |
| 推理时是否生成视频 | 是(只是更快) | 否(完全跳过) |
| 延迟改善来源 | 减少生成步数(从 50 步到约 5 步 AR) | 彻底移除视频生成分支 |
| 对 WAM 的启示 | 可作为更快的 video backbone | 证明 video backbone 的价值在训练而非推理 |
换言之,即使未来有人把 Fast-WAM 的 Video DiT(基于 Wan2.2 的 diffusion 模型)替换为 InfinityStar 风格的 AR 视频模型来做 co-training,Fast-WAM 的核心结论依然成立:推理时不需要真的"走一遍"视频生成过程,只要训练时视频预测任务提供了足够的监督信号,action expert 就能从 backbone 学到的表征中直接 decode 出动作。
不过,InfinityStar 的 AR 架构对 WAM 领域仍有潜在价值:它的离散 token 天然适合作为 proxy task 的训练目标(类似 Pi-0.5 中的 discrete action token co-training),未来或许可以探索用"预测离散视频 token"替代"预测连续 video latent"作为 co-training objective,在保持监督信号密度的同时进一步简化训练流水线。
8. KV Cache 机制:推理加速的工程细节
prefill_video_cache 和 forward_action_with_video_cache 是 Fast-WAM 推理加速的工程核心。它们的实现体现了对 Transformer 推理优化的深刻理解:
# mot.py 中的 KV cache 预填充
def prefill_video_cache(self, video_tokens, video_freqs, video_t_mod, ...):
x = video_tokens
kv_cache = []
for layer_idx in range(self.num_layers):
block = self.mixtures["video"].blocks[layer_idx]
q, k, v, residual_x, ... = self._build_expert_attention_io(...)
# Video 自注意力
mixed = self._mixed_attention(q, k, v, video_attention_mask)
# 更新 tokens 并缓存当前层的 K/V
x = self._apply_post_with_optional_checkpoint(...)
kv_cache.append({"k": k, "v": v})
return kv_cache
# 使用缓存的 action 前向
def forward_action_with_video_cache(self, action_tokens, ..., video_kv_cache, ...):
x = action_tokens
for layer_idx in range(self.num_layers):
q_action, k_action, v_action, ... = self._build_expert_attention_io(...)
# 拼接缓存的 video K/V 和当前 action K/V
k_cat = torch.cat([video_kv_cache[layer_idx]["k"], k_action], dim=1)
v_cat = torch.cat([video_kv_cache[layer_idx]["v"], v_action], dim=1)
# Action query 同时 attend to video cache 和 action self
mixed = self._mixed_attention(q_action, k_cat, v_cat, action_attention_mask)
x = self._apply_post_with_optional_checkpoint(...)
return x
这种设计让 action 的每步去噪只需要计算 action tokens 的 Q/K/V 并与预缓存的 video K/V 做交叉注意力,避免了重复计算 video branch 的高昂代价。
9. 与相关工作的关键区别
9.1 vs Video Prediction Policy (VPP)
VPP 是两阶段训练:先单独训 video backbone,再 freeze 住训 action expert。Fast-WAM 是端到端联合训练。这种差异类比于:VPP 相当于拿 frozen CLIP/DINO encoder 做 Diffusion Policy(前 VLA 时代做法),而 Fast-WAM 相当于端到端训练的 VLA。后者在训练效率和性能上限上都有明显优势。
此外两者研究的问题不同:VPP 问的是"生成式模型学到的表征是否比 encoder 模型更适合机器人";Fast-WAM 问的是"训练时的 video prediction objective 和推理时的 future imagination,哪个才是 WAM 性能的主要来源"。
9.2 vs Unified Video Action Model (UVA)
UVA 同样提出了训练时用 video prediction 监督、推理时跳过的思路。但区别在于:
- 1. UVA 的核心目标是提出一个 unified 结构,而 Fast-WAM 的贡献是严格解耦并验证假设2. UVA 仅在 DP 量级的小模型上实验(小几十倍),而 Fast-WAM 对齐了近期 WAM 工作的 scale(video backbone 对齐 Wan 2.2 5B)
9.3 vs HarmoWAM:泛化与精度的自适应切换
HarmoWAM 指出 Imagine-then-Execute 和 Joint Modeling 各有问题:前者泛化强但接触操作不够精细,后者动作生成连贯但容易被训练分布限制。它引入 predictive expert 和 reactive expert,通过 Process-Adaptive Gating 根据任务阶段动态切换。
与 Fast-WAM 的关键区别在于:Fast-WAM 证明推理时不需要 imagination,结论是"可以全程跳过";HarmoWAM 则认为不同阶段需要不同程度的 imagination——接近阶段用 predictive expert(类似 imagination),接触阶段切到 reactive expert(类似直接反应)。两者互补而非矛盾:Fast-WAM 回答了"imagination 是否必要",HarmoWAM 回答了"如果要用 imagination,什么时候用"。
9.4 vs RLA-WM:特征空间预测替代像素空间预测
RLA-WM 继续挑战"WAM 必须预测未来 RGB 视频"的假设。它不预测 raw pixels,而是预测 DINO token 的残差变化,压缩为 Residual Latent Action。
与 Fast-WAM 的关系非常紧密:两者都指向同一个结论——video prediction 的价值在于学到好的表征,而非生成逼真的画面。区别在于路径不同:Fast-WAM 保留了完整的像素级 video prediction 作为训练目标,但在推理时跳过;RLA-WM 则从源头改变了预测目标本身,用特征残差替代 RGB,训练和推理时都不生成视频。RLA-WM 可以看作 Fast-WAM 思想的进一步推进——既然推理时不需要视频,那训练时何必非得预测像素?
9.5 vs OA-WAM:对象级世界维护
OA-WAM 解决多物体场景中的目标绑定问题。它把每帧拆成 robot slot 和多个 object slots,每个 slot 再分成 identity address(物体是谁)和 time-varying content(物体状态)。通过 address-only attention 强行将"操作哪个物体"和"物体当前状态"分开。
与 Fast-WAM 的区别在研究维度上:Fast-WAM 关注的是时间维度的问题(训练 vs 推理阶段 video prediction 的作用),OA-WAM 关注的是空间维度的问题(多物体场景中如何维护目标身份)。两者正交且可组合——未来可以在 Fast-WAM 的 MoT 框架中引入 object-addressable slots,让 co-training 的监督信号精确到每个物体的状态变化。
9.6 vs FFDC-WAM(When to Trust Imagination):推理时的自我校验
FFDC-WAM 提出 future-reality verification:如果想象的未来和真实观测一致,就多执行几步;如果现实偏离,就提前重规划。FFDC 是一个轻量 verifier,在 RoboTwin 上减少 69.10% WAM forward passes,执行时间减少 34.02%,真实实验成功率提升 35%。
与 Fast-WAM 的区别在前提假设上:FFDC-WAM 假设推理时仍需要 imagination(它的 verifier 就是在判断 imagination 是否可信),而 Fast-WAM 的结论是根本不需要 imagination。如果 Fast-WAM 的结论在所有场景下都成立,FFDC-WAM 的 verifier 就没有存在必要。但 Fast-WAM 也承认其结论目前仅在有限规模上验证,大规模预训练下可能有不同答案——在那种场景下,FFDC-WAM 的自我校验机制就变得有价值。
9.7 vs DAWN:动作与世界的递归耦合
DAWN 提出 World-Action Interactive Model:世界预测和动作生成不是单向流水线,而应在推理中互相修正。World Predictor 和 World-Conditioned Action Denoiser 递归耦合——预测的世界假设影响动作去噪,去噪后的动作假设又反馈回来更新世界预测。
与 Fast-WAM 的区别是哲学层面的:Fast-WAM 的结论是"推理时 world 对 action 的 guidance 不重要",DAWN 则认为"world 和 action 应该在推理时深度耦合"。两者看似矛盾,实则讨论的交互模式不同——Fast-WAM 讨论的是单向的 world→action guidance(这个不重要),DAWN 讨论的是双向递归修正(world↔action 互相约束)。后者的信息流比前者丰富得多,可能在长程复杂任务中展现出不同的价值。
10.总结
Fast-WAM 是一篇回归科研本质的工作。它没有追求最大、最全、最 work 的工程系统,而是提出了一个精准的科学问题——WAM 的性能究竟来自训练时的 video co-training,还是推理时的 future imagination——并通过严格控制的变体实验给出了清晰的答案。
核心结论可以用一句话概括:训练时让模型"学会想象"比推理时让模型"去做想象"更重要。Video prediction 作为一种 proxy task,其价值在于为 backbone 提供与控制高度相关的密集监督信号,帮助模型学到更好的视觉-动态表征。而推理时是否真的生成未来视频,对最终的控制性能影响甚微。
302