VLA生成论文解读

灵巧手数据贵?先扔Simulation搞——SPD这篇paper的骚活

Stevlen.Fu Hongjin2026-09-18 17:13
灵巧手数据贵?先扔Simulation搞——SPD这篇paper的骚活

如果最近在看灵巧手、双臂操作、VLA 或者 Robot Foundation Model,大概率已经发现一个很尴尬的问题:大家天天在喊 Scale Data。

问题是:拿什么 Scale?

就没人吐槽一下,外包采的数据在“能用”这个范畴上真的很有抽象天赋么。

语言模型有互联网,视觉模型有全网图片和视频,机器人模型呢?机器人模型有实验室里那台被所有人轮流折腾、线缆已经开始有点可疑、每次摔一个零件大家都要集体沉默三秒的机械臂。

如果是普通夹爪还好,大概就是:开 → 关 → 抓 → 掉了 → 再抓。但一旦换成灵巧手,事情立刻开始不对劲。

普通夹爪的世界大概是:“我能不能把东西夹起来?”

灵巧手的世界是:“我的食指现在该压这里还是那里,中指是不是已经打滑了,拇指要不要补一点力,无名指是不是纯粹在摸鱼,以及这个杯子为什么突然开始转。”

一个双手灵巧操作系统,随随便便就是几十个自由度。SPD 这篇论文里的机器人,两条 arm 加两只 Sharpa Wave hand,一共:

2×6+2×22=562\times 6 + 2\times 22 = 56

56 个自由度。这已经不是“控制机器人”了,这属于:给控制系统开董事会。

于是灵巧操作领域长期有一个非常朴素的问题:真机数据太贵了。

你让人遥操作真机,当然数据最真实。但真实也是真的真实:物体掉地上要捡,杯子摔了要换,机器人撞桌子要检查,手指出问题要维修。实验室采一小时数据,可能对应三小时人类精神损耗。

外包闪亮登场:别管数据脏不脏,你就说多不多吧。

所以很多人自然会想到:那我用 Human Video 呗。互联网不是一堆人类手部操作视频吗?

理论上很好,问题是:

Human Hand≠Robot Hand\text{Human Hand} \neq \text{Robot Hand}

这句话看起来像废话,但在灵巧操作里非常致命。人的拇指结构、手指长度、关节范围、接触方式,跟机器人的 dexterous hand 根本不是一套东西。你最后还得做 Pose Estimation、Hand Tracking、Retargeting,然后再祈祷遮挡的时候模型没把食指认成中指。

而灵巧操作最重要的阶段,往往恰恰就是:手指正在把摄像头挡得严严实实的时候。

非常贴心。

所以 SPD 这篇论文想了一个特别朴素的方案,朴素到第一次看到的时候甚至会觉得:“这事以前怎么没人狠狠干一遍?”

它的思路是:既然真机器人贵,人手又跟机器人对不上,那我直接让人去操作一个虚拟机器人不就完了?

于是就有了 SPD:Simulation Pre-training for Dexterity。

名字听起来很论文,翻成人话就是:先让人在仿真里疯狂练机器人,练够了以后,再拿一点真机数据把它从虚拟世界拽回现实。

这篇 Paper 最大的点,其实不是“仿真能不能迁移到真机?”这个问题早就被问烂了。SPD 比较聪明的地方是,它压根没打算证明:

Simulation→Zero-shot Real Robot\text{Simulation} \rightarrow \text{Zero-shot Real Robot}

它没这么勇。它走的是:

Simulation Data→Policy Pre-training→少量 Real Data Fine-tuning→真机执行\text{Simulation Data} \rightarrow \text{Policy Pre-training} \rightarrow \text{少量 Real Data Fine-tuning} \rightarrow \text{真机执行}

也就是说:仿真不是来取代现实的,仿真是来当数据工厂的。

这个定位一下就合理很多。因为如果你非得要求 Simulation 直接 Zero-shot 到 Real,那 Simulator 就得尽量把现实世界复刻得像真的:摩擦系数不能乱,质量不能乱,接触不能乱,相机不能乱,延迟最好也不能乱。最后基本属于:“为了少做现实实验,我们决定先在电脑里重新造一个现实。”

然后你会发现:造现实也挺贵。

电机维修和摔坏的花瓶走什么报销?

