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"
变化:
之前: 随机初始化的模型
之后: 损失值反向传播更新权重
完整数据流程
- 输入准备
图像: 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. 多任务损失 | 又学动作又学语言 | 两手抓两都要 |