UniVLA训练思路
一、整体架构思想
UniVLA的核心创新是使用**潜在动作模型(Latent Action Model)**从视频中提取任务相关的动作表示,而不是直接预测具体的机器人动作。
为什么这样设计?
传统VLA模型的问题:
- 不同机器人的动作空间不同(7轴 vs 14轴)
- 不同任务的动作定义不同
- 需要大量标注的动作数据
UniVLA的解决方案:
- 创建一个统一的潜在动作空间
- 所有机器人、所有任务都映射到这个统一空间
- 可以利用无标注的视频数据
二、训练分为三个阶段
阶段0:潜在动作模型训练(LAM Training)
这是UniVLA独特的部分,训练一个能从视频中提取"抽象动作"的模型。
Stage 1 - 学习任务无关的潜在动作:
输入:大量视频(机器人 + 人类)
目标:学习通用的运动模式
方法:VQ-VAE(Vector Quantized VAE)
- 把连续的动作压缩成离散的token
- 建立一个"动作词典"(codebook)
Stage 2 - 学习任务相关的潜在动作:
输入:视频 + 语言指令
目标:让潜在动作与任务目标对齐
方法:在DINO特征空间中训练
- 结合视觉特征和语言信息
- 生成"任务驱动"的抽象动作
训练数据:
- OpenX机器人数据集
- Ego4D人类视频
- 导航数据集
阶段1:VLA预训练(Generalist Policy Pre-training)
训练一个能理解视觉、语言并预测潜在动作的大模型。
架构:
- Backbone: Prismatic-7B(视觉-语言模型)
- 输入: 图像 + 语言指令
- 输出: 潜在动作token序列
# 训练过程伪代码
for batch in training_data:image = batch['observation']instruction = batch['language']# 1. 用LAM把真实动作转换为潜在动作tokenlatent_actions = LAM.encode(batch['video'])# latent_actions 是离散的 token,例如 [ACT_42, ACT_156, ACT_89, ...]# 2. VLA模型预测潜在动作predicted_tokens = VLA(image, instruction)# 3. 下一个token预测损失loss = CrossEntropy(predicted_tokens, latent_actions)loss.backward()
**关键点:潜在动作被映射为特殊token {ACT_0, ACT_1, …, ACT_C},就像语言token一样
阶段2:LIBERO微调(Downstream Fine-tuning)
在特定任务上微调,添加机器人特定的action decoder。
新增组件:Action Decoder(仅12M参数)
功能:把潜在动作转换为机器人的实际控制信号
输入:潜在动作 token + 视觉特征
输出:7维动作(LIBERO的情况)
训练配置:
# 训练设置
- 使用LoRA (rank=32) 微调VLA backbone
- 训练Action Decoder(从头开始)
- 总可训练参数:约123M(仅占总参数的1.6%)# LIBERO-specific
- Spatial/Object/Goal: 30k steps
- Long (LIBERO-10): 40k steps
- Batch size: 128
- 只使用第三人称相机 + 语言指令
训练流程:
# 微调伪代码
for batch in libero_dataset:image = batch['observation']instruction = batch['task_description']real_action = batch['action'] # 7维真实动作# 1. VLA预测潜在动作(冻结或LoRA微调)latent_action_tokens = VLA(image, instruction)# 2. 获取潜在动作的embeddinglatent_embedding = LAM.get_embedding(latent_action_tokens)# 3. Action Decoder解码为真实动作predicted_action = ActionDecoder(latent_embedding, visual_features)# 4. 监督损失loss = MSE(predicted_action, real_action)loss.backward()
三、数据流动全流程
训练时:
视频帧 → LAM Encoder → 潜在动作token → VLA学习预测这些token微调时:
观察图像 + 指令 → VLA → 潜在动作token → LAM Embedding →
Action Decoder → 机器人动作推理时:
相机图像 + 任务指令 → VLA → 潜在动作token →
Action Decoder → 执行动作 → 环境反馈 → 下一帧
四、为什么这样设计有效?
1. 跨机器人泛化:
- 不同机器人通过各自的Action Decoder连接到统一的潜在空间
- VLA backbone可以共享,只需训练12M的decoder
2. 数据效率:
- 可以使用人类视频(无动作标注)预训练
- 潜在动作捕捉了"任务本质"而非"机器人特定"的知识
3. 计算效率:
- 仅需OpenVLA 5%的预训练算力(960 GPU小时)
- 微调时只更新很少的参数
4. 语言对齐:
- 潜在动作在DINO特征空间训练,与视觉语义对齐
- 更容易理解自然语言指令
五、LIBERO训练的具体要点
# 你需要准备的
1. 预训练模型:univla-7b (通用VLA模型)
2. 潜在动作模型:lam-stage-2.ckpt
3. LIBERO数据集:轨迹数据(图像+动作+指令)# 训练时发生的事
1. 冻结LAM(已经训好)
2. LoRA微调VLA backbone(学习LIBERO任务特征)
3. 从头训练Action Decoder(学习解码到7维动作空间)# 关键超参数
- max_steps: 30k (Spatial/Object/Goal) 或 40k (Long)
- batch_size: 根据GPU显存调整
- LoRA rank: 32
- learning_rate: 通常5e-4
这个设计的精妙之处在于:潜在动作作为中间表示,既保留了任务相关信息,又抽象掉了机器人特定细节,这使得模型能高效地在不同机器人和任务间迁移!
有什么具体环节需要我详细解释吗?