SPD 换了个思路。没关系,Simulation 不需要百分之百真实,它先负责教机器人一些“基本功”:怎么靠近物体、什么时候换手、双手怎么配合、手指什么时候收紧、东西滑了以后怎么补救,做 handover 的时候别像两个部门交接项目一样互相甩锅。

至于真实世界里这个杯子摩擦力稍微不一样、马达速度有一点偏差、摄像头颜色跟 MuJoCo 不完全一致,这些东西最后再拿少量真机数据修。我觉得这是这篇论文最实际的地方。

作者搞了一个叫 spd-vr 的系统。操作者戴 Meta Quest 3,然后直接在 VR 里面操作 MuJoCo 里的双臂灵巧机器人。头显负责追踪 wrist 和 fingertips,再通过 inverse kinematics 控制虚拟机器人。MuJoCo 的 Physics 跑在 480 Hz,控制、Streaming 和 Recording 则是 60 Hz。

整个流程最大的优势可以总结成一句话:失败以后按一下 Reset。

没人需要弯腰捡杯子,没有博士生要趴桌子底下找 Jenga block,也没有人要停下来问:“等一下,这个 gripper 刚才是不是撞到了?”

这就是 Simulation 最伟大的地方之一。它当然不是没有问题,但是:它特别会保护研究生腰椎。

但是站久了,腿是不是也会有问题。

最后作者找了 5 个 operator,花了一周,采了大概 75 小时数据,总共 1,930 条 episode,包括 Jenga、字母积木、mug、dish、cup、bottle,里面有搭塔、handover、挂杯子、rack dishes、杯子堆叠、把瓶子扔进箱子等操作。

这里有一个地方挺重要。很多任务只告诉 operator:最后要做到什么。 但不强制规定:你必须怎么做。

于是同一个任务,不同人可能有不同操作方式,甚至同一个人今天和明天,操作顺序都可能不一样。在数据层面,这其实是件好事,因为 Dexterous Manipulation 本来就是一个很 Multimodal 的东西。

比如拿一个 mug,你可以抓杯身,也可以抓 handle;handover 的时候,可以左手先接,也可以右手先让,理论上都能做成。

所以如果你硬让一个普通 Regression Policy 去学:

a^t=fθ(ot)\hat{\mathbf a}_t = f_\theta(\mathbf o_t)

很容易发生一件特别经典的事情:训练数据里方案 A 合理,方案 B 也合理,模型一平均,得到方案 C。

方案 C:谁都不会这么干。

对某些普通回归问题来说,平均一下可能问题不大;对灵巧手来说,就会变成:“恭喜,你的五根手指达成了某种 民主妥协 不可抗力,然后东西掉了。”

所以 SPD 用的是一个 Diffusion Transformer Policy,总计大约 222M 参数,输入包括视觉信息、Proprioception 和历史动作,输出的是 Future Action Chunk。

可以粗略写成:

πθ(at:t+c−1∣ot−w+1:t,at−w:t−1)\pi_\theta \left( \mathbf a_{t:t+c-1} \mid \mathbf o_{t-w+1:t}, \mathbf a_{t-w:t-1} \right)

其中 (w) 表示 Policy 看多长的历史,(c) 表示一次预测多长的 Future Action。

这里还得特意说一句:SPD 没有上 Language。 因为他们这批 Simulation Data 并没有完整的语言标注,所以现在别把它理解成“给一句自然语言,双手什么都能给你干”的通用 VLA。

它目前更准确的定位是:Dexterous Visuomotor Pre-training。 先把“怎么看”和“怎么动”练好,以后再讨论怎么把语言也接进来。

然后就到了这篇 Paper 一个非常关键的词:On-Embodiment。

这个东西基本就是 SPD 的数据哲学核心。Human Video 的问题是:

Human Action Space≠Robot Action Space\text{Human Action Space} \neq \text{Robot Action Space}

SPD 想做到的则是:

Simulation Robot Action Space≈Real Robot Action Space\text{Simulation Robot Action Space} \approx \text{Real Robot Action Space}

因为 Simulation 里面那双手,本来就是按照目标机器人搭的,相机布局也尽量对齐,都是一个 Top Camera 加两个 Wrist Camera。所以 operator 从一开始就在操作机器人的身体,而不是操作人类的手 → 做 Pose Estimation → 做 Retargeting → 强行翻译成机器人动作。

