Posts
31 minFast-WAM 精读:不“预测未来”,也叫WAM吗?
从传统 VLA、视频与动作联合训练,到视频 K/V 缓存和 ActionDiT
如果把最近两年的具身智能模型粗略分成两条路线,一条是直接从图像、语言和本体状态预测动作的 VLA,另一条是把“世界接下来会怎样变化”也纳入学习的 World Action Model,那么 Fast-WAM 提出的恰好是两条路线交界处的一个问题:
一个世界动作模型,是否必须在机器人每次行动前,真的生成一段未来视频?
Fast-WAM 给出的答案是:不一定。
但“不生成未来视频”并不等于“不要世界模型”。Fast-WAM 没有删除世界建模,而是把“显式生成未来视频”从默认控制路径中拿掉了。未来视频主要在训练时提供监督;实际控制时,动作分支读取当前图像经过 Video Expert 处理后形成的逐层视觉缓存,直接生成动作块。
笔者想在这篇文章尝试把这件事完整讲清楚。全文主要回答三个问题:
- Fast-WAM 训练时到底怎样使用未来视频?
- 未来视频没有直接输入动作分支,为什么仍可能帮助动作生成?
- 去掉测试时的未来视频生成后,Fast-WAM 与普通 VLA 还剩下什么本质区别?
SECTION 01
一、一个反直觉的问题:不预测未来,为什么还叫 WAM?
先看它在机器人控制时的接口。
Fast-WAM 接收当前相机画面、语言指令和机器人本体状态(proprioception,例如关节位置、末端位姿和夹爪状态),最后输出一段连续动作。从外部看,这几乎就是标准 VLA 的形式:
当前图像 + 语言指令 + 本体状态 → 动作
它没有要求机器人先播放一段“未来电影”,也没有把预测出来的 RGB 视频直接交给控制器。于是一个很自然的问题出现了:如果它在推理时和 VLA 长得一样,为什么还要称为 World Action Model?
关键不在最终接口,而在模型是怎样训练出来的。
传统 VLA 的主要监督通常是动作:给定当前观测和任务,专家做了什么,模型就学习预测什么。Fast-WAM 则在动作学习之外保留了一条未来视频建模任务。训练数据不只有单张图像和动作标签,而是对齐好的短视频、动作序列、语言指令和本体状态。视频分支学习如何把带噪的视频潜变量(video latent,即压缩后的视频表示)还原到真实未来,动作分支学习如何把带噪的动作序列还原到专家动作。
因此,论文提出的核心主张可以压缩成一句话:
WAM 的收益可能主要来自训练阶段的视频建模,而不一定来自推理阶段真的生成未来视频。
这里的“可能”很重要。机器人仍然可能需要预测或比较未来。论文并没有证明所有机器人任务、所有 WAM 都可以省去显式未来推演;它做的是一组受控比较:保留或删除视频共训,同时改变推理时是否生成未来视频,观察两类因素分别带来多大影响。
SECTION 02
二、先补齐背景:VLA、World Model 和 WAM 分别是什么?
为了避免术语堆叠,我们先用一个“抓起杯子”的任务建立直觉。
当前画面里,机械臂夹爪停在杯子旁边,语言指令是“把杯子拿起来”。
1. VLA:看到什么,就决定做什么
VLA 是 Vision-Language-Action 的缩写,可以理解成视觉—语言—动作模型。它接收:
- 相机图像;
- 自然语言任务;
- 机器人当前关节、末端位姿或夹爪状态;
然后输出下一步动作,或者一次输出一小段动作。
它要学习的关系大致是:
看到杯子在夹爪右前方 + 收到“拿起杯子”的指令 + 知道机械臂当前姿态 → 让夹爪向杯子靠近
如果输出的是动作块(action chunk),模型还可能一次给出未来若干步:向右前方移动、降低高度、靠近杯壁、闭合夹爪。
这种方式很直接。它不要求模型显式回答“杯子被夹住以后画面会怎样变化”,只要动作预测足够准确,就可以完成任务。
2. World Model:不只识别世界,还要学习世界怎样变化
世界模型关心的是另一类问题:
如果夹爪继续靠近,会不会接触杯子? 如果夹爪闭合,杯子会不会被夹住? 如果机械臂抬高,杯子会不会离开桌面?
在视觉世界模型中,这种变化可以用未来图像或未来视频表示。给定当前画面和条件,模型预测接下来几帧会出现什么。
它因此需要保留的不只是“哪里有杯子”,还包括:
- 夹爪与杯子的相对位置;
- 哪些区域正在运动;
- 两者是否接近接触;
- 夹爪闭合后哪个物体可能随之移动;
- 当前处于接近、抓取还是抬升阶段。
这些信息与动作控制显然有关。但世界模型本身未必直接输出机器人动作,它可能只是预测未来,或者为规划器提供可评估的未来候选。
3. WAM:把世界变化和动作放进同一个学习框架
World Action Model,也就是世界动作模型,试图把两件事结合起来:
一边学习未来世界怎样变化 一边学习机器人应该执行什么动作
常见思路有两类。
第一类是联合生成:未来视频 token 和动作 token 在同一个生成过程中一起去噪。这里的 token 可以理解为模型内部处理的基本单元;图像片段和连续动作都能被编码成 token,并不只指文字。第二类是先想象后执行:先生成未来视觉轨迹,再让动作模型根据这段未来表示决定动作。
它们的共同直觉是:如果模型不仅知道“专家做了什么”,还要解释“执行后世界怎样变化”,动作学习或许能得到更丰富的动态监督。
但代价也很直接。高质量视频生成通常需要一个大型视频扩散模型进行多轮迭代去噪。如果机器人每次重新规划动作前,都要先生成多帧未来视频,那么控制延迟会显著增加。对于需要频繁闭环修正的机器人,这并不是一个小问题。
所以,Fast-WAM 要讨论的不是“未来是否有用”,而是:
未来的价值一定要通过推理时生成一段视频来兑现吗?还是说,只要训练阶段的视频任务塑造了模型参数和视觉表征,部署时就可以省掉视频生成?
SECTION 03
三、Fast-WAM 的核心判断:训练时学习未来,推理时不展开未来
Fast-WAM 把训练和推理明确分成两条不同路径。
训练时:
真实短视频 → 视频 latent → 加噪 → 视频去噪 真实动作块 → 加噪 → 动作去噪 视频 token + 动作 token → 在 MoT 中逐层交互 → video loss + action loss
推理时:
当前图像 → Video Expert 运行一次 → 形成逐层视频 K/V 缓存(注意力中的 key/value) → ActionDiT 多步去噪 → 32 步动作块
未来视频仍然参与训练,但默认控制路径不生成完整未来视频:它不再创建未来视频噪声,也不运行完整的视频去噪循环。
官方代码实现里,这两种路径是分开的:
infer_joint(...)- 会同时创建未来视频 latent 和动作 latent,并在多步迭代后同时返回视频与动作;
infer_action(...)- 只对动作 latent 去噪,视频分支只处理当前图像并生成视觉缓存。
论文实验使用的是 10 步动作去噪,动作预测长度(horizon)为 32 步。代码函数本身允许不同设置,其中 infer_action 的函数默认值是 20 步,但正式评测配置覆盖为 10 步。区分“函数默认参数”和“论文实验配置”很重要,否则很容易在读代码时得到错误的性能判断。
Fast-WAM 并没有简单地把视频模型删掉。相反,它使用 Wan2.2-5B 的视频 DiT 作为世界建模骨干,再增加一个约 1B 参数的动作专家,整套模型约 6B。变化发生在推理路径:视频骨干不再反复生成未来帧,而是处理当前观测一次,把每一层的视频 K/V 缓存留给动作分支反复读取。
接下来要解决的,就是这套结构中最容易混淆的部分:Video VAE、Video Expert、ActionDiT 和 MoT 分别是什么;视频与动作究竟怎样一起训练;以及未来视频为什么可以不成为动作的直接输入。
SECTION 04
四、Fast-WAM 的完整架构:五个模块分别做什么?
Fast-WAM 的论文配置由一个约 5B 的视频骨干和一个约 1B 的动作专家组成,总规模约 6B。理解它时,最容易出现两个误区:一是把 Video VAE 当成世界模型,二是把 MoT 当成连接两个大模型的小插件。
更准确的拆法是五个部分。
1. Video VAE:负责压缩,不负责决定动作
原始机器人视频的形状大致是:
批量 × RGB 通道 × 时间 × 高度 × 宽度
VAE 是 Variational Autoencoder(变分自编码器)的缩写。直接在像素空间做多轮去噪,计算量非常大,因此 Fast-WAM 复用 Wan2.2 的视频 VAE,把图像和视频压缩成更小的潜变量,也就是前文所说的视频 latent。
可以把 VAE 理解成一套压缩与解压工具:
RGB 图像/视频 → VAE Encoder → 视频 latent 视频 latent → VAE Decoder → RGB 图像/视频
训练世界模型时,核心计算主要发生在 latent 空间。模型比较的是“带噪 latent 应该往哪个方向还原”,通常不需要每一步都把结果解码回 RGB。只有在联合推理、生成可视化视频或检查结果时,才需要 VAE Decoder 把 latent 还原成人能看的画面。
因此,VAE 本身不是 Video Expert,也不是负责动作决策的网络。它解决的是表示成本问题。
2. Video Expert:从视频生成模型继承而来的世界建模骨干
Fast-WAM 的 Video Expert 来自 Wan2.2-TI2V-5B 的视频 Diffusion Transformer(扩散式 Transformer,简称 DiT)。它使用 Transformer 的注意力结构预测去噪方向。论文和配置显示,这一分支有 30 层,隐藏维度 3072,包含 24 个注意力头,每个头 128 维。
训练时,它看到两类视频 token:
- 干净的第一帧 latent,代表当前真实观测;
- 加噪的未来视频 latent,代表需要学习还原的未来变化。
Video Expert 的任务不是直接输出关节命令,而是处理视频 latent,学习当前画面与未来变化之间的时空关系。经过每一层 Transformer,它都会形成该层的 query、key 和 value。可以粗略理解为:query 表示“正在查什么”,key 用来匹配,value 是匹配后读取的内容。到了 action-only 推理阶段,真正被动作分支复用的正是当前图像在这些层中形成的 key/value,也就是后面会反复提到的视频 K/V 缓存。
3. Action Expert:在连续动作空间中去噪
动作分支通常简称 ActionDiT。它同样有 30 层、24 个注意力头,每个注意力头的维度也是 128;但隐藏维度缩小到 1024,因此规模约 1B。
它处理的不是汉字、英文单词或离散动作编号,而是一段连续控制数值。代码中的动作张量写成:
[B, T, action_dim]
这三个维度分别表示:
B- :一次共同训练多少条轨迹样本;
T- :每条样本包含多少个未来动作步;
action_dim- :机器人每一步需要输出多少个控制数。
论文设置的动作预测长度是 32,也就是一次生成 32 步动作。至于每步有多少维,取决于机器人接口。LIBERO 配置中动作是 7 维,可以理解成 6 维末端位姿加 1 维夹爪;RoboTwin 是双臂任务,动作和本体状态都是 14 维。
ActionDiT 先用一个线性层把每步动作从 action_dim 映射到隐藏空间,经过 30 层 DiT,再由输出层映射回动作维度。
它也不是完全随机初始化。官方预处理脚本会从视频 DiT 向 ActionDiT 迁移中间 Transformer 主干权重:形状相同的直接拷贝,宽度不同时进行线性插值。动作输入层 action_encoder 和最终输出 head 会被跳过,因为视频 token 和机器人动作的输入输出语义完全不同。
4. MoT:让视频分支和动作分支逐层交互
MoT 是 Mixture-of-Transformer 的缩写。这里的 “Mixture” 不是常见的专家路由器,也不是在两个模型后面再加一个小融合网络。
Fast-WAM 的做法更像两支结构对齐的 Transformer 队伍:
Video Expert 第 1 层 ↔ ActionDiT 第 1 层 Video Expert 第 2 层 ↔ ActionDiT 第 2 层 …… Video Expert 第 30 层 ↔ ActionDiT 第 30 层
两条分支的隐藏宽度可以不同,但层数、注意力头数和每个头的维度必须对齐。这样,同一层产生的视频 K/V 与动作 Q/K/V 才能进入共享注意力计算。
这里需要区分“主干隐藏宽度”和“注意力接口”。Video Expert 的 token 是 3072 维,ActionDiT 的 token 是 1024 维;这是两条分支各自在 Transformer 主干内部保存信息的宽度,并不是它们直接交互时使用的最终形状。
进入注意力计算前,两条分支会通过各自独立的线性层,把 token 投影成相同格式的 Q、K、V:都是 24 个注意力头,每个头 128 维。形状可以简写为:
视频隐藏状态:[N_video, 3072] → 视频 Q/K/V:[N_video, 24, 128] 动作隐藏状态:[N_action, 1024] → 动作 Q/K/V:[N_action, 24, 128]
因此,动作 Q 可以与视频 K 做点积,视频 K/V 也可以和动作 K/V 沿 token 维度拼接。注意力计算结束后,ActionDiT 再通过自己的输出投影,把 24 × 128 维的结果转换回 1024 维动作隐藏状态。换句话说,3072 和 1024 是两条分支不同的“内部宽度”,24 × 128 才是它们交互时共同遵守的“接口格式”。
层数对齐解决的是逐层配对问题:Video Expert 第 i 层产生的视频 K/V,会交给 ActionDiT 第 i 层读取;推理时缓存的正是这 30 组逐层视频 K/V。因此,在 Fast-WAM 当前这种直接按层配对、直接拼接 K/V 的实现中,两条分支需要具有相同的层数、注意力头数和单头维度,但主干隐藏宽度可以不同。
代码里 model.dit 实际指向 model.mot。训练器冻结 VAE、文本编码器等非核心组件,训练 MoT 内的视频与动作 Transformer,并可同时训练本体状态编码器。所以,这里并不是“冻结一个 5B 视频模型,只训练很小的动作头”;视频和动作主体都会针对机器人数据适配。
5. 语言与本体状态:两种不同的条件
语言指令由 Wan2.2 自带的 T5 文本编码器转换成条件向量。为了节省显存和时间,官方训练通常提前缓存文本向量,而不是每个训练步骤都重新运行文本编码器。
机器人本体状态则保留为数值。关节位置、末端位姿或夹爪状态经过一个线性层,被转换成与文本条件同宽的一个 token,再拼到语言条件序列后面。
也就是说:
“拿起杯子” → 文本编码器 → 语言条件 关节/夹爪数字 → proprio_encoder → 本体状态条件 token
模型不需要先把“关节 3 的角度是 0.42”写成一句自然语言,才能理解机器人当前的本体状态。
SECTION 05
五、训练阶段:视频和动作如何一起学习?
一条 Fast-WAM 训练样本,不只是“图片—动作”对。它至少要把以下信息放在同一时间轴上:
- 语言任务;
- 当前帧和未来短视频;
- 与视频对应的动作序列;
- 机器人本体状态;
- 为批处理补齐的无效位置(padding)和有效帧标记。
论文设置中,一个动作块包含 32 步动作;与每个动作块对齐的短视频包含 9 帧。多路相机画面先按固定布局拼接成一张图,再进入 VAE。
完整训练过程可以拆成六步。
第一步:把真实视频变成 latent,并加入噪声
真实短视频先经过 VAE Encoder,得到干净的视频 latent。模型随后采样高斯噪声和时间步,把真实 latent 与噪声混合成带噪输入。
第一帧是特殊的。它代表机器人控制时真正拥有的当前观测,因此保持干净,作为视频分支和动作分支共同依赖的视觉锚点。需要预测的是后面的未来视频 latent。
第二步:也给动作序列加噪
真实 32 步动作块同样与高斯噪声混合,形成带噪动作。视频和动作会分别采样自己的噪声时间步,所以它们不必处于完全相同的噪声强度。
这一步的直觉是:模型不是直接看一个空白输入,然后一次回归真实动作;它要学会在不同噪声程度下,指出动作样本应该怎样向真实示范轨迹移动。
第三步:构造语言和本体状态条件
语言向量与当前本体状态 token 被组合成条件序列(context)。视频 token 和动作 token 都可以通过交叉注意力读取这些条件,所以两条分支知道当前任务是“拿起杯子”还是“把杯子推到左侧”,也知道机械臂此刻处于什么姿态。
第四步:两条分支进入 MoT
带噪视频 latent 经 Video Expert 的输入处理变成视频 token,带噪动作经 ActionDiT 的输入层变成动作 token。随后,两者进入 MoT 的 30 层联合计算。
这里有一张非常关键的注意力 mask。论文和代码共同确认:
未来视频 token:可以在视频分支中建模,并读取干净第一帧 动作 token:可以读取其他动作 token 动作 token:可以读取干净第一帧视频 token 动作 token:不能读取未来视频 token
这条限制是 Fast-WAM 能够在推理时省去未来视频去噪路径的基础。
如果训练时允许动作直接读取真实未来视频,模型很可能学会一条捷径:
先从未来画面判断发生了什么 → 再反推动作
可是在真实部署时,未来画面并不存在。模型就不得不先生成它,或者遭遇严重的训练—推理不一致。Fast-WAM 用 mask 从结构上切断了这条信息泄漏路径。
第五步:视频和动作分别输出去噪目标
经过 MoT 后,Video Head 输出视频的 flow-matching 预测,Action Head 输出动作的 flow-matching 预测。
Flow matching 可以用一句不严格但足够准确的话理解:
给定一个处于“真实数据与随机噪声之间”的样本,模型学习它下一步应该朝哪个方向移动,才能逐渐回到真实数据分布。
论文把真实目标记为 y,噪声记为 ε,构造:
y_t = (1 - t) y + t ε
模型要预测的不是原始 y 本身,而是把这个带噪样本沿正确方向推回真实数据所需的速度场。视频分支对未来视频 latent 做这件事,动作分支对动作块做同样的事。
第六步:两个损失一起反向传播
总目标是:
总损失 = action loss + λ × video loss
当前官方默认配置中,动作损失和视频损失的系数都为 1.0。代码还会处理视频和动作中的 padding,以及不同噪声时间步的训练权重。
更重要的是,训练器把整个 MoT 设为可训练。于是:
- video loss 会更新视频分支及相关交互参数;
- action loss 会更新动作分支,也会通过动作对视频 K/V 的注意力路径影响视觉表示;
- 两个目标共同塑造模型,而不是先把视频模型完全训好,再单独训练动作模型。
这就是“视频与动作联合训练”的具体含义。
SECTION 06
六、全文最关键的问题:未来视频没有直接输入动作,它怎样发挥作用?
到这里,最容易产生的疑问是:
动作 token 明明不能读取未来视频 token。推理时也不生成未来视频。那么 video loss 到底怎么影响动作?
先给出最简洁的路径:
真实未来视频 → video loss → 更新 Video Expert 参数 → 改变当前图像产生的视频 K/V 缓存 → ActionDiT 读取视频 K/V 缓存 → 生成动作
未来视频不是动作分支的直接输入,而是 Video Expert 的训练老师。
继续用抓杯子的例子。
假设当前画面中,夹爪已经靠近杯子,但还没有接触。一个只依赖动作监督的模型,可能只需要学到“杯子位于这个位置,所以末端向这里移动”这类相关性。
加入未来视频任务以后,视频分支还要处理后续变化:
夹爪继续靠近 → 发生接触 → 夹爪闭合 → 杯子局部被遮挡 → 杯子随夹爪移动 → 杯子离开桌面
为了降低未来视频的 flow-matching loss,Video Expert 可能需要在当前视觉表示中保留更多与动态有关的信息,例如夹爪与杯子的相对关系、是否接近接触、哪个物体可能运动、当前处于抓取的哪个阶段。
这里不能说“未来已经存进当前帧”。当前图像仍然只是当前图像。更准确的说法是:模型参数在大量训练样本中学到了从当前状态到未来变化的统计规律,因此同一张当前图像经过训练后的 Video Expert,会产生不同于普通静态图像编码器的中间表示。
ActionDiT 读取的就是这些中间表示形成的视频 K/V 缓存。
直接作用与间接作用
两种路径必须严格区分。
Fast-WAM 默认 action-only 推理中不存在这条路径:
生成未来视频 → 把未来视频输入动作模型 → 输出动作
存在的是:
未来视频监督 → 训练参数 → 当前视频 K/V 缓存 → 动作生成
前者是直接条件,后者是通过训练和参数产生的间接影响。
数学上,video loss 到底怎样影响动作?
看到这里,一个问题很自然:推理时明明不生成未来视频,训练时的 video loss 凭什么影响最后的动作?
更进一步,就算它能影响动作,又凭什么说这种影响是好的?
下面把这两个问题分开回答。先说明边界:以下不是论文给出的理论定理,而是依据官方计算图所做的局部一阶分析。我们只观察 Video Expert 这一块参数,记为 θv;ActionDiT 参数记为 θa;语言、本体状态等条件统一记为 c,当前去噪步的带噪动作记为 a_t。
STEP第一步:先证明它“能够影响”动作
当前图像 x0 会先进入 Video Expert,产生动作分支逐层读取的视频表示。把这个过程简写为:
h0 = f_θv(x0)
动作分支再根据这份表示,以及语言、本体状态和带噪动作,预测动作 flow:
â = g_θa(h0, c, a_t) = g_θa(f_θv(x0), c, a_t)
这两行公式表达了一件很关键的事:动作输出 â 虽然不以未来视频为输入,却依赖 Video Expert 当前的参数 θv。只要 θv 被训练过程改变,当前图像产生的视频 K/V 就可能跟着改变,动作预测自然也可能变化。
那么,video loss 是怎样改变 θv 的?省略 padding、时间步权重等实现细节后,视频训练目标可以简写为:
L_video = MSE(predicted_future_flow, target_future_flow)
为了先看清方向,我们暂时把优化器简化成一步普通梯度下降。只保留 video loss 对 θv 的更新分量:
θv⁺ = θv - η λ_video ∇_θv L_video
其中,η 是学习率,λ_video 是视频损失的权重。参数从 θv 变成 θv⁺ 后,同一张当前图像会产生一套略有不同的视频 K/V。于是,动作输出的一阶变化可以写成:
Δâ ≈ -η λ_video (∂â / ∂θv) ∇_θv L_video
把这条式子翻译成人话,就是:video loss 先推动 Video Expert 的参数发生变化,这个变化再沿着“Video Expert → 视频 K/V → ActionDiT”的路径传到动作输出。
不过,“网络里连着一条线”还不是严格的非零证明。动作真的发生一阶变化,需要满足:
(∂â / ∂θv) ∇_θv L_video ≠ 0
这里的 (∂â / ∂θv) 是动作输出相对视频参数的 Jacobian。即使这个 Jacobian 和 video 梯度分别都不为零,两者相乘仍然可能为零:比如 video 梯度刚好落进了这个 Jacobian 的零空间,也就是参数沿这个方向变化时,动作输出在一阶近似下并不敏感。
因此,更准确的说法是:Fast-WAM 的计算图为 video loss 影响动作提供了可微路径;在乘积不为零时,它会改变动作输出。不能仅凭“有梯度、有连线”,就断言每个样本、每一步训练中的动作都会变化。
STEP第二步:能够影响,不等于一定变好
到这里,问题只回答了一半。
公式已经说明 video loss 能“碰到”动作输出,但“碰得到”和“帮得上忙”是两回事。要判断这种变化对动作目标是否有利,还需要把 action loss 放进来。
把动作损失记为 L_action。由于动作输出经过视频 K/V 依赖 θv,链式法则给出:
∇_θv L_action = (∂L_action / ∂â) (∂â / ∂(K_video, V_video)) (∂(K_video, V_video) / ∂θv)
这条式子从右往左看会更直观:Video Expert 的参数决定视频 K/V,视频 K/V 参与动作注意力,动作预测又决定 action loss。因此,action loss 不只训练 ActionDiT,也能反向传到产生视频 K/V 的参数。
官方代码中的计算图确实满足这条链路:ActionDiT 的 query 会读取视频 K/V;中间没有对视频 K/V 做 detach;MoT 中的视频与动作 Transformer 也都被设为可训练。
但这里仍要保留一个严谨限定:可微路径存在,只代表梯度“可以传到”。在某个具体样本或参数点上,它仍可能因为处在驻点、局部抵消等原因恰好为零。
STEP第三步:两个梯度是在合作,还是在打架?
现在,Video Expert 同时收到两份训练信号:一份来自动作目标,一份来自未来视频目标。记作:
g_action = ∇_θv L_action g_video = ∇_θv L_video
可以把它们理解成作用在同一组视频参数上的两股“推力”。在联合损失下,用普通梯度下降近似 Video Expert 的一步更新:
θv⁺ = θv - η( λ_action g_action + λ_video g_video )
问题于是变成:加上 g_video 这股推力后,action loss 是更容易下降,还是反而被拖累?
把更新后的 action loss 在当前参数附近做一阶泰勒展开:
L_action(θv⁺) ≈ L_action(θv) - η λ_action ||g_action||² - η λ_video ⟨g_action, g_video⟩ + O(η²)
先看第一项 -η λ_action ||g_action||²:这是动作目标沿自身梯度更新时带来的局部下降趋势。
真正回答“video loss 有没有帮忙”的,是第二项:
- η λ_video ⟨g_action, g_video⟩
它取决于两个梯度的内积,也就是两股“推力”有多同向:
⟨g_action, g_video⟩ > 0- :两个目标在这一步大体同向。video loss 的更新分量会进一步降低局部 action loss,属于正向协同;
⟨g_action, g_video⟩ < 0- :两个目标发生梯度冲突。video loss 会抵消一部分动作目标的下降,权重过大时可能造成负迁移;
- 内积接近 0:两者在一阶近似下几乎互不帮助,也不明显冲突,video loss 对 action loss 的局部影响较弱。
如果不希望内积大小受到梯度模长影响,还可以看梯度余弦相似度:
cos φ = ⟨g_action, g_video⟩ / (||g_action|| ||g_video||)
余弦越接近 1,说明两个目标越同向;越接近 -1,说明冲突越强;接近 0,则说明二者近似正交。
至于公式最后的 O(η²),它表示与学习率平方同阶或更小的高阶项。只有当单步更新足够小时,一阶项才适合用来判断当前参数附近的局部方向;步子很大时,高阶影响就不能忽略。
STEP这套公式能证明到哪一步?
现在可以给出一个比“video loss 有用”更准确的结论:
video loss 能通过共享的 Video Expert 和逐层视频 K/V 改变动作输出;它在某一步训练中究竟帮助还是干扰动作目标,取决于视频梯度和动作梯度在共享参数上的方向关系。
这套推导能说明二者为什么可能发生耦合,也能判断一次足够小的局部更新是协同还是冲突。但它不能证明 video loss 必然提高动作生成质量,更不能单靠公式推出真实机器人的成功率一定会上升。
还要注意三个限制:
- 官方实际使用的是 AdamW,而不是上面为了讲清方向而写的普通梯度下降。AdamW 还包含动量、自适应缩放和权重衰减;严格分析时,应该比较优化器实际产生的预条件更新方向,而不能只看原始梯度内积。
g_action- 和
g_video是当前小批量上的随机梯度估计。它们的夹角会随样本、训练阶段和参数位置变化,一个 step 的正余弦不能代表整个数据分布或完整训练过程。 L_action- 是动作 flow matching 的训练目标,并不等于真实机器人的闭环成功率。即使局部 action loss 下降,也仍要靠消融实验和机器人闭环评测,判断动作是否真的更稳定、更准确。
所以,公式解决的是“机制上怎样影响”和“局部方向怎样判断”;至于这种机制在 Fast-WAM 中是否真的转化成了更好的动作表现,还要继续看实验。
这种解释是否只是经验猜测?
机制解释本身不能证明 video loss 一定有用。真正的证据来自消融实验。
论文保持 Fast-WAM 的架构和推理方式不变,只删除视频共训目标。在 RoboTwin 上,平均成功率从 91.8% 降到 83.8%;在 LIBERO 上,从 97.6% 降到 93.5%;真实毛巾折叠任务中,无视频共训版本的成功率只有 10%。
这些结果支持“视频共训确实贡献了动作性能”。但它们仍不能把原因精确拆成“更懂接触”“更懂遮挡”或“更懂物理”。论文没有单独报告冻结 Video Expert、随机初始化视频骨干、切断视频 K/V、扫描不同视频损失权重等完整对照。
因此,客观结论应该是:
视频共训在论文任务中显著有效;它通过塑造视频骨干和视觉—动作交互来影响动作,是与代码结构一致的解释,但具体学到了哪些动态概念,还需要更细的表征分析和消融。
SECTION 07
七、推理阶段:当前图像怎样变成机器人动作?
理解训练以后,再看实际控制路径就会简单很多。
1. 当前图像只进入视频分支一次
infer_action(...) 接收一张当前图像。VAE 先把它压缩成第一帧视频 latent。文本指令和本体状态也在这一阶段准备好。
随后,Video Expert 从第 1 层运行到第 30 层。每一层都会计算当前视频 token 的 K 和 V,并把它们保存下来:
第 1 层:K_video¹, V_video¹ 第 2 层:K_video², V_video² …… 第 30 层:K_video³⁰, V_video³⁰
这个过程叫 prefill_video_cache。
2. 动作从随机噪声开始
模型创建一个形状类似 [1, 32, action_dim] 的随机动作 latent。论文实验使用 10 个去噪步骤。
在每一个去噪步骤中,ActionDiT 都从第 1 层运行到第 30 层。第 i 层会根据当前动作 token 重新计算:
Q_action, K_action, V_action
然后把当前层的动作 K/V 与缓存的视频 K/V 拼接:
K = [K_video ; K_action] V = [V_video ; V_action]
动作 query 再对这组 K/V 做注意力:
Q_action → 读取当前图像的视频 K/V → 同时读取当前动作 K/V → 更新动作 token
30 层完成以后,模型得到本轮动作 flow 的预测,再由调度器更新动作 latent。重复 10 次后,随机动作逐渐变成一段连续动作块。
3. 为什么缓存 K/V,不缓存 Q?
因为在一次动作生成过程中,当前图像没有变化。Video Expert 每层形成的视觉内容可以重复使用。
动作则不同。每完成一次去噪,动作 latent 都会改变。下一轮 ActionDiT 面对的是一段新的动作状态,所以动作 Q、K、V 都必须重新计算。
可以把它理解为:
视频 K/V:这次规划期间不变的“视觉资料库” 动作 Q:每轮去噪都在变化的“当前问题”
如果不缓存视频 K/V,ActionDiT 每做一步动作去噪,都要重新运行约 5B 的 Video Expert。缓存的主要价值,就是避免这部分重复计算。
4. 输出动作块以后,机器人仍要闭环重规划
模型最终返回 32 步动作,但机器人通常不会把 32 步一次性执行到底。
部署代码会反归一化动作,只把前 replan_steps 步放入待执行队列。比如 RoboTwin 部署配置默认执行前 8 步。队列消耗完后,系统重新读取相机和本体状态,再运行一次 infer_action(...)。
控制过程因此是:
看当前画面 → 生成 32 步动作 → 执行前 8 步 → 获取新画面 → 再生成新的 32 步动作
这仍然是闭环控制,只是模型以动作块为单位规划,而不是每个底层伺服周期都运行一次 6B 模型。
5. 190 ms 应该怎样理解?
论文报告 Fast-WAM 的推理延迟为 190 ms,Fast-WAM-IDM 为 810 ms,因此在同一测试条件下约快 4.3 倍。所有延迟均测于单张 NVIDIA RTX 5090D V2 32GB,并使用论文配置。
所以可以说:
Fast-WAM 在论文硬件和设置下,把显式未来视频去噪带来的延迟从控制路径中移除,取得了 190 ms 的单次推理延迟。
不能把它扩展为“任何硬件都能 190 ms”,也不能把 190 ms 等同于机器人的底层伺服频率。大模型负责的是较低频的动作块重规划,真正的关节控制仍由底层控制器连续执行。
SECTION 08
八、Fast-WAM 和传统 VLA 到底有什么不同?
从外部接口看,Fast-WAM 确实很像 VLA。两者在部署时都可以写成:
当前图像 + 语言 + 本体状态 → 动作块
真正的差异在训练目标、视觉表征和内部交互方式。
维度传统 VLAFast-WAM推理输入当前图像、语言、本体状态当前图像、语言、本体状态推理输出单步动作或动作块去噪生成的动作块训练目标主要是动作监督视频与动作联合 flow matching未来视频监督通常没有有推理时生成完整未来视频通常不生成默认 action-only 路径不生成视觉—动作交互视觉特征条件动作头MoT 中逐层视频/动作交互视觉表征来源图像编码器或 VLM视频预训练与机器人视频共训动作生成方式回归、离散 token、扩散等1B ActionDiT 多步去噪因此,一个相对准确的概括是:
Fast-WAM 的推理接口像 VLA,但训练目标和内部结构具有 WAM 特征。
这里也要避免把“传统 VLA”描述得过于单一。很多新 VLA 已经使用动作扩散、动作块、视频历史或额外预测任务。Fast-WAM 的区别不是“只有它会输出动作块”,也不是“只有它使用 DiT”,而是它把预训练视频生成骨干、未来视频 flow matching、结构化注意力和动作去噪放进了同一套受控设计。
换句话说,判断一个模型更接近 VLA 还是 WAM,不能只看推理接口,还要看它是否通过世界变化建模来训练动作相关表示。
SECTION 09
九、论文证明了什么,又没有证明什么?
Fast-WAM 论文最有价值的部分,不只是提出一个新结构,而是搭建了三种有视频共训的受控变体和一个无视频共训的对照:
- Fast-WAM
- :训练时做视频共训,推理时只生成动作;
- Fast-WAM-Joint
- :推理时视频和动作共同去噪;
- Fast-WAM-IDM
- :先生成未来视频,再根据未来表示生成动作;
- Fast-WAM w.o. video co-train
- :保持 Fast-WAM 架构和 action-only 推理,只删除视频建模目标。
这让两个通常纠缠在一起的因素可以被分开观察:
因素 1:训练时有没有未来视频监督 因素 2:推理时有没有显式未来想象
1. RoboTwin:视频共训的差距大于推理范式的差距
RoboTwin 2.0 是双臂操作基准,论文报告的平均成功率如下:
模型平均成功率Fast-WAM91.8%Fast-WAM-Joint90.6%Fast-WAM-IDM91.3%Fast-WAM,不使用视频共训83.8%三种保留视频共训的模型相差不超过 1.2 个百分点;删除视频共训后则下降 8.0 个百分点。
这组结果支持:在 RoboTwin 的论文设置中,训练时是否有视频建模目标,比推理时是否显式生成未来视频更重要。
2. LIBERO:action-only 并不是分数最高,但仍保持接近
LIBERO 四个任务套件的平均成功率是:
模型平均成功率Fast-WAM97.6%Fast-WAM-Joint98.5%Fast-WAM-IDM98.0%Fast-WAM,不使用视频共训93.5%这里 Joint 变体比 Fast-WAM 高 0.9 个百分点。因此,论文不支持“跳过未来生成一定让动作更准”。它支持的是更克制的结论:Fast-WAM 在显著降低推理开销的同时,性能仍与显式想象变体接近;而删除视频共训造成的 4.1 个百分点下降更明显。
Fast-WAM 在 RoboTwin 和 LIBERO 上都没有使用具身预训练(embodied pretraining)。这个结果说明它的数据效率较强,但比较时仍需注意,不同基线的预训练数据和训练配方并不完全相同。
3. 真实毛巾折叠:延迟优势明确,但不是所有指标都第一
真实实验使用 Galaxea R1 Lite 进行毛巾折叠,收集了 60 小时遥操作数据。论文把成功率和完成时间同时作为指标,因为模型即使最终完成任务,也可能依赖大量反复修正。
结果中,使用预训练的 π0.5 仍然是最强方法。Fast-WAM 家族内部,IDM 变体的成功率最高,Fast-WAM 的完成时间更好。无视频共训版本的成功率只有 10%,且完成时间最差。
在推理延迟上,Fast-WAM 为 190 ms,Fast-WAM-IDM 为 810 ms,前者在同一硬件与配置下约快 4.3 倍。论文所有延迟均在单张 RTX 5090D V2 32GB 上测量。
因此,真实实验最稳妥的总结是:
Fast-WAM 用接近显式未来想象变体的任务表现,换来了明显更低的推理延迟;视频共训的贡献则远大于几种推理范式之间的差距。
4. 论文还没有回答的问题
现有对照足以支持论文的核心判断,但还没有把所有原因拆开。
论文没有单独报告:
- 冻结 Video Expert 与继续适配 Video Expert 的直接对照;
- 随机初始化视频骨干与 Wan2.2 预训练的完整对照;
- 切断视频 K/V 到 ActionDiT 后的结果;
- 不同
lambda_video权重的系统扫描; - 当前 K/V 中究竟编码了哪些与接触、运动或物体持续性有关的信息。
所以,不能仅凭成功率下降就断言 Video Expert 已经形成了完整物理模型。它可能学到了物理动态,也可能学到了对动作有用的时序和视觉统计。要回答这个问题,还需要表征探针、可视化和更细的消融。
5. 工程局限与部署约束
第一,Fast-WAM 的总规模约 6B。即使跳过未来视频生成,它仍不是面向低算力端侧设备的轻量方案。
第二,视频、动作和本体状态必须严格对齐。如果动作比画面提前或滞后,模型会把错误的视觉变化归因给错误动作。
第三,不同数据集的动作定义不能直接混用。关节位置、关节增量、末端位姿和夹爪控制需要先统一到明确的控制数据格式(schema)。
第四,官方实现把多相机画面拼成一张图,虽然简单有效,但没有显式保存多相机之间的三维几何关系。
第五,离线 video loss 和 action loss 都不能替代闭环成功率。真实机器人还需要动作限幅、关节保护、急停、夹爪逻辑和失败恢复。
第六,视频损失与动作损失的尺度需要平衡。默认权重都设为 1.0,并不代表两种任务对优化的影响天然相等;视频目标过强时,理论上可能压过动作学习,而论文没有系统扫描不同 lambda_video。
最后,Fast-WAM 的结论来自 LIBERO、RoboTwin 和一个真实毛巾折叠任务。对于需要多候选未来比较、显式长时程规划或高度不确定环境的任务,测试时未来想象是否仍不重要,论文并没有给出最终答案。
SECTION 10
十、结语:Fast-WAM 真正改变了什么?
Fast-WAM 最值得关注的地方,不是简单把“生成未来视频”改成“不生成未来视频”,而是重新划分了世界建模在机器人策略中的职责。
第一,世界建模的价值不一定要表现为测试时输出一段未来视频。未来预测也可以作为训练任务,改变模型如何理解当前观测。
第二,未来视频不会神秘地“藏在当前帧里”。它通过 video loss 更新 Video Expert,再通过当前图像形成的视频 K/V 缓存影响 ActionDiT。论文的无视频共训消融表明,这种训练信号在论文任务中很重要;但它具体学到了哪些动态概念,仍需进一步验证。
第三,Fast-WAM 尝试把两件事拆开:
训练阶段:付出视频建模成本,学习世界变化 推理阶段:复用学到的表示,只生成动作块
这不意味着所有 WAM 都应该放弃未来想象,也不意味着 VLA 与 WAM 的边界从此消失。它给出的更实际启发是:如果未来视频的主要价值在训练,那么部署时未必需要继续承担完整视频生成的计算成本。
对于机器人学习工程来说,这也许比“机器人能不能生成一段漂亮的未来视频”更重要。
REFERENCES
参考资料与关键代码索引
论文与项目
1. Tianyuan Yuan, Zibin Dong, Yicheng Liu, Hang Zhao. Fast-WAM: Do World Action Models Need Test-time Future Imagination? arXiv:2603.16666, v2, 2026。
https://arxiv.org/abs/2603.16666
2. Fast-WAM 官方项目页:
https://yuantianyuan01.github.io/FastWAM/
3. Fast-WAM 官方代码:
https://github.com/yuantianyuan01/FastWAM
关键代码
- 模型配置:
configs/model/fastwam.yaml - 主模型、训练损失与推理:
src/fastwam/models/wan22/fastwam.py - 动作专家:
src/fastwam/models/wan22/action_dit.py - MoT 与逐层 K/V 缓存:
src/fastwam/models/wan22/mot.py - ActionDiT 主干权重迁移:
scripts/preprocess_action_dit_backbone.py - RoboTwin 部署循环:
experiments/robotwin/fastwam_policy/deploy_policy.py - LIBERO 评测循环:
experiments/libero/eval_libero_single.py
文章有误之处,还请大佬们指正,本文中的配图由codex生成,文中提到的模型规模、成功率和延迟数据均以论文、官方项目页和官方代码为准。