Paper
Introduce
在高度多样化的数据集上进行pretrain, 然后在根据需要的任务进行fine-tune(align), 能有更好的效果.
采用cross-embodiment training, 将来自多个不同机器人的数据合并到一个模型中
使用action chunking architecture with flow matching, 加速推理: 50 Hz
为了将flow matching和VLM结合, 提出了action expert
Related Work
FlowMatching
Diffusion的一个变种, 主要使用flow matching的loss而不是之前的cross-entropy
提供了高精度和多模态的建模能力
Transfusion
graph TB a(Text)-->|Tokenizer|b(token)-->|Embedding Layer|e(embedding vector) c(Image)-->|VAE|d(patch vector)-->|projector|e-->f(Transformer)-->z(output vector) z-->|tokenizer decode|h(text) z-->|projector decode|j(image patch vector)-->|diffusion denoise|k(image)
Overview
Dataset: combine 自己的数据集和OXE数据集
pretrain stage: 训练一个base model在多种任务上有泛化能力
post-train stage: fine-tune base model使其适应特定的下游任务
The Model
模型主要由一个LLM backbone组成. 使用conditional flow matching对robot action的continuous distribution进行建模. 受到Transfusion的启发, 使用multiple objectives训练一个单独的transformer, 并使用flow matching对image的输出进行supervise. 使用独立的权重针对robot action可以提升performance. 因此有两个独立的flow matching weights, 第一个是image的, 第二个是robot action的(称作action expert)
希望model data distribution: , 是未来的action chunk, , 其中是 time step的观测到的第个image(每个robot都有2-3个image), 是sequence of language tokens, 是机器人的关节角度向量.
对于中的每一个action , 都有一个对应的action token, 通过action expert进行处理. 使用flow matching的loss 进行处理:
其中, 下标表示time step, 上标表示flow matching step, .
flow matching的probability path为simple Gaussian(or optimal transport)的时候, 有strong empirical performance, probability path由给出.
在训练中, Network采样随机噪声, 然后进行加噪, 通过训练network 以匹配去噪向量场
在inference的时候, 从到积分学到的向量场来生成action. 从随机噪声开始, 使用Euler integration rule:
其中是integration step size. 这里使用, 10 integrate step.
使用PaliGemma作为LLM backbone
Train recipe
配置action space dimension始终为max: 18, 2个6 DoF的arms, 2个gripper, 一个自由移动的底座, 一个垂直移动的躯干. 对于low-dimension的robot, 使用0-padding. 对于摄像头少的robot, 会屏蔽对应的图片槽位.
使用fine-tune和prompt将复杂的动作分解成简单的任务, 然后根据简单的任务生成actions.
graph TD PD["π Dataset <br> (自有灵巧任务数据)"] OD["Open X-Embodiment <br> (开源多任务数据)"] ID["Internet-scale Data <br> (互联网图文数据)"] ID -- "用于预训练" --> VLM_Init(PaliGemma VLM) VLM_Init -- "加载权重" --> VLM["VLM Backbone <br> (视觉语言主干)"] PD & OD --> DM("数据混合器 <br> Data Mixture") DM --> Sampled("从数据集中采样一个时间步 t") Sampled -- "观察数据 (o_t)" --> Img("多视角图像 I_t") Sampled -- "观察数据 (o_t)" --> Lang("语言指令 l_t") Sampled -- "观察数据 (o_t)" --> Prop("机器人本体状态 q_t") Sampled -- "标签数据" --> GT_Action("真实的未来动作序列 A_t") GT_Action --> Noise_Proc Noise["采样随机噪声 ε"] --> Noise_Proc(""结合动作与噪声"") Noise_Proc --> Noisy_Action("生成带噪动作 A_t^τ") Noise_Proc -- "计算目标" --> Target_Field("目标向量场 u = ε - A_t") Img & Lang --> VLM Prop --> AE["Action Expert <br> (动作专家)"] Noisy_Action --> AE VLM -- "通过注意力机制交互" <--> AE AE -- "预测" --> Pred_Field("预测的向量场 v_θ") Pred_Field & Target_Field --> Loss("计算流匹配损失 <br> ||v_θ - u||²") Loss -- "反向传播" --> Update(更新VLM和动作专家的权重)
Inference Recipe
“
graph TD Img("多视角图像 I_t") --> VLM Lang[语言instruction] --> VLM Prop --> AE VLM -- "计算并缓存K/V" --> AE Robot[机器人环境] -- "获取" --> Img Robot -- "获取" --> Prop("机器人本体状态 q_t") Start_Noise["从纯随机噪声 A^0 开始"] -- "迭代去噪循环<br>(例如10步)" --> AE AE -- "预测" --> Pred_Field("向量场 v_θ") Pred_Field -- "欧拉积分步进<br>A^{τ+δ} = A^τ + δ*v_θ" --> AE AE -- "10步后完成" --> Final_Action("最终预测的动作序列 A_t") Final_Action -- "发送至机器人控制器 执行动作" --> Robot