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:18,model_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。
数据流走向:
| |
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 一行写清:
:标准 next-token CE,只在 action token 位置打分(非 action 位置用 IGNORE_INDEX 掩掉)。监督的是 5 步 action chunk 的 256-bin 离散预测。
:
其中 是 noisy VAE-latent, 是 LLM 在 image-token 上的 hidden state(reshape 成 27×27 grid 后传进 DiT 作 condition)。两个 loss 直接相加,没有可调权重——code 里既没有 warmup 也没有 schedule。
| |
这是个偏激进的选择:通常加 auxiliary supervision 都要 schedule 控制(早期 0、warmup 升、稳定时持平),ReconVLA 直接 1.0 平权。配置上的依据是两边都跑了 large-scale pretrain 才进 fine-tune(pretrain.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 的处理:
| |
把 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) 里有一个看似不起眼的细节:
| |
每个 example 在每个 batch step 里采 4 个不同的 diffusion timestep,等于用 4× 重采样降梯度方差。这是 DDPM 训练里常见的方差降低 trick——loss 在不同 之间方差很大,做 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_loss(recon_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_vla(train_vla.py:921-931)通过搜两个 fixed token id 35560 和 25 把 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。
| 路线 | Target | Capacity 浪费 | 推理 cost | Visualization |
|---|---|---|---|---|
| ReconVLA | pixel via VAE latent of gaze-crop | 中(VAE 必须能重建像素) | zero(DiT 推理时丢) | 好(可 decode 看图) |
| DriveVLA-W0 / SuSIE | pixel via VAE latent of full future frame | 高(要重建全帧) | zero / 中 | 好 |
| V-JEPA 风格 latent prediction | self-supervised feature latent | 低(无 pixel 重建) | zero | 弱(latent 不可视) |
| 直接 bbox 回归 | bbox text token | 低 | 一致(多输出几个 token) | 弱 |
| GR-1 future-frame prediction | pixel 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.