如果说过去十年计算机视觉的核心命题是"让机器看懂世界",大语言模型的核心是"让机器理解人类指令",那么下一个十年的星辰大海无疑是------让机器根据视觉信息和语言指令,自主完成物理世界中的操作任务。
这正是视觉-语言-动作模型(Vision-Language-Action Model,VLA) 要做的事。
想象这样一个场景:你对家庭机器人说"把茶几上的蓝色杯子放到厨房的第二个抽屉里",机器人环顾四周,识别出茶几、蓝色杯子、厨房位置、第二个抽屉,规划出移动路径,抓取杯子,打开抽屉,放置,关上抽屉------整个过程无需任何预编程动作,全靠模型对视觉场景的理解和对自然语言指令的解析。
VLA 正是实现这一愿景的关键技术。它统一了视觉感知、语言理解和动作生成三大能力,被视为具身智能(Embodied AI)和人形机器人的"大脑"。
本文将带你系统了解 VLA 模型的技术脉络、核心原理、代表性工作及未来趋势。
VLA 是什么?
2.1 基本定义
VLA 模型是一种多模态基础模型,输入通常包含:
-
视觉观测(Vision):来自相机、深度传感器等的图像或视频流;
-
语言指令(Language):自然语言描述的任务目标(如"打开冰箱门");
输出是:
- 动作序列(Action) :机器人末端执行器(如机械臂)在笛卡尔空间或关节空间中的运动轨迹,或更抽象的操作原语(如
pick(blue_cup))。
与传统的视觉-语言模型(VLM,只能输出文本)不同,VLA 的最终输出是可执行的控制指令,因此它必须内化物理世界的动态规律和操作常识。
2.2 VLA 与 VLM、LLM 的关系
| 模型类型 | 输入模态 | 输出模态 | 典型任务 |
|---|---|---|---|
| LLM | 文本 | 文本 | 对话、写作、推理 |
| VLM | 图像+文本 | 文本 | 图像描述、视觉问答 |
| VLA | 图像+文本 | 动作序列 | 机器人操作、导航 |
可以通俗地理解:VLM 让 AI 会"看"会"说",而 VLA 进一步赋予了 AI 会"做"的能力。
VLA 的技术演进路线
3.1 早期尝试:从 RT-1 到 RT-2
RT-1(Robotics Transformer 1) 是 Google 于 2022 年发布的机器人 Transformer 模型。它首次将 Transformer 架构应用于真实机器人的多任务学习,在 700 多个任务上训练,展现了一定的泛化能力。但 RT-1 的局限在于:它仍是一个"机器人专用"模型,语言理解能力较弱,动作空间是离散的。
RT-2(Robotics Transformer 2) 在 2023 年横空出世,核心创新是将视觉-语言模型(VLM)微调为视觉-语言-动作模型。Google 团队直接拿预训练好的 PaLI-X(55B 参数)或 PaLM-E(12B 参数)VLM,把原本输出文本的"语言头"替换为"动作头",然后用少量机器人数据进行微调。
结果令人惊叹:RT-2 不仅在已知任务上表现更好,还涌现出对未见过的物体、背景、甚至抽象指令的泛化能力。例如,训练时从未见过"把可乐罐推倒"这个动作,但 RT-2 能根据"推倒可乐罐"的指令,结合对"推倒"这个动词的语义理解,自主推理出大致正确的动作序列。
3.2 里程碑:从 VLM 到 VLA 的范式转移
RT-2 的成功揭示了一个关键洞见:互联网规模的视觉-语言预训练已经为机器人控制打下了坚实的语义基础。VLM 中的"知识"可以零样本迁移到动作生成任务上。
自此,VLA 研究进入快车道。后续工作可大致分为两条技术路线:
-
基于 VLM 微调:继续以 RT-2 为代表,利用已有 VLM 的视觉-语言对齐能力,只需少量机器人数据即可适配;
-
端到端 VLA 预训练 :直接在包含视觉、语言、动作三元组的大规模机器人数据集上从头训练 VLA 模型,代表工作如 Octo 、OpenVLA。
3.3 代表性 VLA 模型一览
| 模型 | 发布方 | 参数规模 | 核心特点 |
|---|---|---|---|
| RT-2 | Google DeepMind | 12B~55B | 首个从 VLM 微调成功的 VLA |
| Octo | UC Berkeley / Stanford / CMU | 27M~93M | 开源、轻量,支持多机器人平台 |
| OpenVLA | Stanford / UC Berkeley | 7B | 基于 Llama 2 + DINOv2,完全开源 |
| π0(Pi Zero) | Physical Intelligence | 3B | 原生多模态架构,直接输出连续动作 |
| RDT-1B | 清华 / 上海期智研究院 | 1B | 面向双臂操作,国内开源代表 |
其中,OpenVLA 和 Octo 是目前社区最活跃的两个开源项目,适合开发者上手实践。
VLA 的技术原理深度剖析
4.1 架构设计
以典型的 VLA 架构(如 OpenVLA)为例,其组件主要包括:
[视觉输入] → 视觉编码器(如 DINOv2/SigLIP)
[语言输入] → 大语言模型(如 Llama 2)
↓
多模态融合模块(Cross-Attention / 特征拼接)
↓
动作解码器(输出关节角度、末端位姿等)
-
视觉编码器:负责将高维图像压缩为语义丰富的视觉特征(通常为 patch tokens 或全局向量)。常用骨干网络包括 DINOv2、CLIP、SigLIP。
-
大语言模型 :负责理解自然语言指令,并输出高层次的"任务表征"。LLM 在这里不仅是语言理解器,还承担了规划与推理的角色。
-
融合模块:将视觉特征与语言特征对齐,常见方式包括交叉注意力(Cross-Attention)或直接将视觉 token 插入 LLM 的输入序列(类似 Flamingo 架构)。
-
动作解码器:通常是一个多层感知机(MLP)或一个小型 Transformer,将融合后的特征映射为具体动作。动作可以是离散的(如夹爪开/闭)或连续的(如 6D 位姿)。
4.2 动作表示
VLA 的输出动作有多种表示形式,直接影响模型泛化能力和训练难度:
| 表示方式 | 优点 | 缺点 | 典型应用 |
|---|---|---|---|
| 离散化动作 | 训练稳定,与 VLM 输出 token 天然兼容 | 精度受限,动作不连续 | RT-2(早期版本) |
| 连续动作回归 | 动作平滑,精度高 | 训练难度大,需特殊损失函数 | π0、扩散策略 |
| 动作码本(Action Chunking) | 平衡离散与连续,预测未来一段序列 | 计算量稍大 | ACT、Octo |
目前主流趋势是动作分块预测:模型一次性预测未来 N 步的动作序列(如 N=10),通过执行部分动作后重新规划来保证实时闭环控制。
4.3 数据来源与训练策略
VLA 模型的训练数据来源主要有三类:
-
互联网图文数据:用于预训练 VLM 基础能力(已由上游模型完成,如 Llama 2 的文本语料);
-
机器人操作数据集:如 Open X-Embodiment 数据集,包含来自 20+ 个机器人平台、100 万+ 条真实机器人轨迹,是目前最大的机器人学习数据集合;
-
仿真数据:在模拟器(如 MuJoCo、Isaac Sim)中生成大量合成数据,弥补真实数据的稀缺性。
训练策略通常分为两阶段:
-
阶段一(对齐预训练):在大规模机器人数据集上训练 VLA 模型,学习视觉-语言-动作的联合分布;
-
阶段二(下游微调):针对特定机器人平台和任务,用少量高质量真实数据进行微调(Fine-tuning)或 LoRA 适配
快速上手:基于 OpenVLA 的实战演示
环境要求:Ubuntu 20.04+,Python 3.10+,NVIDIA GPU(显存 ≥ 16GB 推荐)
5.1 安装 OpenVLA
OpenVLA 官方提供了便捷的 Pip 安装方式:
bash# 创建虚拟环境 conda create -n openvla python=3.10 -y conda activate openvla # 安装 PyTorch(需根据 CUDA 版本调整) pip install torch==2.2.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 # 安装 OpenVLA pip install openvla5.2 加载预训练模型并推理
下面示例演示如何输入一张图像和一段语言指令,让 OpenVLA 输出 7 自由度的动作(包括夹爪状态):
pythonimport torch from PIL import Image from openvla import OpenVLA, OpenVLAProcessor # 加载模型与处理器(使用 Hugging Face Hub) model = OpenVLA.from_pretrained("openvla/openvla-7b", torch_dtype=torch.bfloat16) model.to("cuda") processor = OpenVLAProcessor.from_pretrained("openvla/openvla-7b") # 准备输入:一张图像 + 自然语言指令 image = Image.open("robot_view.jpg").convert("RGB") instruction = "pick up the red cube and place it into the bowl" # 处理输入 inputs = processor(images=image, text=instruction, return_tensors="pt").to("cuda", torch.bfloat16) # 推理 with torch.no_grad(): outputs = model.generate(**inputs, max_new_tokens=50, do_sample=False) # 解析动作(输出为归一化的关节角度或末端位姿) actions = processor.decode_actions(outputs) print("预测动作序列:", actions.shape) # 例如 (horizon, 7)小贴士:实际部署时需要配合机器人控制接口(如 ROS 或 PyBullet)将预测动作发送给执行器,这部分因硬件平台而异,本文不展开。
5.3 在自己的数据集上微调
OpenVLA 支持 LoRA 高效微调,只需几百条高质量轨迹即可适配新任务:
pythonfrom openvla import OpenVLAForActionPrediction from peft import LoraConfig, get_peft_model # 加载基础模型 model = OpenVLAForActionPrediction.from_pretrained("openvla/openvla-7b") # 配置 LoRA lora_config = LoraConfig( r=16, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) model = get_peft_model(model, lora_config) model.print_trainable_parameters() # 通常仅训练 1%~3% 的参数完整微调代码可参考 OpenVLA 官方 GitHub。