Fast-WAM 方法原理详解:把“想象未来”留在训练中 📅 2026/7/22 11:31:52 Fast-WAM 要解决的不是“怎样更快地生成未来视频”而是一个更根本的问题World Action ModelWAM的收益到底主要来自训练时学习预测未来还是来自推理时真的把未来视频生成出来传统 WAM 常采用“先想象、再行动”先用视频生成模型迭代去噪出未来画面再根据这些画面生成机器人动作。形式上它近似计算其中是当前视觉观测是语言指令是未来视频是未来步动作块action chunk。Fast-WAM 的观察是“学会预测未来”和“测试时生成未来”是两件可以拆开的事。于是它采用以下策略训练时同时做未来视频预测和动作生成让视频预测任务把 Video DiT 训练成懂运动、接触和物体变化的“世界表征器”。推理时只输入当前一帧不创建未来视频噪声也不做未来视频去噪当前帧经过 Video DiT 一次所得逐层特征直接供 Action DiT 生成动作。因此更完整地写Fast-WAM 推理时建模其中是当前本体状态是当前观测在语言和本体上下文调制下得到的隐式世界表征而不是显式生成的未来画面。后文为了简洁有时仍把全部条件统称为上下文。一句话概括Fast-WAM 用“预测未来”教会模型理解世界但部署时不让模型真的画出未来只让它直接行动。这带来论文中最重要的实验现象保留视频协同训练但删除测试时未来生成性能基本不掉反过来删除视频协同训练性能明显下降。论文报告 Fast-WAM 在单张 RTX 5090D V2 上延迟约而两阶段 Fast-WAM-IDM 约为。为什么 WAM 原本要“先想象、再行动”一个普通视觉-语言-动作策略VLA直接学习它的优点是直接缺点是训练目标只要求“动作答对”未必迫使视觉骨干理解手臂推一下物体会往哪里走、夹爪闭合后物体是否会被抓住、布料受力后会怎样变形。WAM 增加未来视频预测任务希望模型通过预测“接下来会看到什么”来学习物理动态。典型做法有两类联合生成未来视频 token 和动作 token 一起从噪声迭代去噪两者在每一步互相通信。视频后接动作先完整生成未来视频再把生成结果送进逆动力学模型IDM或动作头。两种方法都在测试时显式生成未来。问题在于视频 latent 很长Video DiT 又很大迭代生成未来视频会成为机器人闭环控制的主要延迟。Fast-WAM 进一步追问如果视频预测真正有价值的部分是它在训练期塑造了更好的表示那么推理期的未来视频也许只是昂贵的“中间产品”并非动作预测所必需。可以把它类比成学生训练做大量“预测下一步会发生什么”的练习是为了形成物理直觉考试时不必先画一整套未来分镜才能回答下一步该怎么做。1.1 Fast-WAM 真正解耦的两个因素论文通过统一框架分别控制两个开关方法 训练时视频建模 推理时显式生成未来 动作如何使用视觉Fast-WAM 是 否 只看当前帧的世界特征Fast-WAM-Joint 是 是 动作与正在去噪的未来视频联合生成Fast-WAM-IDM 是 是 先生成未来视频动作再看完整未来Fast-WAM w.o. video co-train 否 否 架构和 Fast-WAM 相同但没有视频损失这组对照回答了两个不同问题比较 Fast-WAM 与 Joint/IDM测试时显式未来想象是否必要比较 Fast-WAM 与 no-video-co-train训练时的视频预测监督是否重要2. 一条样本到底包含什么一条样本取自一小段机器人演示分为当前条件和未来监督训练和推理都有仅训练仅训练33 个控制时刻的演示窗口当前条件训练监督当前多相机图像 I0当前状态 s0任务指令 l主要 GT32 步动作视频监督9 帧输入I0 为条件8 帧对应 2 个 future latentFast-WAM推理输出32 步动作块Fast-WAM 最终要学会的是未来图像只负责训练 Video DiT 的动态表示推理时没有未来图像和真实动作。2.1 原始演示轨迹是什么样的机器人数据按控制时刻记录图像、状态和动作。动作把机器人从时刻推进到个时刻之间有次状态转移。原始窗口写成其中是相机数。模型不会把窗口中的全部变量都当作条件。2.2 为什么动作是 32 步视频却只有 9 帧动作完整保留步视频每隔步取一帧a0 到 a3a4 到 a7继续每 4 步取帧a28 到 a31时刻 0I0 和 s0时刻 4I4时刻 8I8时刻 28I28时刻 32I32因此视频共有九帧相邻视频帧覆盖四个动作。九帧也满足 Wan VAE 的长度要求。2.3 条件输入和 GT 到底分别是什么数据 训练时使用 推理时使用 身份当前图像是 是 视觉条件当前状态是 是 本体状态条件任务指令是 是 语言条件后续动作是 否 动作任务的 GT后续图像是 否 视频辅助任务的 GT条件输入是主要的动作 GT 是辅助的视频 GT 是是两个任务共享的干净条件不计入视频 GT。动作分支也不能读取后续图像 GT。2.4 GT 为什么也会出现在网络输入里这里还有一个生成模型中特别容易混淆的点训练时GT 会先被加噪再作为“待恢复变量”送进网络。它不是作为条件把答案直接告诉模型。动作分支对真实动作采样同形状高斯噪声并构造带噪动作Action DiT 实际收到的是带噪动作、噪声时间以及条件。它的监督目标不是直接回归而是预测 flow velocity推理时没有直接从纯高斯动作开始再用学到的 velocity 逐步生成动作。因此“训练时输入带噪 GT”与“推理时从纯噪声生成”是同一个 flow-matching 过程的两个阶段。视频分支VAE 先把包含当前帧的帧视频编码为Wan VAE 做倍时间压缩所以张 RGB 图像变成个 latent 时间片是对未来视频片段的时空压缩表示不应简单理解成某两张 RGB 图像。视频 latent 同样先被加噪但是第一时间片会重新替换成干净的当前帧条件Video DiT 因而收到“干净当前帧 latent 带噪未来 latent 语言和本体状态”。未来时间片的监督目标为当前帧只作为条件视频 loss 对该位置使用 mask。2.5 一次训练前向网络输入与监督目标经过上面的加噪后真正送进 Fast-WAM 的变量是训练监督则是二者分别形成视频 loss 和动作 loss逐步的 batch 前向见第 5.2 节这里的重点是视频只监督未来 latent动作只监督有效动作步。2.6 为什么训练时使用未来视频不算答案泄漏未来视频以带噪形式进入视频分支是待恢复变量不是动作条件。结构化 mask 禁止动作读取未来视频动作只能读取当前帧、其他动作 token、指令和当前状态。第 3.6 节给出了完整可见关系。2.7 多相机、文本与状态如何预处理Fast-WAM 不为每个相机建立独立视觉编码器而是先把同一时刻的多相机图像拼成一张大图再送入 VAE。数据集 相机 单相机预处理 拼接方式 最终图像 动作维度 状态维度 归一化LIBERO 主视角 腕部 各缩放到水平拼接min-maxRoboTwin 头部 左腕 右腕 头部双腕各头部在上双腕并排在下z-scoreRGB 按映射到。LIBERO 的维动作是维末端执行器位姿变化加维夹爪其维状态包含维末端位姿和维夹爪状态。RoboTwin 的维动作和状态采用双臂关节表示。任务文本会套入固定模板A video recorded from a robot’s point of view executing the following instruction: {task}T5 将其编码为长度、每个 token 为维的文本特征。代码提前缓存这些特征。模型只取用线性层投影成一个维 token并拼在文本 token 后2.8 代码中一条样本的具体形状数据处理器原本读取共个状态。为了与个动作对齐数据集最终返回前个状态模型内部再只取第一个。忽略 batch 维后训练代码收到的主要字段为字段 LIBERO RoboTwin 作用video当前帧和未来视频 GTaction动作 GTproprio状态序列模型只取第项context预计算的 T5 特征action_is_pad动作有效性掩码image_is_pad视频帧有效性掩码经过 VAE 后的无 batch 视频 latent 形状为数据集 VAE latentDiT 视频 token 数LIBERORoboTwin轨迹靠近 episode 末尾时数据集复制末端值补齐并用 action_is_pad、image_is_pad 和 proprio_is_pad 标记。动作和视频 loss 会屏蔽 padding。视频 padding 从个 RGB 标志映射到两个未来 latent 标志时按 VAE 的倍时间分组只有一组帧全部是 padding对应未来 latent 才被屏蔽。第一 latent 帧本来就是条件不计算视频 loss。2.9 数据构造伪代码函数 构造训练样本(轨迹, 起点):# 原始窗口33 个图像/状态时刻以及连接它们的 32 个动作图像0到32, 状态0到32, 动作0到31, padding 滑窗读取(轨迹, 起点, 长度33)# 每个时刻先拼接多相机视频每 4 步取一帧动作完整保留 对 t 0...32: 拼接图像[t] 按数据集布局拼接相机(图像0到32[t]) 视频 拼接图像[[0, 4, 8, ..., 32]] # 9 帧 动作GT 动作0到31 # 32 步 状态序列 状态0到32[0:32] # 与动作对齐模型只使用状态序列[0] 视频 图像归一化到负一至一(视频) 动作GT 数据集统计量归一化(动作GT) 状态序列 数据集统计量归一化(状态序列) 文本特征 读取T5缓存(固定模板.format(任务指令)) 返回 视频, 动作GT, 状态序列, 文本特征, padding最后再用一句话区分训练和推理训练有当前条件也有未来动作 GT 和未来视频 GTGT 加噪后用于学习去噪速度。推理只有当前图像、当前状态和指令没有未来视频也没有真实动作从纯噪声生成动作。3. 模型结构两个专家一次受控的信息交换Fast-WAM 总参数量约Video DiT来自预训练 Wan2.2-TI2V-5B约负责视频 latent 和当前帧世界表示。Action DiT约负责生成步动作块。视频 VAE把 RGB 视频压缩为 latent训练中冻结。T5 文本编码器编码任务指令训练中冻结且通常提前缓存。两条 DiT 分支组成 Mixture-of-TransformerMoT。这里的 “Mixture” 不是稀疏 MoE 路由每一层始终有一个视频专家和一个动作专家两者参数分开但在 self-attention 处把 token 放在一起做一次带掩码的 mixed attention。3.1 先看整张架构图下面把训练路径和 Fast-WAM 的实际推理路径放在一张图中。蓝色路径属于视频分支黄色路径属于动作分支绿色路径是两个分支共同读取的条件。Fast-WAM 推理阶段训练阶段共同条件每层 cross-attention每层 cross-attention拆回视频序列拆回动作序列cross-attention每一步、每层 cross-attention每层 mixed attention任务指令 lT5 文本编码器当前本体状态 s0线性投影条件 token c9 帧多相机拼接视频I0, I4, …, I32VAE 编码器 冻结干净当前帧 latentz_cur未来视频 latent GT加入视频噪声Video DiT30 层32 步动作 GT加入动作噪声Action DiT30 层每层统一 masked attention视频速度预测动作速度预测视频 loss动作 loss当前多相机图像 I0VAE 只编码当前帧Video DiT 运行 1 次缓存 30 层视频 K/V随机动作噪声32 x 动作维度Action DiT 去噪 K 次默认 K1032 步动作块按从上到下的顺序读这张图指令和当前状态先形成共同条件 token。训练时有两个生成任务未来视频 latent 去噪和动作去噪。两个 DiT 不共享全部参数只在每一层通过带 mask 的 mixed attention 交换允许的信息。推理时未来视频分支整个消失Video DiT 只编码当前帧一次随后 Action DiT 反复读取缓存的视觉 K/V。图中的 Video DiT 和 Action DiT 各画成一个方框但内部实际都有层mixed attention 和条件 cross-attention 在每一层都会发生并非只在网络末端发生一次。3.2 关键尺寸项目 Video DiT Action DiT层数hidden sizeFFN sizeattention heads每头维度Q、K、V 各自的投影维度输入 token 视频 patch 每个动作一步一个 token虽然两个专家的 hidden size 不同但注意力头数和 head dimension 相同所以两边投影后的、、各自都是维可以在序列维拼接后共同计算注意力。注意力输出切回各自序列后再由各专家自己的输出投影、残差、cross-attention 和 FFN 继续处理。3.3 从原始数据到两类 tokenWan VAE 把 RGB 视频编码为Video DiT 再用大小为的 3D patch embedding也就是时间上不继续压缩空间上每个 VAE latent 像素形成一个 token。以 LIBERO 为例输入拼接图为VAE latent 空间为DiT patch 后每个 latent 时间片有个 token个 RGB 帧经时间压缩成为个 latent 时间片训练视频序列共有个 token推理只保留第一个 latent 时间片因此只有个视觉 token。RoboTwin 最终图为对应每个 latent 时间片个 token训练为个视频 tokenFast-WAM 推理只用个。完整的数据字段与张量形状见第 2.8 节。下面用 LIBERO 的具体尺寸展示视频 token 和动作 token 如何产生。注意图中序列长度不同不妨碍交互真正要求相同的是两个专家投影后每个注意力头的维度。动作 token 路径视频 token 路径每个取样时刻主相机 腕部相机水平拼接224 x 4489 帧 RGB3 x 9 x 224 x 448Wan VAE空间压缩 8 倍时间压缩 4 倍视频 latent48 x 3 x 28 x 563D patchifypatch 1 x 2 x 21176 个视频 token3 x 14 x 2832 步动作 GT32 x 7归一化并加入噪声动作线性编码器7 - 102432 个动作 token每步对应 1 个 token每层 MoT mixed attention这张图表达了三件事一个视频 token 代表某个 latent 时间片中的一个空间 patch而不是一整张图。一个动作 token 代表动作块中的一个控制步因此固定有个。个视频 token 与个动作 token 不需要一一对齐attention 负责从全部允许读取的 token 中聚合信息。动作与从控制时刻到的转移对齐。具体控制周期以及 RoboTwin个分量的机器人学语义由原始数据/环境定义论文和当前 Fast-WAM 配置没有给出足够信息本文不作猜测。3.4 动作 token 的编码与初始化归一化动作块为其中默认LIBERO 的RoboTwin 的。一个线性层把每一步动作投影到维因此恰好有个 action token。动作位置通过一维 RoPE 表示。Action DiT 的骨干不是完全随机初始化。代码先把 Video DiT 中形状相同的参数直接复制形状不同的参数沿各维做线性插值缩放。若最后一维从视频宽度缩到动作宽度还乘以调整幅值。动作输入层和输出头保持随机初始化。这使动作专家从一开始就继承视频 Transformer 的结构先验又允许其宽度缩到。3.5 单个 MoT 层里两类 token 怎样交互设第层的视频和动作表示分别为、。每个专家先独立产生然后在序列维拼接并执行其中是结构化 attention mask。得到的再按视频/动作长度切开分别走各自专家的输出投影、语言 cross-attention、FFN 和残差连接。因此“共享注意力”准确地说是共享一次带掩码的注意力计算和可见键值集合不共享整套 Transformer 参数。位置编码也仍由各专家按自己的数据结构生成视频 token 使用覆盖时间、高度和宽度的 3D RoPE动作 token 使用动作序列上的 1D RoPE。两者都把旋转编码应用到各自的随后才把同维度的沿序列拼接并不是把动作位置硬映射到某个视频空间坐标。下面把第个 MoT 层拆开。实线表示张量计算绿色虚线表示条件通过 cross-attention 注入两个专家。第 m 层输入视频 token XvVideo 专家Norm 时间调制第 m 层输入动作 token XaAction 专家Norm 时间调制QvKvVvQaKaVa沿序列拼接 Q沿序列拼接 K沿序列拼接 V带结构化 mask 的统一 attention按原序列长度拆分视频部分Video 输出投影 残差动作部分Action 输出投影 残差条件 token c文本 当前状态Video cross-attentionAction cross-attentionVideo FFN得到下一层视频 tokenAction FFN得到下一层动作 token这不是“视频特征先算完再整体喂给动作网络”。在每一层中动作 query都会直接对允许访问的视频 key/value 做 attention得到的新动作表示进入下一层后又会重新产生下一层的。因此视觉信息会随层处理逐层渗入动作表示。训练阶段的 Fast-WAM mask 可以进一步画成下面的有向信息图。箭头表示“作为 query 可以读取的 key/value”。允许允许允许未来内部双向允许允许动作内部双向禁止禁止禁止禁止当前帧 token f0未来视频 token f动作 token a图中最关键的箭头是动作可以读取当前帧。最关键的禁止关系是动作不能读取训练时才存在的未来视频所以推理时删除未来 token 不会造成条件缺失。3.6 结构化注意力掩码是整个方法的核心令干净的当前帧 latent token加噪后的未来帧 latent token加噪后的动作 token。行表示 query列表示它能读取的 key。Fast-WAM 训练时的可见关系是Query/ Key当前帧未来帧动作当前帧是 否 否未来帧是 是 否动作是 否 是这张表有四个必须理解的含义当前帧是共享视觉锚点但它不读取未来或动作所以自身不会被未来信息污染。未来视频 token 可以双向读取整个视频分支用当前帧和其他未来 token 完成视频去噪。动作 token 彼此双向可见因此一次生成完整动作块而不是自回归地逐动作生成。动作永远不能读取未来视频 token所以训练时不存在“看答案”部署时删除未来分支后动作的条件分布没有突然少掉一类输入。所有视频和动作 token 还会通过各自的 cross-attention 读取语言与本体上下文。一个常见疑问是动作不能看未来 token视频协同训练如何帮助动作答案在共享的 Video DiT 参数和特征。未来 token 为了预测物体运动会读取视频 loss 的梯度因而会训练产生逐层键值的 Video DiT。动作分支在每一层又读取这些键值所以它得到的是被未来预测任务塑造过的当前世界表示。这里“学到运动、接触等动态信息”是由训练目标和信息路径给出的机制解释。论文用任务成功率和消融结果证明这种协同训练对控制有帮助但没有用表征探针直接测量某个 token 是否编码了某一种物理概念。3.7 条件 token 怎样影响去噪模型中有三类不同的条件作用路径不能混为一谈当前帧视觉 token通过 mixed self-attention 给动作提供“场景里有什么、在哪里”的信息。文本和本体状态 token通过每一层的 cross-attention 告诉两个专家“任务是什么、机器人当前姿态是什么”。噪声时间经过时间 embedding 后调制每层的归一化、门控和 FFN告诉网络“当前变量有多 noisy应按哪个阶段的向量场去修正”。三条条件路径视频 K/V条件 K/VAdaLN 调制下一次前向当前帧视觉 token场景与物体状态条件 token c任务文本与当前本体状态噪声时间 sigma当前去噪阶段第 k 步带噪动作 A_k动作编码Action DiT 第 m 层时间 embedding逐层更新后的动作 token动作速度头预测速度 v_theta乘 Delta sigma执行 Euler 更新下一去噪步动作 A_next这张图说明条件 token 不会自己被去噪也不是拼到动作向量末尾后直接输出。它们在每一层充当 cross-attention 的 key/value改变动作 token 的隐藏表示从而改变速度头输出的。速度不同Euler 更新后的就不同这个影响会在默认个动作去噪步中反复发生。对视频分支也是同样的条件机制文本与本体 token 通过 Video DiT 每层的 cross-attention 影响视频速度预测。因此训练期的视频世界建模不是无条件预测而是任务和当前机器人状态条件下的预测。3.8 一个需要特别注意的开源默认设置当前发布配置的 action_conditioned 为 false也就是视频分支的未来预测并不显式以真实动作作为条件。代码虽然把动作参数传给 Video DiT但默认配置下不会使用它。视频预测的条件是当前帧、语言和本体上下文。因此对当前开源 release 最准确的说法是它通过“任务条件下的未来视频预测”学习动态先验而不是严格意义上的动作条件视频模型。论文的核心对照结论不依赖把视频分支解释成动作条件生成器但读者不应擅自假定未来帧看到了真实动作。Flow Matching视频和动作共用的生成原理Fast-WAM 的两个输出都不是直接回归而是用 flow matching 从高斯噪声逐渐运输到真实数据。纯高斯噪声 sigma1线性路径 y_sigma (1-sigma)y sigma epsilon真实动作或视频 latent sigma0模型预测速度 epsilon - y沿 sigma 从 1 到 0 做 Euler 更新生成样本对任意目标它可以是视频 latent也可以是动作块。采样噪声在数据与噪声之间作线性插值当时是干净数据当时是纯噪声。这条直线轨迹对的速度是常数模型的任务就是看到、噪声时间和条件后预测这个速度论文给出的基础目标是模型不是直接猜终点而是在任意噪声位置学习“下一步往哪里走”的向量场。4.1 代码中的时间采样不是简单均匀分布当前实现先采样再用默认的 shift 函数会把更多样本推向高噪声区。训练代码内部还把时间写成但真正混合数据时仍会除以所以数学本质仍是上面的。此外代码还给每条样本的 MSE 乘时间权重。令并定义离散网格先计算其中最后将其除以该离散网格上的均值使平均权重大约为它降低靠近两端时间的权重更强调中间噪声区域。论文与代码差异论文正文将时间分布描述为 logit-normal并给出未加权的标准 flow-matching MSE当前仓库实际采用上述 shift-uniform 采样和时间加权。理解论文思想时可用标准公式复现当前代码时应以这里的真实调度器为准。