深夜的城中村小炒店里,老板老周一个人就是整条流水线:顾客指一指塑料袋里的活鱼,说一句“酸菜鱼,辣一点”,他扫一眼鱼、听一耳朵话,手里的锅铲已经动起来。不需要传菜员帮他翻译,不需要配菜员替他判断火候——看、听、做,在他身上是一件事。 传统机器人更像一个分工过细的后厨:视觉系统负责“看”,语音系统负责“听”,规划模块负责“想”,控制器负责“动”。每一次交接都要翻译一次,慢,而且容易失真。视觉-语言-动作模型(Vision-Language-Action Model,VLA)想做的,就是把老周请进机器人:让同一个模型同时处理相机画面和自然语言指令,直接输出机械臂该做的动作。这个方向是“具身智能”的核心战场,也是机器人从封闭产线走向开放世界的关键一步。
对 AI 从业者而言,理解 VLA 能帮你在机器人技术选型、模型微调和部署落地上建立全局判断力,不再把“感知”和“控制”割裂成两套孤立系统。
目录
可视化演示
展示神经网络前向传播信号流动与反向梯度回传过程,直观理解权重更新机制与损失优化原理。
本节配有交互动效(进入视口后自动加载,约 3KB)。
前向传播阶段 输入信号逐层加权求和并激活,最终得到输出预测值 a⁽ˡ⁾ = σ(w⁽ˡ⁾·a⁽ˡ⁻¹⁾ + b⁽ˡ⁾) 蓝色信号从左向右流动,每层神经元依次激活
核心理念:看见、听懂、直接动手
老周炒菜时,不需要先把“鱼”翻译成坐标,再把“辣一点”翻译成温度。他看的是整条鱼的状态,听的是整句话的意图,动作是从这两类信息里直接“长”出来的。VLA 的设计目标正是如此:输入是相机图像和自然语言指令,输出是机器人本体的动作,中间没有独立的物体检测器、语义解析器和运动规划器接力。
从技术上看,VLA 是一个端到端模型。它接收视觉观测 \(v\) 和语言指令 \(l\),直接输出动作 \(a\)。这里的关键不是“有没有视觉模块”,而是“视觉、语言、动作是否在同一套梯度里共同优化”。只要三者在一个网络里端到端训练,模型就能自动学习“看到杯子、听到‘拿杯子’、伸手去抓”之间的内在关联。
在具身智能的版图里,VLA 是连接大模型知识与物理世界的桥梁。多模态大模型贡献常识,动作头负责把“常识”变成电机指令。对机器人来说,VLA 不再是把感知结果“喂”给控制器,而是让感知、理解和执行成为一个整体。就像老周不是把菜单递给别人,而是自己扫一眼、听一句、直接挥铲。
大模型扩展:从会说到会做
老周之所以能很快学会一道新菜,是因为他本来就会刀工、火候和各种调料的特性。VLA 也一样:它站在多模态大语言模型(VLM)的肩膀上,不需要从零开始理解世界。一个典型的 VLA 由一个视觉编码器、一个大语言模型和一个小小的动作头组成。
视觉编码器把图像变成视觉 token;语言指令被转成文本 token;两者拼接后进入大语言模型做多模态推理;最后,动作头把隐藏状态映射成动作 token 的概率分布。这个结构与“输入图片和问题、输出文字答案”的视觉问答几乎一样,只不过把“答案”从文字换成了动作。
因此,VLA 可以借用语言模型最擅长的自回归生成方式:一个动作一个动作地“说”出来。这个思路可以用下面的条件概率描述:
这就是“让大模型学会做动作”的核心机制。语言模型原本只会预测下一个词,现在只要把“动作”也变成一种 token,它就能像写菜谱一样,把一连串动作“写”给机器人执行。对 AI 工程师来说,这意味着大量成熟的 NLP 基础设施都能直接迁移到机器人控制上。
- 输入条件\(v\) 是视觉特征,\(l\) 是语言指令 token,表示模型同时“看见”和“听见”。
- 历史动作\(a_{< t}\) 是已经生成的动作 token,保证动作序列连续、不跳步。
- 隐藏状态\(h_t\) 是模型在第 \(t\) 步的隐藏状态,融合了前面所有信息。
- 动作头映射\(W_a\) 是动作头权重,经过 softmax 后得到动作词表上的概率分布。
RT-2 架构:把动作写成 token
老周去名厨学校进修时,课程表很有意思:上午学一千道名菜的文字描述,下午跟老师傅学颠勺。这两件事同时发生,而不是先学完理论再学实操。RT-2 的“Co-Fine-Tuning”就是这种思路:一边用海量视觉-语言数据训练模型理解世界,一边用机器人轨迹数据训练模型输出动作,两项任务共享同一套参数。
RT-2 的激进之处在于:它不再单独设计一个连续动作回归头,而是把动作也当作文本 token。例如“机械臂向左移动 5 厘米,然后合拢夹爪”会被离散成若干 token,放进语言模型的词表里。这样一来,机器人动作和自然语言共用同一个 tokenizer,VLM 的预训练知识也能直接服务于动作生成。
Co-Fine-Tuning 的联合损失可以写成:
RT-2 的意义在于证明了“大模型不需要额外动作头也能控制机器人”。它把动作当作一种特殊语言,大幅降低了机器人与大模型的融合成本。这就像老周不需要换一套新厨具,只要在原来的灶台上多练几道机器人特色菜,就能把文字菜谱变成真实翻炒。
- 视觉-语言任务\((x,y)\) 来自图文数据集,\(x\) 是图像或文本输入,\(y\) 是期望的文本输出。
- 机器人任务\((o,l,a)\) 来自机器人轨迹数据,\(o\) 是观测,\(l\) 是语言指令,\(a\) 是动作。
- 负对数似然\(-\log p_\theta\) 让模型给正确输出更高概率。
- 两项相加视觉-语言损失和动作损失联合优化,防止模型学了动作就忘了看图说话。
OpenVLA 架构:开源基座与轻量适配
如果说 RT-2 是老周在名厨学校里的秘密课程,OpenVLA 就是把课程笔记整理成公开出版物,还附带一个“调味包”。OpenVLA 是一个开源 VLA,让研究者和工程师不需要从零训练一个百亿参数模型,也能在真实机器人上做指令跟随实验。
OpenVLA 的底座是一个预训练视觉-语言模型:视觉编码器采用 SigLIP 和 DINOv2 的融合,语言骨干采用 Llama-2 7B。为了让模型学会动作,它引入 LoRA 低秩适配和动作解码器。LoRA 相当于在原始权重旁边加一条很小的“旁路”,训练时只更新这条旁路,大大降低显存和算力开销。动作解码器则把模型隐藏状态映射成 7 维动作,每一维被离散成 256 个 bin。
LoRA 的数学本质是给预训练权重加一个低秩增量:
OpenVLA 很好地体现了“大模型 + 小适配”的工程哲学。它没有重新训练一个全新的机器人模型,而是在强大开源 VLM 上做轻量手术。对团队来说,这意味着用少量机器人数据也能快速验证 VLA 方案,而不必一开始就背上巨额训练成本。
- 预训练权重\(W_0\) 是冻结的 VLM 权重,保留海量视觉语言知识。
- 降维矩阵\(A\) 把输入映射到低秩空间,负责“提炼”.
- 升维矩阵\(B\) 把低秩特征映射回原始维度,负责“还原”.
- 等效权重\(W'\) 是最终使用的权重,训练时只更新 \(A\) 和 \(B\)。
训练策略:混合数据与行为克隆
老周带徒弟,从来不会只给徒弟看一段视频就让他上灶。他会同时让徒弟看菜谱、看食材图片、看师傅手部动作,最后再亲手模仿一遍。VLA 的训练也遵循同样的原则:要用混合数据。
训练数据通常来自两个池子:一是海量互联网图文数据,帮助模型获得视觉语言先验;二是机器人示范数据,告诉模型“看到这个场景、听到这句话,应该怎么做”。两者在实际训练中往往按比例混合,先在大规模混合数据上预训练,再在目标机器人数据上微调。
其中最核心的学习目标叫“行为克隆”,也就是让模型模仿人类示范的动作。给定观测 \(o_t\) 和语言指令 \(l\),希望模型输出的动作尽可能接近示范动作:
这种训练策略的最大优点是简单直接:只要有足够多的高质量示范,模型就能学会复杂操作。但行为克隆也有短板——它只能模仿数据里见过的场景,一旦新场景超出分布,模型容易“不知所措”。因此,VLA 训练通常还会混入网络数据、数据增强、仿真数据来提升泛化能力,就像老周除了让徒弟看真锅真灶,还要他多看不同厨房的视频。
- 观测序列\(o_t\) 是第 \(t\) 步的相机图像或传感器状态。
- 固定指令\(l\) 是整条任务的用户指令,例如“把苹果放到篮子里”。
- 策略模型\(\pi_{\theta}(a_t \mid o_t, l)\) 表示在观测和指令下选择动作 \(a_t\) 的概率。
- 累计取负对所有时间步的对数概率求和再取负,最小化它就是在最大化总动作概率。
动作表示:从连续值到动作 token
老周写便签给帮厨时,不会写“向左 3.1415926 厘米”,而是写“左 3 格、抓”。因为便签是给人看的,写得太细反而没法用。VLA 也面临同样的难题:大语言模型擅长生成离散 token,而机器人真正需要的是连续的关节角度或末端坐标。于是,主流 VLA 选择把连续动作离散化。
具体做法是:把每个动作维度的取值范围分成若干个 bin,比如 256 档,然后将连续动作映射到最近的档位编号。这个过程叫动作 token 化:
动作 token 化让 VLA 可以用语言模型的自回归方式生成动作,但也带来了精度损失。为了缓解这个问题,实际系统会在 token 解码后加一层平滑或残差修正,把离散值还原成连续控制信号,再以较低的频率发给底层控制器执行。这就像老周写完便签后,还会站在旁边用眼角余光瞄着,随时纠正帮厨的火候偏差。
- 平移缩放先减去最小值,再除以取值区间,把原始动作归一化到 \([0,1]\)。
- 边界保护用 clip 把越界值拉回 0 到 1,防止机械臂算出危险位置。
- 放大到档位乘以总档位数 \(N_{\mathrm{bins}}\),得到 0 到 \(N_{\mathrm{bins}}\) 之间的浮点数。
- 向下取整用 floor 得到整数 token,这个整数就是模型要预测的“动作单词”。
挑战与趋势:从厨房走向真实世界
老周再厉害,换到一个完全陌生的厨房也会头疼:没见过的锅、没摸过的炉子、顾客催菜催得急。VLA 从论文走向真实世界的路上,同样要闯过几道难关。
第一是数据稀缺。机器人的示范数据必须由真实机械臂或高质量仿真环境采集,成本远高于互联网文本。第二是泛化能力。VLA 在训练场景里表现惊艳,但换了一个光照、一种背景、一个新物体,成功率就可能骤降。第三是实时推理。大模型本身计算量大,而机器人控制系统有严格的响应时间要求,模型再聪明,反应太慢也端不起这碗饭。第四是安全部署。物理世界不允许模型像聊天机器人那样“乱说”,一个错误动作就可能撞坏设备或伤到人。
未来的方向也很明确:更大的统一模型、更强的世界模型、更廉价的高质量数据采集,以及更高效的推理部署。VLA 不会止步于论文里的机械臂抓取,它会逐步走进仓库、厨房、车间和家庭。到那时,老周不再只是城中村小炒店的传奇,而会成为每一台具身机器人的精神原型——看见、听懂、直接动手。
AI 应用场景
家庭服务机器人
阶段:具身模型选型与微调
解决的问题:传统扫地或抓取机器人只能执行预设轨迹,无法理解“把桌上的苹果放进蓝筐”这种组合指令。VLA 让机器人把摄像头画面和语言指令直接映射成抓取、移动、释放的动作序列,省去手写规则解析和运动规划。
具体案例:在智能家居演示中,研究人员用 OpenVLA 在包含“grasp cup”等指令的家庭操作数据集上做 LoRA 微调,机器人听到中英文混合指令也能抓取桌面上指定的新物品,成功率明显高于固定规则方案。
工业柔性装配
阶段:端到端动作生成
解决的问题:产线换型时,传统“视觉 + PLC 配方”需要重新标定和编程,周期长。VLA 利用视觉理解和语言泛化能力,让操作员用一句话切换工序,模型直接输出机械臂末端动作。
具体案例:某电子厂用 VLA 控制六轴机械臂完成“抓取 USB 插头,对准工装插入”的动作,通过混合训练减少不同工装下的重编程时间。
科研快速原型验证
阶段:模型训练与评估
解决的问题:从零训练一个具身大模型成本极高。OpenVLA 开源权重加上 LoRA 适配,让团队在小规模机器人数据上快速验证新任务。
具体案例:高校实验室以 RT-2 的设计思路为参照,在仿真环境里用 VLA 做“指令跟随导航抓取”实验,只训练几天就得到可复现的 baseline。
Python 演示
# 一个极度简化的 VLA 演示: 动作token化 + 伪动作头import mathimport random class ToyVLA: def __init__(self, num_bins=256, prompt_dim=16, seed=7): self.num_bins = num_bins self.prompt_dim = prompt_dim self.rng = random.Random(seed) self.action_head = [[self.rng.random() for _ in range(prompt_dim)] for _ in range(num_bins)] def _prompt_vector(self, instruction, visual): text_vec = sum(ord(c) for c in instruction) % self.prompt_dim visual_vec = sum(int(v) for v in visual) % self.prompt_dim return [(text_vec + visual_vec + i) % self.prompt_dim for i in range(self.prompt_dim)] def action_logits(self, instruction, visual): vec = self._prompt_vector(instruction, visual) return [sum(a * b for a, b in zip(vec, row)) for row in self.action_head] def sample_action_tokens(self, instruction, visual, token_count=6): logits = self.action_logits(instruction, visual) max_logit = max(logits) exp_logits = [math.exp(x - max_logit) for x in logits] total = sum(exp_logits) probs = [x / total for x in exp_logits] tokens = [] for _ in range(token_count): r = self.rng.random() acc = 0.0 for idx, p in enumerate(probs): acc += p if r <= acc: tokens.append(idx) break else: tokens.append(len(probs) - 1) return tokens def decode_to_actions(self, tokens, low=-1.0, high=1.0, action_dim=3): actions = [] for i in range(0, len(tokens), action_dim): action = [] for token in tokens[i:i + action_dim]: normalized = token / (self.num_bins - 1) action.append(low + normalized * (high - low)) actions.append(action) return actions def cross_entropy_loss(self, instruction, visual, target_tokens): logits = self.action_logits(instruction, visual) max_logit = max(logits) log_sum_exp = math.log(sum(math.exp(x - max_logit) for x in logits)) loss = 0.0 for token in target_tokens: loss += max_logit + log_sum_exp - logits[token] return loss / len(target_tokens) if __name__ == '__main__': model = ToyVLA() target = [10, 20, 30, 40, 50, 60] tokens = model.sample_action_tokens('put the cup on the plate', [128, 64, 32], 6) actions = model.decode_to_actions(tokens) loss = model.cross_entropy_loss('put the cup on the plate', [128, 64, 32], target) print('action tokens:', tokens) print('continuous actions:', actions) print('BC loss:', round(loss, 4))
self.action_head = [[self.rng.random() for _ in range(prompt_dim)] for _ in range(num_bins)]模拟动作头权重,每个 bin 对应一组可学习的参数。def _prompt_vector(self, instruction, visual):把语言指令和视觉特征揉成一个提示向量,模拟多模态编码。return [sum(a * b for a, b in zip(vec, row)) for row in self.action_head]相当于模型把提示向量映射到每个动作 bin 的 logits。def sample_action_tokens(self, instruction, visual, token_count=6):按 logits 概率采样出一串动作 token。def decode_to_actions(self, tokens, low=-1.0, high=1.0, action_dim=3):将离散 token 还原成连续动作,交给机器人执行。def cross_entropy_loss(self, instruction, visual, target_tokens):计算预测动作和示范动作之间的交叉熵损失,对应行为克隆目标。tokens = model.sample_action_tokens('put the cup on the plate', [128, 64, 32], 6)运行入口:给定一句指令和一组伪视觉特征,生成动作序列。
常见误区
误区“我以为 VLA 只要把语音识别结果发给机械臂厂商的 API 就行,本质上是两个软件联调,跟大模型没什么关系。”
正解VLA 不是软件拼接,而是让同一个模型同时编码视觉、语言和动作。动作 token 化、Co-Fine-Tuning、动作头等设计决定它能不能端到端优化。就像老周不是把点菜单传给一个炒菜机器,而是自己同时看、听、炒。
为何常见:因为商业机械臂通常提供控制 API,大家习惯把 AI 拆成感知加控制模块,忽略了端到端建模的价值。
误区“机器人动作是连续角度和位置,用 token 会损失精度,所以 VLA 一定直接回归连续坐标。”
正解主流 VLA 常用离散动作 token,比如 OpenVLA 把每个动作维度分成 256 个 bin,再用解码器还原连续指令。离散化让模型能复用语言模型的自回归生成方式;精度损失可以通过增加 bin 数和后续平滑来弥补。
为何常见:因为传统控制都是连续信号,看到语言模型天然处理离散 token,容易误以为 VLA 发不出连续指令。
误区“只要把海量互联网图文数据灌给大模型,它自然就会操作机器人,不需要真实机械臂数据。”
正解网络数据提供视觉语言先验,但动作对齐需要真实或仿真机器人轨迹。两者必须混合训练,缺少机器人数据的模型会“会说不会做”。
为何常见:因为 VLA 来自大模型,人们容易高估预训练知识的泛化能力,低估物理执行数据的稀缺性。
误区“只要参数量足够大,VLA 在没见过的厨房也能一次成功,不需要微调。”
正解具身操作受数据覆盖、分布外泛化和真实噪声限制。新场景通常需要在目标数据上微调,或借助仿真数据增强,才能稳定工作。
为何常见:大模型在文本任务上表现出很强的 zero-shot 能力,人们习惯把这个结论直接外推到物理世界。
面试题
Q1. 视觉-语言-动作模型的输入输出关系是?
- A.视觉+语言输入,输出动作← 正确答案
- B.语言指令输入,输出视觉
- C.机器人动作输入,输出描述
- D.视觉图像输入,输出描述
答案:A。VLA 的“V”代表视觉观测,“L”代表语言指令,“A”代表动作输出。它把图像和文本一起作为输入,直接生成机器人动作,而不是反过来生成图像或文字。
Q2. 下列哪一项最能描述 RT-2 的核心思想?
- A.用运动规划器替换语言模型
- B.把动作当作文本 token 来预测← 正确答案
- C.只使用真实机械臂数据训练
- D.放弃视觉输入只依赖语言
答案:B。RT-2 的最大创新是把动作离散成 token,纳入语言模型的预测目标。A 是传统模块化路线,C 忽略了网络预训练数据,D 则抛弃了视觉,都与 RT-2 的设计相悖。
Q3. VLA 通常基于以下哪类模型扩展而来?
- A.多模态大模型 VLM← 正确答案
- B.纯卷积图像分类器
- C.传统 PID 控制器
- D.知识图谱问答系统
答案:A。VLA 的核心前提是复用多模态大模型的知识和自回归生成能力。图像分类器、PID 控制器和知识图谱都无法提供“从视觉加语言到动作”的端到端底座。
Q4. Co-Fine-Tuning 的主要好处是什么?
- A.彻底删除网络预训练数据
- B.让所有动作都变成连续值
- C.训练动作同时保留视觉语言能力← 正确答案
- D.把动作维度从 7 维降到 1 维
答案:C。Co-Fine-Tuning 把视觉语言任务和机器人动作任务放在一起联合训练,既能学会操作,又不容易灾难性遗忘原有能力。A、B、D 都不是它的目标。
Q5. OpenVLA 使用了哪些适配技术或组件?
- A.预训练视觉语言模型← 正确答案
- B.LoRA 低秩适配← 正确答案
- C.动作解码器动作头← 正确答案
- D.从零训练 100B 大模型
答案:ABC。OpenVLA 建立在预训练 VLM 之上,用 LoRA 减少微调成本,并额外加动作解码器输出 7 维动作。它并没有从零训练一个 100B 模型,所以 D 错误。
Q6. 将连续动作离散成 token 的主要原因是?
- A.让动作精度变得更高且无误差
- B.使所有机械臂都使用相同型号
- C.使模型完全不需要训练数据
- D.让动作能用语言模型自回归生成← 正确答案
答案:D。语言模型天然处理离散 token,把动作离散化之后就能复用“预测下一个词”的生成方式。离散化本身会损失一定精度,也不能免除训练数据,所以 A、C 错误。
Q7. 以下哪些属于 VLA 训练或部署中的常见挑战?
- A.机器人演示数据采集成本高← 正确答案
- B.模型在陌生场景中泛化能力不足← 正确答案
- C.端到端推理实时性要求高← 正确答案
- D.语言模型不需要视觉编码器
答案:ABC。真实机器人数据贵、分布外泛化差、大模型推理慢,都是 VLA 落地的主要瓶颈。D 显然错误,因为 VLA 必须依赖视觉编码器理解场景。
Q8. 关于 VLA 的动作表示,最准确的说法是?
- A.所有 VLA 都必须直接回归连续坐标
- B.动作 token 与文本 token 完全没有关系
- C.离散成动作 token 再执行← 正确答案
- D.动作通常用正弦波表示
答案:C。主流 VLA 如 RT-2 和 OpenVLA 都采用离散动作 token,再解码成执行指令。A 过于绝对,B 忽略了“动作也像文本 token 一样建模”的核心思想,D 没有依据。
Q9. 为什么要在训练中混合网络数据和机器人数据?
- A.网络数据帮助模型学到视觉语言先验← 正确答案
- B.机器人数据帮助模型学会具体操作← 正确答案
- C.混合训练可以缓解机器人数据稀缺← 正确答案
- D.混合训练让机器人不需要传感器
答案:ABC。网络图文数据提供常识和视觉语言对齐,机器人示范数据提供动作对齐,混合训练能减少对昂贵机器人数据的依赖。D 不符合物理常识,机器人当然需要传感器。
Q10. 动作 token 化时,若 a_raw 超出边界,通常先做哪一步?
- A.直接取绝对值作为新动作值
- B.直接输出原始连续值不做处理
- C.随机映射到任意一个 bin
- D.先 clip 到边界再归一化和量化← 正确答案
答案:D。动作超出边界意味着危险或无效指令,必须先用 clip 把值限制在安全区间,再归一化和取整。取绝对值、直接输出或不安全映射都会让机械臂跑到未知位置。