paper
Motivation
现在类似OpenVLA的VLA模型, 使用自回归的方式将动作离散化成token, 然后使用LLM进行推理. 但是这种离散化token有一个问题:
- 推理效率低, 逐token生成的方式很慢
- 重建精度于压缩率的冲突. 如果需要高精度, 那么需要大量token表达action, 这会导致自回归推理速度慢; 如果希望效率高速度快, 那么一个token表达的动作太多太模糊, 导致细节丢失, 精度低
- 动作序列有二维特性(时间维度和动作维度), 不同维度的物理含义和数据分布不均匀(如, 夹爪是二值的, 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的原因是:
- 将动作离散化, 能够适应LLM原本的离散建模能力. 如果使用连续建模可能会导致LLM内部输出离散token的能力下降, 导致灾难性遗忘
- 离散化能够有效建模多模态, 特别是action这种有二值化的问题(如, 夹爪)
- 引入了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大小
训练时分成两阶段:
- 在大规模数据上同时pre-train VLM Backbone和Action Expert
- 冻结部分层(VLM的Transformer部分), 在特定任务上微调
如果直接从零开始在一个特定任务上训练, 会导致效果很差