OpenVLA 一线 VLA 把 vision token + text token + action token 全部 concat 给 LLM,用 next-token cross-entropy 监督,推理时 LLM 直接吐离散化 action token。这套 pipeline 训出来的 attention map 有一个反复出现的问题:散。VLA 看场景跟看哪个具体物体之间没区分,attention 几乎均匀铺在整个 frame 上。

OpenHelix 团队的 ReconVLA(arXiv:2508.10333)给的方案:在 LLM 输出的 image-token hidden state 上挂一个 DiT (diffusion transformer),让它在 VAE latent 空间里把"目标物体附近的 gaze-crop"重建出来。论点是:既然 hidden state 能重建操作目标的局部表征,那它必然 encode 了关于目标的细粒度信息,反过来约束 LLM 把注意力集中过去。

属于 perception probe 式的辅助监督——跟 Dense Latent Predictive Supervision 论的那一族同类(auxiliary visual loss 用来弥补 sparse action supervision),但 reconstruction target 选了 pixel-level(via VAE latent)而非 latent-level。本文把这套机制照 paper + code 走一遍,再指出几个 paper 没强调但 code 里能看到的点。

读者预设:熟悉 OpenVLA / π₀ 形态的 VLA,知道 DiT 是什么。


一、问题:VLA 的 attention 为什么散

VLA 训练目标是 next-action-token prediction。监督信号几乎全集中在 action token 上——文本 caption / 视觉 token 都不做反向回传(图像本身没有 loss)。LLM 没有任何机制被强迫去区分"图像里这个目标物体"和"图像里其他无关像素"。

结果是 attention map 在视觉 token 上的分布趋向平坦。Paper §1 给的可视化(OpenVLA + 标准训练)显示 attention 散在整个 frame 上,gripper 跟目标物体没有明显的 attention 峰值。这跟 LLaVA / Qwen-VL 这类 vision-language 模型不一样——VL 模型至少有 caption / VQA 这种监督会逼着 attention 跟 referent 词对齐。VLA 的 action token 跟视觉 token 之间没有语义对应关系,attention 自然没必要聚焦。

ReconVLA 的修复方向:加一个跟视觉关联的 dense 监督,让信号能传回 hidden state。具体形态是重建一个裁出来的 gaze-region crop——不是 full frame,不是 future frame,只是当前帧上目标物体附近的小块。


二、核心机制:OpenVLA stack + DiT 探针

整体形态可以拆成两条路径:action 路径 + recon 路径,共享一个 LLM backbone。

Backbone

  • LLM:Qwen2-7B(pretrain.sh:18model_name_or_path=./qwen2-7b),全参数训练,无 LoRA
  • Vision encoder:SigLIP-SO400M patch14 384px(frozen,unfreeze_mm_vision_tower=False)。输出 27×27 = 729 个 visual token,取倒数第 2 层。
  • MM projector:2 层 MLP + GELU,常规 LLaVA pattern。
  • Action 输出:256 bins 离散化,映射到 Qwen2 词表的最后 256 个 token id(action_tokenizer.py:9-83,OpenVLA 路线)。一次预测 5 步 action chunk(act_min_bound = np.tile(..., 5))。

Recon 路径(paper 的核心 contribution):

  • VAE:FLUX.1-dev 的 frozen VAE(pixel_decoder/flux_decoder.py),只用来把 target gaze-crop 编码到 latent。从不参与训练。
  • ReconDenoiser:一个 DiT(denoiser_dit.py:101-207)。depth=3、width=1024、16 heads,adaLN-Zero conditioning,cosine noise schedule,1000 training timesteps。
  • 条件输入:LLM 在 image-token 位置上的 hidden state(image_hidden_states ∈ R^{B×729×3584}),reshape 成 27×27 grid 后作为 DiT 的 condition tokens。
  • 训练目标:DDPM 的 ε-prediction MSE,让 DiT 学会从 noisy VAE latent 出发去 denoise,且 denoise 时只能看 LLM 给的 condition。

数据流走向:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
input image
  ↓ SigLIP (frozen)
  ↓ MLP projector
[image tokens (729)] + [text tokens] + [action tokens]
  ↓ Qwen2-7B (full train)
[image-pos hidden states (B, 729, 3584)]
  ↓ reshape → 27×27 grid
  ↓ as DiT condition
ReconDenoiser (DiT, 3 layers)
  ↓ predicts noise in VAE-latent space
compare to ε added to GT VAE-latent of gaze-crop
  → vm_loss (MSE)

