OpenVLA-OFT:VLA 微调方法论——从自回归到并行 MLP 回归¶
背景知识
| 属性 | 值 |
|---|---|
| 开发者 | Stanford(Moo Jin Kim, Chelsea Finn, Percy Liang) |
| GitHub | moojink/openvla-oft |
| 论文 | arXiv:2502.19645 |
| 基座模型 | OpenVLA 7.5B(Prismatic VLM = SigLIP + DINOv2 + Llama-2 7B) |
一句话定位:不是一个新模型,而是一套 VLA 微调方法论(Optimized Fine-Tuning recipe)——通过三个设计决策(并行解码、连续 MLP 动作头、L1 回归目标)将 OpenVLA 的推理速度提升 26–43x、成功率从 76.5% 提升至 97.1%,并系统性证明微调策略比预训练数据覆盖更重要1。后被 StarVLA 作为四种 Action Head 范式之一纳入统一对比。
核心问题:自回归 VLA 为什么不够用¶
原始 OpenVLA 沿用语言模型的自回归范式预测动作——将 7 维动作(3 位置 + 3 姿态 + 1 夹爪)各离散化为 256 个 bin,然后逐 token 串行生成:
每生成一个 token 需要一次完整的 decoder forward pass。这带来两个瓶颈:
- 速度:单步动作需要 7 次串行前向传播,在 A100 上仅 4.2 Hz(0.24s 延迟),而双臂机器人需要 25–50 Hz
- 动作精度:连续动作值被强制量化到 256 个离散 bin(约 0.008 精度),精细操作信息被丢弃
如果要做 action chunking(一次预测 K 步),串行次数变为 \(K \times D\)——K=8 时需要 56 次前向传播,完全不可用。
OFT 方法论:三个设计决策¶
决策一:并行解码替代自回归¶
核心改动:将因果注意力掩码换成双向注意力,用空的 action embeddings(仅靠位置编码区分)替代 teacher forcing 输入。
flowchart LR
subgraph "原始:自回归"
direction LR
A1["图像+语言"] --> D1["decoder<br/>×7 次"]
D1 --> T1["token₁→token₂→...→token₇"]
end
subgraph "OFT:并行解码"
direction LR
A2["图像+语言 + 空 action embeddings"] --> D2["decoder<br/>×1 次"]
D2 --> T2["同时输出全部动作"]
end
这样一次前向传播就能输出所有动作维度。加上 action chunking,预测 K 步只需在输入中多插几组空 embedding,总计仍然只需一次前向传播——K=8 时吞吐从 4.2 Hz 跳到 109.7 Hz(26x)。
关键的是,并行解码不仅提升速度,还提升了成功率(+14%)。论文推测 action chunking 帮助捕获时序依赖并减少累积误差,在长序列任务上尤为明显(LIBERO-Long 从 53.7% 升到 86.5%)。
决策二:MLP action head 直接回归连续动作¶
这是 OFT 方法论中最核心的架构改动,也是后来被 StarVLA 等框架广泛采用的设计。
原始方案:decoder 最后一层的 hidden states 经过线性投影 → softmax → 256-way 分类,选出离散 bin ID,再反量化回连续值。本质上是把回归问题硬转成了分类问题。
OFT 方案:将这个分类层替换为一个 MLP(多层感知机),直接输出连续浮点数:
decoder hidden states [B, K×D, 2048]
↓
┌─────────────┐
│ Linear 2048→1024 │
│ ReLU │ ← 第 1 层
├─────────────┤
│ Linear 1024→512 │
│ ReLU │ ← 第 2 层
├─────────────┤
│ Linear 512→256 │
│ ReLU │ ← 第 3 层
├─────────────┤
│ Linear 256→1 │ ← 第 4 层
└─────────────┘
↓
连续动作值 [B, K×D] (每个位置输出 1 个浮点数)
每个 action token 位置的 hidden state 独立通过同一个 MLP,输出对应维度和时间步的动作值。MLP 总参数约 151M,相对于 7.5B 的 backbone 仅占 2%。
为什么 MLP 就够了:VLM backbone 的 hidden states 已经编码了"该怎么做"的高级语义——空间关系、物体属性、任务目标都已经压缩在 2048 维向量中。MLP 的角色只是一个"翻译器",将抽象表征映射到具体的物理量。这个映射本质上接近线性,不需要复杂的非线性建模能力,堆 4 层带激活函数的线性变换就足够了。StarVLA-α 后来的消融实验证实了这一点——在 Qwen3-VL-4B backbone 上,MLP head 与更复杂的 Flow Matching DiT head 表现几乎相同2。
决策三:L1 回归目标¶
训练目标选择 L1 loss(平均绝对误差),而非 diffusion/flow matching 的迭代去噪:
对比三种学习目标:
| 目标 | 推理方式 | 吞吐(K=8) | LIBERO-Long SR |
|---|---|---|---|
| Next-token prediction(原始) | 自回归 K×D 步 | 4.2 Hz | 53.7% |
| Diffusion(50 步去噪) | 并行,但迭代 50 次 | 4.2 Hz | 91.1% |
| L1 regression | 并行,单次前向 | 109.7 Hz | 90.7% |
L1 和 diffusion 成功率相当,但 L1 快 26 倍。更值得注意的是 L1 在不完美数据上的鲁棒性优势:diffusion 会忠实复现训练数据中的次优行为(比如演示者偶尔将勺子插得太深),而 L1 天然倾向于学习动作分布的中位数模式,等效于对噪声和次优轨迹做了隐式正则化。
OFT+ 变体:FiLM 语言调制¶
在真实 ALOHA 双臂机器人上部署时,多视角摄像头引入视觉虚假相关——policy 学会根据物体在画面中的位置预测动作,而忽略语言指令。去掉 FiLM 后语言跟随率降至随机水平(33%)。
解决方案:在视觉编码器(SigLIP + DINOv2)的每个 Transformer 块中插入 FiLM(Feature-wise Linear Modulation)层:
其中 \(\gamma, \beta\) 由语言 embedding 均值经线性投影得到,\(\mathbf{F}\) 是视觉 patch embeddings。关键实现细节:\(\gamma, \beta\) 的每个元素对应 hidden dimension 的一个维度(而非一个 patch),实现空间无关的全局调制——与 CNN 中 FiLM 对整个 feature map 做缩放/偏移的语义一致。
核心发现:微调策略 > 预训练数据覆盖¶
| 方法 | 预训练含双臂数据 | ALOHA 平均成功率 |
|---|---|---|
| ACT(从头训练) | — | 最低 |
| Diffusion Policy(从头训练) | — | 中等 |
| RDT-1B(微调) | 6K 集双臂 | 中等偏上 |
| \(\pi_0\)(微调) | 8K 小时双臂 | 高 |
| OpenVLA-OFT+(微调) | 完全没有 | 最高(+15%) |
OpenVLA 预训练数据全部是单臂机器人,但通过 OFT 微调后在双臂灵巧任务上超越了专门预训练过双臂数据的 \(\pi_0\) 和 RDT-1B。这说明对于下游任务而言,怎么微调比预训练时见过什么更关键。