问题 · §1
指令里的东西不在画面里,VLA 就没有依据
多数 VLA 在固定视角的桌面上训练:一个静态相机或第三人称视角,标定简单、状态估计稳定、数据好采。论文指出这里藏着一个视野绑定假设(view-bound assumption):决策时,指令提到的物体一定在当前相机画面里。目标一旦被遮挡或在视野外,感知—动作回路就断了,策略没有任何上下文去推断它在哪。
现有的两条补救路线,论文认为都不够:
- 靠模型内部的空间推理猜。RoboBrain、Galaxea G0、AgiBot 等用学到的空间先验推断看不见的目标。但现有 MLLM 只有在画面里有部分证据或相关线索时才推得准,目标完全在视野外时空间估计迅速变差(引 VSI-Bench)。没见过、或者见过但没存下来的东西,模型再大也补不回来。
- 装可动相机去找。ViA、ActiveUMI 用可动相机暴露未见区域,但它们不看指令(instruction-agnostic),底层是 Diffusion Policy,没有持久的空间记忆。MemoryVLA、MemER 这类记忆设计存的是最近的观测或关键帧,服务于短时推理,也不保存当前视锥以外的空间信息。
论文的结论是需要两样东西同时具备:能拿到当前视野以外的空间证据(可动头部),以及把证据存进一个持久的场景表示(空间记忆)。
解读这篇的 harness 改的是“记什么”,但先要改“看什么”
SOMA 的记忆不是从策略看过的画面里被动攒出来的。它先主动扫一遍场景,把视锥外的物体写进记忆,再让策略在操作时读。所以它同时动了两处:扫描阶段决定记忆里有什么,检索阶段决定策略每一步从记忆里拿到什么。表 2 的消融正好把这两件事拆开(见结果部分)。
方法 · 全局 · §3 · Figure 2
扫描 → 记忆 → 刷新 → 读出 → DiT
推理时的一个回合按论文 §3 和 §4.2 的描述是这样走的:
- 触发。一个轻量检测器检查指令里的目标在当前视野里能不能定位到。能,就不扫描;不能,就启动扫描。
- 扫描建图。头部沿预先定义的轨迹转动,采一段多视角视频,每 N 帧取一帧,生成 overview memory 𝓜0。
- 每一步。输入当前三路相机 otc(c ∈ {l, r, h}:左腕、右腕、头部)、指令、机器人状态、加噪动作序列。只有头部画面 oth 被拿来刷新记忆,得到 𝓜̂t。
- 读出与出动作。VLM 的视觉语言 token 对 𝓜̂t 做交叉注意力得到 Xboost,和原始视觉语言 token、状态、加噪动作一起进 DiT,动作解码器输出长度为 H 的动作块(H 未披露)。
俯视沙盘:一张桌面走一遍 SOMA
机制按 §3 与表 2 的变体定义;场景、坐标、视场角是示意
用法:先选目标再点“开始”。扫描结束后拖动头部 pan,松手或点“观测一帧”即处理一帧头部画面(相当于前进 N 步)。“把目标放进篮子”模拟一次抓放,之后把头转回篮子方向看记忆怎样刷新。两个“关联”按钮对应论文的类内外观+几何关联在物体被挪动后的两种结果,阈值数值论文未披露。
解读沙盘里哪些是论文的,哪些是我们补的
论文的:扫描只在目标定位不到时触发;扫描轨迹是预定义的(图 2 画的是中→左→右);每 N 帧取一帧;同类实例按外观+几何相似度关联、超过阈值就平均合并;操作中只用头部画面刷新;匹配上的条目做 α = g·s 的 EMA,没匹配上的观测追加为新条目,没被观测到的旧条目保留;四个变体的定义取自表 2 图注。我们补的:物体摆放、坐标、69° 视场、扫描角度范围、EMA 的位置插值画法(真实的插值发生在 384 维向量上),以及“关联匹配上/没匹配上”这两种结果的手动切换。
方法 · ① Spatial Memory Construction · §3.1 · 附录 B
每个物体压成一个 token:外观 + 3D 框
输入是头部扫描视频 V = {fi}i=1…Nv,每 N 帧均匀取一帧得到子集 Ṽ。每一帧过同一条感知流水线:
VGGT
估计每帧的相机位姿和粗略场景几何。VGGT 在同一个场景级坐标系里给出所有帧的位姿,论文直接把它当作全局参考系,所有 3D 框都表达在这个系里。
论文的理由:扫描是短时、静态的,位姿漂移可以忽略。
YOLO-World
检测物体、给出 2D 框 b(i)j 和类别标签 c。开放词表的提示词(检测哪些类)论文没写。
DINOv3
给出特征图 F(i) ∈ ℝH×W×C。用 2D 框裁出对应区域,空间平均池化,得到实例外观向量 f(i)j ∈ ℝC。
- 抬到 3D。每个 2D 检测借 VGGT 的几何先验抬成 3D 框 b(i)j ∈ ℝ8×3(8 个角点)。
- 跨视角关联。同一物体会在多帧里出现,同类的不同物体也要分开。做法是按类别分组,组内用 DINOv3 外观的余弦相似度加 3D 框的空间一致性算联合相似度,超过阈值就合并,外观特征和 3D 几何取平均。得到 NI 个全局实例:𝓕 = {fk}、𝓑3D = {bk}、𝓒3D = {ck}。
- 空帧兜底。某个采样帧一个物体都没检测到时,注入学到的占位嵌入和伪框,保证记忆结构连续。
| 模块(附录表 6) | 结构 | 作用 |
|---|---|---|
| Φpos 3D 框嵌入 | LN(8×3) → 24→768 → GELU → 768→768 → GELU → 768→384 → GELU → LN 384 | 8 个角点坐标 → 384 维位置描述 |
| Spatial Positional Refinement | LN 384 → 384→768 → GELU → 768→768 → GELU → 768→384 → GELU → LN 384 | 第二级 MLP,压多视角抬升带来的几何噪声(正文没提到这一级) |
| Φmem 记忆投影 | LN 384 → 384→768 → GELU → 768→384 → GELU → LN 384 | 外观向量投到记忆空间,和 pk 相加 |
解读记忆的形状:NI 个 384 维 token,与时间长度无关
Φmem 的输入是 384 维,说明 DINOv3 的特征宽度 C = 384,对应 ViT-S 一档(论文没写用哪个变体)。图 8 里去掉 DINOv3 只省约 114 MB 显存(7966 → 7852 MB),也和小模型一致。记忆的大小由场景里的物体数决定:一个桌面几个物体,就是几个 token。这和 MemoryVLA 那种按时间步存 token 的记忆很不一样,后者随回合变长而增长,需要合并来控制容量。
几何从哪来:VGGT 还是深度相机(附录表 13)
| 几何来源 | 视野外任务 SR (%) ↑ | 延迟 (s) ↓ |
|---|---|---|
| RGB-D + OpenCV 融合 | 22.6 | 0.18 |
| VGGT 几何 + 位姿 | 27.3 | 0.21 |
平台上明明有 D435 深度相机,论文仍选 VGGT。理由是真实深度有噪声、缺失和跨视角错位,多视角点云配准时误差累积,记忆的几何一致性变差;VGGT 在头部转动时给出更稳定的跨视角几何和位姿。论文的总结是:对视野外操作,几何一致性比原始深度精度更重要。表里的延迟指什么环节(每帧?每次建图?)没写清。
预处理开销(原文 Figure 8)
去掉哪个感知模型,省多少
横轴显存(MB),纵轴耗时(s/it),点旁标 GR1 消融成功率。数字读自原图标注;“每 it”是每帧还是每条示范,图注说“per demo”,坐标轴写 s/it,没讲清。
VGGT 是大头:去掉它显存从 7966 MB 降到 1224 MB、耗时减半多,但 GR1 成功率掉 4.2 个点;去掉 DINOv3 几乎不省资源,却掉 5.6 个点。注意这是训练时离线预处理的开销;部署时这条感知栈要在线跑,论文只给了整体的每块延迟(见训练与推理)。
方法 · ② Dynamic Memory Refinement · §3.2
新观测要不要写进去,由两个门的乘积决定
操作过程中物体会被移动、遮挡或新出现。每一步,当前头部画面 oth 过同一条流水线,得到当前记忆 token 𝓜t = {mtj},其中 mtj = Φmem(ftj) + p̄cjt。然后和上一时刻的记忆 𝓜t−1 做实例级关联:
- 只在同类条目里找,判据与扫描建图时相同(外观+几何)。
- 一对一:每个观测最多匹配一个记忆条目,每个条目每步最多被一个观测更新。
- 匹配上的,算两个分数再做 EMA:
- 没匹配上的新观测追加为新条目。
- 没被观测到的旧条目保留,用来应对暂时遮挡和部分可观测。
结果记为 𝓜̂t = {m̂tk},共 NMt 个条目。整个过程没有删除操作。
两个门:s 和 g 都开才写入
公式 (1)(2);右侧为附录表 10 的更新策略消融
消融里 SimEMA 是“普通 EMA 更新”(引 SimCLR),Only stkj / Only gtkj 是只用一个门。完整的乘积门 49.3,比三种替代高 5.1–8.6 个点。
疑点公式和附录表 6 对不上的三处
- Φsim 的输入维度。公式里 Φsim 只吃差向量 [mk − mj](384 维),表 6 却写 LN(3×384)、Linear(1152→768),输入是三个 384 维向量的拼接,可能是 [mk, mj, mk − mj],正文没说。
- s 和 g 不是标量。表 6 里 Φsim 和 Φfuse 的最后一层都输出 384 维(再接 LayerNorm),过 sigmoid 后是 384 维向量。如果按表 6 实现,α 是逐通道的门,“语义相似度分数”这个说法只是比喻。另外整个训练只有动作损失,s 并没有被监督成“相似度”。
- 位置项的记号变了。§3.1 用每个实例自己的 pk,§3.2 写成 p̄c。tex 源码里被注释掉的早期版本把 p̄c 定义为同类别所有框的平均位置编码;正式版说它是“由该实例估计 3D 位置得到的位置编码”。如果实现里真是按类平均,同类的多个杯子会共用一个位置,这和“类内区分实例”的目标矛盾。
方法 · ③ Contextual Memory Retrieval · §3.3 · 附录表 6
没有“选中目标”这一步:VLM 的所有 token 对全部记忆做注意力
VLM 输出的视觉语言 token Xvl = {xi}i=1…Nq 当 query,刷新后的记忆 𝓜̂t 当 key/value。记忆 token 先经对齐 MLP 投到 VLM 的特征空间:
Nq 个 VL token
来自 VLM(框架图里三路相机画面和指令一起进 VLM),包括图像 token 和指令 token。Xboost 的长度和 query 一样是 Nq:每个 VL token 都被“补”上记忆里的空间信息,而不是检索出几条记忆。
NMt 个记忆 token
Φalign:LN 384 → 384→768 → GELU → 768→dVLM → GELU → LN。dVLM 的数值没写。附录的 Memory–Token Transformer 是 3 层、32 头、每头 64 维、dropout 0.2。
进 DiT 当全局上下文
Xboost 作为空间—语义先验注入 DiT 块;原始 VL token、机器人状态、加噪动作嵌入照常进 DiT。论文说 Xboost “调制 token 间的交互”,具体是拼进交叉注意力的 K/V 还是别的方式,未披露
读出模块怎么做(附录表 10 · Retrieval Module)
GR1 Full 数据,平均成功率。Concat = 把感知 token 和记忆特征直接拼接;Light / Middle / Heavy = 2 / 3 / 4 层交叉注意力。
论文说读出性能“和模型容量强相关”,但数字并不单调:2 层(42.8)比直接拼接(45.6)还低,4 层(44.4)又比 3 层(49.3)低近 5 个点。更稳妥的读法是:3 层这个配置在这次评测里最好。
疑点交叉注意力还是自注意力
正文和表 10 图注都说是交叉注意力(cross-attention),附录表 6 却把这个模块写成“Self-Attention Transformer (3 layers)”。如果是把记忆 token 和 VL token 拼在一起做自注意力,记忆 token 之间、VL token 之间也会互相看,和公式里的单向读出不是一回事。另外公式用 √C 缩放,而多头实现里应是每头维度 64。
方法 · 训练与推理 · §4.2 · 附录 B · 算法 1
训练时感知栈离线跑,推理时在线跑
训练
- 基座
- GR00T N1.5。论文原话是“采用 GR00T N1.5 作为真机 baseline”;框架图里的 VLM、状态/动作编码器、DiT 块和 embodiment-specific 动作解码器与 GR00T N1.5 一致,解读记忆模块是加在它上面的
- 可训练
- 除 VLM 的语言解码器外全部训练,多任务学习
- 规模
- batch 60,30,000 步,32 张 H200
- 损失
- 正文没写;输入里有“加噪动作序列”,解读应沿用 GR00T 的 flow matching 动作损失,记忆模块没有辅助损失
- 记忆
- Spatial Memory Construction 在数据预处理阶段离线完成(算法 1)
推理
- 硬件
- 一台 RTX 4090 服务器(机器人上有 Jetson AGX Orin 64 GB,但推理不在上面)
- 触发
- 轻量检测器判断目标是否可见,不可见才扫描;检测器是哪个没写
- 扫描
- 预定义轨迹,不是学出来的探索策略
- 仿真
- overview memory 直接用初始观测构建,没有扫描
- 延迟
- 约 1.58 s / 动作块(表 12),GR00T N1.5 约 1.30 s
算法 1:稀疏取证据,再回填到每一步
MemoryPreprocess 的三步
示意 N = 20(表 11 选定的间隔)。扫描段每 N/3 帧取一帧,操作段每 N 步取一帧,其余步回填最近的取样步 t′ = ⌊t/N⌋·N。
回填意味着训练时一个 20 步区间内的所有样本,看到的是同一份记忆证据;论文称这样“经验上保留了刷新所需的全部信息”。推理时记忆多久刷新一次,论文没有单独说明。
采样间隔 N(附录表 11)
GR1 平均成功率。表题说的是“扫描序列的采样频率”,但 GR1 没有扫描阶段(记忆从首帧构建),这里实际变的应是操作段的刷新间隔。
原表数字(表 11)
在线推理延迟(附录表 12)
真机实验,每个动作块的秒数,均为约数。
SOMA 比 GR00T N1.5 每块多约 0.28 s。论文说“同一量级、不构成过大开销”。动作块长度 H 和控制频率都没给,所以换算不出实际的反应频率;这 1.58 s 里是否每块都重跑 YOLO-World + DINOv3 + VGGT 也没说。
实验设置 · §4.1–4.2 · 附录 A、C
五个“看不见”的抓放任务,外加两个全可见的仿真基准
遥操作与数据清洗(附录 A)
Meta Quest 3 做统一接口,操作员穿仿 GELLO 的全尺寸双臂外骨骼,关节到关节映射到机器人双臂。头部 pan–tilt 映射到 Quest 3 手柄按键,离散、低延迟地调视角。不往头显里推相机画面,所有画面显示在工作站的显示器上,以免编码、无线传输和渲染延迟。
逐帧人工审查 6 条规则:执行延迟 ≥300 ms;夹爪开合抖动;夹爪读数尖峰(正常 0–1000,出现 1001–1010 视为损坏);画面被人体侵入、手臂缺失或严重运动模糊;自上而下的抓取(要求水平抓取);丢帧 ≥2.5 帧(录制上限 25 FPS)。
数据量(附录 A)
5 个任务 × 400 条示范 = 2000 条,每个任务 3 种物体。每条轨迹包含扫描段(建 overview memory)和操作段(所有对比模型都用操作段训练)。
原始数据降采样 2 倍后共 711,524 帧,平均 12.74 Hz,约 15.52 小时。
基线同样在“可动头部”的数据上训练,论文称为公平起见;Fixed Head Camera 是把 SOMA 放在固定头部设置下训练。
| 任务 | 抓取目标 | 放置目标 | 评测阶段(图 4) | 考什么 |
|---|---|---|---|---|
| 1 Invisible-to-Invisible | 视野外 | 视野外 | Pick / Place | 完全脱离直接观测的操作 |
| 2 Visible-to-Invisible | 视野内 | 视野外 | Pick / Place | 召回看不见的放置位置 |
| 3 Invisible-to-Visible | 视野外 | 视野内 | Pick / Place | 召回看不见的物体再精确执行 |
| 4 Sequential Dual-Object | 先视野内、后视野外 | 同一个篮子 | PnP-1 / PnP-2 | 跨阶段保留并复用记忆 |
| 5 Dual-Arm Coordination | 视野外 | 视野外 | Pick / Exchange / Place | 双臂交接 + 全局一致的空间表示 |
- 真机评测:每个任务 20 个回合,报告各阶段成功率。基线 StarVLA、SpatialVLA、GR00T N1.5 均用可动头部训练,外加 Fixed Head Camera 版 SOMA。
- RoboCasa Tabletop GR1:GR-1 人形 + Fourier 灵巧手,24 个任务分 5 类(容器交互、烹饪准备、桌面上菜、餐具转移、托盘整理),单路头部第一视角 RGB。每任务 30 / 100 / 300 条示范和 Full(完整数据集)。基线 Diffusion Policy、StarVLA*(Qwen-GR00T 设置)、GR00T N1.5。所有物体都可见。
- SimplerEnv:只用 Fractal(Google Robot)套件的 3 个任务:Pick Coke Can、Move Near、Open/Close Drawer,分 Visual Matching 和 Variant Aggregation 两种协议。表注说所有模型都在 OXE 上预训练、再在 Fractal 上微调。
- 消融:在 GR1 上做,以 Full 数据版本为基线,正文说“每个设置评测 50 个回合”。
结果 · §4.3–4.5 · 附录 D
真机三组、仿真两组、消融四组
真机:五个任务的分阶段成功率(原文 Figure 4)
每个阶段的成功率,20 个回合
数字读自原图柱顶标注。上:任务 1–3;下:任务 4–5。纵向虚线分隔任务。
图中数字(Figure 4)
按任务把阶段取平均,再对五个任务取平均
我们按图 4 算的。SOMA 的结果 28.3 与表 2 “Full SOMA” 的 SR 一致,说明表 2 用的就是这种口径。
几个读数:
- 固定头部基本做不了。Fixed Head Camera 只在“抓取目标起初可见”的阶段有分(任务 2 Pick 25、任务 4 PnP-1 30),其余全是 0,说明任务确实依赖视野外信息。
- 可动头部的三个基线几乎一样。StarVLA、SpatialVLA、GR00T N1.5 平均 15.5–18.3,差距在 1 个回合左右。
- SOMA 的优势落在后半程。任务 4 第二个物体(视野外)25 vs 15,任务 2 放到看不见的篮子里 35 vs 15。但任务 5 的 Exchange 阶段 SOMA 和 StarVLA、GR00T 一样是 10(2/20)。
- 绝对水平低。最高的单阶段是 40(任务 4 PnP-1,StarVLA 同为 40);每个百分点差 5 就是 1 个回合。
真机:行为指标(表 1)
GR00T N1.5 vs SOMA,越低越好
附录 D.2 定义:每个回合算一次,再对 20 个回合平均。条旁的百分比是表里标注的降幅。
原表数字(表 1)
疑点行为指标的定义和用法有几处说不通
- First-Fixation Time 不是“找到目标的时间”。附录定义是从目标首次进入头部视野到手臂开始抓取的时长(人工离线标注)。正文却把它解读为“视觉锁定目标所需的时间缩短”。按定义,它衡量的是看到之后多快下手。
- Time-to-Grasp 的单位。附录定义为“从回合开始到成功抓取的环境步数”,表 1 的单位却是秒。
- 失败回合怎么算。Grasp Attempt Count 和 Time-to-Grasp 都以“直到成功抓取”为终点,但 GR00T 的抓取阶段成功率只有 15–35%,SOMA 也只有 30–40%:多数回合没有成功抓取。论文说每个指标对 20 个回合取平均,失败回合用什么值没交代。SOMA 在任务 1、3 上 Grasp Attempt 恰好是 1.0。
- 任务 2 的搜索转角。任务 2 的抓取目标起初就在视野里,“目标首次可见前的头部累计转角”应接近 0,表里却是 51.0 / 28.1 度,这里的“目标”指什么(可能是放置目标)没说明。
- 解读降幅过于整齐。同一任务上五个性质不同的指标降幅几乎相同:任务 1 全在 44–45%,任务 5 全在 57–60%。论文没有给逐回合数据或方差,无法判断这是巧合还是计算方式造成的。
真机:扫描和记忆各贡献多少(表 2)
四个变体,5 个任务
Scan+GR00T:扫描,把检测到目标的那一帧当作固定视觉输入给反应式策略,没有持久记忆。No-Scan SOMA:记忆只从第一帧初始化。Scan-only SOMA:扫描建图,但操作中关掉刷新。
原表数字(表 2)
按平均 SR 逐级看:只扫描不存(18.5)→ 有记忆结构但不扫描(19.8,+1.3)→ 扫描建图但不刷新(24.1,+4.3)→ 扫描 + 刷新(28.3,+4.2)。论文据此认为“主要增益来自持久记忆及其持续刷新,而不是扫描本身”。解读也可以说扫描建图和刷新各占一半,单有记忆结构的增益(+1.3)很小。
疑点表 2 的数字和 20 个回合对不上
图 4 的每个阶段成功率都是 5 的倍数(20 个回合),按任务对阶段取平均后,两阶段任务只能是 2.5 的倍数,三阶段任务只能是 1.67 的倍数。Full SOMA 那一列完全符合(30.0、35.0、27.5、32.5、16.7)。但另三列有 19.0、22.0、16.0、24.0、26.0、29.0、14.2 这类值,20 个回合按阶段平均得不出来。这三个变体的评测次数或口径论文没说。另外附录表 13 里“VGGT 几何 + 位姿”的视野外 SR 是 27.3,按理应与 Full SOMA 是同一配置,却和 28.3 不同。
仿真:RoboCasa Tabletop GR1(表 3)
平均成功率随每任务示范数的变化
横轴按类别等距。Diffusion Policy 没有 Full 数据的结果。
五个类别的热力表
颜色越深分越高;SOMA 列下方小字为相对 GR00T N1.5 的差值(我们算的)。
原表数字(表 3)
这个基准所有物体都可见,论文把它当作“隔离出记忆设计本身”的测试。SOMA 在 30 条示范时平均 48.3,已经高于 GR00T N1.5 用完整数据的 45.9,这是论文强调的数据效率。但 SOMA 自己的曲线几乎是平的(48.3 → 49.1 → 52.0 → 49.3),Full 比 300 条还低 2.7。
按类别看,优势集中在容器交互(放进柜子/抽屉/微波炉再关上):Full 数据 55.6 vs 40.3。另外几类在 Full 数据下 SOMA 并不总是更好:烹饪准备 46.4 vs 49.2,托盘整理 47.6 vs 50.8,餐具转移 49.5 vs 50.0。容器交互在 300 条时 Diffusion Policy(54.2)也略高于 SOMA(53.3)。正文和附录说的“在所有数据量下都是 SOTA”只对平均值成立。
仿真:SimplerEnv Fractal(表 4)
Google Robot 三个任务的平均
左:Visual Matching;右:Variant Aggregation。两种协议列出的基线不同。
原表数字(表 4)
SOMA 相对自己的基座 GR00T N1.5 提升明显(VM 45.0 → 63.2,VA 42.4 → 52.5),主要来自 Pick Coke Can 和 Move Near;Open/Close Drawer 只有 31.5 / 25.4,低于表里多数基线。VM 平均 63.2 只比 OpenVLA-OFT 的 63.0 高 0.2。
疑点基线挑选与均值
表 4 没有列 SOMA 在相关工作里引用的 MemoryVLA,也没列它在真机里对比的 SpatialVLA。按 MemoryVLA 论文自己的表,同样三个 VM 任务上 MemoryVLA 是 90.7 / 88.0 / 84.7,CogACT 是 91.3 / 85.0 / 71.8,SpatialVLA 是 79.3 / 90.0 / 54.6,都高于 SOMA 的 85.0 / 73.0 / 31.5(不同论文的评测细节可能不同)。此外表 4 里 TraceVLA 的 VM 平均写 42.0,三列的平均是 46.2;RoboVLM 的 VA 平均写 51.3,三列平均是 48.7。
消融:记忆的三个组件(表 5 · 表 10)
GR1 Full 数据,平均成功率
表 5 的 w/o Geo. 对应表 10 的 “Obj.”(只留物体语义),w/o Obj. 对应 “Geo.”(只留几何),w/o Update 对应 “NoUpd”。
原表数字(表 10 的类别行)
三个组件各拿掉一个:去掉几何 −4.2,去掉物体语义 −5.6,去掉刷新 −7.8(最大)。
疑点消融的增益几乎全来自一个类别,评测次数也对不上
表 10 里完整模型在容器交互上是 55.7,所有变体都在 29.2–37.5。拿掉这一类、只看另外四类的平均(我们算的):完整模型 47.8,Concat 48.5、Only g 48.0 反而更高,Heavy 47.0、Obj. 46.9、Geo. 46.2 也只差 1 个点左右。见下方“读懂它”里的对照图。
正文说每个消融设置评测 50 个回合,那么逐任务成功率应是 2 的倍数。完整模型那一列确实如此,但变体列大量出现 25.0、35.0、45.0、15.0 这样的 5 的倍数,更像 20 个回合。变体的“托盘整理”类别均值还都等于去掉 TrayToCardboardbox 后另外 4 个任务的平均(例如 SimEMA 47.5),而完整模型的 47.6 是 5 个任务的平均。正文还写“只用一个门掉 8.6%∼8.3%”,按表是 8.6 和 5.1。
失败分析(附录 D.7 · 表 14 · 表 15)
真机:25 个失败回合(每任务 5 个)
GR1 全可见仿真:50 个失败回合(每类 10 个)
两边的失败性质不同。真机上,论文认为记忆给出的定位基本可靠,问题出在头还在动时把定位变成准确的动作:视角变化导致抓取位姿估计不准占 48%。全可见仿真里没有视野外问题,失败暴露的是记忆机制本身:VGGT 在细长/无纹理物体上的几何噪声污染空间 token(44%),交叉注意力激活了无关记忆(32%),以及物体级记忆分不清“抽屉开着还是关着”这类状态变化(24%)。
定性结果
读懂它
这篇真正说明了什么
关键 insight
1. 空间记忆可以按“物体”而不是按“时间”组织
SOMA 的记忆是 NI 个物体 token,每个绑定一个 3D 框。它回答的是“东西在哪”,不是“刚才发生了什么”。容量随物体数增长、不随回合长度增长,也就不需要 MemoryVLA 那样的合并机制。代价是它对“状态”无感:失败分析里 24% 的仿真失败是分不清抽屉开关。
2. 扫描只是取证,存下来并持续刷新才有用
表 2:只扫描、把那一帧喂给反应式策略(18.5)几乎没有增益,和图 4 里 GR00T 的 18.3 相当。扫描建图 +4.3,持续刷新再 +4.2。换句话说,主动去看本身不够,看到的东西要进一个能被反复读的结构。
3. 现成感知模型做“记什么”,VLA 只负责“怎么读”
YOLO-World、DINOv3、VGGT 都是冻结的外部模块,训练时离线跑完。真正训练的是几个小 MLP、门控和 3 层注意力。这让记忆的质量上限受感知模型约束:44% 的仿真失败来自 VGGT 的几何噪声。
4. 全可见的仿真增益主要来自一类任务
GR1 上 SOMA 对 GR00T 的平均优势和消融里完整模型的优势,都主要落在容器交互这一类。下图把这一类拿掉后重算消融平均。
拿掉“容器交互”之后,消融还剩多少差距
我们用表 10 的类别行计算:5 类平均 vs 其余 4 类平均。
容易误解的地方
- “检索”不是搜索。没有显式选出目标物再去找的步骤;所有 VL token 对全部记忆 token 做软注意力,取哪条靠学到的权重。仿真里 32% 的失败恰恰是注意力激活了无关条目。
- 扫描不是学出来的主动探索。扫描沿预定义轨迹走,由一个检测器判断“目标不可见”来触发。操作中头怎么动是策略输出的(解读:遥操作数据里操作员用手柄按键控制头部,行为指标统计的就是这部分头部运动,但论文没有列出动作空间的维度)。
- “40–60% 的行为改善”只对比了 GR00T N1.5。StarVLA、SpatialVLA 没有行为指标。
- 仿真结果不测视野外能力。GR1 和 SimplerEnv 都是全可见,记忆从第一帧构建,没有扫描。论文把它们定位为“常规可见条件下记忆设计依然有益”。
- 真机“最高成功率”是相对的。SOMA 平均 28.3%,意味着大约十次里成功三次左右。
FAQ
物体在视野外被挪走,记忆会怎样?
按 §3.2 的规则,没被观测到的条目原样保留,所以记忆会一直指向旧位置,直到头部再次看到这个物体。看到之后,如果按“同类 + 外观 + 几何”的判据匹配上,就用 α = g·s 做 EMA,逐步移到新位置;如果几何差太多没匹配上,会作为新条目追加,旧条目仍在,记忆里就有了一个过时的副本。论文在局限里承认“陈旧或错误的记忆可能危及安全”,提出记忆过期、重新扫描触发等缓解办法,但没有实现。真机的 5 个任务里也没有“趁机器人不看时挪动物体”这种扰动。可以在上面的沙盘里试。
操作阶段的单帧怎么放进扫描时的全局坐标系?
论文没说。§3.1 说 VGGT 对扫描序列给出一致的场景坐标系,并把它当全局参考系;§3.2 说当前头部帧“过同一条流水线”。单帧跑 VGGT 只能得到相机坐标系下的几何,要和扫描坐标系对齐,需要联合推理、配准,或者用头部关节角算外参。三种做法论文都没提到。
为什么不直接用深度相机?
表 13 的对比:RGB-D + OpenCV 融合 22.6%,VGGT 27.3%,延迟 0.18 s vs 0.21 s。论文的解释是多视角点云配准会累积深度噪声和错位,VGGT 的跨视角几何更一致。这是一次单配置对比,没有试别的配准方法。
记忆在 GR00T 里接在哪?
在 VLM 输出和 DiT 动作头之间。VLM 的 token 先对记忆做 3 层注意力得到 Xboost,Xboost 作为额外的全局上下文送进 DiT,原始 VL token 照常送入。GR00T 的 VLM 本体不看记忆。训练时除了 VLM 的语言解码器,其余部分都更新。
为什么 GR1 上的记忆也有用,明明什么都看得见?
论文的解释是显式场景表示 + 指令条件的读出提供了更结构化的归纳偏置。附录图 10 的图注补了一点:GR-1 的手臂、手、腰会带着头部相机大幅晃动,视角不稳,记忆提供了一个跨帧稳定的物体表示。不过上面的分析显示,增益主要集中在容器交互一类,其余类别和 GR00T 互有高低。
局限与疑点
作者承认的,和我们读出来的
论文自己提到的(附录 D.7、D.8)
- 扫描假设场景准静态、时间短;实例关联和融合用全局固定阈值。完全动态的场景、更大的自运动、密集杂乱需要实时跟踪、基于置信度的重扫和逐 token 的几何置信度;匹配判据应该学出来而不是手调。
- 残余失败更多来自“头还在动时把空间线索变成精确动作”,需要更紧的头—臂协调和视角稳定的动作解码。
- 记忆只到物体级(位置和外观),分不清抽屉开/关这类有意义的状态变化,限制多阶段任务;可以给空间 token 加阶段转换信号。
- 扩展到移动操作或房间尺度需要分层记忆和回环/SLAM 对齐来控制漂移。
- 持久记忆带来安全和隐私风险:陈旧或错误的记忆可能危及人机共处环境的安全;建议置信度评分、重扫触发、记忆过期、本地存储和人在回路确认。
我们读出来的
- 疑点真机每任务 20 个回合,没有方差或置信区间;三个可动头部基线之间、以及 SOMA 与它们之间的很多差距只有 1–3 个回合。
- 疑点表 2 的三列变体数字与“20 回合 × 阶段平均”的粒度不符;表 13 的 VGGT 配置 27.3 与 Full SOMA 28.3 不一致。
- 疑点行为指标:First-Fixation Time 的定义与正文解读不符;Time-to-Grasp 定义为步数却以秒报告;失败回合如何计入未说明;任务 2 的搜索转角含义不明;五项降幅在同一任务上异常一致。
- 疑点附录表 9 的 GR1 逐任务数字与类别均值多处算不拢:SOMA 容器交互 300 条的 6 个任务平均是 58.2,表里写 53.3;GR00T 烹饪准备 Full 的 5 个任务平均是 55.6,表里写 49.2;GR00T 餐具转移 300 条是 43.0 vs 51.0。SOMA Full 列有 6 个任务的数字与表 10 的 Full 列不同,而两表的类别均值完全相同。正文表 3 与附录表 9 还有 55.6/55.7、52.0/51.9、44.9/45.0、45.9/46.0、20.0/20.1、54.2/54.3 这类小出入。
- 疑点消融:正文说 50 个回合,变体的逐任务数字是 5 的倍数;托盘整理类别均值的计算口径不一;“8.6%∼8.3%”应为 8.6 和 5.1;增益几乎全部来自容器交互。
- 疑点SimplerEnv 表没有列出在同样任务上报告更高分数的已发表方法(如 MemoryVLA、CogACT);两个基线的平均值与其三列不符。
- 结构细节不一致:Φsim 的输入维度、s/g 是向量还是标量、pk 与 p̄c、读出模块是交叉注意力还是自注意力;符号 C 同时指 DINOv3 宽度和 VL token 宽度。
- 未披露动作块长度 H、控制频率、推理时的记忆刷新频率、触发用的检测器、YOLO-World 的词表、关联阈值和外观/几何权重、操作阶段单帧与扫描坐标系的对齐方式、预定义扫描轨迹的角度范围和时长、扫描段是否计入回合时间。
- 记忆 token 不带时间戳或“多久没被看到”的信息,策略无法区分新鲜条目和陈旧条目(对比 TIC-VLA 显式输入延迟元数据)。
- 只有一个自研平台、5 个抓放类任务、每个任务 3 种物体;代码尚未发布。
放到专题里看
记忆类 harness 里,唯一存“空间状态”的一篇
在 Harness for Robotics 专题里,SOMA 属于 Persistent State / Memory:它改的是策略记住什么。具体说,它在多步任务中持续保存的是空间状态(每个物体的外观和 3D 位置),形式是一组物体 token,插在 VLM 与 DiT 动作头之间,用交叉注意力读出。它也是同类四篇里唯一和“看什么”深度耦合的:记忆的内容取决于一次主动扫描。
| SOMA | MemoryVLA | OptimusVLA | HiMe | |
|---|---|---|---|---|
| 记住什么 | 每个物体的 DINOv3 外观 + VGGT 3D 框(空间状态) | 过去各时间步的 VLM 感知 token(256 个)和认知 token(1 个),带时间步位置编码(执行历史) | GPM:离线示范库里的整条轨迹;LCM:上一个动作块和 Mamba 隐状态(动作历史) | 多模态键值库(图像 + 文字:物体状态、空间约束、人的偏好)+ 子目标清单(任务状态) |
| 按什么索引 | 物体(类别 + 外观 + 几何) | 时间步 | 任务嵌入的余弦相似度 | 文本键的向量检索 |
| 写入 / 更新 | 扫描时同类关联、平均合并;操作中 α = g·s 的门控 EMA,未匹配的观测追加 | 每步写入门控融合后的 token;超过容量时合并相邻最相似的一对 | GPM 训练后固定;LCM 每块滚动 | Sentry 判定子任务完成或偏离时,触发 GPT-4o Planner 做 Add / Update / Delete |
| 遗忘 | 无,未观测到的条目一直保留 | 相似合并 | 不适用 | 显式 Delete |
| 怎么读出 | VL token 作 query,3 层注意力,输出作 DiT 的额外上下文 | 当前 token 作 query,2 层交叉注意力 + 门控融合,再条件扩散动作专家 | 检索 top-k 轨迹组成先验分布作 flow 起点;LCM 偏置加到初始噪声上 | Planner 读检索结果,输出语言子目标给执行器 |
| 插在哪 | VLM 与动作头之间 + 外部感知栈 | VLM 与动作专家之间 | 动作生成的起点(噪声先验) | 策略外部的三层系统 |
| 训练 | 在 GR00T N1.5 上微调;感知模型冻结、离线预处理 | 7B Prismatic VLM(OXE 预训练)+ 扩散动作专家,端到端 | 基于 π0.5,三阶段:预训练 → InfoNCE 训 Prior Head → 冻结 GPM 训 LCM | 只微调执行器(π0.5);Sentry(Qwen3-VL-8B)和 Planner(GPT-4o)零样本或少样本使用 |
- 和 MemoryVLA:结构上最像。两者都用交叉注意力从记忆读、都有一个 sigmoid 门决定新旧比例(MemoryVLA 是 g ⊙ H + (1−g) ⊙ x 融合读出结果,SOMA 是 α = g·s 的 EMA 更新记忆本身)。根本区别在索引:MemoryVLA 按时间存,解决“动作做没做过”(如按钮按前按后看起来一样);SOMA 按物体和 3D 位置存,解决“东西在哪”。MemoryVLA 用固定第三人称相机,SOMA 靠可动头部把视锥外的东西写进来。SOMA 在相关工作里把 MemoryVLA 归为“存最近观测或关键帧、服务短时推理”。
- 和 OptimusVLA:记忆放在完全不同的地方。OptimusVLA 记的是动作(相似任务的轨迹、刚执行的动作块),用来改动作生成的起点和平滑性;SOMA 记的是场景。两者可以叠加,互不冲突。
- 和 HiMe:HiMe 的记忆在策略外面,由大模型用自然语言管理,有显式的增删改,还能记“这是 Alice 的杯子”这类像素里没有的信息;SOMA 的记忆是策略内部的向量,没有删除,也不懂语义状态。HiMe 的频率分层(执行器快、Planner 只在关键节点调用)和 SOMA 的“一次扫描 + 每步刷新”是两种摊销开销的思路。
- 跨类:和 ActiveVLA。同样针对“看不全”,ActiveVLA 属于 Context Architecture:用标定相机重建点云,在关键区域周围渲染虚拟视角并做 3D 放大,每一步重新决定看什么,不跨步保存。SOMA 移动真实的头部,并把看到的存下来。
- 跨类:和 RA-VLA。两者都把检索结果通过注意力注入动作生成,但 RA-VLA 检索的是专家示范片段(“怎么做”),来源是回合外的示范库;SOMA 检索的是本回合的场景记忆(“东西在哪”)。
- 跨类:和 TIC-VLA。TIC-VLA 把 VLM 语义的“陈旧程度”(延迟、期间的自运动)显式交给策略。SOMA 的记忆条目不带任何时间信息,很久以前看到、之后再没被确认过的条目,和刚刷新过的条目在策略眼里没有区别;解读这正是 SOMA 局限里提到的“记忆过期”问题可以借鉴的方向。
- 和(3)结构化执行、(4)评估与反馈两类:SOMA 在局限里承认记忆只到物体级,分不清抽屉开 / 关这类阶段变化(仿真失败里占 24%);τ₀-VLA 的文字执行记忆记的正是阶段(标注时压缩已完成的阶段、保留当前子任务细节,例如「已放好杯子」「已加盐」)。解读两者互补,一个回答「东西在哪」,一个回答「做到哪一步」。MotorMind 回答「东西在哪」的办法是每次需要时让 VLM 在多个固定相机视角上画框、三角化,近距离换腕部相机细化;它的失败分析里,VLM 决策错误最多的一类就是定位。
术语表
读这篇会遇到的词
展开术语表
- OOV
- Out-of-Vision,目标物或放置位置不在当前相机视野内。
- frustum / 视锥
- 相机能看到的锥形空间区域。
- view-bound assumption
- 论文用语:默认指令里的物体在决策时一定出现在当前画面中。
- overview memory 𝓜0
- 扫描后建立的初始场景记忆,每个物体一个 token。
- 𝓜t / 𝓜̂t
- 当前头部画面得到的观测 token / 刷新后的记忆。
- (fk, ck, bk)
- 一个全局实例的三元组:DINOv3 外观向量、类别、8×3 的 3D 框角点。
- α = g·s
- 记忆 EMA 的更新系数,s 来自 Φsim,g 来自 Φfuse,都过 sigmoid。
- Xboost
- VL token 对记忆做注意力后的输出,作为 DiT 的额外上下文。
- VGGT
- Visual Geometry Grounded Transformer,前馈估计多视角相机位姿和几何。
- YOLO-World
- 开放词表的实时目标检测器。
- DINOv3
- 自监督视觉基础模型,这里用作实例外观编码器。
- GR00T N1.5
- NVIDIA 的人形机器人 VLA,VLM + DiT 动作头,本文的基座和主要对比对象。
- StarVLA*
- 本文在仿真中用 Qwen-GR00T 设置实现的 StarVLA。
- pan–tilt
- 水平转动(偏航)和俯仰,本文机器人的 2 自由度头部。
- back-mapping
- 算法 1 的第三步:把每 N 步取一次的记忆证据回填给区间内的所有训练样本。
- First-Fixation Time
- 目标首次进入头部视野到手臂开始抓取的时间(人工标注)。
- Head Search Path Length
- 目标首次可见之前,头部 pan 和 tilt 角度变化的绝对值累加(度)。
- Viewpoint Correction Count
- 目标已被看到后,头部改变运动方向去重新对准的次数。
- Visual Matching / Variant Aggregation
- SimplerEnv 的两种评测协议:前者贴近真实部署配置,后者加入背景、纹理、光照、干扰物、相机视角等扰动。
- RoboCasa Tabletop GR1
- GR-1 人形 + Fourier 灵巧手的桌面重排仿真基准,24 个任务、5 类,单路头部第一视角。