parallel:
[action tokens hidden states]
  ↓ lm_head
  → lm_loss (cross-entropy)

DiT 不在 inference graph 里——推理时只走 action token 路径,DiT 跟 VAE 都丢掉,没有任何额外推理开销。这跟把 DiT 当 generator 用(如 SuSIE / GR-1 的 future-frame prediction)的 setup 不同:这里 DiT 全程是梯度回传通道而非生成模块。


三、监督:lm_loss + vm_loss 的分工

recon_qwen.py:203 一行写清:

Ltotal=Llm+Lvm \mathcal{L}_{\text{total}} = \mathcal{L}_{\text{lm}} + \mathcal{L}_{\text{vm}}

Llm\mathcal{L}_{\text{lm}}:标准 next-token CE,只在 action token 位置打分(非 action 位置用 IGNORE_INDEX 掩掉)。监督的是 5 步 action chunk 的 256-bin 离散预测。

Lvm\mathcal{L}_{\text{vm}}

Lvm=Et,ϵ[ϵϵθ(ztc)2] \mathcal{L}_{\text{vm}} = \mathbb{E}_{t, \epsilon}\left[\| \epsilon - \epsilon_\theta(z_t \mid c) \|^2\right]

其中 ztz_t 是 noisy VAE-latent,cc 是 LLM 在 image-token 上的 hidden state(reshape 成 27×27 grid 后传进 DiT 作 condition)。两个 loss 直接相加,没有可调权重——code 里既没有 α\alpha warmup 也没有 β\beta schedule。

1
loss = lm_loss + vm_loss  # recon_qwen.py:203

这是个偏激进的选择:通常加 auxiliary supervision 都要 schedule 控制(早期 0、warmup 升、稳定时持平),ReconVLA 直接 1.0 平权。配置上的依据是两边都跑了 large-scale pretrain 才进 fine-tunepretrain.sh 跑 2 epoch on CALVIN+Bridge+LIBERO 混合数据),相当于已经做过隐式 warmup。


四、几个 paper 没强调但 code 里很清楚的点

读完 paper 再翻 code,几处工程现实跟 paper 的卖点之间有差距,值得逐条列。

4.1 “Implicit grounding” 在监督端其实是 explicit

Paper 反复强调 implicit grounding——不需要显式 bbox 标签、不让模型输出坐标。但实际 dataloader(train_vla.py:1099-1138)需要 两份图像文件image(完整观察)和 image_target(已经裁好的 gaze-crop)。

image_target 怎么来?scripts/helper/crop.py + Readme.md 说明白:用 offline YOLO 模型(仓库自带 best.pt)对每帧出 bbox,然后裁出 target region。对没有现成 YOLO 模型的数据集(Bridge / LIBERO / 真实世界),README 建议用 GroundingDINO 或 YOLO 重新标。

也就是说,grounding 在模型推理路径里确实是 implicit(不输出 bbox、不显式回归坐标),但训练 supervision 仍然消耗了 explicit 的 bbox 标注成本——只是这份成本被挪到了数据预处理而非模型输出。一个完整的 deployment pipeline 仍然依赖某种 grounding detector 来准备训练数据。

这条没说错的话术应该是"inference-time implicit, training-time explicit"。

4.2 DiT 只有 3 层,是 probe 不是 generator

ReconDenoiser 配置:depth=3、width=1024、16 heads(denoiser_dit.py:101)。对比常规 DiT-XL/2(28 层、1152 dim),ReconVLA 的 DiT 几乎可以忽略——大部分计算量都在 Qwen2-7B 的 forward 上。

这个选择背后的设计意图很清楚:这条 DiT 的核心作用是当梯度通道,把 reconstruction loss 通过 condition 通路传给 LLM。生成图本身不是重点。3 层 DiT 自己 capacity 有限,没法靠自己"硬猜"出 reconstruction target,只能依赖 LLM hidden state 提供的 condition——梯度回传质量决定了这条 supervision 有没有意义。

这条设计选择的代价:DiT 容量太小可能让 reconstruction quality 本身较差,体现在 latent space 而不是 pixel space 的话肉眼也看不到。Paper 给的可视化是 decoded image,但 decoded image 跟梯度信号质量是两件事。

4.3 2×2 space-to-depth pooling 是被 grid 错位强制出来的

FLUX VAE 把 384×384 image 编到约 48×48×4 的 latent(downsample 8×)。SigLIP token grid 是 27×27。两边对不上。

