5.1 VLA 模型架构总览:视觉-语言-动作的统一建模 VLA 的革命性在于:它不再把视觉理解、语言理解、动作生成拆成三个独立模块,而是用一个 Transformer 把它们统一为「输入图像+指令,输出动作」的端到端映射。 5.1.1 VLA 的核心思想 传统机器人系统的「感知-决策-执行」是三个独立模块: 每个模块独立训练、独立优化,模块间用人工设计的接口连接。这种「流水线」架构有诸多痛点: 接口信息损失:视觉模型输出「物体位置」时丢失了大量像素细节。 错误传播:上游小错被下游放大。 不能联合优化:每个模块只优化自己的目标,整体未必最优。 VLA 的核心思想是端到端: 把整条流水线压缩成一个神经网络,所有参数联合训练。这样: 信息无损传递(图像特征直接进入动作生成)。
VLA 的革命性在于:它不再把视觉理解、语言理解、动作生成拆成三个独立模块,而是用一个 Transformer 把它们统一为「输入图像+指令,输出动作」的端到端映射。
传统机器人系统的「感知-决策-执行」是三个独立模块:
图像 → 视觉模型 → 物体位置 → 规划器 → 子目标 → 技能库 → 关节序列 → 控制器 → 力矩
每个模块独立训练、独立优化,模块间用人工设计的接口连接。这种「流水线」架构有诸多痛点:
VLA 的核心思想是端到端:
图像 + 语言指令 → [VLA 模型] → 动作序列
把整条流水线压缩成一个神经网络,所有参数联合训练。这样:
💡 类比:传统架构像「分工明确的工厂流水线」,VLA 像「一个全能匠人」。前者效率高但僵化,后者灵活但训练难。VLA 之所以成为热点,是因为大模型时代让我们终于有算力训练这种「全能匠人」。
虽然具体实现各异,主流 VLA 都遵循一个统一架构:
四个核心组件:
| 组件 | 职责 | 代表实现 |
|---|---|---|
| 视觉编码器 | 把图像编码为视觉 token 序列 | ViT、SigLIP、CLIP、DINOv2 |
| 文本编码器/Tokenizer | 把语言指令编码为文本 token | LLM 的 tokenizer(BPE/WordPiece) |
| 多模态 Transformer 主干 | 融合视觉、语言、本体感觉 token,输出 hidden state | LLM 主干(Gemma、Llama、PaLI) |
| 动作头(Action Head) | 把 hidden state 转为动作 | 离散:token 分类;连续:扩散/Flow/MLP |
下面分别拆解。
VLA 的视觉编码器常用预训练的视觉基础模型:
| 编码器 | 训练方式 | 特点 |
|---|---|---|
| ViT | 监督学习 ImageNet | 经典 backbone |
| CLIP | 图文对比学习 | 文本对齐,开放词汇 |
| SigLIP | 改进的 CLIP(sigmoid loss) | 比 CLIP 更稳健 |
| DINOv2 | 自监督学习 | 强语义特征 |
| NaViT/Pyramid ViT | 原生任意分辨率 | 适合变分辨率输入 |
视觉编码器把图像(H×W×3)切成 patch(如 16×16),每个 patch 编码为一个向量(通常 1024-2048 维)。一张 224×224 的图像有 196 个 patch,对应 196 个视觉 token。
⚠️ 关键设计:视觉 token 数量直接影响计算量。196 个 token 进 LLM 已经很重,如果用高分辨率图像(如 448×4448,784 个 token),计算量爆炸。当前 VLA 模型常用「双分辨率」策略:低分辨率全局图 + 高分辨率局部图(如手腕相机),平衡信息与计算。
VLA 通常复用现有 LLM 的 tokenizer,把语言指令编码为文本 token:
"Pick up the red cup" → [Pick, up, the, red, cup] → [token_id_1, ..., token_id_5]
更进一步,VLA 直接借用 LLM 的预训练权重——这是 RT-2 的关键创新:复用 PaLM/PaLI 等 LLM 的语言能力,让 VLA 一出生就具备语言理解。这是「LLM 即 VLA 的主干」思想。
视觉 token、文本 token、本体感觉 token 拼成一个序列,喂给 Transformer 主干:
[V1, V2, ..., V196, L1, L2, ..., L5, P1, P2, ..., P7] → Transformer → hidden states
主干通常是一个预训练 LLM(如 Gemma 2B、Llama 3 8B、PaLI 540B)。注意几个设计选择:
| 选择 | 含义 | 代表 |
|---|---|---|
| 冻结视觉编码器 | 视觉编码器不更新,只训主干和动作头 | OpenVLA |
| 全参数微调 | 视觉、主干、动作头都训 | RT-2(数据充足时) |
| LoRA 微调 | 只训低秩适配器 | 资源受限时 |
| 本体感觉是否输入 | 是否给主干当前关节状态 | 多数 VLA 都给 |
主干输出的 hidden states 进入动作头。
动作头是 VLA 最有创新空间的部分。当前主流有三种:
把连续动作离散化为 token,让 VLA 像「生成文本」一样生成动作。这是 RT-1、RT-2、OpenVLA 的做法。
具体做法(以 RT-2 为例):
# 动作 token 化伪代码 def tokenize_action(action_7d): # action_7d 是 7 维连续动作,每维 [-1, 1] tokens = [] for dim_value in action_7d: bin_idx = int((dim_value + 1) / 2 * 255) # 量化到 [0, 255] tokens.append(action_vocab_token(bin_idx)) return tokens # 7 个 token def detokenize_action(tokens): return [(tok / 255 * 2 - 1) for tok in tokens]
优点:复用 LLM 的自回归生成,与文本 token 同构,可无缝接入现有 LLM 训练管线。
缺点:(1) 量化误差;(2) 自回归生成本质慢;(3) 难以建模多模态动作分布(一个状态可能对应多个合理动作)。
不离散化,用扩散模型(Diffusion)生成连续动作。这是 Diffusion Policy、π0 的思路。详见 5.2 节。
比扩散更新的生成式方法,用连续时间流(Flow)建模动作分布。π0 用 Flow Matching 替代 Diffusion,速度快、质量高。详见 5.2 节。
除了「离散 vs 连续」,动作表征还有几个维度需要选择:
| 维度 | 选项 | 说明 |
|---|---|---|
| 动作空间 | 关节空间 / 末端空间 / 任务空间 | 关节空间最直接,末端空间更可解释 |
| 动作类型 | 绝对位置 / 增量(delta)/ 速度 | delta 最常用(输出当前帧的变化) |
| 输出单位 | 单步 / chunk(多步) | chunk 更能补偿延迟,第 5.2 详述 |
| 频率 | 与视觉同步(10-30Hz)/ 控制频率(100-1000Hz) | VLA 通常 10-30Hz,下游插值到更高频 |
💡 业界共识:当前主流 VLA 输出末端位姿增量(delta EE pose)+ 夹爪开合,以 chunk 形式(一次输出未来 8-16 步),频率 10-30Hz。下游控制器(第 6 章)把 chunk 插值并跟踪到 100-1000Hz。
VLA 用 Transformer 做控制,相比 NLP 有几个独特挑战:
VLA 训练需要大量「(图像, 指令, 动作)」三元组。数据来源:
| 来源 | 规模 | 质量 | 成本 |
|---|---|---|---|
| 遥操作(第 7.1 节) | 万-百万条 | 高(真实任务) | 极高 |
| 仿真(第 7.2 节) | 百万-亿条 | 中(域差) | 中 |
| 互联网视频 | 亿级 | 低(无动作标签) | 低 |
| 自主探索(RL) | 视情况 | 中 | 中(算力) |
| 跨本体聚合(Open X) | 百万级 | 中高 | 共享 |
数据是当前 VLA 的核心瓶颈——架构已逐渐收敛,但高质量真实操作数据稀缺。第 7 章会专门讨论数据问题。
| 场景 | 推荐 |
|---|---|
| 开放语义任务(家庭、办公) | VLA(语言泛化强) |
| 精细工业操作(装配、焊接) | 传统控制(精度高) |
| 长程多步任务(做早餐) | LLM 规划 + VLA 执行(分层) |
| 高速动态任务(接球、平衡) | 经典 RL + MPC(VLA 太慢) |
| 全新场景快速部署 | VLA(少样本即可) |
| 高可靠性工业线 | 传统架构(可验证) |
💡 当前格局:VLA 适合泛化优先、精度次要的场景;传统架构适合精度优先、可解释的场景。两者在分层架构中协作——VLA 做高层策略,传统控制做底层执行。
下一节《5.2 策略表征与生成式策略》将深入扩散策略与 Flow Matching,看它们如何解决「动作多模态性」这个核心难题。