想象你在筹备一家全自动机器人餐厅。你梦寐以求的米其林三星大厨 RT-2 被谷歌锁在深宅大院里,只可远观。于是你把目光投向开源界两位年轻厨师:Octo 和 OpenVLA。 Octo 是一位“民间全能学徒”——走南闯北,在 22 种不同“厨房”(机器人本体)里打过下手,手上的动作从不间断,颠勺一气呵成。OpenVLA 则是一位“科班研究生”——实战经验稍少,但头脑聪慧(7B 参数),能把每一步动作像报菜名一样一字一句说出来,再稳稳落地执行。 这两位学徒师出同门体系——VLA(视觉-语言-动作)模型训练:让机器人用眼睛看懂食材,用大脑理解菜谱,用手完成操作。但他们的“练功方式”截然不同:一个靠“连续的直觉”(扩散模型),一个靠“逐字的思考”(语言模型 token)。这篇文章,带你走进这两位开源厨师的厨房,看看他们的本事、差距,以及如何把他们请回自己的餐厅一展身手。

岗位关联

掌握开源 VLA 模型的架构、数据与微调方法,能显著降低机器人智能应用的落地门槛,是具身智能工程师和研究者的必备技能。

目录
  1. 可视化演示
  2. VLA模型基础
  3. Octo架构解析
  4. OpenVLA架构解析
  5. 训练数据对比
  6. 泛化能力对决
  7. 动作空间表示
  8. 部署微调实战
  9. 差距与未来
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

通过架构对比Octo解码器Transformer vs OpenVLA基于Llama2、动作空间连续vs离散token、LoRA微调部署三个模式,展示两种开源VLA模型的设计差异与部署实践。

本节配有交互动效(进入视口后自动加载,约 3KB)。

架构对比:Octo vs OpenVLA Octo采用解码器Only Transformer统一编码观测序列语言指令和动作目标 OpenVLA基于Llama 2大语言模型将视觉和动作映射到token序列空间 Octo: Decoder-only Trf | OpenVLA: Llama2 + V/A tokens 两种架构代表不同的VLA设计哲学

VLA模型基础

开一家全自动机器人餐厅,最难的不是买设备,而是让设备“懂事”。传统机器人像只会背流程的传菜员,遇到菜谱上没有的情况就卡壳。VLA 模型则像一位能“看、听、做”三合一的新手厨师:眼睛盯着食材(视觉),耳朵听着老板报菜名(语言),双手随即做出响应(动作)。三位一体、端到端打通,这就是具身智能的“大脑”。

具体来说,VLA 把摄像头采集的画面和人类下达的文本指令一起送进同一个神经网络,网络直接输出机械臂各关节该怎么动。你不需要手工编写“先抓哪里、用多大力”的规则,模型自己从海量示范里学习。

把这个映射写成数学形式:策略网络 $\pi_\theta$ 接收视觉观测 $v$ 和语言指令 $l$,输出动作 $a$。所有的训练,都是在调整参数 $\theta$ 让输出动作越来越接近人类示范。Octo 和 OpenVLA 正是这个赛道上两个最具代表性的开源模型,而谷歌的 RT-2 则是闭源领域的标杆。

所以 VLA 的本质,是让机器人厨师“边看边听边动手”一气呵成。Octo 和 OpenVLA 都在这套框架下成才,只不过一个靠“手感直觉”,一个靠“理性表达”。接下来我们分别走进这两位厨师的厨房。

a=πθ(v,l)a = \displaystyle \pi_\theta(v, l)
公式含义:策略 $\pi$ 是厨师的大脑,输入“看到了什么($v$)+ 要做什么($l$)”,输出“手怎么动($a$)”,$\theta$ 是大脑里无数条可调的经验参数。
  1. 视觉观测 $v$机器人摄像头每一帧拍摄的图像,可以是单视角或多视角画面,相当于厨师的“眼睛”。
    v={I1,I2,…,IT}v = \{I_1, I_2, \ldots, I_T\}
  2. 语言指令 $l$人类用自然语言下达的任务描述,如“把苹果放进碗里”,相当于老板的口头菜单。
    l="把红色苹果放进白色碗里"l = \text{"把红色苹果放进白色碗里"}
  3. 策略网络 $\pi_\theta$一个端到端的神经网络,把视觉和语言特征融合后映射到动作空间,相当于厨师大脑里的经验决策系统。
    πθ:(v,l)↦a\pi_\theta: (v, l) \mapsto a
  4. 动作输出 $a$机器人末端的位姿变化,通常包括 xyz 平移、俯仰偏航旋转和夹爪开合,相当于“手的每一个细节动作”。
    a=(x,y,z,roll,pitch,yaw,gripper)a = (x, y, z, \text{roll}, \text{pitch}, \text{yaw}, \text{gripper})