recon_arch.py:603-605 的处理:

1
2
z_q = z_q.unfold(2, 2, 2).unfold(3, 2, 2)  # 2×2 patch
z_q = rearrange(z_q, 'b c h w p1 p2 -> b (c p1 p2) h w')  # channel ×4

把 VAE latent 按 2×2 切 patch,channel 维拼起来——24×24×16 (≈ 27×27×16)。这一步把 VAE 的空间分辨率压一半换 channel 维深一倍,最终跟 SigLIP token grid 对齐。

这是被两边分辨率 mismatch 强制出来的工程 trick,paper 里没提。读 code 才知道:整个 condition-target alignment 在分辨率上是事后拼出来的,设计层面两边没对齐。换 backbone(比如换成 Qwen2.5-VL 的 32×32 grid)或换 VAE(SD 1.5 vs FLUX 的 latent 维度不同)都要重新算这个 pool factor。

4.4 4× gradient variance trick

compute_vm_loss (recon_arch.py:574-664) 里有一个看似不起眼的细节:

1
2
3
target = target.repeat(4, 1, 1, 1)
condition = condition.repeat(4, 1, 1, 1)
mask = mask.repeat(4, 1, 1, 1)

每个 example 在每个 batch step 里采 4 个不同的 diffusion timestep,等于用 4× 重采样降梯度方差。这是 DDPM 训练里常见的方差降低 trick——loss 在不同 tt 之间方差很大,做 4× 重采样能让 effective batch size 翻 4 倍,对单 example 内的 timestep 平均更准。

Code 上跟 dataloader batch size = 8 配合,实际单卡 effective batch 是 32 个 sample-noise pair。这是个挺重要的训练稳定性细节,paper 没提。

4.5 双摄像头模式硬编码 14+13=27 split

compute_double_vm_lossrecon_arch.py:666-761)处理 reconstruct_image_num=2 的双摄像头场景(goal cam + gripper cam),把 729 个 vision token 按 spatial 切成 14 行 + 13 行(378+351)。

14+13=27 这个 split 跟 SigLIP 的 27×27 grid 死绑。换 vision encoder(任何不是 27 行的 grid)都需要重写这段。Paper 没把双摄像头当 core contribution,但 code 里专门做了这条分支——估计是某些 benchmark(CALVIN?)默认有 2 个相机的 setup。

4.6 Action token splicing 是 Qwen2-tokenizer 特定 hack

preprocess_qwen_2_vlatrain_vla.py:921-931)通过搜两个 fixed token id 3556025 把 action token 字段拼回 conversation。这俩 id 是 Qwen2 tokenizer 上的具体值——换 LLM 就立刻 broken。

不是 fundamental 问题,但暴露了 ReconVLA 的工程整合度:跟 Qwen2 backbone 绑得很紧,不像 OpenVLA 那种 backbone-agnostic 的 wrapper。


五、实验跟 ablation

Paper 在 CALVIN ABC→D(zero-shot environment split)、LIBERO 套件、以及 real-robot 上跑了对比。Headline claim 是 “highest success rates” vs 主流 VLA baseline。

做了的 ablation

  • 预训练规模 ablation:在 unseen environment 下需要 large-scale pretrain,paper 的解释是 VAE generation 也要泛化——recon target 落在 pixel space,未见过的物体 / 纹理会让 DiT denoise 不稳定。
  • CALVIN ABCD→D(同分布)vs ABC→D(zero-shot D split)的对比,说明 zero-shot 设定下 ReconVLA 仍能保住一定的 success rate。

核心缺位的 ablation

vm_loss 开 / 关的对照实验没给

读完正文不知道单纯加 reconstruction loss 究竟带来多少 success rate 提升,还是主要来自 backbone scale up(Qwen2-7B vs OpenVLA 的 7B Llama)、data mix(CALVIN+Bridge+LIBERO vs 单数据集)、或 longer training。Table 4 的 ablation 维度是 pretrain data composition,跟 supervision dimension 不是同一件事。

这是这条研究路线最该回答的问题。“我们加了 X 监督所以 PDMS / SR 涨了 Y 个点"必须有 X 单独的 on/off 对照。ReconVLA paper 没给。

退一步看,也许作者自己也清楚单独的 vm_loss ablation 不一定显著——把 dense supervision 加到 VLA 通常都涨点,问题是涨在哪里、是否值得 capacity / cost。但这正是读者最需要知道的部分。