这个区别其实特别大。

可以把 Human Video 想成:“我看别人怎么游泳,然后再把他动作翻译给螃蟹。”

SPD 是:“我先操作一只虚拟螃蟹在泳池模拟器里练,再把经验给真实螃蟹。”

所以显卡最后还是回归到游戏了么。

当然,Sim-to-Real Gap 还是存在,只是现在 Gap 从:

Human Embodiment→Robot Embodiment\text{Human Embodiment} \rightarrow \text{Robot Embodiment}

变成了:

Sim Robot→Real Robot\text{Sim Robot} \rightarrow \text{Real Robot}

SPD 赌的是:后面这个 Gap 比前面那个更容易补。

这个赌注我觉得还算务实。Human Video 的最大优势是量大,百万小时、千万小时都不是完全无法想象,但是 Action Supervision 很弱。SPD 刚好反过来:规模没有互联网视频那么夸张,但是 Action Label 很干净。

所以如果把机器人数据来源画成一条线,大概就是:

Human Video⟷Simulation Teleop⟷Real Robot Teleop\text{Human Video} \longleftrightarrow \text{Simulation Teleop} \longleftrightarrow \text{Real Robot Teleop}

越往左,便宜、数据多,但 Embodiment Gap 大;越往右,真实、直接,但钱包先死。

SPD 就站在中间说:“各位,要不别走极端。”

站中间,串两边。

模型结构本身其实没那么需要神化。三个 Camera Image 先过 Frozen DINOv3 ViT-B/16,然后每个 Camera 使用 4 个 Learnable Query 去 Cross-Attention Patch Features。简单说就是:把一大坨视觉 Token 压缩成少量、后面真正方便用的 Visual Representation。

主干是 8-block Transformer,Hidden Size 768,12 个 Attention Head。这部分属于:“正常,合理,现代。”

真正比较值得记的是它后面的 Temporal Design。

SPD 每条训练 Sequence 长度是 256 个 timestep,数据是 30 Hz,所以相当于一次 sequence 覆盖:

25630≈8.53 s\frac{256}{30} \approx 8.53\ \text{s}

左右的时间。

但是 Attention 不会每层都硬看完整 256 step,而是用了 32-step Sliding Window。视觉也不是每个 timestep 都重新塞一次,每 8 个 timestep 才送一次新的 Visual Feature。

这个挺合理,因为连续视频帧之间的信息量,有时候真的低得令人悲伤。

比如给你 30 张图,内容是:“手在靠近杯子。”“手还在靠近杯子。”“手依然在靠近杯子。”“手还他妈在靠近杯子。”

GPU:“收到,非常有信息量。”

Flow Matching 这块也可以很快过。假设真实的 Action Chunk 是:

x1\mathbf x_1

随机噪声是:

x0∼N(0,I)\mathbf x_0 \sim \mathcal N(0,I)

随机采一个 Flow Time:

τ∼U(0,1)\tau \sim \mathcal U(0,1)

然后在 Noise 和真实 Action 之间做线性插值:

xτ=(1−τ)x0+τx1\mathbf x_\tau = (1-\tau)\mathbf x_0 + \tau\mathbf x_1

目标 Velocity 是:

v⋆=x1−x0\mathbf v^\star = \mathbf x_1-\mathbf x_0

模型根据当前 noisy action、Flow Time 以及前面的 sensorimotor context (\mathbf h),去预测:

vθ(xτ,τ,h)\mathbf v_\theta \left( \mathbf x_\tau,\tau,\mathbf h \right)

对应的 Flow Matching Loss 可以写成:

LFM=E[∥vθ(xτ,τ,h)−(x1−x0)∥22]\mathcal L_{\mathrm{FM}} = \mathbb E \left[ \left\| \mathbf v_\theta \left( \mathbf x_\tau,\tau,\mathbf h \right) - \left( \mathbf x_1-\mathbf x_0 \right) \right\|_2^2 \right]

这部分说白了就是:让模型学会怎么从随机动作噪声,一路往“合理动作”那个方向走。

没必要在这里表演数学体操。

真正有意思的是:History 长度 (w) 和 Action Chunk 长度 (c),到底应该怎么选。

