OpenVLA 模型详解
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. 多任务损失 |
又学动作又学语言 |
两手抓两都要 |
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)