π0.5: a Vision-Language-Action Model with Open-World Generalization

paper

杂谈

从不同类型的数据进行学习,从不同方向进行学习,不再局限于一个特定的场景。像人类一样学习,不一定是亲身体验,可以是通过书籍,视频,或者别人的经验。

人类的神经可以模拟,但是激素呢?当然这个应该是让机器人更像人方向要考虑的问题。

$\pi_{0.5}$本质是训练方法,使用“异构多源数据”进行泛化训练,能在未见过的场景中完成任务(论文中提到,清洁未见过的厨房和卧室)。

cleaning an entire kitchen or bedroom based on only a high-level prompt

π₀.₅的巧妙之处:混合设计

实际上π₀.₅是分层端到端,不是完全黑箱:

1
2
3
4
5
高层(语义):端到端学习
"清理卧室" → 自动分解为 "整理床铺→收衣服→擦桌子"

低层(动作):端到端学习
"整理床铺" → 直接输出机械臂关节角度

Q: 按照门的例子,如果一个从未见过的门,人类只需要演示一遍就可以操作,机器人怎么做到这一点,就是给他演示一遍,就让它自己上手?

A: π₀.₅的”泛化”是”见多识广后的举一反三”,不是人类式的”看一遍悟原理”。真正的单样本学习仍是未解决的难题——这也是机器人还没能进入普通家庭的核心瓶颈。

思考: 之前问过为什么大模型能够回答我们的问题,听过一个说法是,语言可以理解为一种概率输出,就是听到别人说什么,你大概率会说什么,模仿这种行为,让ai去学习各种知识,然后将语言对话可以转换成概率输出,那按理说VLA应该也可以这样操作,用一种新的抽象,去解决单样本学习的问题。

所以所谓像人类的AI,是不是也是一种“仿生学”。

模型和训练方案

整体设计思想

$$
\pi_\theta(a_{t:t+H},\hat{\ell}|o_t,\ell)=\pi_\theta(a_{t:t+H}|o_t,\hat{\ell})·\pi_\theta(\hat\ell|o_t,\ell)
$$

1
2
3
4
5
6
7
8
整体任务:收拾餐具 ℓ
↓ 第一步:高层推理(慢)
生成子任务:拿起盘子 ℓ̂
πθ(ℓ̂ | o_t, ℓ) = 看到情况 + 知道要收拾 → 决定先拿盘子

↓ 第二步:低层推理(快)
生成动作:具体怎么拿
πθ(a_{t:t+H} | o_t, ℓ̂) = 看到情况 + 知道要拿盘子 → 生成关节角度

输入序列设计

$$
y_{1:N} = f(x_{1:N},A(x_{1:N},\rho(x_{1:N})))
$$

三种token类型

符号 类型 具体是什么 例子
$x^w_i$∈$\mathbb{N}$ 文本 离散的数字编号 “plate” = 第5823号token
$x^I_i$∈$\mathbb{R^{p×p×3}}$ 图像 连续像素值,p×p大小,3通道 64×64的RGB图像块
$x^a_i$∈$\mathbb{R}^d$ 动作 连续向量,d维 [0.2, -0.5, 1.1, …]关节角度
部分 含义 作用
$x_{1:N}$ 输入序列 原始信息
$A(x_{1:N})$ 注意力机制 让模型知道”看哪里”、”关注什么”
$\rho(x_{1:N})$ 位置编码 告诉模型”这个token在序列中的位置”
$f(\cdot)$ Transformer网络 整体映射函数

注意力机制的具体设计

1
2
3
4
5
6
7
8
9
输入序列(按顺序):
[图像块1] [图像块2] ... [图像块n] [文本提示] [动作token1] [动作token2] ...

注意力规则:
├─ 图像块之间:双向 ← 互相看,理解整幅图
├─ 文本提示内部:双向 ← 理解完整句子
├─ 图像 ↔ 文本:双向 ← 图文互相理解
├─ 连续动作token之间:双向 ← 动作互相协调
└─ 生成部分(如子任务→动作):因果 ← 先生成的不能看后面的

为什么这样设计?

部分 为什么双向 为什么因果
图像/文本/动作输入 需要整体理解,没有先后顺序
生成输出 必须按顺序生成(先子任务后动作)

输出序列设计

