转载自公众号:敢敢AUTOHUB
0. 简介
VLAct 面向视觉语言动作模型的核心矛盾:机器人轨迹昂贵、稀疏,而且只覆盖场景、物体、任务、本体和接触动力学的很小一部分。它从 Qwen3-VL-4B 出发,用浅层冻结、图像描述共训、OFT/PI/GR00T 三种连续动作头共监督,以及 20 维部分统一布局,把多来源机器人轨迹转换成更可复用的视觉动作表征。论文在 LIBERO-Plus、VLA-Arena、RoboTwin 2.0、DOMINO、Franka 真机和未见本体迁移中报告了稳定提升,例如 LIBERO-Plus 达到 82.6%,RoboTwin 2.0 Data Scaling-Clean 达到 92.5%。下面结合论文、项目主页、开源仓库和真实实现代码,拆解它到底改变了什么,以及下游研究者应该如何使用这块 backbone。
这个问题值得从数据本身的形态说起。互联网图文可以被抓取、清洗和重复利用,机器人轨迹却必须由真实或仿真机器人执行出来,通常还依赖人类遥操作、场景布置和失败重试。论文标题里的 Beyond Data Scaling 并不否认数据规模的价值,而是把另一个变量放到同等位置:在固定机器人数据预算下,持续预训练能让 backbone 从每条轨迹中留下多少可迁移知识。这个问题的答案会直接影响后续任务的微调效率,也会决定一块 VLM 底座能否被不同动作头和不同机器人反复使用。
项目主页:https://starvla.github.io/VLAct
GitHub地址:https://github.com/starVLA/VLAct
1. 研究问题与现有方法的缺口
1.1 机器人数据为何不能复制互联网式扩展
机器人数据的第一层困难是采集成本。每条轨迹都需要一个具体本体在具体场景中执行,视觉观测、语言指令、机器人状态和动作序列必须同步记录。失败样本、标定误差、控制频率差异和接触动力学变化都会影响数据质量。即使数据量增长,也只是连续物理交互空间中的稀疏采样,无法像网页语料那样自然覆盖长尾语言和视觉组合。
第二层困难是组合爆炸。同一个抓取动作会随物体形状、桌面材质、光照、相机视角、夹爪状态和初始位姿发生变化;双臂协作还要处理两臂的时序同步。进一步看,跨本体训练又引入关节空间、末端执行器空间、控制频率和动作语义的差异。核心问题在于,机器人数据不仅少,而且异构,简单把不同来源的轨迹拼在一起,并不能自动产生共享表征。
1.2 VLA 的真正瓶颈是表征质量
VLA 模型通常把 VLM backbone 当作现成底座,再接一个动作头输出控制信号。这个做法有一个隐含假设:VLM 在网页图文上学到的表征已经足够支撑机器人控制。论文的立场更细:通用 VLM 表征确实提供了物体、属性、空间关系和指令语义,但动作条件下的物理交互知识仍需要机器人轨迹注入。若持续预训练只优化动作预测,模型可能记住训练分布,却没有把可复用的 affordance 和动作语义沉淀到 backbone。
这里要厘清的是,VLAct 研究的对象不是某个新动作头,而是进入下游微调前的 VLM 权重。它希望回答一个可检验的问题:在下游动作头、演示数据、优化器和训练预算都相同的条件下,把原始 Qwen3-VL 换成 VLAct backbone,策略是否会更好。换句话说,论文把 backbone 本身当成 VLA 系统的一等设计变量,而不是固定不变的通用底座。
1.3 论文定义的迁移范围
论文把“可迁移”拆成四类变化,避免让这个词停留在口号层面。第一类是新任务和新环境,例如 LIBERO-Plus 中的相机、语言、光照、背景、噪声和布局扰动。第二类是不同下游动作头,例如预训练后丢弃原来的 OFT、PI、GR00T,再重新接一个目标头。第三类是不同机器人本体,例如持续预训练未见过的 GR-1 人形机器人。第四类是真实 Franka 机械臂上的物体替换和长程执行。
这个定义的工程价值在于,它把评测和训练设计对应起来。若一个 backbone 只在某一个动作头上表现好,就不能称为通用动作表征;若它只在同分布仿真任务上有效,也很难支撑真实机器人部署。VLAct 的方法设计正是围绕这些风险展开:先保护通用视觉语言先验,再避免单一动作头的几何锁死,最后处理跨本体动作语义的可共享部分。
2. 整体框架
2.1 从 Qwen3-VL 到 VLAct 的两阶段流程
VLAct 的训练流程分为持续预训练和下游微调两个阶段。持续预训练从 Qwen3-VL-4B-Instruct 初始化,输入多来源机器人轨迹和图像描述数据,冻结视觉编码器与 LLM 下半层,同时更新 LLM 上半层和三只连续动作头。机器人样本通过 OFT、PI、GR00T 共同监督共享 latent;caption 样本继续提供交叉熵语义约束。这个阶段的目标是塑造可迁移的 backbone,而不是交付一个最终策略。
下游微调时,三只预训练动作头可以被全部丢弃。目标 benchmark 或目标机器人安装一只随机初始化的新动作头,完整 backbone 解冻后按下游数据训练。这样的分离让比较更干净:VLAct 与基线使用相同的动作头、相同的演示、相同的优化器和相同的训练步数,唯一系统性差异是 backbone 初始化。论文报告的 7.6 到 21.4 个点提升,正是在这种 matched comparison 下得到的。
从这张图可以看出,论文把训练和部署拆成两个清楚阶段。预训练阶段的三个机制都服务于表征,而不是为了保留某个部署接口;微调阶段则允许使用者按照任务选择动作头。这里的关键是,预训练动作头只是塑造 backbone 的监督工具,不是必须带入部署的控制模块。
2.2 输入、输出与模块关系
模型输入包括多视角图像、语言指令、机器人状态和历史动作上下文。视觉编码器把图像转成 token,LLM 处理图像 token、语言 token 和动作 query,得到共享 hidden state。三只动作头读取同一份 hidden state,并在 20 维部分统一动作空间中预测未来动作块。对于无效维度,模型使用 mask 隔离,不让 Franka 的末端位姿维度去污染 AgileX 的关节维度。
输出侧并不把 20 维都解释成同一种物理量。1 到 12 维对应双臂绝对关节角,13 到 18 维对应单臂 delta end-effector pose,第 19 维由 Franka 夹爪和 AgileX 左夹爪共享,第 20 维留给 AgileX 右夹爪。直观理解是,这张表不是把所有机器人硬塞进同一个控制器,而是只让物理语义相近的维度共享监督,其余维度保持隔离。
2.3 matched comparison 的实验逻辑
论文的实验设计有一个值得学习的细节:它尽量避免用不同训练预算、不同动作头或不同数据量解释结果。仿真 benchmark 中,VLAct 与 Qwen3VL 基线使用相同的下游头和训练协议;真机实验中,两类模型使用完全相同的演示、动作头、优化器和 50K-step 预算;未见本体迁移中,只改变下游轨迹比例。这样可以更有力地把结果归因到 backbone 表征。
工程价值
matched comparison 像汽车测试中的同一赛道、同一胎压和同一组驾驶员。它不能消除所有随机性,却能减少最常见的外部解释,让读者看到 backbone 本身带来的差异。
当然,这种比较仍然不是完整因果证明。不同 backbone 的初始化会影响优化轨迹,预训练数据与某些 benchmark 的分布也可能更接近。论文的缓解方式是使用多组评测和消融,把浅层冻结、caption、多头和动作布局分别拆开验证。读者在引用数字时,应同时说明对应 benchmark、动作头和数据设置,避免把一个设置下的结果外推成所有机器人任务上的结论。
3. 先验保护:冻结浅层与图像描述共训
3.1 浅层冻结
机器人轨迹的视觉分布远窄于网页图文。固定相机、重复工作台、有限物体和高度相关的动作序列,容易让端到端更新覆盖 VLM 原有的通用特征。VLAct 在持续预训练时冻结视觉编码器和 LLM 第 0 到 17 层,只更新上层 LLM 与动作模块。这样做的假设是,底层视觉特征和早期视觉语言对齐应当保持稳定,上层语义组合更能吸收动作条件信息。
消融数据支持这个选择。在固定机器人数据与训练预算的实验中,完整更新 backbone 得到 LIBERO-Plus/RoboTwin 78.9%/77.1%;只冻结视觉编码器提升到 81.3%/79.3%;视觉编码器加 LLM 下半层一起冻结达到 82.6%/80.5%。递进关系说明,持续预训练的收益并非来自“更新更多参数”,而来自把更新限制在更适合吸收动作语义的位置。
直觉理解
可以把 VLM 的浅层看成一套已经校准好的基础感官系统,把上层看成更灵活的任务组合层。机器人数据有限时,与其让所有层都被窄分布重写,不如保住基础感官,再让上层学习如何把感官信息和动作目标关联起来。
3.2 caption 数据作为表征锚点
第二个保护机制是图像描述共训。每个训练 step 中,VLAct 混入 ShareGPT4V-COCO 和 LLaVA-ReCap-CC3M 的 caption 样本,让模型在动作梯度之外继续接收视觉语言交叉熵梯度。caption 提供物体、属性、空间关系和场景语义,相当于持续提醒 backbone 保持可读的视觉语言表征,而不是只服务于动作回归。
论文的固定预算消融显示,机器人数据直训基线为 75.0%;加入纯文本指令、BBox-QA、Point-QA、代码和 Spatial-QA 后分别达到 79.6%、80.2%、80.9%、80.6% 和 81.9%;caption 单独达到 82.6%。多种辅助数据混合为 82.5%。作者的解释是,总 step 固定后,最有效的 caption 被其他数据分走了采样频率。这里的工程技术判断是,辅助监督不是越多越好,而是要看它是否直接补齐 VLA 需要的视觉语义。
这张图的意义不在于证明 caption 神奇,而在于揭示持续预训练中的遗忘风险。动作数据能提供控制信号,却缺少显式的物体描述和空间语言监督;caption 恰好补上这部分。进一步看,它也解释了为什么 VLAct 的 backbone 在物体替换和长程任务中更稳:视觉语义没有被动作拟合完全覆盖,下游策略仍能借助这些特征定位物体并维持任务序列。
4. 多动作头共监督
4.1 decoder lock-in 的先导实验
论文最有解释力的实验出现在正式方法之前。作者固定 Qwen3-VL-4B,只改变持续预训练和下游微调使用的动作头。FAST 把连续动作块压缩成离散 token;OFT 用轻量 MLP 直接回归动作块;PI 和 GR00T 使用 flow matching 从噪声逐步生成动作。它们不仅输出方式不同,对 backbone 特征的读取方式也不同。
实验结果揭示了两个现象。FAST 预训练后改用连续 GR00T 微调,LIBERO-Plus 从 75.9% 小幅升到 76.7%,说明离散监督能注入粗动作结构;但沿用 FAST 头时,成功率从 scratch 的 61.4% 降到 45.2%,作者将其归因于离散化造成的细时间和幅值信息损失。连续头的情况更直接:OFT 预训练接 OFT 微调时,RoboTwin 从 61.7% 升到 75.8%;换成 PI 后从 scratch 的 60.5% 降到 55.1%;换成 GR00T 后从 51.2% 降到 28.9%。
难点提示
这组数字容易误读。OFT 同头提升并不代表 backbone 更通用,可能只代表特征被整理成 OFT 容易读取的几何形状。就像某份笔记按一个人的检索习惯重新排序后,他自己查找更快,换一个人反而更慢。
4.2 OFT、PI、GR00T 三头并行
VLAct 的应对方式是同时挂上 OFT、PI、GR00T 三只连续动作头,让它们读取同一个 latent,并预测同一个真实动作块。三个头没有额外的对齐网络,也不互相蒸馏;它们通过各自损失共同约束 backbone。若共享 latent 只对 OFT 友好,PI 和 GR00T 的损失无法同时下降,backbone 就必须把动作信息组织成更中性的形式。
附录中的关键对照说明了这个机制的有效性。OFT 单头预训练后,未见过的 PI 下游头只有 55.1%;把 GR00T 加入预训练但仍不让 PI 参与,PI 微调回升到 63.1%;完整三头预训练后,PI 微调达到 77.0%。相对各自单头预训练,三头版本在 OFT、PI、GR00T 下游微调上分别再提升 1.7、1.6 和 4.3 个点。这意味着多头不是简单增加参数,而是在约束表征的复用性。
4.3 多头共监督为什么不是堆模块
从优化角度看,三个动作头相当于三种不同的可微读取器。OFT 检验 hidden state 是否能被浅层 MLP 直接映射为动作块;PI 和 GR00T 则要求 hidden state 能作为条件,引导从噪声到动作分布的运输过程。若同一个 latent 同时满足这些读取方式,它更可能包含物体状态、末端目标、时序连续性和动作幅值等信息,而不是只保留某个解码器的 shortcut。
工程上也要避免过度解读。多头共监督增加了一次前向后的多分支计算和显存开销,训练复杂度高于单头方案。它的收益必须放在“下游可能换头”的前提下评估。如果某个应用永远固定使用同一只动作头、同一套控制接口,单头预训练可能已经足够;如果目标是研究可复用 backbone,或希望后续尝试不同动作生成方式,三头共监督的价值才更明显。
5. 跨本体动作空间
5.1 20 维部分统一布局
跨本体是 VLA 预训练中最容易出错的部分。Franka 单臂在 DROID、DROID-100 和 MolmoAct 中使用 6 维 delta end-effector pose 加 1 维夹爪;AgileX 双臂在 InternData-A1 和 RoboCOIN 中使用 12 维绝对关节角加 2 维夹爪。若为每类本体保留完全独立的动作头,夹爪开合这类物理语义相近的动作也无法共享监督。
VLAct 采用 20 维部分统一布局:1 到 12 维留给双臂关节,13 到 18 维留给单臂 delta EEF,第 19 维共享给 Franka 夹爪和 AgileX 左夹爪,第 20 维给 AgileX 右夹爪。每条样本只在所属本体的有效维度上计算损失,无效维度用 padding 和 mask 隔离。换句话说,它统一的是语义上可对应的部分,不强行统一控制接口。这个边界划得比“全统一”和“全独立”都更谨慎,也为后续加入新本体留下了明确扩展位置。
这个设计的消融结果很清楚。RoboTwin Base-Clean 中,直接回归原始关节角为 75.5%,加入统一关节空间升到 78.6%,再加 wrap-aware loss 达到 80.5%。另一组跨本体设计消融中,本体独立头为 78.5/81.1,统一头为 79.5/81.4,完整统一动作表示为 80.5/82.6。这里的改进来自两个层面:共享头让相似语义有同一参数入口,维度布局和 mask 则避免不相干物理量互相污染。
5.2 wrap-aware loss
绝对关节角是周期变量。普通 L1 或 L2 距离会把 和 看成相差 ,但物理上它们只差一个很小的环绕距离。VLAct 先把关节角归一到 ,再对预测与目标之差取最短环绕距离。这个细节看似只影响少数边界样本,却会改变优化器在关节极限附近的梯度方向。
公式上,先把角度 映射到环绕区间。这个映射的价值在于消除同一物理姿态的多种数值表示,让 附近的关节角和 附近的关节角在输入侧就落入同一周期区间,而不是交给损失函数去处理一个本来不存在的长距离。对连续控制来说,这种输入约定能减少边界附近的错误梯度:
再计算预测值 与目标 的最短角差。这里的差值不是普通数轴距离,而是单位圆上按顺时针或逆时针取更短的那条路径,因此它能反映关节实际需要转过的角度。若使用普通差值,优化器会把一个很小的物理偏差放大成接近整圈的数值距离:
对应的环绕损失可以写成。由于损失只作用于被标记为周期维的关节角,平移、夹爪开度和非周期状态不会被这套几何假设影响,这也是实现中必须保留维度 mask 的原因。这个设计把数学修正和动作物理语义绑定在一起,避免了把周期几何当成通用技巧:
在实现中,代码并不是简单替换所有误差,而是用 angular_dim_mask 只对周期维度启用环绕距离,非周期维度仍使用原始绝对误差。这一层选择很重要,因为末端位姿中的平移和旋转如果被错误地当作同一类周期变量,反而会引入错误几何假设。换句话说,wrap-aware loss 是一个按维度启用的几何修正,不是全局训练技巧。
5.3 跨数据集动作对齐
统一动作空间之前,数据侧已经做了大量对齐。Franka 的 delta EEF 会按各数据集帧率换算成每秒位移与旋转量;平移或旋转速度异常的 step 先被 mask,只有一个动作块中超过一半 step 异常时才丢弃整块。AgileX 的绝对关节角先过滤超出物理范围的异常值,再 wrap 到统一区间。夹爪值按数据集做异常值过滤和 0 到 1 归一化。
语言侧同样有清洗。空任务名、unknown_task 和 n/a 等无效指令会被移除,避免模型把无意义字符串当成任务条件。这里的关键是,跨本体预训练不是把不同数据源的列名对上就算完成,而是要统一时间、单位、物理范围、周期性和语言语义。否则模型学到的是数据接口差异,而不是可迁移动作知识。
6. 数据清洗与动作对齐
6.1 delta end-effector 的速度口径
末端执行器动作看似简单,实际包含多个口径选择:位置是相对当前位姿还是相对目标位姿,旋转用欧拉角、四元数还是旋转矩阵,时间差是一个 control step 还是一个固定秒数。VLAct 将 Franka 的 delta EEF 换算为每秒位移与旋转量,使不同帧率的数据尽量落在可比速度尺度上。
异常处理采用 step 级和 chunk 级两层。单步速度异常先被 mask,避免个别错误污染整个动作块;只有当异常比例超过阈值时才丢弃整块。这个策略保留了边界附近的有效上下文,也避免了把整段演示因为少数坏点一起删掉。对机器人数据来说,这种细粒度清洗通常比一刀切更有价值。
6.2 关节角、夹爪与状态归一化
AgileX 的关节角使用绝对值,必须处理物理范围和周期性。代码先把超出 的异常值过滤,再用 wrap 模式归一。夹爪则根据各数据集的取值范围转换为 0 到 1,并在第 19、20 维中按本体语义放置。状态和动作共享同一套统计量逻辑,能减少训练与推理时的尺度不一致。
这部分工作不像模型结构那样显眼,却直接决定统一动作空间是否可信。若关节角没有 wrap,边界样本会被赋予错误距离;若夹爪方向没有对齐,同一维度的“打开”和“关闭”可能在不同数据集中含义相反;若速度没有按帧率换算,高帧率和低帧率数据会给模型不同幅值的动作标签。VLAct 把这些细节纳入数据管线,是它跨本体结果的重要基础。
6.3 语言指令与数据混合
语言清洗的目标是保证每条动作轨迹都有可学习的任务条件。空任务名、unknown_task、n/a 等指令无法提供目标信息,保留它们会让模型学会忽略语言输入。数据混合侧,五组机器人数据进入名为 agilex_franka_5data_manualvel_balance_50 的 mixture,单臂与双臂样本按 8:1 的损失权重平衡,缓解不同来源样本量差异带来的偏置。
原始数据仍需从各自发布方取得,并遵守各自许可。VLAct 提供的是 LeRobot v2.1 目录约定、预处理命令、采样索引、GR00T 统计量生成和训练入口。换句话说,它的开放性体现在可追溯的数据准备链路,而不是重新发布一份绕过原许可的数据包。这对复现者更麻烦一些,但权属和来源更清楚。
7. 训练目标
7.1 总损失
VLAct 的持续预训练目标可以概括为动作损失与视觉语言交叉熵损失的加权和。这个形式看似普通,但两个项的作用不同:动作项把机器人轨迹中的控制规律写入 backbone,交叉熵项则持续约束模型解释图像和语言的能力。两者同时存在,才构成表征层面的双向约束:
其中 来自机器人轨迹, 来自图像描述数据, 控制语义锚点强度。若这个权重太小,动作梯度可能覆盖原有视觉语言特征;若太大,机器人监督又会被稀释。动作项内部再按三只连续头求和,形成对同一 latent 的多重读取约束:
这里的三项并不是三份独立任务的简单叠加,而是对同一个共享 latent 的三种读取约束。所有头都接收相同的机器人观测、语言条件和状态信息,并预测同一个目标动作块。因此,梯度会同时从回归路径和生成式路径回传到 backbone,促使表征同时满足直接解码和条件生成的需要。
7.2 三个动作头的监督形式
OFT 的监督最直接:从 action query 的 hidden state 输出整个动作块,用 masked regression loss 衡量与示范动作的差异。它像一把线性探针,能检验 hidden state 中是否已有足够控制信息。PI 和 GR00T 的 flow matching 目标可以写成,二者从生成式角度提供另一类约束,使动作分布不必被压缩成单一均值:
其中 是目标动作块, 是噪声样本, 是时间变量, 是 backbone 提供的条件表征, 是动作头学习的速度场。直观理解是,模型学习如何把随机噪声沿一条条件轨迹运送到示范动作分布,而不是一次性输出均值动作。这个条件项正是 backbone 表征进入生成式头的关键接口。
对于多模态动作分布,这一点尤其重要。同一观测下可能有多个合理动作,直接回归容易得到折中解;生成式头可以保留分布结构。VLAct 同时使用回归和生成监督,相当于要求 backbone 既能提供直接可读的动作信息,也能支撑分布式的动作生成。这正是多头共监督区别于简单模型集成的地方。
7.3 训练设置与计算投入
论文报告持续预训练共 100K steps,使用 16 张 GPU。公开模型卡记录每卡 VLA batch size 为 16,动作跨度为 50 step,优化器为 AdamW,5K-step warmup 加 cosine schedule。Qwen-VL 接口学习率为 ,动作与基础模块学习率为 。训练不是轻量级微调,但相对于许多工业 VLA 系统的大规模专有数据与算力,论文强调其使用开源数据和 16 GPU 设置。
这里的投入要分阶段理解。100K-step 持续预训练的目标是生成一块可重复微调的 backbone,下游用户不需要每次重复这段训练。若研究目标是适配新机器人,通常从已发布 checkpoint 出发,重新定义接口并做下游微调;若研究目标是改进预训练配方,则需要完整复现或继续预训练,成本自然高得多。
8. 实现细节与代码
8.1 持续预训练启动脚本
仓库把论文设计直接暴露成可定位的参数。下面这段来自 scripts/run_scripts/Pretrain/pretrain_qwen3_single_node.sh,包含 20 维布局、无效维度 mask、三只动作头、环绕损失、caption 权重和冻结模块。阅读这些参数可以快速判断一个复现实验到底启用了哪些机制,也能帮助排查“论文机制”和“实际配置”之间的偏差。
# scripts/run_scripts/Pretrain/pretrain_qwen3_single_node.sh
--framework.disjoint_action_layout True
--framework.mask_padded_action_dims True
--framework.single_arm_loss_weight 8.0
--framework.dual_arm_loss_weight 1.0
--framework.heads oft,gr00t,pi
--framework.head_loss_weights oft:1,gr00t:1,pi:1
--trainer.shortest_angular_joint_loss True
--trainer.shortest_angular_joint_loss_diff True
--trainer.endpoint_wrap_loss_weight 0.5
--trainer.loss_scale.vlm 0.2
--trainer.freeze_modules ${freeze_module_list}
--trainer.max_train_steps 100000
这段配置对应三个设计点。disjoint_action_layout 和 mask_padded_action_dims 负责 20 维动作空间中的无效维度隔离;heads 与 head_loss_weights 实现三头共监督;shortest_angular_joint_loss 系列参数控制周期关节角的环绕距离。loss_scale.vlm 0.2 是公开 artifact 记录的 caption 权重,复现论文协议时应核对论文中的 0.5 设置。
冻结列表也是脚本生成的,而不是手写一长串模块名。视觉编码器整体冻结,LLM 第 0 到 17 层逐层加入列表。这个实现方式便于调整冻结深度,也能避免漏写某一层导致的意外更新。对于想复现消融的研究者,只需要改变循环边界,就能测试浅层保护范围。
8.2 共享 latent 与多头损失
真正执行多头共监督的文件是 starVLA/model/framework/QwenHybrid_xrobot_padding.py。OFT 分支先从 last_hidden 中收集 action query embedding,再输出动作并计算 masked loss;GR00T 和 PI 分支复用同一份 last_hidden,只在各自动作模型内部处理重复扩散步和损失。下面是保留主干语义的代码摘录,省略了重复张量构造的样板部分:
# starVLA/model/framework/QwenHybrid_xrobot_padding.py
total_loss = last_hidden.new_zeros(())
if self.oft_action_model is not None:
action_queries = self._gather_action_token_embeddings(
last_hidden,
input_ids,
action_token_id=self.action_token_id,
chunk_len=self.chunk_len,
)
oft_pred_actions = self.oft_action_model.predict_action(action_queries)
oft_action_loss = self._compute_action_loss(
oft_pred_actions,
actions_target,
robot_tags,
action_valid_mask=action_valid_mask,
action_dim_mask=action_dim_mask,
action_loss_weights=action_loss_weights,
)
total_loss = total_loss + self.head_loss_weights.get("oft", 1.0) * oft_action_loss
# GR00T and PI repeat actions, masks, and hidden states for diffusion steps,
# then compute their own losses from the same last_hidden.
total_loss = total_loss + self.head_loss_weights.get("gr00t", 1.0) * gr00t_action_loss
total_loss = total_loss + self.head_loss_weights.get("pi", 1.0) * pi_action_loss
这段代码的关键不在函数名,而在数据流。三个分支没有各自重新跑一次 backbone,也没有把 latent 先投影到某个统一动作 token 空间再交给头;它们读取的是同一次前向得到的 last_hidden。这意味着任何让某个头变好、却让其他头变差的特征组织方式,都会在总损失中被暴露出来。
action_valid_mask 和 action_dim_mask 是另一处细节。前者处理时间上的无效 step,后者处理维度上的 padding 或非本本体维度。对于混合 Franka 与 AgileX 的 batch,如果没有这些 mask,损失会在不存在的动作维度上产生虚假梯度,统一动作空间反而会破坏训练。这里的无效维度 mask是跨本体训练能否成立的工程前提。
8.3 wrap-aware loss 的实现
环绕距离的实现位于 flow_matching_loss.py。函数接收原始绝对误差、未取环绕的差值和周期维度 mask,只在周期维度上混合 wrap 误差。这个接口设计把几何修正限制在明确标记的关节维度上,避免了把周期假设扩散到整个动作张量。函数边界也使它可以直接接入不同动作头:
# starVLA/model/modules/action_model/flow_matching_loss.py
def blend_angular_wrap_abs_error(
abs_error: torch.Tensor,
raw_diff: torch.Tensor,
angular_mask: torch.Tensor,
) -> torch.Tensor:
if not angular_mask.any():
return abs_error
wrapped_abs = torch.abs(torch.remainder(raw_diff + math.pi, 2 * math.pi) - math.pi)
angular_abs_error = 0.5 * wrapped_abs + 0.5 * abs_error
return torch.where(angular_mask.unsqueeze(1), angular_abs_error, abs_error)
实现采用 0.5 的 wrap 误差和 0.5 的原始误差混合,而不是完全替换。这个选择让优化在边界附近获得正确几何,同时保留与常规误差尺度的联系。torch.where 确保只有 angular_mask 标记的维度使用环绕逻辑,其他维度不受影响。对复现者来说,这个混合比例也是可以单独消融的超参数。
数据侧的 wrap 归一在 state_action.py 中。它发生在损失计算之前,负责把原始关节角投影到统一的周期区间,使模型输入和目标动作都使用同一套数值约定。若数据侧没有这一步,损失函数即使公式正确,也会收到口径不一致的目标值,进而学习到错误的边界映射:
# starVLA/dataloader/gr00t_lerobot/transform/state_action.py
elif self.mode == "wrap":
period = x.new_tensor(2 * np.pi)
normalized = torch.remainder(x + np.pi, period) - np.pi
这两处实现分别对应论文中的统一关节空间和 wrap-aware loss。前者保证输入落在同一周期区间,后者保证预测误差按最短角距离计算。若只做其一,边界样本仍可能在某个环节被错误拉伸,所以数据变换和损失函数必须配套。这样的成对设计在跨本体系统中比单点技巧更可靠。
8.4 下游 checkpoint 加载与随机初始化动作头
下游迁移的实现也很明确。train_starvla.py 读取 random_init_action_model,若为真,则在加载预训练 checkpoint 时忽略 action_model,只迁移共享 backbone。reset_steps 把下游训练步数重新计数,避免把预训练的 100K step 当成已经完成的下游步数。这个分支体现了训练与部署接口的显式分离,也避免了旧动作头污染新控制空间。
# starVLA/training/train_starvla.py
random_init_action_model = _as_bool(
getattr(self.config.trainer, "random_init_action_model", False)
)
if pretrained_checkpoint:
reload_modules = getattr(self.config.trainer, "reload_modules", None)
ignore_modules = None
if random_init_action_model:
logger.info(
"`random_init_action_model=True`, skipping `action_model` when loading checkpoint."
)
ignore_modules = "action_model"
self.model = self.load_pretrained_backbones(
self.model,
pretrained_checkpoint,
reload_modules=reload_modules,
ignore_modules=ignore_modules,
)
self.completed_steps = 0
工程上,这个分支解决了接口不兼容问题。预训练的 20 维头绑定 Franka 与 AgileX 的动作布局,下游机器人可能使用完全不同的控制空间。重新初始化动作头后,模型可以保留视觉动作表征,同时按目标本体重新学习控制映射。使用时通常设置 --trainer.pretrained_checkpoint 指向 steps_100000_pytorch_model.pt,并打开 --trainer.random_init_action_model True 与 --trainer.reset_steps True。
还有一个路径细节容易被忽略:StarVLA 会从 checkpoint 上两级目录读取配置和归一化统计,因此下载后的目录结构需要保持完整。权重文件本身只含模型参数,不含优化器和学习率调度器状态。它适合继续训练或下游适配,不适合期望 bit-for-bit 恢复原始训练进程的场景。
9. 实验
9.1 LIBERO-Plus
LIBERO-Plus 在相机、机器人状态、语言、光照、背景、噪声和布局七个扰动轴上评测单臂鲁棒性。VLAct 总成功率为 82.6%,同设置 Qwen3VL-OFT 为 75.0%。分轴看,相机扰动从 47.0% 升到 73.9%,机器人状态扰动从 60.1% 升到 68.4%,噪声从 73.1% 升到 86.0%,布局从 79.2% 升到 83.3%;语言扰动从 87.0% 变为 81.5%。
这组数字说明提升并不均匀。相机和噪声轴的大幅改善与视觉表征保护、caption 共训有直接关系;布局和状态扰动的小幅改善说明动作条件信息也有贡献。语言扰动下降则提醒读者,持续预训练不必然在所有轴上带来收益,机器人动作数据可能引入与原 VLM 指令分布不同的偏好。
9.2 VLA-Arena
VLA-Arena 覆盖 Safety、Distractor、Extrapolation 和 Long-Horizon 四类设置。VLAct 平均成功率为 54.8%,matched baseline 为 33.4%。分项上,Safety、Distractor、Extrapolation、Long-Horizon 分别为 63.2%、64.0%、36.9%、50.0%,对应基线为 36.1%、40.0%、24.7%、32.7%。这些设置比普通成功率更能暴露策略在干扰、外推和阶段切换中的脆弱性,也能观察视觉语义是否真正参与控制决策。
优势在 Safety 与 Long-Horizon 上更明显。这个结果与论文的方法动机一致:安全相关场景往往需要更可靠的物体定位和状态判断,长程任务则需要策略在多个阶段之间保持目标结构。若 backbone 的视觉语义被动作拟合侵蚀,模型更容易在干扰物或阶段切换处丢失任务逻辑。
9.3 RoboTwin 2.0
RoboTwin 2.0 同时提供低数据 Base 和加入随机化专家轨迹的 Data Scaling 设置。Base 每任务只有 50 条干净轨迹,VLAct-OFT 在 Clean/Random 上为 80.5%/41.5%,Qwen3VL-OFT 为 61.7%/10.5%。Data Scaling 为每任务加入 500 条随机化成功演示后,VLAct-OFT 达到 92.5%/90.8%。低数据与随机化两个设置分别考察表征效率和分布鲁棒性。
更重要的是动作头一致性检验。PI、OFT、GR00T 三个下游头在 Data Scaling-Clean 上分别为 93.0%、92.5%、89.6%。这说明提升没有绑死在某一只头上,也直接回应了先导实验中的 decoder lock-in 问题。进一步看,Random 设置的大幅差距表明预训练表征在分布变化下仍能提供更稳定的动作先验。
9.4 DOMINO
DOMINO 包含 35 个动态双臂任务。VLAct-OFT 的成功率和操作分数为 18.50/34.20,对应基线为 10.86/30.49。绝对数字不高,但任务本身涉及动态场景和双臂协调,难度明显高于普通桌面操作。操作分数比二元成功率更能反映部分完成程度,因此两项同时提升比单看成功率更有信息量。
这组结果也说明了跨本体动作布局的作用。DOMINO 的双臂设置与 AgileX 预训练数据更接近,统一关节空间和 wrap-aware loss 能让模型利用这类先验。需要注意的是,接近并不等于同分布,动态物体和更复杂的接触仍然是下游微调必须处理的问题。因此,这组数字应被理解为结构相近任务上的优势,而非对任意动态场景的普适结论。
9.5 Franka 真机
真机实验使用台面固定的 Franka Research 3,外部 D435 加每只手臂一台腕部 D405。单臂任务各 50 条演示,双臂任务各 100 条演示,均由人类使用 GELLO 遥操作收集。VLAct 与 Qwen3VL-4B-OFT 使用相同演示、动作头、优化器和 50K-step 预算,并从相同 10 组初始状态评测。相机、演示和初始状态的固定使失败差异更容易追溯到策略行为。
短程单臂四项任务的平均成功率为 92.5%,基线为 77.5%。物体换成训练未见的鸡蛋、辣椒、大蒜或方块后,两类短程 OOD 任务均保持 90.0%。长程“舀豆子”中,VLAct 的加权得分为 80.0%,基线为 33.3%;作者观察到基线经常跳过舀取,直接拿空勺执行倾倒。五项双臂协作平均成功率从 44.0% 升到 72.0%。
论文对长程任务采用分阶段计分,而不是只看最终二元成功。以清理桌面为例,三个独立步骤各占 0.33,因此 86.6% 与 73.3% 表示策略平均完成了多少任务阶段。失败分析也具体到行为层面:方块初始位置偏离训练分布时,基线会在推理中停住;笔入杯失败后会累积误差;双臂折毛巾时,两臂速度不同步会让布料从夹爪滑出。VLAct 的优势集中在定位、序列保持和双臂同步三个层面。
9.6 未见本体迁移
GR-1 人形本体既不属于 Franka,也不属于 AgileX。VLAct-OFT 使用 10%、20%、50%、100% RoboCasa-GR1 下游轨迹微调后,成功率依次为 41.42%、49.5%、51.0%、54.0%。其中 20% 数据的 49.5% 已超过论文列出的全量 Qwen3VL-OFT 48.8% 和 GR00T-N1.6 47.6%。这个设置考察的是预训练表征能否降低新本体的数据需求。
这组结果应被理解为数据高效的下游迁移,而不是零样本部署。新本体仍需定义相机、状态、动作空间、归一化和控制频率,并完成微调。它的意义在于,持续预训练得到的表征没有完全绑定 Franka 或 AgileX 的控制契约,换到未见过的人形本体后仍能降低所需演示量。
RoboDojo 提供了另一个外部检查。ARX X5 同样没有出现在持续预训练中;在 2026 年 8 月 24 日快照里,VLAct 的平均部分进度分数为 10.66,成功率为 7.60%,在 35 个策略中分别排第 8 和第 6。作者同时说明排行榜不统一训练算力,因此这组结果更适合作为外部参考,而不是严格控制实验。
10. 结论
VLAct 的贡献不在于又增加一种动作生成器,而在于把 VLM backbone 从“拿来就用的底座”变成 VLA 系统中可以独立优化的对象。浅层保护和 caption 共训负责守住通用视觉语言能力,多动作头共监督避免连续动作特征锁死在单一解码几何上,20 维部分统一表示与 wrap-aware loss 让不同机器人之间共享可共享的动作语义。论文的证据围绕这个归因展开:固定下游头和训练预算,固定真机演示与初始状态,再把目标本体移出持续预训练分布,观察同一批下游数据能否学出更好的策略。
236