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]
其中 是视觉 token 数量, 是文本 token 数量, 是语言模型隐藏维度。视觉分辨率会通过 直接影响注意力计算量。
2. 融合发生在哪里
Projector 不只是“把维度变得一样”。它还要把视觉表征映射到语言模型可使用的统计空间。随后,语言模型通过自注意力在视觉 token、指令 token 和已经生成的动作 token 之间建立依赖。
3. Action decoding
模型生成固定数量的动作 token。部署端减去动作词表偏移,再根据训练数据中的分位数或极值恢复连续控制量:
这意味着 tokenizer、动作统计量、归一化规则和 prompt 模板都应该视作 checkpoint 的组成部分。
4. 工程检查表
- 核对图像 resize、crop 和归一化顺序;
- 打印视觉投影前后的张量形状;
- 保存动作 token 与反量化动作的成对日志;
- 在下发控制指令前增加工作空间与速度限制。
核心结论
OpenVLA 的端到端链路跨越视觉编码、语言建模和机器人控制三个边界。只复现模型结构,而没有复现 tokenizer 与动作解码规则,不能算完整复现。