部分 处理方式 结果
文本输出 $y_{1:M}^\ell$ 标准logits → softmax → 采样token 离散文本如”pick up the pillow”
动作输出 $y_{1:H}^a$ 动作专家 → 线性投影 连续动作值如关节角度
本体感受状态 离散化为文本token输入 关节角度变成数字文本如”30度”

动作训练设计

对于动作,预训练使用基于压缩的分词方法,因为当动作使用离散的token表示时,VLA训练可以快得多。特别是使用对动作块压缩高效的分词方案时。所以这个就是后面要研究的action chunking?

在后训练中,基于$\pi_0$的设计,使用流匹配表示动作分布,因为离散表示不适合实时推理。(需要昂贵的自回归解码)

技术 原理 通俗比喻 π₀.₅使用
压缩Tokenization 把动作序列编码成离散数字 像MP3压缩音频 ✅ 预训练
扩散模型(Diffusion) 从噪声逐步”去噪”生成动作 像雕塑家从泥块逐步雕出形状 ❌ 其他工作用
流匹配(Flow Matching) 学习从随机噪声到动作的最优路径 像GPS导航找最优路线 ✅ 后训练/推理

$$
a^{\tau,\omega}{t:t+H} = {\tau}a{t:t+H} + (1-\tau){\omega}
$$

其中$$ ω∼N(0,I)$$ ,$$τ∈[0,1]$$ 是流匹配时间索引,模型被训练来预测流向量场 $$ω−a_t$$ 。

符号 含义
$\omega$ 随机噪声(就像电视雪花屏)
$a$ 最终想要的动作序列
$\tau$ 进度条(0→1)

这其实就是加权平均

1
2
3
τ = 0:  全是噪声        →  0%数据 + 100%噪声
τ = 0.5: 一半一半 → 50%数据 + 50%噪声
τ = 1: 全是数据 → 100%数据 + 0%噪声

模型学什么?

问题:给定一个”半成品”(某个τ时的混合状态),模型要预测怎么继续修正

1
2
3
4
5
当前状态(τ=0.3):  30%目标 + 70%噪声

模型预测: "还需要往哪个方向走?"

答案: 往"噪声 - 目标"的方向走(即减少噪声,增加目标成分)

存疑?

目标向量 ωa 就是从当前位置指向纯噪声的反向(即指向纯目标的方向)。

损失计算设计

We use the attention matrix to ensure that the different action representations do not attend to each other.(“我们使用注意力矩阵确保不同的动作表示互不关注。”)

1
2
3
4
5
6
7
8
9
两种动作表示:
├─ FAST离散动作:[动作类型_5, 动作类型_23](像文字编号)
└─ 流匹配连续动作:[0.5, -0.3, 1.2](像坐标值)

问题:如果它们互相看,会混淆
"动作类型_5" vs "0.5" 是完全不同的东西!

解决:注意力矩阵设为0,互相屏蔽
就像英语课和数学课,各学各的,不混着听

为什么能做到这样?类似专家权重吗,不同动作使用不同“专家”处理?—>Transformer&&Attention机制

  1. 共享表示空间
1
2
3
4
5
6
7
8
9
预训练时主干学到的:
"看到杯子" + "听到拿起" → 某种内部表示 [0.2, -0.5, 1.3, ...]

后训练时动作专家用的:
输入:噪声动作 + 同样的内部表示

动作专家学会:把这种"理解"映射到"具体怎么动"

关键:两者说的是同一种"语言"(共享的嵌入空间)
  1. 条件计算(Conditional Computation)
1
2
3
4
5
6
7
模型推理时:
if token_type == "text":
用主干的前馈层
elif token_type == "action_discrete":
用主干的前馈层(预训练方式)
elif token_type == "action_continuous":
用动作专家的前馈层(后训练方式)

同一个网络,根据输入类型”路由”到不同内部路径

$$
\mathbb{E}{D,\tau,\omega} \left[ H(x{1:M}, f_\theta^\ell(o_t, \ell)) + \alpha \left| \omega - a_{t:t+H} - f_\theta^a(a_{t:t+H}^{\tau,\omega}, o_t, \ell) \right|^2 \right]
$$

