从 VPP 到 VPP2:让机器人看懂未来,再把未来变成动作
0. 简介
Video Prediction Policy 2(VPP2)研究的是机器人如何根据当前画面和语言指令,预测物体与机械臂接下来的运动,再据此生成控制动作。它继承了 VPP 利用视频模型内部预测表征学习动作的思路,将重点推进到操作视频的数据整理、完整事件预测、固定时域适配和单步生成。论文报告,VPP2 在 ALOHA 已见本体上的新任务测试中达到 58.5% 成功率,在 LIBERO-Pro 上达到 45.0%。对应的代码在Github开源了。
1. 机器人为什么需要预测未来
1.1 从一条摆放指令理解输入与输出
桌上有两个相似的杯子和一个盒子,用户要求“把靠近盒子的杯子放进去”。机器人拿到的是相机图像、语言以及关节或末端状态,最终需要输出连续的控制量,例如末端位置变化、姿态变化和夹爪开合。这里同时存在物体识别、目标消歧、运动选择与接触控制:即使识别对了杯子,抓取方向不合适也会失败;即使动作很平滑,拿错杯子仍然没有完成任务。策略需要把语言指定的目标落实为一段符合场景约束的运动。
视觉—语言—动作模型(Vision-Language-Action,VLA) 通常直接学习从这些条件到动作序列的映射。世界动作模型(World Action Model,WAM) 则尝试利用环境如何变化的信息辅助控制,视频是其中一种表示方式:先判断夹爪接近哪个杯子、物体如何离开桌面、最终应停在哪里,再学习如何产生相应动作。这条路线吸引人的地方在于,普通视频虽然往往没有机器人动作标签,却记录了丰富的操作过程,可以补充昂贵的机器人示教。
1.2 视频合理与任务正确之间的距离
通用视频模型可能生成一段视觉流畅的抓杯视频,但杯子从错误的位置被拿起,或者应该使用左手时用了右手,甚至在遮挡后换了目标。这些画面放在内容创作里未必刺眼,放到机器人控制里却直接改变任务。核心问题在于,视觉真实性、指令遵循和物理可执行性是三个不同要求。VPP2 的诊断是,视频基座缺少操作领域的针对性训练,而动作学习又可能改变已有视频表征;仅仅把动作头接到一个更大的视频模型上,并不能保证泛化。[1]

图中用短动作块与完整事件的对照解释训练动机。同一句“把碗放进盒子”,可以对应从左侧接近、从右侧接近、先调整夹爪等不同轨迹;如果训练目标只覆盖一小段,语言与这段动作之间的联系可能很弱。详细说明目标和执行方式,并让视频覆盖子任务完成,有机会让监督关系更稳定。不过,图中的“分布更集中”是机制示意,论文没有测量条件熵,也没有证明合法轨迹会收缩为唯一解,阅读时应把它理解为可检验的训练假设。
2. 第一代 VPP:把视频模型当作具有预测能力的视觉编码器
2.1 一次前向计算已经包含未来运动线索
VPP 的出发点是,静态视觉编码器擅长描述当前有什么,却未必显式表示物体下一步如何变化。它以约 **1.5B 参数的 Stable Video Diffusion(SVD)**为基础,加入语言条件,用机器人和人类操作视频进行适配,学习预测 16 帧、分辨率为 256×256 的视频。训练完成后,视频模型被冻结,用于下游动作学习。这里的关键是,VPP 执行时只计算一次视频网络,直接读取中间特征,而无需等整段视频完成多轮去噪或解码成清晰图像。[2][4]