Octo架构解析

先来认识 Octo 这位“民间全能学徒”。他最大的特点是见过世面:在 22 种不同型号的机器人上打过下手,到了一个新厨房、面对一套新厨具,往往能直接上手。这归功于他简洁而扎实的基本功——Transformer 主干,加上一手独特的“扩散”功夫。

Octo 由 UC Berkeley、Stanford 等高校联合推出,分为 small(2700 万参数)和 base(9300 万参数)两个版本。它把视觉观测和语言指令编码成条件信息,Transformer 主干负责理解,最后的“扩散动作头”负责把一份随机的“噪声轨迹”不断修正成干净利落的连续动作。

它的训练目标非常优雅——教去噪网络猜测“刚才加进去的噪声长什么样”。练得多了,网络就能从纯噪声里一点点“洗出”正确的动作,就像厨师凭手感把一锅乱炖逐步调成美味。

如果说别的模型是“想一步、走一步”,Octo 就是“闭着眼把整道菜的火候一气呵成”——扩散过程天然生成平滑连续的轨迹,这正是连续动作空间的魅力,也是它能轻巧地跨本体迁移的底气。

Ldiff=Et,a0,ϵ[∥ϵ−ϵθ(at,c,t)∥2]\mathcal{L}_{\text{diff}} = \displaystyle \mathbb{E}_{t, a_0, \epsilon}\left[\left\|\epsilon - \epsilon_\theta(a_t, c, t)\right\|^2\right]
公式含义:训练去噪网络 $\epsilon_\theta$,让它准确预测动作 $a_t$ 里混入的噪声 $\epsilon$,学会之后就能从噪声中还原出真实动作。
  1. 扩散步数 $t$加噪过程的强度等级,$t$ 越大噪声越强,相当于“把动作模糊得越厉害”。
    t∼Uniform(1,T)t \sim \text{Uniform}(1, T)
  2. 加噪动作 $a_t$干净动作 $a_0$ 按系数混合随机噪声后的中间状态。
    at=αˉt a0+1−αˉt ϵa_t = \sqrt{\bar{\alpha}_t}\,a_0 + \sqrt{1-\bar{\alpha}_t}\,\epsilon
  3. 条件信息 $c$由视觉编码器和语言编码器提取的融合特征,告诉模型“看到了什么、要做什么”。
    c=fenc(v,l)c = f_{\text{enc}}(v, l)
  4. 去噪网络 $\epsilon_\theta$以加噪动作、条件、步数为输入,输出对噪声的预测,是 Octo 动作头的“手感核心”。
    ϵθ:(at,c,t)↦ϵ^\epsilon_\theta: (a_t, c, t) \mapsto \hat{\epsilon}
  5. 训练目标最小化预测噪声与真实噪声的均方误差,练得越好,生成的连续动作越精准流畅。
    min⁡θE[∥ϵ−ϵθ∥2]\min_\theta \mathbb{E}\left[\|\epsilon - \epsilon_\theta\|^2\right]

OpenVLA架构解析

再看 OpenVLA 这位“科班研究生”。他的大脑明显更发达——7B 参数,是 Octo-base 的七十多倍。他走的是另一条路:不靠扩散直觉,而是像报菜名一样,把动作“一个字一个字”地说出来。

由 Stanford 团队推出的 OpenVLA,架构上采用 Prismatic 视觉骨干(融合 SigLIP 与 DINOv2)提取图像特征,再交给 Llama 2 语言模型进行推理,最后把输出的离散动作 token 解码成真实的机械臂指令。团队把 7B 权重开源在 HuggingFace 上,任何人都可以下载微调。

关键创新在“动作 token 化”:每个动作维度被量化成 256 个 bin,7 维动作就变成 7 个离散 token,语言模型像生成单词一样自回归地预测这个 token 序列。这样一来,语言模型在海量文本上学到的“常识与逻辑”就被顺理成章地带进了机器人控制。

OpenVLA 的聪明之处在于“站在语言模型的肩膀上”——它不自己发明动作理解,而是把动作当成一门“外语”让 LLM 来翻译。这也解释了为什么它在语言指令跟随和视觉语义理解上格外出色,代价则是模型笨重、推理较慢。

