Long-WAM 深度解析:机器人怎样记住过去、预测未来,并及时完成下一段动作

0. 简介

Long-WAM 面向动态抓取与多阶段操作,研究机器人如何利用较长的视觉历史,同时保持及时响应。单张图像能显示杯子的位置,却难以确定运动方向;增加历史又会提高编码和推理成本。它先用无动作标签的视频学习自回归预测,再通过非对称因果注意力连接视频专家与动作专家,最后用流式编码、异步执行和设备优化缩短决策等待。相关代码已经在Github上开源了

1. 研究问题:一张画面缺少哪些控制信息

1.1 位置相同,正确动作可能完全不同

传送带上的杯子处于同一位置时,可能正在向左运动,也可能向右运动,还可能刚刚停止。机器人若只看到这一帧,三种情况在视觉输入上几乎相同,正确的拦截动作却不同。长程操作也存在类似歧义:桌面上有一只碗,可能意味着尚未开始叠放,也可能意味着上一只碗已经放入、下一步该寻找新目标。视觉历史补充的是运动与任务进度信息。从控制角度看,这是部分可观测问题:当前观测没有完整揭示环境状态,过去的观测能够减少决策歧义。

进一步看,历史也不是越长越有用。静态场景可能只需要很短的运动线索,跨多个阶段的任务才可能依赖更早的交互记录;一段过时或重复的历史还会消耗注意力和计算。Long-WAM 因此没有只展示一个"大窗口模型",而是分别训练多个历史长度的策略,在每个 benchmark 内保持未来预测与动作跨度固定,再比较闭环成功率。这里的关键是,它测试增加过去的证据能否改善当前控制,而不是把历史、预测范围和执行时间同时扩大后,再把收益统称为记忆能力。

1.2 WAM 与 VLA 的区别落在训练目标和预测接口

视觉语言动作模型(Vision-Language-Action,VLA) 通常根据图像、语言指令和机器人状态生成动作,可以结合历史、分层规划或其他记忆机制。世界动作模型(World-Action Model,WAM) 则进一步把视觉动态预测纳入动作学习,在内部建立场景演化与操作之间的联系。不能把所有 VLA 都说成"只看一帧",也不能把所有 WAM 都说成"先生成完整视频再行动"。Long-WAM 采用的是其中一种具体路径:先预测未来视觉 latent,再让动作专家读取预测结果;Fast-WAM 则保留训练时的视频学习,推理时省去未来生成。45

这里要厘清的是,任务规划与连续控制处理不同时间尺度。高层规划者可以决定"抓杯子,再叠杯子",执行策略仍要在物体移动期间判断手该往哪里伸、何时闭合夹爪。Long-WAM 的研究价值来自这段执行过程:既要利用过去推断运动,也要及时生成下一段动作。把规划者叫"大脑"、策略叫"小脑"可以帮助入门,但这个类比不能代替接口说明,更不能直接证明某类规划模型永久无法承担低层控制;论文给出的证据来自具体系统与任务配置。

2. 整体框架:历史、预测与动作如何连接

2.1 两个专家共享信息,但承担不同职责

Long-WAM 的 视频专家(Video Expert) 学习图像序列如何演化,动作专家(Action Expert) 把视觉信息转成指定机器人可执行的动作。相机历史先经过视频 VAE 压缩为 latent;语言指令与当前机器人状态提供额外条件 。视频专家根据干净的历史,生成少量未来 latent,再将逐层计算出的 Key 和 Value 交给动作专家。动作专家由噪声出发生成一个动作块。未来画面始终停留在潜空间,控制路径不需要先把它解码成可供人观看的视频,这一点直接影响推理成本。

这里可以先把几个接口名词拆开。变分自编码器(Variational Autoencoder,VAE) 将高维画面压缩成较小的数值表示,潜变量(Latent) 就是这种内部表示,解码器可以把它还原为图像;模型在潜空间工作并不意味着它只处理文本。Transformer 把这些表示划分成 token,再通过注意力交换信息:query 表示当前要寻找什么,key 用于匹配,value 携带要读取的内容。缓存 Key/Value,简称 KV,可避免重复计算已经固定的条件。动作块(Action Chunk) 则是一次生成的连续多步控制指令,不要求每个电机控制步都重新调用大模型。