视频网络的不同层保留了不同粒度的信息。VPP 将若干上采样层的特征插值到统一空间大小,再沿通道维拼接;不同相机先分别提取预测特征,再交给 Video Former 聚合。可以把这一过程理解为先保留“物体在哪里、可能往哪里动”的稠密描述,再用少量可学习查询压缩成动作网络容易读取的表示。它所学习的是隐式逆动力学:不显式追踪每一个像素,也不要求人工给出轨迹控制器,而是通过示教动作学习从预测表征到控制量的对应关系。
2.2 Video Former 如何把时空特征交给动作模型
下面摘自 VPP 官方仓库的 Video_Former_3D.forward,省略了输入检查和其他分支。输入 x_f 在进入该片段时已经投影、加入时间位置编码,并整理为逐帧特征;可学习查询 self.latents 先读取每帧的空间信息,再沿时间轴交换信息。这样,动作头得到的条件既可以定位目标,也可以保留运动顺序,避免把“夹爪接近物体”和“物体已被提起”压缩成没有时间区别的视觉摘要。
# VPP: policy_models/module/Video_Former.py
x = repeat(self.latents, 'T q d -> b T q d', b=batch_size)
x = rearrange(x, 'b T q d -> (b T) q d')
if self.use_temporal:
for attn, Temp_attn, ffw in self.layers:
x = x + attn(x_f, x)
x = rearrange(x, '(b T) q d -> (b q) T d', b = batch_size)
x = x + Temp_attn(x)
x = rearrange(x, '(b q) T d -> (b T) q d', b = batch_size)
x = x + ffw(x)
attn(x_f, x) 让查询读取图像特征,随后两次 rearrange 把同一个查询在不同帧上的表示放到一起,供时间注意力处理。后续扩散动作头通过交叉注意力读取这些查询,生成一段动作。第一代 VPP 已经具备“单次视频前向计算、利用内部特征、分块动作输出”的设计,因此不能把 VPP2 的贡献概括成第一次避免完整视频生成。VPP 原文还报告了 RTX 4090 上的运行频率,但两代模型规模、任务和计时设置不同,不能直接据此判断谁更快。
直觉理解:看一张驾驶场景的照片,可以知道车道和前车的位置;看一小段运动趋势,才能判断前车在减速还是准备并线。VPP 想让视觉编码器同时提供这两类信息。一次前向得到的表示未必足以还原漂亮视频,但可能已经能帮助动作头决定下一步朝哪里移动。
3. VPP2 的整体框架:先学事件,再适配控制时间
3.1 三个训练阶段承担不同任务
VPP2 将视频基座换为 Wan2.1-I2V-14B,并把学习过程拆成三个阶段。第一阶段用详细描述配对完整操作事件,继续预训练视频模型;第二阶段改为固定持续时间的视频块,再进行一致性蒸馏;第三阶段引入动作专家,读取视频模型内部的注意力信息来学习动作。进一步看,这个顺序分别处理了语义完整性、时间对齐、推理速度和动作空间适配,不能简单等同于在同一批数据上连续做几轮微调。[1]

| 阶段 | 训练对象与目标 | 解决的问题 |
|---|---|---|
| Stage 1 | Wan 视频模型,预测完整子任务事件 | 让语言对应可辨认的操作过程与结果 |
| Stage 2 | 固定时域视频后训练,再进行一致性蒸馏 | 对齐真实时间,并降低生成成本 |
| Stage 3 | 视频分支配合动作 DiT,学习示教动作 | 把预测表征转换到机器人动作空间 |
| 高层规划 | VLM 按观测、指令和反馈选择子任务 | 处理长任务分解与指令细化 |
如果沿用桌面取杯的例子,三个阶段学习的内容就更容易区分。事件级样本把“右夹爪抓起白杯、移入盒内、松开”与从开始到完成的视频对应;固定时域样本再要求未来画面对应明确的实际秒数;动作阶段才利用带控制标签的示教,把这些运动信息与末端位移、姿态和夹爪控制联系起来。**普通视频提供过程监督,机器人示教提供控制监督。**二者互补,但人类完成某个动作的视频,并不会直接告诉机器人自己的关节应该转动多少。

3.2 结构总览:VPP2 最主要做了什么
把训练和执行分成上下两层后,VPP2 的主要工作可以归纳为三个连续环节。**先用详细描述与完整事件训练一个更适合操作任务的视频模型,再把它适配到固定时域并蒸馏加速,最后训练动作专家读取其中的预测表征。**图中 A、B、C 对应这三个环节:A 处理语言与过程的对应关系,B 处理真实时间与计算成本,C 才把视觉运动知识落实到控制标签。这里的“先、再、最后”描述训练顺序,机器人每执行一次任务时并不会重新训练这三个阶段。