1
2
3
4
损失 = 文本损失 + α × 动作损失
↓ ↓
离散token预测 连续流匹配预测
(自回归) (迭代去噪)
符号 含义 解释
$\mathbb{E}_{D,\tau,\omega}$ 期望 对所有训练数据、时间步、噪声取平均
$H(\cdot, \cdot)$ 交叉熵损失 衡量”预测的概率分布”与”真实答案”的差距
$x_{1:M}$ 真实的文本token序列 包括语言指令和FAST编码的离散动作
$f_\theta^\ell(\cdot)$ 文本预测函数(大模型) 输入观测和指令,输出文本logits
$\alpha$ 权衡参数 控制两个损失的权重,像音量调节旋钮
$\omega$ 随机噪声 从标准正态分布采样,流匹配的起点
$a_{t:t+H}$ 真实动作序列 人类演示的动作,训练的目标
$a_{t:t+H}^{\tau,\omega}$ 流匹配中间状态 $\tau \times$真实 + $(1-\tau) \times$噪声
$f_\theta^a(\cdot)$ 动作专家(小模型) 输入中间状态,预测流场方向
$|\cdot|^2$ 均方误差(MSE) 衡量预测方向与真实方向的差距

预训练

把文本,位置和动作都编成统一格式token,使用广泛的数据进行训练,联系“预测下一个token”的能力。

MM data & ME data

利用其他机器人的经验

1
2
3
4
5
MM机器人动作:[关节1, 关节2, ...] → FAST编码 → [动作_5823]
ME机器人动作:[关节A, 关节B, ...] → FAST编码 → [动作_5823]

虽然原始动作不同,但编码后都是"离散token"
模型学到的是:"动作_5823"意味着"抓取"这个语义
1
2
3
4
5
6
7
8
高层(语义层):共享
"看到杯子 → 需要抓取 → 手要过去"
(MM和ME都一样)

低层(执行层):各自专门化
MM动作专家:学高个子怎么动
ME动作专家:学矮个子怎么动
(但π₀.₅只用MM动作专家,ME数据用于预训练高层)

CE data

CE数据是”机器人训练营”:在简化实验室里,用各种机器人练五花八门技能——有的直接考,有的练基本功——让π₀.₅成为”技能通才”,到真实家庭能举一反三。

高层子任务预测

similar to chain-of-thought prompting for language models, can help a trained policy reason about the current scene and better determine the next action.

语言模型(GPT) π₀.₅(机器人)
“解方程” → “先移项” → “再合并” → “最后求解” “清理卧室” → “整理被子” → “捡起枕头” → “擦桌子”
中间步骤用文字 中间步骤用子任务标签

核心思想:先规划,后执行

步骤 操作 例子
1. 标注边界框 标出关键物体位置 “被子”[100,200,300,400], “枕头”[150,250,50,80]
2. 预测边界框 模型先找物体 看到床,预测被子、枕头在哪
3. 预测子任务 决定做什么 “adjust the blanket”
4. 执行动作 具体怎么做 关节角度序列,实际整理被子

WD data

1
2
3
作用:让π₀.₅有"常识"
知道"杯子"长什么样,不只是怎么拿
知道"厨房"有什么东西,不只是怎么擦

后训练

预训练 后训练
步数 280k步 80k步
动作表示 离散token(FAST) 连续流匹配
动作专家 不存在/休眠 激活并训练(随机初始化)
α值 0(只算文本损失) 10.0(动作损失权重很大)
数据 全部四种(MM+ME+CE+WD+HL) 筛选后的MM+ME+WD+部分HL+新增VI

$$\alpha$$ = 10

1
2
3
4
5
6
损失 = 文本损失 + 10.0 × 动作损失

意味着:
├─ 动作损失更重要(专门化目标)
├─ 但文本损失保留(不能忘记怎么说话)
└─ 平衡:主要练动作,顺便维持语言能力

VI数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
传统数据:
人类操作机器人 → 录视频 → 模型学动作

VI数据(语言演示):
专家看着机器人做 → 实时说指令

"现在去桌子那边" → 机器人移动
"拿起那个杯子" → 机器人抓取
"放到水槽里" → 机器人放置

记录:(图像, "拿起那个杯子", 动作) 三元组

作用:教模型"什么时候该说什么指令"
即:高层子任务的时机和内容

知识补充

混合专家(Mixture of Experts)思想:

1
2
3
4
5
6
7
8
9
10
整个π₀.₅模型:
├─ 大LLM主干(2.6B参数):处理图像、理解语言、规划任务
│ → "清理卧室" → "先捡枕头"

└─ 动作专家(300M参数):专门生成动作
→ "捡枕头" → [关节角度序列]

像医院:
├─ 全科医生(大LLM):诊断、开检查单
└─ 专科医生(动作专家):专门做手术

专家权重

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
输入序列(未统一编码):
[图像块] [图像块] [文本] [文本] [动作值] [动作值]
↓ ↓ ↓ ↓ ↓ ↓
视觉编码器 视觉编码器 文本嵌入 文本嵌入 线性投影 线性投影
↓ ↓ ↓ ↓ ↓ ↓
[统一维度的向量] [统一维度的向量] ... 所有token变成同样大小,进入Transformer

但在Transformer内部:
├─ 图像token → 用"视觉专家"处理
├─ 文本token → 用"语言专家"处理
└─ 动作token → 用"动作专家"处理

输入序列(已统一编码):
[图像token] [图像token] [文本token] [动作token] [动作token]
↓ ↓ ↓ ↓ ↓
768维 768维 768维 768维 768维
↓ ↓ ↓ ↓ ↓
第一层Transformer
↓ ↓ ↓ ↓ ↓
注意力层(统一处理:所有token互相看)
↓ ↓ ↓ ↓ ↓
[混合信息] [混合信息] [混合信息] [混合信息] [混合信息]
↓ ↓ ↓ ↓ ↓
前馈层(专家处理:各走各的门)
↓ ↓ ↓ ↓ ↓
[视觉专家] [视觉专家] [语言专家] [动作专家] [动作专家]
↓ ↓ ↓ ↓ ↓
输出到下一层...

注意力模式

1
2
3
4
5
6
7
8
9
10
11
12
13
注意力矩阵:
想象一个N×N的表格,每个格子是0或1:

token1 token2 token3 token4
token1 1 1 1 0
token2 1 1 1 0
token3 1 1 1 0
token4 1 1 1 1

• 1 = 可以看(允许关注)
• 0 = 不能看(屏蔽)

上例中:token1-3互相看,token4可以看所有人,但token1-3不能看token4
模式 名字 特点 用途
双向(Bidirectional) 互相看 所有token可以互相关注 理解整体上下文
因果/单向(Causal) 只看前面 token只能关注自己和之前的 生成文本(一个一个出)

损失

1
2
损失 = 衡量"模型预测"与"正确答案"差距的指标
训练目标:最小化损失(让预测接近正确答案)
1
2
3
4
5
6
7
序列位置:  1      2       3        4        5        6        7
内容: [图1] [图2] [指令] [状态] [待预测] [待预测] [待预测]
↓ ↓ ↓ ↓ ↓ ↓ ↓
角色: 输入 输入 输入 输入 输出位置 输出位置 输出位置
↓ ↓ ↓ ↓ ↓ ↓ ↓
算损失? ✗ ✗ ✗ ✗ ✓ ✓ ✓
已知 已知 已知 已知 预测这里 预测这里 预测这里

机器人本体感受状态

1
2
3
4
5
6
7
8
机器人对自己身体状态的感知:
├─ 关节角度:胳膊肘弯了30度
├─ 夹爪开合:手指张开5厘米
├─ 躯干高度:升降台在0.8米位置
├─ 底座速度:每秒移动0.2米
└─ 等等...

类比人类:你知道自己手在哪、腿弯多少,不用看也能感觉到

标准logits

什么是logits?

1
2
3
4
5
6
7
8
9
10
神经网络输出预测前的"原始分数"(未归一化)

例子:预测下一个字是"猫"还是"狗"
神经网络输出:猫=2.5,狗=1.0

这就是logits(原始分数)

经过softmax:猫=0.82,狗=0.18

变成概率(总和为1)

图示流程

1
2
3
4
5
6
7
8
9
10
11
12
13
文本输出部分:
├─ Transformer最后一层 → 向量 [0.2, -0.5, 1.3, ...]
│ ↓
│ 线性层(投影到词汇表大小)
│ ↓
│ logits [2.5, 1.0, -0.3, 3.1, ...]
│ (每个词一个分数)
│ ↓
│ softmax → 概率 [0.1, 0.05, 0.02, 0.6, ...]
│ ↓
│ 采样 → "pick"(概率最高的词)

