π0 的核心思路
这篇论文最有意思的地方,不是又做了一个'更大的 VLA',而是把机器人控制里几个长期纠缠在一起的问题拆开了:视觉语言理解交给 VLM,动作建模交给独立的 Action Expert,连续控制则用 Flow Matching 来做。这个拆法很像把'看懂世界'和'把手脚动起来'分开处理,工程上也更稳一点。
架构:VLM + Action Expert + Flow Matching
基础骨干用的是预训练视觉语言模型 PaliGemma(3B 参数)。它负责图像和文本里的语义理解,尽量保住互联网预训练带来的常识和推理能力。
动作部分没有直接塞进主干里,而是单独放了一个约 300M 参数的 Transformer,专门处理机器人本体状态(State)和动作(Action)。这样做的好处很直接:动作学习不会轻易把 VLM 原本的语义表征搞乱。
真正生成动作时,π0 没有走 RT-2、OpenVLA 那种把动作离散成 token 再自回归预测的路子,而是改用 Flow Matching 去建模连续动作分布。对机器人控制来说,这比离散 token 更贴近问题本身,也更适合高频、高精度的灵巧操作。
为什么不继续用自回归 token
自回归离散化在简单抓取任务里还能凑合,但一到叠衣服、整理物体这类动作细、频率高的任务,就很容易暴露短板。
先是精度不够。动作被切成有限个 bin 之后,连续控制需要的细节会被磨掉一部分。然后是误差累积。轨迹一旦前面偏了一点,后面就容易抖,越滚越难看。最后是效率问题。灵巧操作往往要跑到 50Hz,自回归逐步吐动作,延迟压不下来。
Flow Matching 的思路更适合这个场景。它天然能处理连续、多峰的动作分布,再配合 Action Chunking,一次生成未来一段动作序列,执行时就不用每一步都重新算一遍。
数据和跨本体训练
π0 用的数据量很大,超过 10,000 小时的真实机器人操作数据,再加上 OXE 数据集,覆盖了 7 种机器人形态和 68 个任务。
这里真正麻烦的不是数据量,而是机器人本体不统一:单臂、双臂、带移动底盘的系统,动作维度根本不是一套东西。论文的处理方式很朴素,直接用 zero-padding 把状态和动作对齐到最大维度,也就是 18 DoF。低自由度机器人缺的那几维就补零,相机视角缺失就 mask 掉。
这方法谈不上优雅,但很实用。至少在 Transformer 体系里,它能把'异构本体'压成一个统一表征,不用给每种机器人单独训练一套模型。
训练范式:先预训练,再后训练
π0 的另一个明显借鉴,是把机器人训练也拆成了类似大模型的两阶段。
第一阶段是预训练,数据来源杂,里面有大量混合任务和次优轨迹。这个阶段主要让模型见过足够多的物理交互,学到通用规律,也顺手学会怎么从偏差里恢复。
第二阶段是后训练,用更高质量、更干净的任务数据做精调,比如某些专门任务上的示范轨迹。这个阶段追求的是动作更顺、更像'会干活'的策略,而不是单纯扩大覆盖面。
如果只拿高质量数据从头训,模型往往会很脆。因为它只见过理想轨迹,现实里一旦有扰动,就不知道怎么把动作拉回来。预训练补的正是这一块。
几个实现细节
1. Flow Matching 的时间步采样
论文里有个挺有机器人味的选择:训练时采样时间步 (\tau) 时,分布偏向高噪声阶段,而不是老老实实均匀采样。
原因不难理解。图像生成时,模型往往要从几乎什么都没有的噪声里'造出'结构;但机器人动作不是这样。它是强条件问题,当前观测已经把可行动作空间压得很窄了。模型更需要学的是:在噪声很大时,怎么把动作一步步修正出来。
2. 为什么要隔离 VLM 和动作学习
π0 不是把整个模型一起端到端硬训,而是用了分块因果注意力掩码,把图像和文本块、状态和动作块分开。
前面的图像+文本块不能看到后面的状态和动作块,这样能避免连续动作学习把 VLM 预训练出来的分布弄偏。说白了,就是让懂语义的部分继续负责'看懂',让懂控制的部分去学'怎么动',中间只在注意力层做必要交互。
3. 真机上怎么做到 50Hz
模型大,流程也不算轻。它要做 10 步 Flow Matching 积分,还要在真机上跑到 50Hz。论文靠的是几件事叠在一起:
- 前缀缓存 KV Cache。图像、文本和历史状态这些条件信息基本不变,没必要每一步都重算。
- Action Chunking。一次生成未来一段动作,不用每个控制周期都完整推理。
- 动作专家做得比 VLM 小得多。真正循环积分的部分被压缩到 300M 级别,算力压力明显低一些。
这套组合拳谈不上华丽,但确实是机器人里比较靠谱的做法:把重计算尽量前移,把循环推理限制在最小必要范围内。