Pθ(a1,…,a7∣v,l)=∏i=17Pθ(ai∣v,l,a<i)P_\theta(a_1, \ldots, a_7 \mid v, l) = \displaystyle \prod_{i=1}^{7} P_\theta(a_i \mid v, l, a_{<i})
公式含义:给定视觉和语言,模型逐个预测 7 个动作 token,每个 token 的预测都依赖前面已经“说出口”的 token,和生成句子一模一样。
  1. 动作 token 序列7 维动作被量化成 7 个 token,每个 token 取值范围为 0~255 的离散 bin,相当于把连续动作“写成 7 个汉字”。
    (a1,…,a7),ai∈{0,1,…,255}(a_1, \ldots, a_7), \quad a_i \in \{0, 1, \ldots, 255\}
  2. 自回归生成每一步只预测当前 token,且以已生成的 token 为条件,像厨师依次报出“放盐、颠勺、出锅”。
    P(ai∣v,l,a1,…,ai−1)P(a_i \mid v, l, a_1, \ldots, a_{i-1})
  3. 视觉骨干 PrismaticSigLIP 负责语义理解、DINOv2 负责几何细节,两者特征拼接成图像序列,相当于厨师的“火眼金睛”。
    zv=Prismatic(v)=[SigLIP(v);DINOv2(v)]z_v = \text{Prismatic}(v) = [\text{SigLIP}(v); \text{DINOv2}(v)]
  4. 解码为动作对最后输出的特征做 argmax 得到 bin 编号,再反量化成连续动作值,相当于把“报出的菜名”落到实际操作。
    a=dequantize(arg⁡max⁡i hi)a = \text{dequantize}\left(\arg\max_i \, h_i\right)

训练数据对比

再好的天赋也需要喂出来的火候。两位学徒的“菜谱”都来自同一本秘籍——Open X-Embodiment(OXE),一个由全球多家机器人实验室联合开源的数据集,收录了 22 种机器人本体、500 多种技能、超过 100 万条真实操作轨迹。

Octo 在 OXE 的约 80 万条轨迹上训练,覆盖多种机器人,这让它见多识广、跨本体能力强。OpenVLA 则把 OXE 与 Bridge V2 数据集合并,共计约 97 万条轨迹。额外的数据主要来自单一双臂平台,虽然多样性略逊,但任务语义更丰富,有利于语言指令的理解。

数据规模直接决定模型的“见识上限”。百万级轨迹听起来很多,但和 NLP 领域的万亿 token 相比仍显微薄——这也是机器人基础模型进展慢于大语言模型的关键原因。

所以说,Octo 是“吃百家饭长大的全能学徒”,OpenVLA 是“精读加餐的科班生”。食量相当,但食谱结构不同,造就了两人截然不同的“口味偏好”——一个擅长适应新厨房,一个擅长听懂复杂菜单。

DOXE=⋃k=122Dk,∣DOXE∣≈106\mathcal{D}_{\text{OXE}} = \displaystyle \bigcup_{k=1}^{22} \mathcal{D}_k, \quad |\mathcal{D}_{\text{OXE}}| \approx 10^6
公式含义:OXE 数据集由 22 个异构数据子集合并而成,总规模约百万条轨迹,是开源 VLA 模型共同的“菜谱合集”。
  1. 数据子集 $\mathcal{D}_k$每个子集来自一种机器人本体或一个实验室,本体结构、相机视角、任务类型各异,就像不同地方菜的菜谱。
    Dk={(obs,instr,act)j}j=1Nk\mathcal{D}_k = \{(\text{obs}, \text{instr}, \text{act})_j\}_{j=1}^{N_k}
  2. 并集操作 $\cup$把 22 个子集拼接成一个大数据集,不同子集之间保留各自的格式,训练时再统一处理。
    DOXE=D1∪D2∪⋯∪D22\mathcal{D}_{\text{OXE}} = \mathcal{D}_1 \cup \mathcal{D}_2 \cup \cdots \cup \mathcal{D}_{22}
  3. 百万级规模约 $10^6$ 条轨迹,每条轨迹包含几十到几百步的观测-指令-动作三元组,是当前开源机器人学习的数据天花板。
    ∣DOXE∣≈1.2×106 episodes|\mathcal{D}_{\text{OXE}}| \approx 1.2 \times 10^6 \ \text{episodes}

泛化能力对决

判断厨师水平,不能只看他会做几道菜,而要看他换个厨房、换套厨具、换份菜单,还能不能端出好菜。这在机器人领域叫“泛化能力”。两位学徒的表现各有千秋。

Octo 的看家本领是“跨本体零样本迁移”:在 OXE 上见过足够多的机器人形态后,遇到全新的机械臂,不经过任何微调就能直接干活。但它的语言指令跟随能力相对薄弱,对“把左边的红色杯子放到右边的蓝色托盘上”这类复杂指令容易犯迷糊。

OpenVLA 则恰恰相反。它的语言理解能力出色,还能抵抗视觉干扰——换背景、换物体颜色、换相机角度,成功率依旧稳定。但在跨本体迁移上,因为训练数据平台较单一,它对新机器人形态的适应不如 Octo 灵活。

