Skip to main content
2026-09-01

OpenVLA 完整数据流与 Action Decoding

理解 OpenVLA 最有效的方法不是记住模块名称,而是追踪每个张量在哪里改变了形状、语义和数值范围。

1. 两类输入 token

图像先进入视觉编码器,得到 patch 特征;文本指令由 tokenizer 转换成语言 token。视觉特征经过 projector 后,与文本 embedding 进入同一隐藏维度。

vision = vision_encoder(pixel_values)       # [B, Nv, Dv]
vision = projector(vision)                  # [B, Nv, Dl]
text = language_embeddings(input_ids)       # [B, Nt, Dl]
multimodal = torch.cat([vision, text], dim=1)# [B, Nv+Nt, Dl]

其中 NvN_v 是视觉 token 数量,NtN_t 是文本 token 数量,DlD_l 是语言模型隐藏维度。视觉分辨率会通过 NvN_v 直接影响注意力计算量。

2. 融合发生在哪里

Projector 不只是“把维度变得一样”。它还要把视觉表征映射到语言模型可使用的统计空间。随后,语言模型通过自注意力在视觉 token、指令 token 和已经生成的动作 token 之间建立依赖。

3. Action decoding

模型生成固定数量的动作 token。部署端减去动作词表偏移,再根据训练数据中的分位数或极值恢复连续控制量:

ai=li+qiK1(uili)a_i=l_i+\frac{q_i}{K-1}(u_i-l_i)

这意味着 tokenizer、动作统计量、归一化规则和 prompt 模板都应该视作 checkpoint 的组成部分。

4. 工程检查表

  • 核对图像 resize、crop 和归一化顺序;
  • 打印视觉投影前后的张量形状;
  • 保存动作 token 与反量化动作的成对日志;
  • 在下发控制指令前增加工作空间与速度限制。

核心结论

OpenVLA 的端到端链路跨越视觉编码、语言建模和机器人控制三个边界。只复现模型结构,而没有复现 tokenizer 与动作解码规则,不能算完整复现。