这个是我觉得整篇 Paper 最实用的实验之一。

大家都知道 Action Chunk 长有好处。比如一次直接预测:

c=32c=32

step。

30 Hz 下,大概就是:

3230≈1.07 s\frac{32}{30} \approx 1.07\ \text{s}

差不多一秒。一秒钟内不重新规划,动作会比较连续,机器人不会动一下、想一下、动一下、想一下,像第一次学科目二的人。

问题是:灵巧操作里,一秒真的很长。

特别是在接触阶段。手指可能 0.2 秒就滑了,杯子 0.3 秒就转了,Jenga 0.5 秒就已经开始表达它对你控制算法的不满。

结果你的机器人还在执行:“我一秒前觉得这个计划挺好的。”

这就很有项目管理的味道。

所以作者把 Chunk 缩短:

c=8c=8

30 Hz 下就是:

830≈0.27 s\frac{8}{30} \approx 0.27\ \text{s}

这样大概每 0.27 秒就能重新 Observe、重新 Plan,反应速度快多了。

但是一个新问题马上出现。如果你只看当前帧:

w=1w=1

同时每 0.27 秒就重新换一次计划:

c=8c=8

机器人会开始抖。

原因也很好理解:它每次重新规划,都像刚失忆。

它不知道自己上一秒刚干了什么。上一刻:“我要从左边绕过去。”下一刻:“诶,这里好像也能抓。”再下一刻:“不对,我觉得右边更合理。”

最终效果:机器人拥有高度民主的内部意见分歧。

作者的解决办法也非常直接:给它 History。

最后效果最好的是:

w=32,c=8w=32, \qquad c=8

也就是看大约一秒左右的历史,但每 0.27 秒重新出一个新的 Action Chunk。

这个设计我还挺喜欢,因为它把本来纠缠在一起的两个问题拆开了:Temporal Coherence 怎么来?靠 History。Reactive Control 怎么来?靠 Short Action Chunk。

可以直接记成:

History⇒别突然失忆\boxed{ \text{History} \Rightarrow \text{别突然失忆} }

和:

Short Chunk⇒别一条路走到黑\boxed{ \text{Short Chunk} \Rightarrow \text{别一条路走到黑} }

这比单纯把 Action Chunk 无限拉长要合理很多。

更有意思的是:Simulation Pre-training 到底有没有用,居然非常依赖这个 Temporal Structure。

作者测试了:

w∈{1,32},c∈{8,32}w\in\{1,32\}, \qquad c\in\{8,32\}

不同组合。

最强的正是:

w=32,c=8w=32, \qquad c=8

这个设置下,SPD 平均 Task Progress 是:

76.7%76.7\%

同一个 Architecture,但是不做 Simulation Pre-training,直接在真机数据上从头做 Behavior Cloning:

58.9%58.9\%

差了 17.8 个百分点。

这件事其实很有意思,因为它说明:Pre-training 不是你训好了以后,随便插到任何 Architecture 上都自动 +20%。

不是充话费送流量。

下游 Policy 得有能力把预训练阶段学到的 Skill 调出来。比如 Simulation 里学到的是:“刚才手指碰到了物体,所以现在应该补一下。”结果你的 downstream policy 只看当前帧,那你让它学这个有什么用?它根本没有“刚才”。

这和前面 MEMOBench 那篇甚至有点奇妙的呼应。MEMOBench 在说:机器人如果几分钟任务里一直忘记过去,会出大问题。SPD 在说:兄弟,别说几分钟了,一秒钟灵巧操作,你把过去忘了都可能开始抽搐。

所以 SPD 这里所谓的 Visual Dexterity,严格来说其实不只是:

Image→Action\text{Image} \rightarrow \text{Action}

而更接近:

Visual History+Proprioception+Action History→Dexterous Action\text{Visual History} + \text{Proprioception} + \text{Action History} \rightarrow \text{Dexterous Action}

这个我觉得是一个挺好的 takeaway。

然后来到大家最喜欢的部分:真机。

作者测试了五个双臂灵巧操作任务:Plate Racking、Mug Hanging、Jenga、Cup Stacking、Bottles in Bin。都不是那种“拿起方块,放进盒子”,否则 56 DoF 就显得有点浪费。