论文将这条"预测后行动"的路径称为 逆动力学建模(Inverse Dynamics Modeling,IDM) 。下式对应原文式(3): Z t − Z_t^{-} Zt− 表示真实观测历史的 latent, q t q_t qt 是当前机器人状态, c c c 是语言条件, ϵ v \epsilon_v ϵv 与 ϵ a \epsilon_a ϵa 是两路高斯噪声, θ \theta θ 与 ψ \psi ψ 分别表示视频和动作专家参数。动作块 A ^ t \widehat{\mathbf A}_t A t 含 H H H 个未来控制步; K t \mathcal K_t Kt 是逐层视觉 KV 缓存。这里的条件化体现学习到的关系,不等同于显式求解物理方程或搜索最优轨迹。1,§3.2

Z ~ t + = Rollout ⁡ θ , σ ⋆ ( ϵ v ∣ Z t − , c , q t ) , K t = Prefill ⁡ θ ( Z t − , Z ~ t + , c , q t , σ ⋆ ) , A ^ t = Denoise ⁡ ψ ( ϵ a ∣ K t , c , q t ) . \begin{aligned} \widetilde Z_t^{+} &=\operatorname{Rollout}{\theta,\sigma^{\star}} \left(\epsilon_v\mid Z_t^{-},c,q_t\right),\\ \mathcal K_t &=\operatorname{Prefill}{\theta} \left(Z_t^{-},\widetilde Z_t^{+},c,q_t,\sigma^{\star}\right),\\ \widehat{\mathbf A}t &=\operatorname{Denoise}{\psi} \left(\epsilon_a\mid\mathcal K_t,c,q_t\right). \end{aligned} Z t+KtA t=Rolloutθ,σ⋆(ϵv∣Zt−,c,qt),=Prefillθ(Zt−,Z t+,c,qt,σ⋆),=Denoiseψ(ϵa∣Kt,c,qt).

直觉理解:可以把它看成开车前根据路况预判前方几秒的变化,再决定油门和方向。驾驶员不必先在脑中渲染一段高清电影,控制所需的是足以区分运动趋势的内部表示;但预判错误仍可能导致动作错误。

2.2 一次在线决策的完整链路

下图把模型计算与机器人执行放在同一条路径中:相机帧到达后进入流式 VAE,触发决策时补完当前窗口的编码,视频专家产生部分去噪的未来,再构建视觉 KV,动作专家生成动作块,控制器按绝对控制步对齐后执行。执行期间的新画面用于下一次决策。真实观测与模型预测具有不同身份:预测未来用于本次动作条件,下一轮历史来自相机反馈,不能直接把想象的画面当成已经发生的事实。否则模型会逐渐用自己的预测替代环境反馈,闭环控制也就失去了纠错依据。

2.3 把输入输出还原成张量与时间范围

实现时最容易混淆的是三种长度:观察了多久、预测了多久、准备执行多久。设一次处理 B B B 个样本,历史包含 M M M 个 latent 帧,未来预测包含 K v K_v Kv 个 latent 帧,每帧有 C z C_z Cz 个通道和 h z × w z h_z\times w_z hz×wz 个空间位置,视频张量可以记作 B × C z × ( M + K v ) × h z × w z B\times C_z\times(M+K_v)\times h_z\times w_z B×Cz×(M+Kv)×hz×wz;动作张量则为 B × H × d B\times H\times d B×H×d,其中 d d d 取决于机器人动作接口。这里是对公开接口的形状归纳,实际 Transformer 还会把空间位置切成 token。latent 帧数、视觉 token 数与控制步数不是同一个量,不能拿一个长度直接替代另一个。

接口 时间含义 在一次 IDM 求解中的处理
观测历史 Z t − Z_t^{-} Zt− 截至当前的真实画面 编码后固定为干净前缀
未来 latent Z ~ t + \widetilde Z_t^{+} Z t+ 尚未发生的预测片段 从噪声部分去噪,随后用于预填充
视觉 KV K t \mathcal K_t Kt 历史与预测的逐层条件特征 动作去噪期间复用
动作块 A ^ t \widehat{\mathbf A}_t A t 从当前锚点起的 H H H 个控制步 全块生成,再按调度执行有效部分

这张表也解释了长上下文实验的控制变量。增加 M M M 会扩大历史编码、预填充和注意力的负担,但不要求同时增加 K v K_v Kv 或 H H H。如果把三个长度一起调大,即使任务表现改变,也很难判断收益来自看得更久、预测更远还是执行方式改变。Long-WAM 在同一 benchmark 内固定预测和动作跨度,分别训练不同历史模型;因此正文的 context scaling 指向历史时长与闭环表现之间的实验关系,并非已经拟合出某条普适幂律。

3. 视频预训练:先学习从过去预测未来

3.1 无动作标签的数据为什么适合这一阶段