简单说,Octo 是“见多识广、入乡随俗快”的江湖师傅,OpenVLA 是“听懂人话、抗干扰强”的学院派。选谁当主厨,取决于你的餐厅更缺哪种能力。

Szero=1N∑i=1NI[taski succeeds]S_{\text{zero}} = \displaystyle \frac{1}{N}\sum_{i=1}^{N} \mathbb{I}[\text{task}_i \text{ succeeds}]
公式含义:零样本成功率 $S_{\text{zero}}$ 衡量模型不经过微调、直接在新任务上跑通的概率,是泛化能力的“统考成绩”。
  1. 测试任务集合准备 $N$ 个训练时没见过的新任务,如新物体、新布局、新背景,相当于“临时出题”。
    tasks={T1,T2,…,TN}\text{tasks} = \{T_1, T_2, \ldots, T_N\}
  2. 指示函数 $\mathbb{I}$每个任务执行成功记为 1、失败记为 0,把成败变成可统计的数字。
    I[taski succeeds]={1成功0失败\mathbb{I}[\text{task}_i \text{ succeeds}] = \begin{cases} 1 & \text{成功} \\ 0 & \text{失败} \end{cases}
  3. 平均成功率对所有任务求平均,得到一个 0 到 1 之间的分数,分数越高说明换场景后的适应力越强。
    Szero∈[0,1]S_{\text{zero}} \in [0, 1]

动作空间表示

两位厨师最根本的分歧,藏在“手怎么动”这件事上。Octo 的动作是“连续滑炒”——锅铲从不停顿,轨迹是一条光滑曲线;OpenVLA 的动作则是“逐字报菜名”——每一步动作都从 256 个离散选项里挑一个,像用键盘敲出一串指令。

连续动作空间里,Octo 输出的是实数向量,通过扩散过程的迭代去噪得到,天然平滑细腻,适合需要精细力控的操作。离散动作空间里,OpenVLA 把每个维度量化成 256 个 bin,把动作变成 token,让语言模型可以“用思考的方式”生成动作。

量化必然带来精度损失,但 256 个 bin 在归一化后每个 bin 的步长仅约 0.008,对大多数抓取操作足够。更重要的是,离散化换来了语言模型的强大先验——模型能“想清楚再动”,这在语义复杂的任务上收益远大于精度损失。

一个是“意到手到”的直觉派,一个是“言出必行”的理性派。理解了这两种动作空间,你就能明白 Octo 为什么擅长流畅轨迹控制,而 OpenVLA 为什么更擅长需要“想清楚”的复杂任务。

aOcto∈R7,aOpenVLA∈{1,2,…,256}7a_{\text{Octo}} \in \mathbb{R}^{7}, \qquad a_{\text{OpenVLA}} \in \{1, 2, \ldots, 256\}^{7}
公式含义:Octo 的动作是 7 维连续实数,OpenVLA 的动作是 7 个取值范围 1~256 的离散编号,两种表示各有取舍。
  1. 连续动作空间7 个维度分别是 xyz 平移、roll/pitch/yaw 旋转、夹爪开合,取值是任意实数,像手在空间里画出的无限细腻的曲线。
    aOcto=(x,y,z,δroll,δpitch,δyaw,g)∈R7a_{\text{Octo}} = (x, y, z, \delta_{\text{roll}}, \delta_{\text{pitch}}, \delta_{\text{yaw}}, g) \in \mathbb{R}^7
  2. 离散 token 空间每个维度独立量化成 256 个 bin,7 维动作变成 7 个 token,像把动作翻译成一串 0~255 的“动作字母”。
    aOpenVLA=(b1,b2,…,b7),bi∈{0,1,…,255}a_{\text{OpenVLA}} = (b_1, b_2, \ldots, b_7), \quad b_i \in \{0, 1, \ldots, 255\}
  3. 量化步长归一化量程除以 255,得到每个 bin 的分辨率,衡量离散化的“颗粒粗细”。
    Δ=amax⁡−amin⁡255≈0.008\Delta = \frac{a_{\max} - a_{\min}}{255} \approx 0.008

部署微调实战

把学徒请回自家餐厅,不能光靠天赋,还得“特训”。好在他俩都支持参数高效微调,不需要把整个大脑推翻重来。LoRA 微调就像上一期短训班:只调整火候、手感这几项核心要领,其余的长期记忆全部冻结不动。

LoRA 的做法是冻结原始权重 $W_0$,在旁边加一个低秩增量 $\Delta W = BA$,训练时只更新这个小小的矩阵。OpenVLA 论文里用 LoRA 在单张 24GB 显存(如 RTX 4090 / A6000)上微调 7B 模型,只需要几百条新机器人的示范数据,就能让它学会新任务。

Octo 因为参数小,部署更加轻量,消费级 GPU 就能跑推理和微调,非常适合资源受限的实验室和创业团队。实践中,先采集目标机器人的数百条示范(包括视觉、语言指令和动作),再按官方脚本做 LoRA 微调和评估。

所以,把 OpenVLA 请进你家的门槛并没有想象中高——一张 24GB 显存的显卡、几百条示范、一个下午的 LoRA 特训,这位科班研究生就能为你专属餐厅服务了。Octo 则更像是拎包入住的灵活帮工,设备简陋也能立刻上手。

W′=W0+ΔW=W0+αr BAW' = W_0 + \Delta W = \displaystyle W_0 + \frac{\alpha}{r}\, B A
公式含义:新权重 = 冻结的原始权重 + 低秩增量。$B$ 和 $A$ 是两个小矩阵,乘积 $BA$ 近似一个低秩更新,$\alpha/r$ 控制更新力度。
  1. 冻结权重 $W_0$预训练得到的原始参数在微调中完全不动,保留模型在大数据上学到的通用能力,相当于“师傅领进门”的长期功底。
    W0∈Rd×k,frozenW_0 \in \mathbb{R}^{d \times k}, \quad \text{frozen}
  2. 低秩分解 $BA$用一个秩为 $r$ 的矩阵近似权重更新量,$r$ 通常取 16~64,远小于 $d$ 和 $k$,训练参数从百万级降到千级。
    B∈Rd×r,A∈Rr×k,BA≈ΔWB \in \mathbb{R}^{d \times r}, \quad A \in \mathbb{R}^{r \times k}, \quad BA \approx \Delta W
  3. 缩放系数 $\alpha/r$控制更新的步幅,$\alpha$ 是学习率级别的超参数,除以 $r$ 保持训练稳定性,相当于“特训强度”的旋钮。
    W′=W0+λ BA,λ=αrW' = W_0 + \lambda \, BA, \quad \lambda = \frac{\alpha}{r}

差距与未来

最后,我们不得不面对那个“别人家的孩子”——谷歌的 RT-2。这位米其林大厨的参数规模高达 55B,并且在海量网页数据加机器人数据的组合上训练,见过的世面比两位开源学徒加起来还多得多。

目前开源 VLA 模型在简单抓取、单步操作上已接近 RT-2,但在复杂指令理解、多步长任务规划、场景多样性上仍有明显差距。差距的核心不在算法灵感,而在数据与算力的规模——RT-2 背后是 Google 庞大的数据管道和 TPU 集群。

未来方向有三条主线:一是构建更大、更统一的开放数据集,让“菜谱合集”不只百万级;二是设计更高效的跨本体架构,让模型天生就能在不同机器人之间迁移;三是融合扩散模型与语言模型的优势,既“想得清楚”又“动得丝滑”。开源社区正在快马加鞭。

开源学徒与大厨的差距,说到底是“厨房的规模和食材的储备”差距。好消息是,开源社区正以惊人的速度追赶。也许用不了多久,你餐厅里的掌勺大厨,就不再只是那个高不可攀的 RT-2,而是你亲手微调出来的开源 VLA 大厨。

S≈η⋅Dα⋅NβS \approx \displaystyle \eta \cdot D^{\alpha} \cdot N^{\beta}
公式含义:模型能力 $S$ 随训练数据规模 $D$ 和参数量 $N$ 按幂律增长,$\alpha$、$\beta$ 是指数,$\eta$ 是常数——规模越大,能力越强,这是“大力出奇迹”的数学表达。
  1. 数据规模 $D$训练用的示范轨迹或文本 token 数量。RT-2 的数据量级远超开源,差距由此而来。
    DRT-2≫DOcto≈DOpenVLAD_{\text{RT-2}} \gg D_{\text{Octo}} \approx D_{\text{OpenVLA}}
  2. 参数量 $N$模型的权重总数。RT-2 的 55B 比 OpenVLA 的 7B 大近 8 倍,比 Octo 大几百倍。
    NRT-2=55×109,NOpenVLA=7×109,NOcto=9.3×107N_{\text{RT-2}} = 55 \times 10^9, \quad N_{\text{OpenVLA}} = 7 \times 10^9, \quad N_{\text{Octo}} = 9.3 \times 10^7
  3. 幂律指数 $\alpha$、$\beta$决定“砸数据”和“加参数”哪个更划算。通常数据指数高于参数,说明开源社区优先做大数据集更明智。
    α,β∈(0,1),α>β\alpha, \beta \in (0, 1), \quad \alpha > \beta

AI 应用场景

家庭服务机器人快速部署

阶段:模型微调与部署

解决的问题:传统方法需要为每台机器人编写大量规则和运动轨迹,遇到新户型、新家电就失效。用 OpenVLA + LoRA,采集几百条用户环境的示范即可让机器人学会新任务,零代码实现“看一遍就会”。

具体案例:某养老院引入陪伴机器人。工程师先用 OpenVLA 的预训练视觉语言能力理解老人指令,再在养老院场景采集 500 条端到端示范做 LoRA 微调,两周内让机器人学会了倒水、递药、收碗等任务,准确率超过 90%。

工业产线多机型分拣

阶段:跨平台零样本迁移

解决的问题:工厂里常有多种品牌、多种自由度的机械臂,传统方案每个型号都要单独标定和编写控制程序。Octo 的跨本体泛化能力让同一套策略在不同机械臂上直接迁移,大幅降低部署成本。

具体案例:某物流仓库先用 Octo 在 UR5 机械臂上采集数据训练,随后直接迁移到自家国产六轴机械臂,无需重新训练即可完成包裹按颜色分拣,实测准确率达到 85% 以上,部署时间从两周压缩到两天。

科研团队搭建基础模型实验

阶段:研究对比与基线测试

解决的问题:学术团队研究机器人泛化问题,过去需要从零训练巨大模型,算力成本高、复现门槛大。现在可以用开源 Octo/OpenVLA 作为统一基线,把精力集中在改进方法本身。

具体案例:某高校实验室以 OpenVLA 为基座,加入新的“示教数据增强”方法,在 RLBench 仿真和真实双臂机器人上验证,比原始 OpenVLA 的成功率提升了 12 个百分点,相关论文已开源全部代码。

Python 演示

python55 行
"""模拟 Octo 扩散动作头 vs OpenVLA 离散 token 动作头"""import numpy as np  def sample_action_traj(T=64, dims=7, seed=42):    """合成一条 7 维机械臂动作轨迹"""    rng = np.random.default_rng(seed)    t = np.linspace(0, 4 * np.pi, T)    traj = np.zeros((T, dims))    for d in range(dims):        traj[:, d] = 0.5 * np.sin(t + d * 0.8) + 0.1 * rng.standard_normal(T)    return traj  def openvla_quantize(traj, bins=256, lo=-1.0, hi=1.0):    """OpenVLA 风格: 连续动作 -> 离散 token"""    norm = (np.clip(traj, lo, hi) - lo) / (hi - lo)    return (norm * (bins - 1) + 0.5).astype(np.int64)  def openvla_dequantize(tokens, bins=256, lo=-1.0, hi=1.0):    """OpenVLA 风格: 离散 token -> 连续动作"""    return lo + (tokens / (bins - 1)) * (hi - lo)  def octo_diffusion_denoise(x_noisy, steps=8):    """Octo 风格: 迭代去噪还原连续动作"""    x = x_noisy.copy()    for k in range(steps):        x = (x + np.roll(x, 1, axis=0) + np.roll(x, -1, axis=0)) / 3        alpha = (k + 1) / steps        x = alpha * x + (1 - alpha) * x_noisy    return x  def main():    traj = sample_action_traj()    tokens = openvla_quantize(traj)    recon = openvla_dequantize(tokens)    err_openvla = float(np.abs(traj - recon).mean())     rng = np.random.default_rng(0)    noisy = traj + rng.standard_normal(traj.shape) * 0.8    cleaned = octo_diffusion_denoise(noisy)    err_octo = float(np.abs(traj - cleaned).mean())     print("=== VLA action space comparison ===")    print(f"[OpenVLA] discrete token reconstruction error: {err_openvla:.4f}")    print(f"[Octo]    diffusion denoising reconstruction error: {err_octo:.4f}")    print(f"OpenVLA action space: {tokens.max() + 1} bins per dim")    print(f"Octo action space: 7-dim continuous vector")  if __name__ == "__main__":    main()
目的:用合成动作轨迹直观对比 OpenVLA 的离散 token 量化和 Octo 的扩散去噪两种动作表示,输出二者的重建误差与动作空间特点。
  1. def openvla_quantize(traj, bins=256, lo=-1.0, hi=1.0):定义 OpenVLA 风格的动作量化函数,把连续动作映射到 0~255 的离散区间
  2. norm = (np.clip(traj, lo, hi) - lo) / (hi - lo)将动作截断到有效范围并归一化到 0~1,相当于把动作“对齐到尺子上”
  3. return (norm * (bins - 1) + 0.5).astype(np.int64)映射到整数 bin 编号并四舍五入,生成离散 token
  4. def octo_diffusion_denoise(x_noisy, steps=8):定义 Octo 风格的迭代去噪函数,模拟扩散模型的逆过程
  5. x = (x + np.roll(x, 1, axis=0) + np.roll(x, -1, axis=0)) / 3用相邻帧平滑模拟去噪网络对轨迹的“修正手感”
  6. alpha = (k + 1) / steps去噪进度系数随迭代递增,体现扩散过程由粗到细的逐步精修
  7. tokens = openvla_quantize(traj)对真实动作轨迹执行量化,得到离散 token 序列
  8. err_openvla = float(np.abs(traj - recon).mean())计算离散化重建误差,量化精度损失一目了然
  9. cleaned = octo_diffusion_denoise(noisy)对加噪轨迹执行扩散去噪,还原干净动作
  10. err_octo = float(np.abs(traj - cleaned).mean())计算扩散去噪的重建误差,与离散化误差对比

常见误区

误区两个模型都开源、都叫 VLA,名字也在同一篇综述里出现,初学者很容易以为 OpenVLA 是在 Octo 基础上迭代的 v2 版本。

正解两者是独立研发、设计哲学完全不同的模型。Octo 出自 UC Berkeley / Stanford / CMU 等联合团队,参数仅 9300 万(base 版),主打跨本体迁移 + 扩散动作头;OpenVLA 出自 Stanford,7B 参数,走“VLM 语言模型 + 离散动作 token”路线。它们像两位师承不同的厨师,手艺各有千秋却互不隶属。

为何常见:名字都带 VLA 且发布时间接近,网络上常把两者并列讨论,容易造成“代际关系”的错觉。

误区把连续动作量化到 256 个 bin,听起来很粗糙,感觉机械臂会“一顿一顿”地动,实际任务肯定做不好。

正解归一化后每个 bin 的步长仅约 0.008(约 0.8% 量程),对大多数抓取和放置操作完全够用;更重要的是,离散 token 让动作可以被语言模型以自回归方式建模,从而借用 LLM 强大的语义先验。OpenVLA 的真实机器人实验证明,这种表示在复杂指令任务上反而比纯连续输出更稳。就像报菜名虽然不如亲自颠勺细腻,但能把烹饪经验“说出来”传承下去。

为何常见:线性直觉认为“离散必失精”,忽略了量化误差的相对大小,以及语言模型先验带来的补偿收益。

误区看到 Octo / OpenVLA 在演示视频里表现惊艳,就以为开源闭源差距已经消失,甚至反过来超过谷歌。

正解RT-2 基于 55B 的 PaLI-X,并且在互联网级大语料(WebLI)+ 机器人数据上共同微调,规模远超开源模型。开源模型在简单 pick-place 任务上接近 RT-2,但在复杂指令理解、多步长规划、场景多样性上仍有明显差距。类比:学徒食谱再多,也难比大厨几十年积累的私房秘籍。

为何常见:主要在精心挑选的简单 demo 上对比,低估了分布外复杂场景下的真实差距。

误区把 NLP 领域“参数越多越好”的观念直接套到机器人领域,认为 7B 的 OpenVLA 一定碾压 93M 的 Octo。

正解OpenVLA 在语言指令跟随、视觉语义理解上确实更强,但 Octo 在跨本体迁移、推理速度和部署成本上明显占优。Octo-base 只有 93M 参数,单张消费级 GPU 即可实时推理;OpenVLA 需要 24GB 以上显存,推理延迟也更高。类比:研究生大脑发达但饭量大、出菜慢;全能学徒轻装上阵,换厨房就能干。

为何常见:忽略了机器人领域的特殊约束——算力、延迟、本体多样性往往比参数量更卡脖子。

误区以为动 7B 参数就要像训练大语言模型一样,动辄几十万美元的算力账单,小实验室只能望而却步。

正解LoRA 等参数高效微调方法只需训练极少量低秩矩阵(秩 16~64),OpenVLA 可以在单张 24GB 显存(如 RTX 4090 / A6000)上用几百条示范完成新机器人微调,Octo 更是轻量到消费级设备即可。类比:不需要重新教厨师整个职业生涯,只需上几节“特训班”调整手感和火候。

为何常见:习惯了全量微调 LLM 的高成本印象,不了解 PEFT 技术在 VLA 场景已相当成熟。

面试题

Q1. 在 VLA(视觉-语言-动作)模型中,"V"代表哪种输入信息?

单选题 · easy

  • A.视觉图像信息← 正确答案
  • B.语音音频信息
  • C.触觉传感信息
  • D.温度传感信息

答案:A。VLA 中 V 表示视觉(Vision),即机器人摄像头采集的图像;L 表示语言指令,A 表示动作输出。语音、触觉、温度都不属于 VLA 的标准输入。

Q2. Octo 模型使用什么机制来生成连续动作?

单选题 · easy

  • A.扩散模型去噪← 正确答案
  • B.强化学习探索
  • C.遗传算法进化
  • D.模糊逻辑推理

答案:A。Octo 的动作头采用扩散模型,从噪声逐步去噪得到连续动作,类似“慢慢修正手部轨迹”。强化学习、遗传算法、模糊逻辑都不是 Octo 的动作生成机制。

Q3. OpenVLA 将每个动作维度量化为多少个离散 bin?

单选题 · easy

  • A.64 个离散区间
  • B.128 个离散区间
  • C.256 个离散区间← 正确答案
  • D.512 个离散区间

答案:C。OpenVLA 将每个动作维度在归一化范围内分成 256 个 bin,7 维动作由 7 个离散 token 表示。256 的粒度在精度和语言模型建模之间取得平衡,过大过小都不合适。

Q4. 以下哪个数据集是 Octo 和 OpenVLA 共同的核心训练数据来源?

单选题 · mid

  • A.Open X-Embodiment← 正确答案
  • B.ImageNet 图像集
  • C.COCO 检测数据集
  • D.LibriSpeech 语音集

答案:A。两者都在 Open X-Embodiment(跨 22 种机器人本体、百万级轨迹的开源数据集)上训练。ImageNet、COCO、LibriSpeech 分别是图像分类、目标检测、语音识别数据集,与机器人动作数据无关。

Q5. Octo 相比 OpenVLA 的主要优势是什么?

单选题 · mid

  • A.轻量快速跨本体迁移强← 正确答案
  • B.语言指令理解能力更强
  • C.参数量更大推理更好
  • D.训练数据规模更加庞大

答案:A。Octo-base 仅 93M 参数,支持多种机器人本体零样本迁移、推理快。OpenVLA 的优势在语言指令跟随,参数为 7B,数据量两者相近,因此 B、C、D 均不成立。

Q6. 在 OpenVLA 的架构中,"Prismatic"发挥什么作用?

单选题 · mid

  • A.视觉骨干编码图像特征← 正确答案
  • B.直接输出机械臂动作
  • C.管理机器人硬件接口
  • D.压缩训练数据体积量

答案:A。Prismatic 融合 SigLIP 与 DINOv2 作为视觉骨干,将图像编码为特征序列送入语言模型。动作由语言模型以 token 形式输出,硬件接口、数据压缩都不属于 Prismatic 的功能。

Q7. 关于 OpenVLA 的动作 token 化描述,正确的是哪项?

单选题 · extreme

  • A.7 维动作映射为 7 个离散 token← 正确答案
  • B.动作直接回归不经过量化过程
  • C.语言指令不参与动作预测流程
  • D.动作输出与视觉输入完全无关

答案:A。OpenVLA 将 7 维动作的每一维量化为 256 个 bin,得到 7 个离散 token,由语言模型自回归生成。动作必须同时结合视觉与语言条件,B、C、D 都与模型设计矛盾。

Q8. 以下属于 Open X-Embodiment 数据集特征的有哪些?

多选题 · mid

  • A.包含多种机器人本体数据← 正确答案
  • B.全部来自仿真环境生成
  • C.覆盖五百多种任务技能← 正确答案
  • D.开放共享推动开源研究← 正确答案

答案:ACD。OXE 包含 22 种机器人本体、500+ 技能、百万级真实轨迹,并开源共享。它包含真实机器人数据而非纯仿真,因此 B 错误。

Q9. 使用 LoRA 微调 VLA 模型时,以下说法正确的有哪些?

多选题 · hard

  • A.只更新低秩增量矩阵参数← 正确答案
  • B.需要从头训练全部模型权重
  • C.大幅降低显存与训练成本← 正确答案
  • D.完全无法适应新机器人本体

答案:AC。LoRA 冻结原始权重 W0,仅训练低秩矩阵 B·A,显著降低显存占用,并能在几百条示范下适应新本体。B 是全量微调的描述,D 与事实相反。

Q10. 开源 VLA 模型与 RT-2 的差距主要体现在哪些方面?

多选题 · hard

  • A.模型参数量与训练数据规模← 正确答案
  • B.复杂指令理解与泛化能力← 正确答案
  • C.完全没有能力完成简单抓取
  • D.闭源导致复现与研究受限← 正确答案

答案:ABD。RT-2 基于 55B 参数,并在 Web 级数据上联合微调,规模远超开源模型,复杂指令上更鲁棒;同时闭源限制了复现。开源模型能完成简单抓取,因此 C 错误。