比如 Mug Hanging,不是只把杯子拿起来,而是先拿,然后 Handover,最后挂到架子上。Jenga 更离谱一点:先把 Block 推出来,然后从另一边拉出来,塔还不能塌,最后还要把它放到顶上。

属于机器人界经典:你但凡有一个步骤没做好,前面全白忙。

而且作者每个任务真正使用的 Real-world Fine-tuning Data 并不算特别多,大概:

44∼121 min44\sim121\ \text{min}

一个任务。

Mug 大概 44 分钟,Jenga 48 分钟,Plate 70 分钟,Bottle 72 分钟,Cup 比较难,用了 121 分钟。

所以它真正比较的是:

75 h Sim Pre-training+约 1 h Real Fine-tuning75\ \text{h Sim Pre-training} + \text{约 }1\ \text{h Real Fine-tuning}

和:

约 1 h Real Data From Scratch\text{约 }1\ \text{h Real Data From Scratch}

到底谁更强。

结果确实是 Simulation Pre-training 全面赢,尤其 Jenga、Cup、Bottle 这种更吃 Dexterity 的任务,提升非常明显。

不过这里有一个坑一定要说。

论文里的:

76.7%76.7\%

不是“76.7% 的任务完整成功”。

它报告的是:Normalized Task Progress。

也就是说,每个任务被拆成几个阶段。比如 Jenga:推出去一分;拉出来,而且塔没倒,再一分;最后放到顶上,再一分。

所以 (76.7%) 更接近:“平均完成了大约四分之三的任务阶段。”

它不是 Binary Success Rate。

这个一定要讲清楚,否则特别容易变成:“SPD 真机灵巧操作成功率 76.7%!”

然后论文作者隔空血压升高。

其实对于 Dexterous Manipulation 来说,Progress Metric 本身挺合理的。一个 Policy 如果每次都能走到最后一步再失败,和一个第一步就趴窝的 Policy,显然不是一个水平。

只是:别把 Progress 当 Success。

那这篇 Paper 最大的意义到底是什么?

我觉得不是“MuJoCo 很牛”,也不是“VR 可以采数据”,这些东西都不新。

真正重要的是:它重新给 Simulation 找了一个位置。

以前大家提 Simulation,大概有两种经典用法。第一种:

Sim Train→Zero-shot Real\text{Sim Train} \rightarrow \text{Zero-shot Real}

目标是把 Simulator 搞得足够好,最后现实世界直接跑。

第二种就是:“我这个算法先在仿真 Benchmark 测一下。”也就是 Simulation 作为考试场。

SPD 说:不,还有第三种。

Simulation=Robot Data Factory\boxed{ \text{Simulation} = \text{Robot Data Factory} }

重点不是“最终 Policy 是不是完全在 Simulation 里训练出来的”,而是:仿真能不能先廉价制造一大堆高质量 Robot-native Data。

这件事我觉得很值得关心,特别是灵巧手、双足、Humanoid 这种高自由度系统。

真机数据每一小时都贵。你想 Scale 到 100 小时、1000 小时、10000 小时,最后可能不是 GPU 先不够,是硬件、操作员、维护人员、实验室管理员先集体辞职。

SPD 至少给了一条还算现实的中间路线:让 Human Operator 继续提供人最擅长的东西——策略、直觉、灵巧行为;然后 Simulation 提供低成本 Reset、并行、安全、干净状态和 Robot-native Action Label。

这么一看,其实很合理。

当然,这篇 Paper 离“以后不用采真机数据了”还差十万八千里。

问题也不少。

首先,75 小时其实还是不算特别大,而且主要集中在六类 Scene Family,距离真正的 General-purpose Dexterity 还很远。

其次,Downstream Real Task 和 Simulation Pre-training 不是完全无关。虽然对象不是完全同一批,但 Object Category 和 Manipulation Pattern 还是比较接近。

所以现在它真正证明的是:Simulation Pre-training 可以迁移一部分 Dexterous Skill Prior。

不是:机器人突然获得了 Open-world Dexterity。

这俩差得挺远。

然后是 Simulation Quality。

别觉得既然不追求 Zero-shot Sim-to-Real,就可以随便乱填 friction。不行。

假如仿真里的杯子摩擦力大得像贴了双面胶,Operator 在里面学会“两根手指随便夹”,到了现实:啪,杯子没了。