沿着下层箭头阅读,用户指令先由高层 VLM 转成明确子任务,当前图像则直接作为视频分支的视觉条件。视频专家在一次前向计算中形成运动相关的内部表示,动作专家通过 MoT 读取逐层 KV,并结合本体状态与动作噪声生成动作块。**控制链路不必先把未来解码成一段可播放的视频,再逐帧识别轨迹。**机器人只执行动作块的一个前缀,随后用新的真实观测重建条件;这里的反馈表示重新观测与决策,不等于已经具备自动判断所有失败原因的检测器。
这张结构图也解释了 VPP2 与 VPP 的连续性:两者都利用视频网络的预测能力辅助动作学习,VPP2 进一步围绕操作数据、事件监督、时间对齐、蒸馏和动作接入安排训练流程。**主要贡献需要把数据组织和训练配方一起看,单独一个 MoT 模块不能代表整项工作。**图上 LoRA 与早期冻结体现论文保护视频先验的设计动机,并不构成泛化完全保留的实验证明;公开 RoboDojo 版本的历史输入、联合训练与参数设置差异,仍应以第 8 节的源码和配置核对为准。
3.3 预测八秒、生成两秒动作与闭环执行

在论文的通用机器人设置中,视频分支观察当前场景,预测约八秒的未来,动作专家据此生成约两秒的动作块;机器人执行一段后重新观测,再决定后续动作。下面是便于理解的数据流记号,并非仓库 API: o t o_t ot 表示当前视觉观测, p t p_t pt 表示机器人本体状态, u t u_t ut 表示明确的子任务指令, K t \mathcal{K}_t Kt 表示视频网络逐层产生的键值缓存, G ϕ G_\phi Gϕ 表示动作专家。图像编码、语言编码和具体采样器在这个表达中被略去。
K t = VideoFeatures θ ( o t , u t ) , a ^ t = G ϕ ( η , p t , u t , K t ) , η ∼ N ( 0 , I ) . \mathcal{K}_t=\operatorname{VideoFeatures}_{\theta}(o_t,u_t), \qquad \widehat{\mathbf a}_t=G_{\phi}(\boldsymbol\eta,p_t,u_t,\mathcal{K}_t), \qquad \boldsymbol\eta\sim\mathcal N(0,I). Kt=VideoFeaturesθ(ot,ut),a t=Gϕ(η,pt,ut,Kt),η∼N(0,I).
这里要厘清的是,预测时域、动作块时域和实际执行前缀是三个量。视频看得更远,用于提供运动方向与目标结果;动作块覆盖近处的一段控制;实际执行多少步以后重新观测,则由部署配置决定。公开 RoboDojo 配方使用动作长度 32、执行 24 步,LIBERO 配方使用长度 32、执行 10 步,不能直接用论文中的“两秒”替代这些设置。更不能把八秒视频理解成机器人必须闭眼执行八秒,闭环的关键正是持续用真实反馈修正预测。
4. 数据处理:让文字真正描述这段视频
4.1 从杂乱轨迹切出完整、可辨认的事件
VPP2 汇集机器人、人手以及从通用视频中筛选出的操作片段,覆盖超过二十种机器人本体。视频监督不需要每一帧都有动作标签,因此可以纳入 Ego4D、EPIC-KITCHENS、Something-Something V2 等人类活动数据,以及经过操作相关性过滤的 OpenVid、Panda-70M。动作训练则需要可用且对齐的控制标签,不能把这份视频来源清单直接理解为所有数据都参与统一动作回归。论文将重点放在第一人称、双臂结构较相近的数据上,缓解视角与动作定义冲突。[1]
原始轨迹先去除损坏、相机故障或突变片段,再切成约一至十二秒的语义事件。候选切分点来自末端或手部速度的局部极小值,以及夹爪、手指的开合变化,随后由视觉语言模型调整边界或合并相邻片段。例如“抓住杯子”与“把杯子放进盒子”是否应当分开,要看描述覆盖的子任务是否在片段中完整出现。切分质量直接决定后续文字是在描述真实完成的动作,还是在描述一段尚未开始或已经结束的过程。