└─ 这就是"标准"的语言模型输出方式,所以叫"标准logits"

对比:动作输出不一样

1
2
3
4
5
6
7
文本输出(标准logits):
离散 → 概率分布 → 采样token

动作输出(不是logits):
连续值 → 流匹配生成 → 直接输出数字(如0.5, -0.3)

不需要"选一个字",而是"生成一个数"

训练与推理

维度 训练 (Training) 推理 (Inference)
定义 用大量数据教模型学习模式和规律 用训练好的模型对新数据进行预测
目的 调整模型参数(权重、偏置) 应用已学知识解决实际问题
计算方向 前向传播 + 反向传播 仅前向传播
计算量 极大(需要梯度计算、参数更新) 相对较小(单次前向计算)
数据 大规模训练数据集 单条或批量新数据
硬件需求 通常需要GPU/TPU集群,显存大 可在CPU/边缘设备运行,显存小
耗时 小时到天甚至周(如GPT-4训练数月) 毫秒到秒级(实时响应)
输出 模型参数文件(checkpoint) 预测结果(分类、生成文本、检测框等)

类比理解

  • 训练 = 学生学习知识(做练习题、对答案、改正错误)
  • 推理 = 学生考试答题(运用已学知识解决新问题)

按模型“生命周期”划分

名词 含义
预训练 (Pre-training) 在大规模通用数据上进行基础训练(如GPT在万亿token上训练)
微调 (Fine-tuning) 在预训练模型基础上,用特定领域小数据继续训练
部署 (Deployment) 将训练好的模型投入生产环境提供服务
蒸馏 (Distillation) 大模型教小模型,压缩模型同时保留能力

按计算类型划分

名词 含义
前向传播 (Forward Pass) 数据从输入层→隐藏层→输出层的计算过程
反向传播 (Backpropagation) 计算损失函数梯度,反向更新参数(仅训练时)
梯度下降 (Gradient Descent) 优化算法,沿梯度反方向调整参数
推理加速 (Inference Optimization) 量化、剪枝、编译优化等提升推理速度的技术

自回归解码

基本原理

自回归解码是逐个生成token的过程:

1
2
3
4
5
第1步: 预测 token_1
第2步: 将 token_1 作为输入,预测 token_2
第3步: 将 token_1, token_2 作为输入,预测 token_3
...
第N步: 预测 token_N(结束)

关键特征

特征 说明
顺序依赖 每个token依赖之前所有token
因果掩码 只能看左边,不能看右边
串行计算 无法并行,必须一步一步来

计算成本分析

成本来源 具体说明
时间复杂度 生成N个token需要N次前向传播 → O(N)
无法并行 每个token必须等前一个生成完 → 串行瓶颈
内存访问 每次都要加载模型权重 → 重复IO开销
KV-Cache管理 维护历史token的key/value缓存 → 额外内存和计算

实时推理中的致命问题

假设:

  • 动作块被压缩为 32个离散token
  • 模型推理延迟 10ms/token
  • 总延迟 = 32 × 10ms = 320ms

对于机器人控制:

  • 320ms的动作生成延迟 → 控制频率仅 3Hz
  • 机器人通常需要 10-50Hz 的控制频率
  • 无法满足实时性要求!

自回归 VS 流匹配

对比维度 离散token + 自回归 流匹配(连续)
表示空间 离散(整数token) 连续(实数向量)
生成方式 逐个token自回归 单步/少步直接回归
并行性 ❌ 串行 ✅ 可并行
推理步数 动作token数量(如32步) 通常1-10步
单次输出 1个token 整个动作向量

一些名词

术语 详细解释
交叉熵损失 分类问题的标准损失。比如真实是”猫”,模型预测”猫”的概率是0.8,损失就是-log(0.8)。预测越准,损失越小
FAST编码的动作token 连续动作[30.5°, 45.2°] → FAST压缩 → 离散编号[动作_5823] → 当作”词”来预测
动作专家 专门处理流匹配的小网络,300M参数,比大模型(2.6B)小很多
权衡参数α 预训练时α=0(只练文本),后训练时α>0(加上动作)