Motivation

现在类似OpenVLA的VLA模型, 使用自回归的方式将动作离散化成token, 然后使用LLM进行推理. 但是这种离散化token有一个问题:

  1. 推理效率低, 逐token生成的方式很慢
  2. 重建精度于压缩率的冲突. 如果需要高精度, 那么需要大量token表达action, 这会导致自回归推理速度慢; 如果希望效率高速度快, 那么一个token表达的动作太多太模糊, 导致细节丢失, 精度低
  3. 动作序列有二维特性(时间维度和动作维度), 不同维度的物理含义和数据分布不均匀(如, 夹爪是二值的, joint是连续的)

因此提出两个架构:

  • FASTerVQ: 高效action tokenizer
    • 根据action的物理含义进行切片, 缓解数据分布不均匀的问题
    • 使用混合Transformer编码器, 使用TAAE捕捉全局时空依赖, 结合CNN建模局部关系
    • 使用RVQ的思路进行多级量化
    • 使用DCT计算在频域上的损失, 捕捉动作趋势
  • FASTerVLA: 高效policy model
    • 使用block-wise autoregressive(块状自回归解码), 极大提升效率
    • 在pre-trained VLM上添加一个轻量级action expert model, 缓解离散语言和连续action之间的冲突2

Methods

FASTerVQ

Patchify & Flatten

将Action Chunk 在时间维度上再次切片, 同时根据物理含义非均匀分组. 如, Arm(手臂), Gripper(夹爪), Torso(躯干), Chassis(底座).

假设, 那么首先进行时间维度上再次切片: , 然后在根据物理意义分组并添加pad: . 然后, 将同一个时间段()的相同action group(如, Arm, Gripper,…)的feature拼接, 得到. 最后, 把这个patch给拼接(flatten), 得到

最终经过patchify和flatten之后的结果, 每一行是 一段时间内同一个物理含义的action dim的拼接. 一段时间内有行(因为有个组), 有段时间, 拼接得到了

Encoder

将patchify之后的结果给到encoder进行编码. 首先使用一个position embedding+transformer进行编码, 然后使用一个Linear将feature投影到latent space

Vector Quantize

Scaling Transformers for Low-Bitrate High-Quality Speech Coding这篇文章不同, Robotic Actions是一个稀疏的信号空间. 因此Robotic Action的quantize需要非均匀采样, 而不能直接简单的分格子来进行量化.

因此这里依然使用了RVQ的方法.

使用quantize的原因是:

  1. 将动作离散化, 能够适应LLM原本的离散建模能力. 如果使用连续建模可能会导致LLM内部输出离散token的能力下降, 导致灾难性遗忘
  2. 离散化能够有效建模多模态, 特别是action这种有二值化的问题(如, 夹爪)
  3. 引入了Information bottleneck和正则化, 能够把无意义的高频抖动磨平, 降低对噪声的敏感性

Decoder

相同的做法. 首先经过一个Linear将latent vector投影回feature space, 然后经过一个Transformer decoder解码得到action patch

Action Unpatchifier

仿照Patchify的做法, 将action逆patchify回到原来的action chunk的样子

FASTerVLA

多模态输入(RGB 图像 、本体感受状态 、语言指令 VLM 主干网络(提取多模态上下文) 轻量级动作专家(Action Expert) 离散动作 Token 序列 连续动作序列

每一次推理action chunk, VLM backbone仅计算一次, 为Action Expert提供latent context.

Action Expert是一个与backbone相同架构的VLM. 为了加速推理, 使用Block-wise Auto-Regression(BAR)的方法进行加速:

  • 设计一个token作为占位符: <BoBlk> (Begin of Block). <BoBlk>经过Action Expert之后, Transformer将其转换为RVQ的基向量编号(类似RQ-Transformer)
  • block的方法为: 将一个chunk分成多个block , 一次性生成一整个block . 假设一个block中有个token, 那么将<BoBlk>重复次并直接进行计算输出.
  • block的attention mask: 每一个block的内部可以相互看到, 每一个block能看到前面所有的信息, 但是看不到block后面的信息
  • 输出头: 通过增加原始的词表来实现输出基向量序号, 增加的大小就是RVQ的codebook大小

训练时分成两阶段:

  1. 在大规模数据上同时pre-train VLM Backbone和Action Expert
  2. 冻结部分层(VLM的Transformer部分), 在特定任务上微调

如果直接从零开始在一个特定任务上训练, 会导致效果很差