4.2 详细描述消除哪些歧义,又留下哪些歧义
一条可用描述需要写清操作步骤、哪只手或哪个夹爪参与、目标物体如何从相似物体中区分,以及相机视角是否变化。执行器和目标对象原则上都应在首帧可见,否则模型可能依赖尚未出现的信息来猜未来。例如“把杯子放进去”可以改成“右侧夹爪抓起盒子前方的白杯,将其移入打开的盒子,左侧夹爪保持静止,相机不动”。这只是解释模板的场景示例,实际标注必须依据对应图像,不能凭文字补出不存在的杯子或空闲手。
直观理解是,详细描述把“做什么”进一步约束为“谁对哪个物体做什么,最终达到什么状态”,但它无法消除全部运动自由度。绕障路径、抓取点、动作速度仍可能有多个正确答案,因此更准确的判断是减少无关歧义,同时保留合法的动作多样性。公开推理指南也强调,提示词增强必须保留工具、目标、目的地和最终状态。若改写模型把“用刷子扫进容器”简化成“把物体放入容器”,即使下游动作顺畅,系统也已经偏离原任务。[3]
难点提示:把一张快递单写得更详细,可以减少送错楼、送错门的概率,却不会让快递员只剩下一条合法路线。VPP2 的描述约束也有类似边界:它帮助模型选对任务与对象,不能替代对碰撞、抓取和接触过程的学习。
4.3 首帧可见约束怎样影响标注
假设示教视频先拍到一个空桌角,随后相机转向杯子,最后右手把杯子放进盒子。如果整段都标成“右手将白杯放入盒子”,训练条件中的首帧并没有杯子、右手或盒子,模型只能猜它们随后从哪里出现。VPP2 对首帧可见性的要求,实际是在限制这种缺少依据的预测:适当后移片段起点,或重新切分,直到执行器和目标可被首帧支持。这里仍要检查目的地与最终状态是否足够明确,不能把“目标可见”误读成全部任务信息都已充分给定。
人工复核可以沿着三条线进行:文字提到的对象是否出现在画面中,文字描述的变化是否真的在片段里发生,描述是否夹带了对机器人控制不可见的信息。例如用“最终被拿起的杯子”来区分两个同款杯子,虽然事后可以判断,首帧却无法确定它指的是哪一个。**标注应该让模型从当前条件决定未来,而不是从已经发生的未来反推条件。**这种检查比让 VLM 把句子写得更长更重要,也是将自动描述转化为有效训练监督的必要步骤。
5. 多视角和动作空间:统一格式以后仍要校准
5.1 T 形输入是可执行的数据接口
不同数据集的相机数量不同,VPP2 将主视角放在左边,将最多两个辅助视角上下堆在右边,缺失视角以黑图补齐。官方独立视频推理工具先把主视角裁成 4∶3、缩放为 320×240,将两个完整辅助视角各缩放为 120×120,拼成 440×240 的画布,最后整体缩放到 416×240。以下是 prepare_image 中的机器人分支原始片段,views、boxes 和 crop_box 已在函数前文准备好,片段用于解释数据几何处理。[3]
# VPP2: src/vpp2/utils/conditioning.py,prepare_image 的机器人分支
canvas = Image.new("RGB", (440, 240), "black")
for index, (view, size, position) in enumerate(zip(
views, [(320, 240), (120, 120), (120, 120)], [(0, 0), (320, 0), (320, 120)]
)):
if view is not None:
boxes[index] = (crop_box(view.size, 4 / 3) if index == 0 else
(0, 0, view.width, view.height))
canvas.paste(view.crop(boxes[index]).resize(size, Image.Resampling.BICUBIC), position)
result = canvas.resize((416, 240), Image.Resampling.BICUBIC)
这段代码透露了两个容易影响复现的细节:主相机会裁剪,辅助相机保留完整视场;缺失视角会留下固定的黑色区域。模型可以据此学习布局,但不会因此自动获得相机标定或严格的三维几何一致性。换句话说,T 形拼图统一了输入接口,仍然需要跨视角数据帮助模型识别同一对象。还要区分独立视频演示与基准适配:公开 LIBERO 流水线将两个 224×224 的视角横向拼接,不能把 T 形预处理不加修改地套到所有检查点上。
5.2 两侧的刚体变换分别对齐什么
相同的视觉运动,在不同机器人数据里可能被记录为不同轴方向上的变化。论文用两级刚体变换对齐: T d = W d T E d T_d={}^{W_d}T_{E_d} Td=WdTEd 是数据集 d d d 原来的末端位姿, A d = W ˉ T W d A_d={}^{\bar W}T_{W_d} Ad=WˉTWd 把原工作空间变换到统一世界坐标, B d = E d T E ˉ B_d={}^{E_d}T_{\bar E} Bd=EdTEˉ 则统一末端坐标系的原点与朝向。所有矩阵属于三维刚体运动群 S E ( 3 ) SE(3) SE(3),包含旋转和平移;它们的乘法顺序对应各自改变的参考系,不能任意交换。
T ~ d = A d T d B d . \widetilde T_d=A_dT_dB_d. T d=AdTdBd.