六、跟其他 auxiliary supervision 路线的位置

ReconVLA 是 dense auxiliary supervision 这条 axis 上的一个候选项。把它跟同 axis 上的几条主要路线放一起对比,可以看到选型 trade-off。

路线TargetCapacity 浪费推理 costVisualization
ReconVLApixel via VAE latent of gaze-crop中(VAE 必须能重建像素)zero(DiT 推理时丢)好(可 decode 看图)
DriveVLA-W0 / SuSIEpixel via VAE latent of full future frame高(要重建全帧)zero / 中
V-JEPA 风格 latent predictionself-supervised feature latent低(无 pixel 重建)zero弱(latent 不可视)
直接 bbox 回归bbox text token一致(多输出几个 token)
GR-1 future-frame predictionpixel future frame

ReconVLA 在这张表上的位置:pixel-level 但 target 范围小。比 full-frame pixel reconstruction (SuSIE / DriveVLA-W0) 省一些 capacity——因为 gaze-crop ≪ full frame,DiT 需要重建的内容少;但仍然是 pixel space,仍然让 capacity 浪费在纹理上。

这正好是 Dense Latent Predictive Supervision 论的 trade-off:pixel-level dense supervision 跟 latent-level 在"加 dense 信号"这件事上等同,但 pixel-level 让 backbone 必须 model 像素,而 latent-level 让 supervision 集中在决策相关的 semantic / spatial structure 上。

ReconVLA 选 pixel-level 而不是 latent-level,给出的合理化解释(隐含的)是可视化好做、可以肉眼检查 recon quality。这是 paper-writing 友好但技术上不一定最优的选择。一个值得做的对照实验:把 ReconDenoiser 的 target 换成 DINOv2 / SigLIP 自身的 EMA feature,看 success rate 是否还能持平甚至提升——latent target 在原则上应该更省 capacity。


七、几条开放问题

  • vm_loss 单独的贡献:见上节,是这条研究路线最该回答的问题。
  • Crop quality 上限:ReconVLA 的实际表现被上游 YOLO / GroundingDINO 检测器的精度卡死。检测器漏检 / 误检时,recon target 错误,梯度反过来 mislead attention。一个稳健的实现需要把 detector 的 confidence 纳入 loss 权重(低 confidence 样本降权),paper / code 都没处理。
  • Explicit grounding baseline 缺:最自然的对照路线——让 VLA 直接输出 bbox text token,attention 自然集中到 referent——没有跟 ReconVLA 做对比。这个 baseline 在 RoboFlamingo / VL-grounding 系工作里早就跑过,对比一下应该不难。
  • Generative generalization 风险:ReconDenoiser 在 unseen scene 下 denoise 失败会让 vm_loss 信号无效甚至有害。Paper 用 large-scale pretrain 来缓解,但没量化"达到多大规模才能让 OOD recon quality 不退化”。
  • Action head 还是 OpenVLA-1.0 vintage:discrete 256 bins + 5 步 chunking。fine-grained manipulation 的 bottleneck 经常不在视觉感知,而在 action head 的表达力。把感知端做好再回头看,可能发现 action head 也得换成 π₀ 风格的 flow-matching expert。这是把 ReconVLA 拼到更激进 VLA stack 上的自然下一步。
  • 跟其他 auxiliary loss 的 compose:ReconVLA 跟其他 dense supervision(latent prediction、future-frame)能不能叠加?理论上不冲突(都挂在 vision tower / hidden state 输出端),但谁也没试过同时加两路 auxiliary head。

参考

主要工作

  • ReconVLA: Reconstructive Vision-Language-Action Model with Implicit Grounding. arXiv:2508.10333. OpenHelix Team. Paper | GitHub

Backbone / 工具组件

  • Qwen2-7B. Qwen Team.
  • SigLIP-SO400M. Google. arXiv:2303.15343
  • FLUX.1-dev VAE. Black Forest Labs.
  • DiT: Scalable Diffusion Models with Transformers (Peebles & Xie, 2023). arXiv:2212.09748

同 axis VLA / 辅助监督路线

  • OpenVLA: An Open-Source Vision-Language-Action Model (Kim et al., 2024). arXiv:2406.09246
  • π₀: A vision-language-action flow model for general robot control. arXiv:2410.24164
  • GR-1 / SuSIE / Diffusion Policy 系列 future-frame / visual auxiliary 路线
  • DriveVLA-W0. arXiv:2510.12796
  • V-JEPA 2.1. Meta FAIR.