LongLive2.0-Robot 从 LongLive-2.0 的自回归视频 checkpoint 继续训练,使用 RoVid-X、AgiBot World、EgoDex、EgoVerse 与 VITRA 五个数据族。机器人和人类第一视角数据可以共同进入这一阶段,因为监督目标是视频演化,不要求不同平台共享关节维度或动作坐标。论文附录给出训练集 2,251,021 个模型输入样本,按每个样本折算 16 秒得到约 10,004.5 小时。"约一万小时"是窗口等价量,受到重叠窗口、片段长度和填充影响,不能理解为一万小时互不重复的原始拍摄素材。

这种数据选择解决了动作标签难统一的问题,却不会自动解决跨机器人控制。模型可以从人手移动杯子的画面中学习物体会怎样被推动、拿起和遮挡,具体到机器人的关节目标、夹爪开合与状态归一化,仍要在动作适配阶段学习。换句话说,动作空间无关的是这一阶段的监督,不是最终策略对所有机器人都零样本可用。把视频预训练和动作接口分开讨论,才不会把视觉动态先验的收益误写成已经验证的跨本体操作能力。

3.2 分块因果注意力与误差回收

自回归视频预训练(Autoregressive Video Pretraining) 在时间块之间遵守"过去到未来"的依赖。训练采用 teacher forcing:多个目标块可以并行计算,但每个块只能读取允许的真实前缀和自身噪声 token,不能偷看后面的真实结果。模型还沿用误差回收机制,把缓冲的模型误差作为扰动加入部分输入,使预测器接触更接近自由推演时的偏差。这里的关键是,扰动后的输入仍以原始目标为恢复方向,训练不只是拟合干净的历史,还试图学习如何从不完美前缀继续预测。

官方 ar_mask.py 的 _frame_allowed 把这个时间约束写成布尔矩阵。下面是原始函数主体节选,行表示 query 所在帧,列表示允许读取的 key 帧;块编号来自帧编号整除每块帧数。local_attn_size 可以限制历史窗口,sink_size 可以保留起始帧,二者属于掩码接口能力,不能据此推断所有论文配置都启用了局部窗口或 sink。主文中的上下文扩展需要与实际配置共同阅读,代码提供的是可用机制,不是某组实验的默认参数。