坐标统一解决的是标签含义冲突,并没有自动解决臂长、可达空间、夹爪形状和接触能力的差别。工程上还需要从机器人描述、外参标定和动作定义确定每套数据的变换,核对绝对位姿与相对增量的区别,再处理旋转表示、夹爪量程和归一化。只让轨迹在图上看起来重合远远不够:如果相机中的“向前”与归一化后的动作正方向仍不一致,策略就会从相似画面学到相互冲突的控制标签。
6. 事件级预训练:先让语义与完整过程对应
6.1 固定帧数覆盖可变长度事件
第一阶段从事件开始到结束均匀采样,让一个样本同时包含初始观测和子任务完成后的结果。设事件为 o 0 , … , o T o_0,\ldots,o_T o0,…,oT, T T T 是终止帧索引, N N N 是不含条件首帧的采样间隔数,便于理解的索引写法如下。论文报告总共使用 49 帧、416×240 的分辨率,以 batch size 1024、学习率 10 − 5 10^{-5} 10−5 训练三万步。这里的四十九帧应与“不含首帧的 N N N”区分,不能把两种计数混用,写成四十九个未来帧再额外加一帧。
i k = ⌊ k T N ⌋ , y e v e n t = ( o i 0 , o i 1 , … , o i N ) , k = 0 , … , N . i_k=\left\lfloor\frac{kT}{N}\right\rfloor, \qquad \mathbf y_{\mathrm{event}}=(o_{i_0},o_{i_1},\ldots,o_{i_N}), \qquad k=0,\ldots,N. ik=⌊NkT⌋,yevent=(oi0,oi1,…,oiN),k=0,…,N.
这种监督有一个实际好处:若描述是“将杯子放进盒子”,预测目标里确实会出现杯子到达盒内的时刻,而不是只看到夹爪刚开始接近。数据集里的快动作和慢动作,都可以按语义进程被压缩到同样长度的视觉序列。代价是时间不再统一:同样相隔两张采样帧,有时对应十分之一秒,有时接近一秒。事件级目标有利于学习任务过程,却不能直接提供精确的控制时间尺度,这也是下一阶段必须存在的原因。
6.2 Flow Matching 学的是从噪声走向视频的速度
VPP2 在视频 VAE 的潜空间中训练,而非直接对全部像素做生成。令 x 1 = E ( y e v e n t ) \mathbf x_1=\mathcal E(\mathbf y_{\mathrm{event}}) x1=E(yevent) 为真实视频编码, ϵ \boldsymbol\epsilon ϵ 为同形状高斯噪声, s ∈ [ 0 , 1 ] s\in[0,1] s∈[0,1] 为生成过程的连续时间。**流匹配(Flow Matching)**在两者之间构造插值状态,再让网络预测朝向数据端的速度。这个 s s s 是生成过程的时间坐标,与视频里杯子运动了几秒没有关系,也不等同于动作序列的控制步数。
x s = ( 1 − s ) ϵ + s x 1 , L F M = E [ ∥ v θ ( x s , s , c ) − ( x 1 − ϵ ) ∥ 2 2 ] , c = ( o 0 , u ) . \mathbf x_s=(1-s)\boldsymbol\epsilon+s\mathbf x_1, \qquad \mathcal L_{\mathrm{FM}} =\mathbb E\left[ \left\|v_\theta(\mathbf x_s,s,c)-(\mathbf x_1-\boldsymbol\epsilon)\right\|_2^2 \right], \qquad c=(o_0,u). xs=(1−s)ϵ+sx1,LFM=E[∥vθ(xs,s,c)−(x1−ϵ)∥22],c=(o0,u).
论文与代码使用了方向相反的时间参数。当前开源调度器把噪声比例记为
σ
\sigma
σ,因此
σ
=
1
\sigma=1
σ=1 对应噪声端,训练目标是 noise - sample;论文上述定义则在
s
=
0
s=0
s=0 对应噪声端,目标为数据减噪声。下面是调度器中连续的两个原始方法,为了阅读移除了类层级缩进。复现时需要连同推理积分方向一起检查,不能仅看到符号相反就认定实现错误。
# VPP2: src/vpp2/models/wan21_14b/schedulers/scheduler_continuous.py
# WanContinuousFlowMatchScheduler 中的两个方法
def add_noise(
self, original_samples: torch.Tensor, noise: torch.Tensor, timestep: torch.Tensor
) -> torch.Tensor:
sigma = (timestep / float(self.num_train_timesteps)).to(
original_samples.device, dtype=original_samples.dtype
)
if sigma.ndim == 0:
return (1 - sigma) * original_samples + sigma * noise
sigma = sigma.view(-1, *([1] * (original_samples.ndim - 1)))
return (1 - sigma) * original_samples + sigma * noise
@staticmethod
def training_target(
sample: torch.Tensor, noise: torch.Tensor, timestep: torch.Tensor
) -> torch.Tensor:
del timestep
return noise - sample
这里的关键是,调度器从高 σ \sigma σ 向低 σ \sigma σ 积分,步长为负,配合“噪声减数据”的目标,仍然向干净样本推进。对照代码时可以令 s = 1 − σ s=1-\sigma s=1−σ,就能把两个表达对应起来。流匹配只定义如何学习生成向量场,本身不保证视频符合机械结构或接触规律。最终能否抓对对象,仍依赖训练数据、语言条件、模型容量与评测约束;损失公式的形式正确,并不能替代操作能力的证据。
难点提示:同一条山路,可以用“已经走了多远”计程,也可以用“距离终点还剩多远”计程。两种计数的变化方向相反,但走的是同一段路。论文与代码中的流时间也如此:必须把时间定义、预测方向和积分步长一起看。
7. 固定时域与蒸馏:把视频能力接到机器人时钟上
7.1 固定八秒的价值是时间对齐
第二阶段改用固定持续时间的未来视频块。论文对机器人操作设定八秒,对人手操作设定两秒,后训练阶段将输入规模减为 17 帧。令 H H H 为预测秒数、 f f f 为原始数据帧率、 t t t 为块起点、 T T T 为轨迹最后帧,采样索引可以写成下式。遇到尾部不足的样本,需要按照实现处理越界与填充,避免无效重复帧或填充动作影响损失;固定时域对齐的是样本的物理时间,视频文件最终以多少 fps 播放则是另一个设置。
δ = f H N , j k = min ( T , t + ⌊ k δ ⌋ ) , y c h u n k ( t ) = ( o j 0 , … , o j N ) . \delta=\frac{fH}{N}, \qquad j_k=\min\!\left(T,t+\lfloor k\delta\rfloor\right), \qquad \mathbf y_{\mathrm{chunk}}^{(t)}=(o_{j_0},\ldots,o_{j_N}). δ=NfH,jk=min(T,t+⌊kδ⌋),ychunk(t)=(oj0,…,ojN).
八秒十七帧如果包含首帧,就有十六个采样间隔,名义间隔约为半秒。这为较长动作方向提供了低频视觉参考,无法细致刻画毫秒级接触。这里要区分预测帧率与控制频率:动作专家可以在两张视觉预测之间输出许多控制步,所以不能说机器人只以约两赫兹运动;但稀疏预测确实可能遗漏短促碰撞、滑移或插接过程,对精细操作形成信息瓶颈。是否需要更密集的视觉未来,要通过接触任务与预测时域消融来验证。

