π0.5:a Vision-Language-Action Model with Open-World Generalization
π0.5: a Vision-Language-Action Model with Open-World Generalization
杂谈
从不同类型的数据进行学习,从不同方向进行学习,不再局限于一个特定的场景。像人类一样学习,不一定是亲身体验,可以是通过书籍,视频,或者别人的经验。
人类的神经可以模拟,但是激素呢?当然这个应该是让机器人更像人方向要考虑的问题。
$\pi_{0.5}$本质是训练方法,使用“异构多源数据”进行泛化训练,能在未见过的场景中完成任务(论文中提到,清洁未见过的厨房和卧室)。
cleaning an entire kitchen or bedroom based on only a high-level prompt
π₀.₅的巧妙之处:混合设计
实际上π₀.₅是分层端到端,不是完全黑箱:
1 | 高层(语义):端到端学习 |
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 | 整体任务:收拾餐具 ℓ |
输入序列设计
$$
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 | 输入序列(按顺序): |
为什么这样设计?
| 部分 | 为什么双向 | 为什么因果 |
|---|---|---|
| 图像/文本/动作输入 | 需要整体理解,没有先后顺序 | — |
| 生成输出 | — | 必须按顺序生成(先子任务后动作) |
输出序列设计
| 部分 | 处理方式 | 结果 |
|---|---|---|
| 文本输出 $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 | τ = 0: 全是噪声 → 0%数据 + 100%噪声 |
模型学什么?
问题:给定一个”半成品”(某个τ时的混合状态),模型要预测怎么继续修正
1 | 当前状态(τ=0.3): 30%目标 + 70%噪声 |
存疑?
目标向量 ω−a 就是从当前位置指向纯噪声的反向(即指向纯目标的方向)。
损失计算设计
We use the attention matrix to ensure that the different action representations do not attend to each other.(“我们使用注意力矩阵确保不同的动作表示互不关注。”)
1 | 两种动作表示: |
为什么能做到这样?类似专家权重吗,不同动作使用不同“专家”处理?—>Transformer&&Attention机制
- 共享表示空间
1
2
3
4
5
6
7
8
9 预训练时主干学到的:
"看到杯子" + "听到拿起" → 某种内部表示 [0.2, -0.5, 1.3, ...]
后训练时动作专家用的:
输入:噪声动作 + 同样的内部表示
↓
动作专家学会:把这种"理解"映射到"具体怎么动"
关键:两者说的是同一种"语言"(共享的嵌入空间)
- 条件计算(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 | 损失 = 文本损失 + α × 动作损失 |
| 符号 | 含义 | 解释 |
|---|---|---|
| $\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 | MM机器人动作:[关节1, 关节2, ...] → FAST编码 → [动作_5823] |
1 | 高层(语义层):共享 |
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 | 作用:让π₀.₅有"常识" |
后训练
| 预训练 | 后训练 | |
|---|---|---|
| 步数 | 280k步 | 80k步 |
| 动作表示 | 离散token(FAST) | 连续流匹配 |
| 动作专家 | 不存在/休眠 | 激活并训练(随机初始化) |
| α值 | 0(只算文本损失) | 10.0(动作损失权重很大) |
| 数据 | 全部四种(MM+ME+CE+WD+HL) | 筛选后的MM+ME+WD+部分HL+新增VI |
$$\alpha$$ = 10
1 | 损失 = 文本损失 + 10.0 × 动作损失 |
VI数据
1 | 传统数据: |
知识补充
混合专家(Mixture of Experts)思想:
1 | 整个π₀.₅模型: |
专家权重
1 | 输入序列(未统一编码): |
注意力模式
1 | 注意力矩阵: |
| 模式 | 名字 | 特点 | 用途 |
|---|---|---|---|
| 双向(Bidirectional) | 互相看 | 所有token可以互相关注 | 理解整体上下文 |
| 因果/单向(Causal) | 只看前面 | token只能关注自己和之前的 | 生成文本(一个一个出) |
损失
1 | 损失 = 衡量"模型预测"与"正确答案"差距的指标 |
1 | 序列位置: 1 2 3 4 5 6 7 |
机器人本体感受状态
1 | 机器人对自己身体状态的感知: |
标准logits
什么是logits?
1 | 神经网络输出预测前的"原始分数"(未归一化) |
图示流程
1 | 文本输出部分: |
对比:动作输出不一样
1 | 文本输出(标准logits): |
训练与推理
| 维度 | 训练 (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 | 第1步: 预测 token_1 |
关键特征
| 特征 | 说明 |
|---|---|
| 顺序依赖 | 每个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(加上动作) |