python 复制代码
# src/longwam/models/wan22/ar_mask.py :: _frame_allowed
fb = torch.arange(num_latent_frames, device=device)
q_blk = (fb // num_frame_per_block).view(-1, 1)
k_blk = (fb // num_frame_per_block).view(1, -1)
allowed = k_blk <= q_blk
if local_attn_size > 0:
    win_blocks = max(1, local_attn_size // num_frame_per_block)
    allowed &= (k_blk > q_blk - win_blocks)
if sink_size > 0:
    allowed |= (fb.view(1, -1) < sink_size)
return allowed

这段代码的核心是 k_blk <= q_blk:允许访问自身和更早的块,屏蔽未来块。默认不启用局部窗口时,较早的历史可以继续提供条件;启用局部窗口则会收缩可见范围。自回归的时间顺序在预训练时就被学习,动作适配继续使用相同方向的视觉依赖,从而减少从离线视频生成到在线控制的结构变化。论文中 AR 与双向初始化的差别需要放在这个背景下理解,它不是仅由推理时把掩码改成三角矩阵就能保证复现的效果。

4. 因果耦合:动作读取预测,视频保持自己的时间结构

4.1 非对称注意力保留了什么

在 Long-WAM 的 IDM 路径中,视频 query 只能读取自身与更早的视觉块,不能读取动作 token;动作 query 可以读取真实历史、部分去噪的未来,以及整个正在去噪的动作块 。这种 非对称因果注意力(Asymmetric Causal Attention) 保留了视频专家已学到的历史预测结构,也让动作拥有对未来的条件。动作块内部可以相互注意,并不违反在线可用性:这些都是当前需要共同生成的变量,而不是环境中已经发生、却在决策时尚不可见的真实未来。

这个设计也带来一个边界:IDM 的视频预测不以待生成动作作为条件,因此它不是一个"输入任意候选动作,精确返回后果"的通用模拟器 。任务指令、视觉历史与状态帮助模型预测可能的交互走向,动作专家再据此生成动作。预测未来作为控制中间表示,与利用动作条件世界模型做候选轨迹搜索,是两类不同接口。Long-WAM 的主路径没有要求生成多个候选动作、逐一模拟、再按奖励选出最优者;把它写成模型预测控制搜索,会改变论文的方法含义。

4.2 IDM、无未来预测与联合去噪的区别

原论文 Figure 2 并列了四种信息流:只使用当前观测、使用历史但不生成未来、联合视频动作去噪,以及先视频后动作的 IDM。联合去噪(Co-Denoising,CoD) 让未来视频与动作在每轮更新中双向交互,IDM 则先形成预测条件,动作阶段读取固定视觉 KV。两者都保留真实历史,区别在生成变量之间怎样交换信息。Long-WAM 发布了对应模式的代码与模型检查点(checkpoint,即保存的权重和配置);训练掩码与去噪日程不同,推理选择必须使用匹配的检查点,不能任意切换一个开关。

难点提示:IDM 像先看完一份路况预测再制定驾驶动作,CoD 像在讨论路况和操作时反复相互修正。两种方式的计算组织不同,不能仅凭"同时计算"就断言能力更好,也不能凭顺序生成就断言物理因果更准确。

4.3 用一个小矩阵检查"谁能读取谁"

为了读懂掩码,可以把视觉序列缩成两个历史块和两个未来块,依次记为 H 0 , H 1 , F 0 , F 1 H_0,H_1,F_0,F_1 H0,H1,F0,F1,再把整个噪声动作块记为 A A A。这只是说明可见性的五组示例,不是论文固定的窗口配置。矩阵的行是发起查询的 query,列是可读取的 key: F 0 F_0 F0 可以读取两个历史块和自己,不能读取后续 F 1 F_1 F1; A A A 可以读取全部视觉条件和自身;所有视频行对动作列都关闭。块内部仍可并行交互,因此"分块因果"不等于每个空间 token 都逐个串行生成。

这种检查方法适合定位实现中的信息泄漏:如果视频 query 读到了动作 token,IDM 的单向条件关系就变了;如果未来视频读到了自己的干净真值,预测训练会变得过于容易;如果动作 query 被误限制为只能读当前帧,则历史与未来条件又没有真正参与控制。这三类错误可能都能输出正确形状的张量,单看 loss 数值未必能及时发现。模型输入形状正确,只说明接口能运行;掩码正确才说明信息依赖符合方法设计。

5. 动作适配:预测监督与动作监督分两次计算

5.1 动作条件里的未来来自哪里

视频预训练结束后,world-action 适配使用视频和动作的 flow matching。视频分支在真实历史条件下学习未来预测;动作分支读取历史和固定噪声水平的未来视觉表示。一个容易遗漏的细节是,训练时的未来来自真实未来 latent 的前向加噪 ,不是每次都在线运行模型生成的视频。噪声水平固定为 σ ⋆ = 0.9 \sigma^{\star}=0.9 σ⋆=0.9,保留残余的真实数据分量;推理时则完全从高斯噪声开始生成。两者共享噪声水平,来源分布仍然不同,这是训练近似,不能宣称已经消除了训练推理差距。

源码 longwam_base.py 在第二次计算中用 torch.no_grad() 构建视觉缓存,代码如下节选。input_latents 包含已编码的训练视频,noise_video_hi 是新采样的噪声,timestep_imagine 对应固定高噪声水平;前缀观测随后被替换回干净的真实历史。节选省略了后续掩码构造和 prefill_video_cache 调用,它们仍位于同一不求梯度的区域。理解这几行,比只写"视频专家先想象"更重要,因为它明确揭示了训练时构造动作条件的方式。

python 复制代码
# src/longwam/models/wan22/longwam_base.py :: training_loss
with torch.no_grad():
    noise_video_hi = torch.randn_like(input_latents)
    latents_hi = self.train_video_scheduler.add_noise(input_latents, noise_video_hi, timestep_imagine)
    latents_hi[:, :, 0:self.num_clean_frames] = inputs["first_frame_latents"]
    video_pre_hi = self.video_expert.pre_dit(
        x=latents_hi,
        timestep=timestep_imagine,
        context=context,
        context_mask=context_mask,
        action=None,
        fuse_vae_embedding_in_latents=inputs["fuse_vae_embedding_in_latents"],
        num_clean_frames=self.num_clean_frames,
    )

这段代码通过固定历史与高噪声未来,为动作专家构造比较统一的视觉条件。action=None 对应视频专家不读取动作的设计;num_clean_frames 区分观测前缀与需要预测的尾部。进一步看,后续缓存还逐层执行 .detach(),把常量边界写得明确。动作损失不会经视觉 KV 回传更新视频专家,视频专家由自己的预测损失训练,动作专家与本体状态适配器则通过动作条件路径获得梯度。它控制的是梯度流,不是证明视觉条件本身一定正确。

5.2 Padding 必须从监督中移除

轨迹长度不足时需要填充,但填充内容不应成为真实预测目标。Long-WAM 将动作 loss 先在特征维求均值,再用 action_is_pad 排除无效时间步,按有效步数归一化,最后乘 scheduler 权重并对 batch 求均值。下面代码保留了原始计算结构。这里的关键是,长窗口训练中"张量有多少位置"与"实际监督了多少动作"并不相同;若把 padding 也当目标,较短轨迹可能因为大量重复内容而主导优化,结果看似收敛,真实交互能力却没有同等改善。

python 复制代码
# src/longwam/models/wan22/longwam_base.py
action_loss_token = F.mse_loss(pred_action.float(), target_action.float(), reduction="none").mean(dim=2)
if action_is_pad is not None:
    valid = (~action_is_pad).to(device=action_loss_token.device, dtype=action_loss_token.dtype)
    valid_sum = valid.sum(dim=1).clamp(min=1.0)
    action_loss_per_sample = (action_loss_token * valid).sum(dim=1) / valid_sum
else:
    action_loss_per_sample = action_loss_token.mean(dim=1)
action_weight = self.train_action_scheduler.training_weight(timestep_action).to(
    action_loss_per_sample.device, dtype=action_loss_per_sample.dtype
)
return (action_loss_per_sample * action_weight).mean()

这段实现用 .float() 计算均方误差,减少低精度误差累积对损失统计的影响;clamp(min=1.0) 避免有效长度为零时除零。视频分支同样要对齐原始帧的 padding 与 VAE 下采样后的时间位置,并排除干净观测的 loss。屏蔽填充目标与补齐历史输入是不同操作:前者避免虚假监督,后者保证固定输入形状。即使目标 mask 正确,历史窗口充满重复的初始帧也不会增加真实信息,这正是超长上下文实验需要结合有效数据覆盖率来解释的原因。

5.3 两次训练计算不等于两套独立视频模型

两次计算使用的是同一视频专家的参数,但输入噪声与梯度用途不同。第一次从训练日程采样视频噪声水平,产生视频速度预测并计算视频损失;第二次独立采样噪声,把真实未来加噪到固定的 0.9,再在不求梯度的上下文中构建视觉 KV,供动作预测使用。源码还会用第二次的动作预测覆盖第一次的动作输出。两次前向计算解决的是两种监督需求,未额外训练一个专门给动作服务的视频专家 。这能解释为什么总 loss 只有两项,执行过程却比"一次联合前向"更复杂。

视频损失->更新视频专家

动作损失->更新动作专家与状态适配器

动作损失->视觉KV->视频专家:这条梯度路径被截断

这样做的主要目的,是让视频专家继续负责学习视觉动态,让动作专家学习如何利用这些动态生成动作。如果允许动作损失一路回传,优化器就有两种降低动作误差的办法:改善动作专家,或者修改上游视频表示,让动作更容易被预测出来。后者可能有帮助,也可能让视频表示偏离原来的预测任务。Long-WAM选择用独立的视频损失约束视频专家,限制动作监督对它的直接干扰。

高噪声条件为什么还值得讨论?按线性路径,固定 0.9 意味着训练输入包含 0.1 倍的真实未来 latent 与 0.9 倍的噪声,系数不能直接解释成信息量百分比,但真实未来成分确实没有完全消失。部署时只有生成结果,误差可能沿 KV 条件影响动作。stop-gradient 可以限制动作损失修改视频表示的路径,却不会自动消除这种分布差异。原文明确承认这是训练近似;后续若尝试混入模型自产未来,应作为新的训练实验检验收益,而不能写成 Long-WAM 已经实现的机制。

6. 推理实现:未来不必生成到清晰画面

6.1 部分去噪如何停在指定噪声水平

部分去噪(Partial Denoising) 是 Long-WAM 降低未来预测成本的一个具体选择。视频 latent 从 σ = 1 \sigma=1 σ=1 的高斯噪声开始,经过少量更新后停止在 σ ⋆ = 0.9 \sigma^{\star}=0.9 σ⋆=0.9,再把内部特征交给动作专家。按照线性 flow 路径,这仍属于高噪声表示;"粗略想象"只是便于理解的说法,不能解释成普通模糊照片或清晰度达到某个百分比。论文验证的是这种表示能够为动作带来收益,并未证明所有任务都只需要同样的噪声水平或去噪步数。

代码 _imagine_future_latents 先生成常规 scheduler 日程,再线性重映射终点,使其恰好停在目标噪声水平。下面代码中的 ntt 是训练时间步标度,sigma_target 把保存的时间步转换回 0 , 1 0,1 0,1,steps 决定部分去噪次数。随后每轮只更新未来 latent,干净历史保持固定。默认配置是四步视频去噪,但代码允许在匹配配置下调整预算;如果模型选择 CoD,未来视频必须走到零噪声,共享联合日程,不能直接套用这个 IDM 截断过程。

python 复制代码
# src/longwam/models/wan22/longwam_base.py :: _imagine_future_latents
ntt = float(self.train_video_scheduler.num_train_timesteps)
sigma_target = float(self.imagine_timestep) / ntt
shift = self.infer_video_scheduler.shift if sigma_shift is None else float(sigma_shift)
steps = max(1, int(self.imagine_infer_steps if num_inference_steps is None else num_inference_steps))
u_steps = torch.linspace(1.0, 0.0, steps + 1, device=self.device, dtype=torch.float32)
sigma_full = self.infer_video_scheduler._phi(u_steps, shift)
sigma_steps = sigma_target + (sigma_full - sigma_full[-1]) * (
    (1.0 - sigma_target) / (sigma_full[0] - sigma_full[-1] + 1e-12)
)

这段日程构造避免把"少做几步"误写成"在完整日程里提前退出":它重新分配了从一到目标水平之间的积分节点,最终输出对应指定条件。未来得到的表示不会经 VAE 解码,模型接下来只计算视觉 token 的逐层 KV。换句话说,视频模型的价值在这里表现为可供控制读取的动态特征,输出一段适合人观看的视频不是控制流程的必要环节。省去像素合成能够减少计算,却仍保留未来预测;这与推理时完全跳过视频生成的 Fast-WAM 有明确区别。

6.2 视觉 KV 为什么能在动作去噪中复用

视频预测完成后,未来与历史在本次动作求解内固定,动作专家则需要多次更新噪声动作。若每一步重新运行完整视频分支,会反复计算相同视觉信息。Long-WAM 因而先对视频执行 预填充(Prefill),保存每层 KV,再在动作去噪时读取。下面的官方代码节选展示了视觉预填充接口:输入包含 token、位置频率、时间调制和文本条件,掩码只截取视频到视频部分。缓存不是单独存一张图像向量,它保留的是 Transformer 每层可直接参与注意力计算的键和值。

python 复制代码
# src/longwam/models/wan22/longwam_base.py :: infer_joint_ar
video_prefill = (self.mot.prefill_video_cache_with_clean_prefix
                 if getattr(self, "_video_clean_prefix_wavefront_enabled", False)
                 else self.mot.prefill_video_cache)
video_kv_cache = video_prefill(
    video_tokens=video_pre["tokens"],
    video_freqs=video_pre["freqs"],
    video_t_mod=video_pre["t_mod"],
    video_context_payload={
        "context": video_pre["context"],
        "mask": video_pre["context_mask"],
    },
    video_attention_mask=attention_mask[:video_seq_len, :video_seq_len],
)

这段代码区分普通预填充与已经准备干净历史前缀的优化路径,随后动作分支用 _predict_action_noise_with_cache 迭代更新动作。单次求解内复用不能直接推广为跨决策永久复用。当前机器人状态也会进入视频条件,下一次状态改变、旧帧退出窗口或时间位置更新,逐层视觉特征都可能改变。论文附录明确讨论了这个限制:跨决策缓存必须定义刷新和对齐语义。若只把新帧追加进去而忽略这些变化,缓存虽然更快,却可能不再等价于原模型的条件计算。

工程价值:这像同一次会议中复用已经整理好的资料,每提出一个新方案不必重新扫描所有文件;但下一次会议的事实与条件变了,旧资料是否还能直接沿用,需要重新检查。缓存有效期是模型语义的一部分。

7. 训练目标:把预测问题写清楚

7.1 Flow matching 预测的是噪声减数据的速度

流匹配(Flow Matching) 把干净数据与噪声之间构造为一条连续路径。对于某一目标 x x x,采样高斯噪声 ϵ \epsilon ϵ 与噪声水平 σ \sigma σ,得到 x σ x^{\sigma} xσ;网络学习路径上的速度 v v v。Long-WAM 使用的方向是噪声减数据,因此当推理日程从大 σ \sigma σ 走向小 σ \sigma σ 时,更新量的时间差为负,样本沿着去噪方向移动。这个符号关系决定代码里 scheduler 的更新方式;只写"预测噪声"会隐藏模型究竟输出哪种量,也容易把不同扩散参数化混在一起。

x σ = ( 1 − σ ) x + σ ϵ , ϵ ∼ N ( 0 , I ) , u = ϵ − x . x^{\sigma}=(1-\sigma)x+\sigma\epsilon, \qquad \epsilon\sim\mathcal N(0,I), \qquad u=\epsilon-x. xσ=(1−σ)x+σϵ,ϵ∼N(0,I),u=ϵ−x.

其中 x x x 在视频分支代表目标视觉 latent,在动作分支代表标准化的动作块; I I I 为单位协方差, u u u 是监督的速度方向。视频预训练还会对输入和噪声加入误差回收扰动,所以其详细目标与上式的普通路径存在区别。论文保留原始视频目标 z i z_i zi,以扰动后的噪声 ϵ ˉ i \bar\epsilon_i ϵˉi 减去原始 z i z_i zi 作为恢复目标。误差回收让输入接触模型偏差,监督仍指向正确结果,并不是让模型把自己的错误预测当成新真值。

L T F - A R = E w ( σ i ) ∥ v θ ( x i σ i , σ i ∣ h \< i , c ) − ( ϵ ˉ i − z i ) ∥ 2 2 . \mathcal L_{\mathrm{TF\text{-}AR}} =\mathbb E\left w(\\sigma_i) \\left\\\| v_{\\theta}(x_i\^{\\sigma_i},\\sigma_i\\mid h_{\. LTF-AR=Ew(σi)∥vθ(xiσi,σi∣h\.

这里 h < i h_{<i} h<i 是第 i i i 块之前的上下文,可能带有启用的历史误差扰动; x i σ i x_i^{\sigma_i} xiσi 是含噪目标输入, w ( σ i ) w(\sigma_i) w(σi) 是 scheduler 的损失权重。teacher forcing 允许多个目标块并行监督,但掩码必须限制真实目标的可见范围。条件初始图像保持干净且不进入预测损失。进一步看,这个目标属于第一阶段的视频预训练;第二阶段的两次 world-action 计算并没有直接沿用成对流与误差回收增强,不能把两阶段的训练过程写成完全相同。

7.2 两路监督共享形式,梯度边界仍然不同

动作适配时,视频与动作分支都使用带有效目标 mask 的加权误差。令 b ∈ { v , a } b\in\{v,a\} b∈{v,a} 分别表示视频和动作分支, m b m_b mb 是广播到目标元素的有效性 mask, r b r_b rb 是网络速度预测与目标速度的差, ⊙ \odot ⊙ 表示逐元素相乘。归一化分母按有效元素数量计数,避免短轨迹因大量填充而改变损失尺度。总目标由两个分支权重 λ v \lambda_v λv 和 λ a \lambda_a λa 控制,公开共享配置中两者均设为一;其他设置需要回查对应实验配置。1,式(6);3

L b = E w b ( σ b ) ∥ m b ⊙ r b ∥ 2 2 max ⁡ ( ∥ m b ∥ 1 , 1 ) , r b = v b ( x b σ b , σ b ∣ conditioning ) − ( ϵ b − x b ) , L = λ v L v + λ a L a . \begin{aligned} \mathcal L_b &=\mathbb E\left w_b(\\sigma_b) \\frac{\\\|m_b\\odot r_b\\\|_2\^2} {\\max(\\\|m_b\\\|_1,1)} \\right,\\ r_b &=v_b(x_b^{\sigma_b},\sigma_b\mid\text{conditioning}) -(\epsilon_b-x_b),\\ \mathcal L &=\lambda_v\mathcal L_v+\lambda_a\mathcal L_a. \end{aligned} LbrbL=Ewb(σb)max(∥mb∥1,1)∥mb⊙rb∥22,=vb(xbσb,σb∣conditioning)−(ϵb−xb),=λvLv+λaLa.

总损失相加并不意味着每条梯度都可以更新所有参数。IDM 的动作计算读取 detached 视觉 KV,动作误差不会经这一缓存改变视频预测器;视频预测器仍由视频误差更新。这意味着,损失公式与计算图必须一起读 :公式说明优化哪些误差,代码说明误差能沿哪些路径影响参数。对于关心实现的读者,前面的 torch.no_grad()、padding 处理与这里的数学目标正好构成同一件事的三个侧面,缺少任何一个都容易误解训练机制。

难点提示:可以把噪声水平想成一条带刻度的坡道。速度目标定义了朝刻度增大方向的变化,推理沿刻度减小的方向积分,所以步长为负。梯度回传则是另一回事,它决定训练后修改哪部分参数;它既不是机器人运动方向,也不是样本在这条坡道上的移动方向。

8. 运行系统:动作交接和边缘加速

8.1 异步执行的难点是对齐,不能重放过期动作

纯异步执行(Pure Asynchronous Execution) 让机器人执行当前动作块时,模型准备下一个块。设每块预测 H H H 步,其中前 R R R 步有资格执行,在第 S S S 步触发下一次推理,重叠为 O = R − S O=R-S O=R−S,控制间隔为 Δ t \Delta t Δt。新块以触发时的观测为起点;到交接时,它的前 O O O 步对应的时间已经过去,必须丢弃,执行对齐的后缀。若新结果未及时到达,控制器在边界等待。这里没有默认把两个动作块平均融合,也没有让旧块无限延长。

R 2 ≤ S < R ≤ H , O = R − S , T r e a d y ≤ O Δ t = ( R − S ) Δ t . \frac R2\leq S<R\leq H, \qquad O=R-S, \qquad T_{\mathrm{ready}}\leq O\Delta t=(R-S)\Delta t. 2R≤S<R≤H,O=R−S,Tready≤OΔt=(R−S)Δt.

其中 T r e a d y T_{\mathrm{ready}} Tready 是触发观测可用之后,到新动作可交接之前的真实时间,包含传输、队列和计算;它不能简单等于论文的 GPU 推理测量。以仓库文档的 H = 32 H=32 H=32、 R = 24 R=24 R=24、 S = 16 S=16 S=16 为例,新块在第十六步请求,第二十四步切换到新块下标八处。源码按块的 anchor 与当前绝对 step 取动作,下面节选来自 AsyncPolicy.act。episode 与 anchor 检查、候选结果形状验证位于 _commit 中,此处展示交接与触发的关键路径。

python 复制代码
# src/longwam/runtime/execution.py :: AsyncPolicy.act
if self._active is None:
    self._submit()
    self._commit(handoff=False)
elif self.step == self._active[0] + self.schedule.execute:
    self._commit(handoff=True)
anchor, actions = self._active
if self.step == anchor + self.schedule.stride:
    self._submit()
action = actions[self.step - anchor].copy()
self.step += 1
return action

这里 actions[self.step - anchor] 保证读取新块中对应当前控制时间的位置,所以交接后不会重新从零播放整块动作。模型输出平滑只是其中一个条件,时间错位仍然可能造成错误行为。动作连续性与反馈频率需要共同优化:固定执行跨度时,较晚触发让决策基于更新的观测、重叠更短,但推理截止时间也更紧,决策间隔还会变长。论文中八步重叠的成功率高于四步重叠,说明不能仅用 jerk 最小来挑选调度参数。

难点提示:这像接力时下一名运动员提前起跑。交接成功既取决于跑得快,也取决于两人的时间对齐;提前准备能缩短等待,但如果把旧时间对应的动作重新执行,再快的模型也会跑错位置。

8.2 用绝对控制步走完一次交接

把上面的 H = 32 , R = 24 , S = 16 H=32,R=24,S=16 H=32,R=24,S=16 例子展开,首块 A 以绝对步零为锚点;机器人走到第十六步时请求块 B,B 的局部下标零对应绝对第十六步。到了第二十四步,旧块 A 结束可执行前缀,新块 B 已有八步对应过去,所以从 B 的下标八开始执行。随后在绝对第三十二步触发块 C,在第四十步交接。稳定运行后相邻触发相隔十六步,而不是二十四步。下图假定推理都按时完成,首次启动等待单独计算,避免把启动延迟混入稳态时序。

...详情请参照古月居

相关推荐
敢敢のwings5 小时前
从 VPP 到 VPP2:让机器人看懂未来,再把未来变成动作
机器人
小lo想吃棒棒糖6 小时前
把机器人训练从 GPU 搬到昇腾 NPU:启元 Q1 起身动作 PPO 训练全记录
python·机器人·昇腾·启元机器人
天树星智源6 小时前
机器人 VLA 一个模型同时动手和动脑:动作参数只占 0.21%,万级扰动任务 85.9%
论文阅读·机器人·vla·全身控制
lisw057 小时前
基于神经网络的机器人导航系统的设计与执行!
神经网络·机器人·自动化
敢敢のwings8 小时前
机器人如何通过触觉认识物体:从材质分类到接触状态判断
分类·机器人·材质
米糕闯编程21 小时前
鱼香ros2(二十五)导航
机器人·slam·ros2·launch·navigation2
猫先生Mr.Mao2 天前
RoboRSI详解:机器人自进化为什么需要任务结构和技能边界
机器人·多智能体·论文解读·具身智能·自进化·roborsi
敢敢のwings2 天前
RPV-SemNav 深度解析:让机器人先理解房间,再决定去哪里找目标
机器人
好悬给我拽开线2 天前
RoboJEPA:扩展机器人潜在世界模型
机器人