7.2 相同语义过程与相同真实时间的取舍
考虑两次都成功的取杯示教:一次迅速抓起,另一次先慢慢调整夹爪。事件级均匀采样可能把两条轨迹的“刚抓住”“开始搬运”排到近似的位置,从而帮助网络理解共同的任务进程;固定时域采样则保留真实速度差异,某个相同时间索引里,两次动作可能仍处在不同阶段。因此二者并非哪个天然更准确,而是对齐对象不同。先学语义过程,再适配控制时间,能解释 VPP2 的训练顺序,但具体收益仍需在同数据条件下通过实验确认。
从训练实现看,改变采样时域后,动作窗口必须与视频窗口保持同一时间起点,历史帧和条件首帧也要使用一致的索引约定。否则可能出现视频在描述“当前抓杯”,动作标签却属于一秒前“张开夹爪”的情况。填充掩码只能排除不足长度的尾部,无法修正整段窗口错位。检查数据时,最有效的办法是把采样帧、末端位姿曲线与夹爪开合画在同一实际时间轴上,核对接近、接触、抬升和释放是否对应。
7.3 一致性蒸馏与直接取一次中间特征的区别
**一致性蒸馏(Consistency Distillation)**让学生模型在生成轨迹的不同位置都预测相同的终点。教师先从状态
x
s
\mathbf x_s
xs 积分到更靠近数据的
x
^
s
′
\widehat{\mathbf x}_{s'}
x
s′,学生对前者的输出需要接近 EMA 学生对后者的输出。公式中
F
θ
F_\theta
Fθ 预测终端样本,
θ
ˉ
\bar\theta
θˉ 为参数的指数滑动平均,stopgrad 表示目标分支不参与本次反向传播,
λ
\lambda
λ 为权重。论文将
s
′
=
1
s'=1
s′=1 的采样概率设为一半,以强调一次计算直接抵达数据端的能力。[1][8]
L C D = E [ λ ( s , s ′ ) ∥ F θ ( x s , s , c ) − stopgrad ( F θ ˉ ( x ^ s ′ , s ′ , c ) ) ∥ 2 2 ] , 0 ≤ s < s ′ ≤ 1. \mathcal L_{\mathrm{CD}} =\mathbb E\left[ \lambda(s,s') \left\|F_\theta(\mathbf x_s,s,c) -\operatorname{stopgrad}\!\left(F_{\bar\theta}(\widehat{\mathbf x}_{s'},s',c)\right) \right\|_2^2 \right], \qquad 0\le s<s'\le1. LCD=E[λ(s,s′)∥Fθ(xs,s,c)−stopgrad(Fθˉ(x s′,s′,c))∥22],0≤s<s′≤1.
推理时,学生从噪声 ϵ \boldsymbol\epsilon ϵ 直接计算 F θ ( ϵ , 0 , c ) F_\theta(\boldsymbol\epsilon,0,c) Fθ(ϵ,0,c)。VPP 原本也读取单次前向特征,但那种做法主要利用一次去噪中已经出现的运动线索;VPP2 主流程则额外训练模型,使单次生成本身更接近有用的视频未来。**一次前向读取特征与经过蒸馏的一步生成,监督目标不同。**不过,当前公开的独立视频检查点指南仍推荐三十步采样,RoboDojo 又从蒸馏前检查点开始适配,不能把所有发布权重一概称为同一个单步蒸馏模型。
直觉理解:VPP 像从老师解题的第一行里提取方向,再交给另一位同学继续完成;一致性蒸馏则额外训练学生直接写出接近最终的答案。两者都可能只调用一次网络,却不能仅凭调用次数就认为方法相同,也不能认定任意检查点改成一步采样都会保持效果。
8. 动作专家:从视频注意力中读取运动信息
8.1 MoT 与逐层 KV 缓存
VPP2 使用**混合 Transformer(Mixture-of-Transformers,MoT)**连接视频专家和动作专家。两个分支保留自己的网络参数和输入表示,通过注意力交换信息;它不等同于按 token 动态路由到若干前馈专家的常见 MoE。论文的通用动作专家是约 0.9B 参数的扩散 Transformer。当前开源实现中,视频前向先生成每层的 键值缓存(KV cache),动作分支在自己的去噪步骤中重复读取,避免每次动作更新都重新计算整个视频网络。
下面摘自 mot.py 的动作缓存前向路径,展示动作查询如何同时读取视频信息和当前动作信息。片段中的 q_action、k_action、v_action 已由当前动作层投影得到,k_video、v_video 来自之前缓存;相应注意力掩码决定哪些视频位置真正可见。为了保留真实调用上下文,代码展示的是方法内部连续片段,并非可以直接独立运行的脚本。它解释的是信息如何传递,不代表用户需要自己重新实现这些算子。
# VPP2: src/vpp2/models/wan21_14b/mot.py
# 动作分支读取缓存的片段,省略外层条件,统一展示缩进
k_cat = torch.cat([k_video, k_action], dim=1)
v_cat = torch.cat([v_video, v_action], dim=1)
mixed = self._mixed_attention(
q_cat=q_action,
k_cat=k_cat,
v_cat=v_cat,
attention_mask=selected_action_attention_mask,
num_heads=expert.num_heads,
)
torch.cat 沿序列维拼接键和值,使动作查询能够在同一注意力计算中参考视频和动作上下文。进一步看,这种缓存只有在视频分支不依赖当前动作噪声、且相应条件保持不变时,才能跨动作去噪步复用。论文架构中的信息流主要从视频到动作,公开实现也通过掩码约束视频可见范围。需要谨慎的是,阻止视频读取动作 token,不等于阻止动作损失更新视频参数;梯度仍可能沿视频键值回传,是否冻结和如何适配必须查看训练配置。
将上面的操作写成一层简化注意力公式,可以更准确地看出缓存复用的条件。 Q a Q_a Qa 是当前动作 token 的查询, K v , V v K_v,V_v Kv,Vv 是视频 token 的键和值, K a , V a K_a,V_a Ka,Va 来自当前动作状态,分号表示沿 token 维拼接, d h d_h dh 为单个注意力头的维度, M M M 表示将不可见位置置为负无穷的加性掩码。公式省略了多头组合、位置编码、归一化和残差,只解释源码中读取什么信息;实际实现使用布尔掩码,两种表达的屏蔽含义相同。
Z a = softmax ( Q a [ K v ; K a ] T d h + M ) [ V v ; V a ] . Z_a=\operatorname{softmax}\!\left( \frac{Q_a[K_v;K_a]^{\mathsf T}}{\sqrt{d_h}}+M \right)[V_v;V_a]. Za=softmax(dhQa[Kv;Ka]T+M)[Vv;Va].
每次动作去噪都会改变动作 token,所以 Q a , K a , V a Q_a,K_a,V_a Qa,Ka,Va 必须随之重新计算;相同观测下的视频分支不读取动作 token, K v , V v K_v,V_v Kv,Vv 才有机会保持不变。一个容易忽略的细节是,代码只允许动作直接读取配置指定的视频 token 范围,但这些 token 的表示此前已经经历视频内部注意力。因而“动作只看前几个视频潜帧”并不必然表示后面的未来对它完全没有影响。判断信息来源,需要同时查看视频内部注意力与动作可见范围,不能只看一行切片。

8.2 论文的先验保护与公开配方的差别
…详情请参照古月居
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)