OpenVLA 模型详解

生成日期: 2026-09-30

OpenVLA

基本信息

项目

内容

全称

Open Vision-Language-Action Model

机构

Stanford / UC Berkeley

论文

[OpenVLA: Open-Source Vision-Language-Action Model](https://openvla.github.io/)

模型规模

7B 参数

架构

Transformer (基于 Llama 2/3)

动作类型

离散 Token(映射自连续动作)

训练方式

模仿学习 (Imitation Learning)

模型架构图

输入图像 ──→ SigLIP Encoder ──→ 图像Embedding ──┐
                                                     ├──→ LLM Backbone (Llama 2/3) ──→ 动作Logits
文本指令 ──→ Text Embedding ────────────────────────┘
                                                     ↑
                                              图像和文本拼接

动作Logits ──→ Action Head (256类) ──→ 动作Token ID ──→ 查表 ──→ 连续动作

公式列表

公式 1:图像 SigLIP 编码

$$I_{emb} = \text{SigLIP}(I_{raw})$$

项目

内容

**输入**

原始图像 $I_{raw} \in \mathbb{R}^{H \times W \times 3}$

**输出**

图像嵌入向量 $I_{emb} \in \mathbb{R}^{N \times D}$

**作用**

预训练的 SigLIP 把图像转成语义向量

场景: 输入一张机械臂相机拍摄的桌面图片

输入: [224, 224, 3] RGB图像
输出: 256个token, 每个token 1024维向量

比喻: 狗能闻气味,人能看语义

• 狗闻到: 面包味、苹果味

• SigLIP 看到: "这是一个桌面,上面有红色积木"

变化:

之前: 像素矩阵 [224×224×3] = 150,528 个数值
之后: 语义向量 [256×1024] = 262,144 个有意义的数

公式 2:文本Embedding

$$T_{emb} = \text{TextEncoder}(text)$$

项目

内容

**输入**

文本字符串 "pick up the red block"

**输出**

文本嵌入向量 $T_{emb} \in \mathbb{R}^{M \times D}$

**作用**

把文字转成模型能理解的向量

场景: 输入 "pick up the red block"

输入: 4个单词
输出: 每个单词 → 1024维向量,共4个向量

比喻: 查词典

• 每个英文单词 → 中文解释

• 每个文本token → 1024维向量

变化:

之前: "pick up the red block" (20个字符)
之后: [4×1024] 的向量序列

公式 3:多模态特征融合

$$X = \text{Concat}(I_{emb}, T_{emb})$$

项目

内容

**输入**

图像嵌入 $I_{emb}$ + 文本嵌入 $T_{emb}$

**输出**

拼接后的序列 $X \in \mathbb{R}^{(N+M) \times D}$

**作用**

把图像和文本拼成一条序列送给LLM

场景: 看到图像 + 听到 "pick up the red block"

图像序列: [img_1, img_2, ..., img_256]  (256个token)
文本序列: [pick, up, the, red, block]   (5个token)
融合后:   [img_1, ..., img_256, pick, up, the, red, block]

比喻: 边看图边听讲解

• 看着幻灯片

• 听着解说词

• 两者结合理解内容

变化:

之前: 图像[256×1024] + 文本[5×1024] = 两个独立张量
之后: [261×1024] = 一个拼接的大序列

公式 4:动作空间离散化(Action Binning)

$$a_{discrete} = \left\lfloor \frac{a_{continuous} - a_{min}}{bin\_size} \right\rfloor$$

$$bin\_size = \frac{a_{max} - a_{min}}{256}$$

项目

内容

**输入**

连续动作 $a_{continuous} \in \mathbb{R}$

**输出**

离散动作ID $a_{discrete} \in \{0, 1, ..., 255\}$

**作用**

把连续动作分成 256 个 bins

场景: 机械臂末端位置动作值 0.45678 米

动作范围: 0.0 ~ 1.0 米
bin_size = 1.0 / 256 ≈ 0.0039 米/每bin

Token = floor((0.45678 - 0.0) / 0.0039)
      = floor(117.1)
      = 117

公式验证:

Token 117 对应的动作范围:
  起始: 117 × 0.0039 = 0.4563 米
  结束: 118 × 0.0039 = 0.4602 米
  原始值 0.45678 在这个范围内 ✓

比喻: 手机音量分级

• 音量范围: 0 ~ 100%

• 手机只有 26 级音量 (0, 4, 8, 12, ..., 100)

• 按一下调 4%,无法调到 37%

变化:

之前: 0.45678 米(精确值)
之后: 117 (离散ID)

公式 5:动作预测(LLM Forward)

$$P(a_{next}) = \text{Llama2/3}(X)$$

项目

内容

**输入**

融合后的序列 $X$

**输出**

下一个动作的 256 维概率分布

**作用**

根据图像和文本预测动作Token

场景: 看到图像和文本,预测下一个动作

输入: [图像序列][文本序列]
     ↓ Llama2/3 前向传播
输出: 动作Token的概率分布
      [0.001, 0.001, ..., 0.42(at index 117), ..., 0.001]

比喻: 智能联想输入法

• 输入 "今天天气"

• 候选词: "很好"(0.6), "不错"(0.3), "糟糕"(0.1)

• 选择概率最高的候选词

变化:

之前: 输入序列 [261×1024]
之后: 256个动作的概率 [256]

公式 6:动作解码(查表)

$$a_{continuous} = \text{ActionDecode}(a_{discrete})$$

$$a_{continuous} = a_{min} + (a_{discrete} + 0.5) \times bin\_size$$

项目

内容

**输入**

离散 Token ID (0-255)

**输出**

连续动作值

**作用**

把 Token ID 变回实际动作

场景: 预测了 Token 117,需要执行

Token ID: 117
bin_size: 0.0039
动作值: 0.0 + (117 + 0.5) × 0.0039 = 0.45855 米

量化误差分析:

真实需要的动作: 0.45678 米
模型预测的动作: 0.45855 米
误差: |0.45678 - 0.45855| = 0.00177 米 ≈ 1.77mm

比喻: 成绩单换算

• 原始分: 87.5分

• 等级: B+ (对应 85-90 分)

• 换算回百分制: 87.5分

变化:

之前: Token ID = 117
之后: 动作值 = 0.45855 米

公式 7:多任务学习损失

$$\mathcal{L} = \mathcal{L}_{action} + \lambda \cdot \mathcal{L}_{language}$$

$$\mathcal{L}_{action} = -\log P(a_{discrete} | I, text)$$

项目

内容

**输入**

预测分布和真实标签

**输出**

总损失(动作损失 + 语言损失)

**作用**

同时训练动作预测和语言理解

场景: 一个样本同时包含动作和文本

输入: 图像 + "close gripper"
动作标签: Token 45
语言标签: "close gripper"

损失 = -log(预测动作概率) + λ × (-log(预测文本概率))

为什么需要语言损失?

• 防止模型只学会动作,忘掉语义

• 让模型同时理解"夹爪闭合"和"close gripper"

变化:

之前: 随机初始化的模型
之后: 损失值反向传播更新权重

完整数据流程

1. 输入准备
   图像: [224, 224, 3] 相机图
   文本: "pick up the red block"

        ↓ SigLIP编码 (公式1)
2. 图像编码
   图像: → [256, 1024] 图像嵌入

        ↓ 文本Embedding (公式2)
3. 文本编码
   文本: → [5, 1024] 文本嵌入

        ↓ 特征融合 (公式3)
4. 多模态融合
   序列: [256+5, 1024] = [261, 1024]

        ↓ LLM预测 (公式4,5)
5. 动作预测
   输出: Token 117 概率最高

        ↓ 动作解码 (公式6)
6. 执行
   Token 117 → 0.45855m → 机械臂移动

公式汇总表

#

公式

输入

输出

解决什么问题

1

$I_{emb} = \text{SigLIP}(I_{raw})$

像素图像

语义向量

图像如何被理解

2

$T_{emb} = \text{TextEncoder}(text)$

文本字符串

文本向量

文字如何被理解

3

$X = \text{Concat}(I_{emb}, T_{emb})$

图+文

融合序列

多模态如何一起输入

4

$a_{discrete} = \lfloor (a-a_{min})/bin\_size \rfloor$

连续动作

0-255 ID

连续值如何变成Token

5

$P(a_{next}) = \text{Llama2/3}(X)$

融合序列

256维概率

下一个动作是什么

6

$a_{cont} = a_{min}+(a_{discrete}+0.5) \times bin\_size$

Token ID

连续动作

Token变回动作值

7

$\mathcal{L} = \mathcal{L}_{action} + \lambda \mathcal{L}_{lang}$

预测/真实

损失值

如何同时学动作和语义

与 RT-2 的区别

对比项

RT-2

OpenVLA

Vision Encoder

ViT (Google自研)

SigLIP (开源)

LLM Backbone

PaLM (Google)

Llama 2/3 (开源)

动作bins

未公开

256 bins

开源程度

专有

完全开源

训练数据

RT-1 数据

Open X-Embodiment

场景比喻总结

公式

生活比喻

一句话

1. SigLIP编码

看图说话

图片变成语义描述

2. 文本Embedding

查词典

文字变成词向量

3. 特征融合

边看图边听讲

图文拼成一串

4. 动作离散化

手机音量分级

连续值分成256档

5. LLM预测

联想输入法

看图猜词

6. 动作解码

成绩换算

Token变回具体数值

7. 多任务损失

又学动作又学语言

两手抓两都要

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