这时候你的 75 小时 Pre-training 就不是 Prior,是:Bad Habit Pre-training。

所以我觉得未来这个方向真正值得研究的问题,可能不是“Simulator 看起来有多逼真”,而是:Simulator 里面采出来的 Behavior Distribution,到底像不像现实世界里有用的行为?

这个问题可能比单纯追 Photorealistic Rendering 更重要。

最后一个问题:SPD 还是需要人。5 个 Operator,一周,75 小时。虽然比真机采舒服太多,但是 Human Time 并没有消失。

所以一个很自然的下一步就是:RL。

Human Teleop 的 Scaling 大概是:

More Data∝More Human Time\text{More Data} \propto \text{More Human Time}

而 Simulation RL 理论上可以尝试把它变成:

More Data∝More Compute\text{More Data} \propto \text{More Compute}

如果先让人类在 Simulation 里给 Policy 一套比较靠谱的灵巧操作 Prior,然后再让 RL 在里面自己刷题,这条路线其实挺顺的。

而且如果把 SPD 跟前面聊过的 ZimaBlue 放在一起看,就更有意思。

ZimaBlue 是:

海量 Action-free Video→World Prior→Robot Action\text{海量 Action-free Video} \rightarrow \text{World Prior} \rightarrow \text{Robot Action}

SPD 是:

大量 Simulated Action-labeled Experience→Dexterity Prior→Real Robot\text{大量 Simulated Action-labeled Experience} \rightarrow \text{Dexterity Prior} \rightarrow \text{Real Robot}

两个方向其实刚好互补。

ZimaBlue 数据多、世界丰富,但是 Action Label 弱;SPD 数据没那么大、世界没那么丰富,但是 Action Label 贼干净。

所以我甚至觉得,未来比较合理的数据配方可能不是二选一,而是:

Human Video+Simulation Teleop+Simulation RL+Real Robot Data\boxed{ \text{Human Video} + \text{Simulation Teleop} + \text{Simulation RL} + \text{Real Robot Data} }

Human Video 负责让模型见世面;Simulation Teleop 负责人类把操作技巧传进去;Simulation RL 负责让机器人自己刷题;Real Robot 负责最后告诉它:“孩子,现实世界没你想得这么理想。”

这个组合听起来反而比“我们再采十万小时真机”现实一点。

所以如果你问:这篇 SPD 到底有没有必要看?

如果你做的是 Dexterous Manipulation、Bimanual Manipulation、Humanoid Hand、Sim-to-Real、Robot Data 或 Robot Foundation Model,那我觉得:值得看。

而且不用一上来从头啃到尾。重点看三件事就够了:第一,他们到底怎么采 Simulation Teleoperation Data,也就是 VR + MuJoCo 那套 Pipeline;第二,为什么

w=32,c=8w=32, \qquad c=8

这么重要,这部分甚至对不做灵巧手的人都有参考价值,它背后的本质就是:短 Chunk 保证 Reactive,History 保证 Continuity。

第三就是真机实验,尤其要看清:76.7% 是 Progress,不是 Success。 然后再看 Pre-trained 和 From-scratch 到底在哪些任务上差得最明显。

如果你只是做普通单臂夹爪 Pick-and-place,那这篇 Paper 对你的直接方法价值可能没那么高。但如果你关心的是:高自由度机器人的数据以后到底要怎么 Scale。

那 SPD 挺值得知道。

因为这篇 Paper 真正想表达的:

各位,别老把 Simulation 当考试场。它完全可以直接当数据工厂。

先在虚拟世界里面让机器人把抓东西、换手、捏住、别掉、别抖这些基本功练个几千几万遍,然后最后拿一点现实数据告诉它:“对,基本就这么干。但是现实世界里的杯子更滑,电机没你仿真里面那么听话,摄像头也没那么干净。以及——你这次真掉了,我是真的要去捡。”

如果一定要一句话总结 SPD:

它没有证明仿真能够替代现实,而是证明了一件更实用的事:真机数据贵得离谱的时候,完全可以先让机器人在虚拟世界里把基本功卷起来,最后再花一点现实成本把它拉回来。

我觉得这反而比天天喊 Zero-shot Sim-to-Real 靠谱得多。

点赞收藏
// 评论0
0 / 500
还没有评论,快来抢沙发