VLA视觉-语言-动作模型训练策略
1. 概述
视觉-语言-动作(Vision-Language-Action, VLA)模型是具身智能领域的核心研究方向,旨在构建能够理解视觉感知、自然语言指令,并生成机器人动作策略的通用基础模型。与传统视觉-语言模型不同,VLA需要在连续的动作空间中进行决策,这对训练策略提出了独特的挑战。1
本文系统梳理VLA模型训练中的关键策略,涵盖数据来源、混合策略、多阶段训练流程、RL后训练方法等方面,为研究者和工程师提供实践参考。
2. VLA训练数据来源
高质量、大规模的训练数据是VLA模型能力的基础。根据数据来源和特性,可以分为以下几类:
2.1 真实机器人数据
真实机器人数据是最直接、最可靠的数据来源,但获取成本高昂。
| 数据集 | 规模 | 特点 |
|---|---|---|
| RT-1 | 130K episodes | Google Robotics大规模演示数据 |
| Bridge | 25K episodes | 家庭环境任务 |
| DROID | 76K episodes | 多场景、多种机械臂 |
| Open X-Embodiment | 100+机器人 | 跨具身汇集数据 |
真实数据的优势:
- 动作质量高,符合物理约束
- 真实的传感器噪声和延迟
- 任务完成率可直接评估
真实数据的局限:
- 采集成本高,扩展性受限
- 覆盖的任务空间有限
- 难以获取极端情况数据
2.2 合成数据
合成数据通过仿真环境生成,具有规模大、成本低的优势。
仿真数据生成策略:
# 仿真数据生成流程
def generate_synthetic_data(env, task_prompt, num_episodes=1000):
trajectories = []
for _ in range(num_episodes):
env.reset()
# 随机化场景参数(物体位置、光照、背景等)
env.randomize()
# 执行任务或随机策略
episode = rollouter.rollout(env, policy=None, horizon=500)
trajectories.append(episode)
return trajectories关键技术点:
- 域随机化(Domain Randomization):在仿真中随机化物理参数、视觉外观
- 资产多样化:使用程序化生成或大规模3D模型库
- 任务空间扩展:通过任务组合生成新任务
典型仿真平台:
- MetaUrban、RoboCasa:家庭场景仿真
- Dex-MG、ManiSkill:灵巧操作仿真
- IsaacGym、MuJoCo:高性能物理仿真
2.3 人类视频数据
人类视频数据(如Ego4D、Epic-Kitchens)提供了大规模、成本极低的动作示范,是VLA预训练的重要数据来源。2
从人类视频学习动作的挑战:
- 形态差异:人类与机器人的身体结构不同
- 动作标签缺失:视频中没有显式的动作标签
- 时序对应:如何将视频帧与机器人动作对应
解决方案——潜在动作模型(Latent Action):
Being-H0等方法2提出从人类视频中提取隐式的”手部运动模式”:
人类视频 → 手部姿态估计 → 潜在动作codebook → 跨形态迁移
通过VQ-VAE或类似方法,将手部运动编码为离散token,然后学习从视觉观察到这些动作的映射。
2.4 神经轨迹数据
神经轨迹(Neural Trajectory)是介于仿真和真实之间的数据形式,通过学习的世界模型或神经渲染生成。
特点:
- 可以生成无限多样本
- 保持视觉真实性
- 需要预训练的世界模型
3. 异构数据混合策略
VLA训练面临的核心挑战之一是如何有效混合来自不同来源、不同质量、不同模态的异构数据。
3.1 数据金字塔策略
NVIDIA GR00T N11提出的数据金字塔是当前最具影响力的异构数据混合框架:
┌─────────────────────────────────────────────┐
│ 顶层:真实机器人数据 │
│ (稀缺但高质量,约M级别) │
├─────────────────────────────────────────────┤
│ 中层:合成仿真数据 │
│ (中等规模,约100K-1M) │
├─────────────────────────────────────────────┤
│ 下层:人类视频数据 │
│ (大规模,约M-B级别) │
├─────────────────────────────────────────────┤
│ 底层:网络图文数据 │
│ (海量,用于视觉-语言预训练) │
└─────────────────────────────────────────────┘
各层数据的角色:
- 真实数据:确保机器人特定能力的上限
- 仿真数据:提供任务多样性、失败场景覆盖
- 人类视频:学习通用动作模式、语义理解
- 图文数据:提供世界知识和语言理解能力
3.2 配分与采样策略
在混合训练中,数据采样比例是关键超参数:
| 策略 | 描述 | 优缺点 |
|---|---|---|
| 均匀采样 | 各来源等比例采样 | 简单但忽略数据质量差异 |
| 质量加权 | 根据数据质量/任务覆盖率加权 | 需要定义质量指标 |
| 课程学习 | 从易到难渐进调整比例 | 训练更稳定但需要阶段控制 |
| 动态调整 | 根据训练损失动态调整 | 自适应但实现复杂 |
Being-H0.52的经验做法:
真实机器人数据 : 仿真数据 : 人类视频 ≈ 1 : 10 : 100
3.3 动作标签生成策略
对于没有动作标签的数据(如人类视频),需要生成伪标签:
隐式动作模型(Implicit Dynamics Model, IDM):
class LatentActionModel:
"""
从状态变化中学习潜在动作表示
核心思想:动作 = 导致状态变化的隐变量
"""
def __init__(self, encoder, decoder, codebook_size=256):
self.encoder = encoder # 观测 → 潜在动作
self.decoder = decoder # 潜在动作 → 下一观测
self.codebook = Codebook(codebook_size)
def encode(self, obs_t, obs_t+1):
"""从两帧观测中提取动作"""
delta = obs_t+1 - obs_t # 或使用特征空间的差异
latent = self.encoder(delta)
return self.codebook.quantize(latent)GR00T N11使用VQ-VAE训练的action codebook,对无动作数据生成伪标签进行训练。
4. 多阶段训练流程
4.1 经典三阶段范式
Ψ₀论文3提出的三阶段训练范式是VLA领域的代表性方法:
┌──────────────────────────────────────────────────────────────┐
│ 阶段1:视觉-语言预训练 │
│ • 使用图文对数据训练视觉编码器和语言理解 │
│ • 冻结或解冻策略取决于下游任务需求 │
│ • 目标:建立强大的视觉-语言对齐 │
├──────────────────────────────────────────────────────────────┤
│ 阶段2:动作预训练(联合训练) │
│ • 混合真实机器人、仿真、人类视频等多源数据 │
│ • 训练VLM backbone + 动作头 │
│ • 目标:学习通用动作策略 │
├──────────────────────────────────────────────────────────────┤
│ 阶段3:任务特定微调 │
│ • 在目标机器人/任务上进行微调 │
│ • 可选择加入RL后训练 │
│ • 目标:优化特定任务性能 │
└──────────────────────────────────────────────────────────────┘
4.2 Ψ₀的具体实现
Ψ₀3作为人形机器人VLA模型,采用SIMPLE架构:
| 模块 | 架构 | 参数量 |
|---|---|---|
| 视觉编码器 | SigLIP + FPN | ~400M |
| 语言模型 | LLaMA 3.2 3B | 3B |
| 动作生成器 | Flow-based DiT | ~1B |
| 总计 | - | ~4.5B |
训练配置:
stage1_vlp:
epochs: 10
lr: 1e-4
batch_size: 2048
data: [web_images, robot_data]
stage2_action_pretrain:
epochs: 20
lr: 5e-5
batch_size: 512
data: [real_robot, simulation, human_video]
stage3_finetune:
epochs: 5
lr: 1e-5
batch_size: 128
data: [target_robot_tasks]4.3 GR00T N1的双系统架构
GR00T N11采用System 1 + System 2的双系统设计:
| 系统 | 组件 | 频率 | 职责 |
|---|---|---|---|
| System 2 | Eagle-2 VLM | ~1Hz | 高层规划、任务理解 |
| System 1 | DiT Flow-Matching | ~50Hz | 低层运动控制 |
这种设计分离了”思考”和”执行”,使系统既能进行复杂推理,又能保持高频控制。
5. 流匹配训练与自回归训练
VLA的动作生成方式主要分为两类:自回归(AR)和流匹配(Flow Matching)。
5.1 自回归训练
传统方法将动作预测视为下一个token的分类或回归问题:
# 自回归VLA前向传播
class AutoregressiveVLA(nn.Module):
def forward(self, obs, lang, action_history=None):
# 拼接观测、语言、历史动作
x = self.tokenizer(obs, lang, action_history)
# 通过Transformer
logits = self.lm_head(self.transformer(x))
# 预测下一动作token
next_action = logits[:, -action_dim].argmax(dim=-1)
return next_action特点:
- ✅ 推理时可以自回归生成任意长度
- ✅ 与LLM架构一致,易于迁移预训练权重
- ❌ 逐token生成延迟高
- ❌ 误差累积问题
5.2 流匹配训练
流匹配将动作生成视为从噪声到数据的连续变换过程:
# 简化的流匹配损失
def flow_matching_loss(model, obs, lang, actions):
# 随机采样时间步和噪声
t = torch.rand(len(actions))
noise = torch.randn_like(actions)
# 线性插值:x_t = (1-t)*noise + t*actions
x_t = t.view(-1, 1) * actions + (1-t).view(-1, 1) * noise
# 预测速度向量
v_t = model(x_t, obs, lang)
# 损失 = 预测速度与真实速度的MSE
loss = F.mse_loss(v_t, actions - noise)
return loss特点:
- ✅ 支持并行生成,动作块一次性输出
- ✅ 高频控制(如50Hz)更自然
- ✅ 可以通过调整采样步数权衡速度与质量
- ❌ 需要额外的归一化处理
- ❌ 推理延迟受采样步数影响
5.3 统一方法
DiffusionVLA4和HybridVLA5等研究探索了统一两种范式:
| 方法 | 核心思想 |
|---|---|
| DiffusionVLA | LLM生成高层计划,扩散模型生成动作序列 |
| HybridVLA | 自回归预测目标状态,扩散生成轨迹 |
| BlockVLA | AR模型输出关键帧,扩散模型插值 |
统一架构的优势:
- 发挥LLM的推理能力
- 利用扩散模型的高质量动作生成
- 支持不同任务类型自适应切换
6. RL后训练在VLA中的应用
6.1 为什么VLA需要RL?
VLA的模仿学习(行为克隆)存在固有局限:
- 分布外泛化差:遇到训练集未覆盖的情况容易失败
- 动作精度不足:模仿学习倾向于预测均值行为
- 奖励信号利用:无法直接优化任务成功指标
RL通过与环境交互、利用奖励信号,可以有效解决上述问题。
6.2 GRPO在VLA中的应用
TGRPO(Trajectory-wise GRPO)6是针对VLA设计的GRPO变体:
def tgrpo_loss(policy, states, actions, rewards, group_size=8):
"""
Trajectory-wise GRPO:按轨迹分组计算优势
"""
# 收集多个候选轨迹
trajectories = collect_group(policy, states, group_size)
# 计算组内相对优势
baseline = trajectories['reward'].mean()
advantages = trajectories['reward'] - baseline
# GRPO策略损失
ratio = torch.exp(trajectories['log_probs'] - trajectories['old_log_probs'])
clipped_ratio = ratio.clamp(1 - epsilon, 1 + epsilon)
policy_loss = -torch.min(ratio * advantages, clipped_ratio * advantages)
return policy_loss.mean()TGRPO相比标准GRPO的改进:
- 按完整轨迹评估奖励,避免片段级奖励的噪声
- 组内相对优势减少基准估计的方差
- 更适合动作序列的信用分配
6.3 DAPO在VLA中的应用
DAPO(Decoupled Clip and Dynamic Sampling Policy Optimization)7进一步改进了VLA的RL训练:
核心改进:
- 解耦clipping:将clip范围与采样分布解耦
- 动态采样:根据样本质量动态调整采样概率
- 过度优势裁剪:允许更大的正向优势
def dapo_loss(policy, states, actions, rewards, epsilon=0.2):
"""
DAPO损失函数
"""
log_probs = policy.get_log_prob(states, actions)
old_log_probs = log_probs.detach()
# 计算优势
advantages = compute_advantages(rewards)
# DAPO特有的裁剪策略
# 对正向优势更宽松,对负向优势更严格
ratio = torch.exp(log_probs - old_log_probs)
# 过度优势裁剪
if advantages > 0:
# 正向样本:允许更大的策略更新
clip_frac = epsilon * 1.5
else:
# 负向样本:更严格的裁剪
clip_frac = epsilon * 0.5
clipped_ratio = ratio.clamp(1 - clip_frac, 1 + clip_frac)
loss = -torch.min(ratio * advantages, clipped_ratio * advantages)
return loss.mean()6.4 VLA-R1:推理增强
VLA-R18将Chain-of-Thought推理引入VLA训练:
输入:一张桌子上有红色积木和蓝色盒子。机械臂应该如何抓取红色积木?
VLA-R1推理过程:
1. "首先,我需要识别红色积木的位置..."
2. "红色积木在桌子中央,旁边有蓝色盒子..."
3. "为了避免碰撞,我应该从侧面接近..."
4. "规划抓取角度:约45度..."
输出动作序列:...
训练方法:
- 使用CoT数据微调VLA
- 通过RL进一步优化推理质量
- 推理时可选择输出CoT或直接输出动作
7. 跨具身泛化的数据策略
跨具身(Cross-Embodiment)泛化是VLA的核心挑战:如何让一个模型在不同形态的机器人上都能有效工作?
7.1 形态差异的来源
| 差异维度 | 示例 |
|---|---|
| 自由度 | 7-DOF机械臂 vs 28-DOF人形双手 |
| 末端执行器 | 夹爪 vs 灵巧手 vs 吸盘 |
| 传感器配置 | 单目相机 vs RGB-D vs 多相机 |
| 动作空间 | 关节角 vs 末端位姿 vs 任务空间速度 |
7.2 归一化策略
动作空间归一化:
不同机器人的动作范围差异巨大,需要统一归一化:
def normalize_action(action, robot_stats):
"""
将异构动作归一化到[-1, 1]
"""
# 使用running stats跟踪每个关节的范围
mean = robot_stats['mean'] # 形状: [action_dim]
std = robot_stats['std'] # 形状: [action_dim]
# 防止除零
std = torch.clamp(std, min=1e-6)
normalized = (action - mean) / std
return normalized.clamp(-3, 3) # 截断极端值
def denormalize_action(normalized_action, robot_stats):
"""
将归一化动作反变换到实际动作空间
"""
return normalized_action * robot_stats['std'] + robot_stats['mean']Being-H0.52的统一动作表示:
Being-H0.5通过将不同形态的物理控制统一建模为手部运动模式的变体:
不同形态 → 统一的手部运动表示 → 不同形态
这使得模型可以在统一的隐空间中学习跨形态的控制策略。
7.3 形态感知架构
MLP Projector方法(GR00T N1):
每个机器人使用独立的MLP层将统一表示映射到特定的动作空间:
class EmbodiementProjector(nn.Module):
def __init__(self, latent_dim, action_dims):
self.shared_encoder = ...
self.projectors = nn.ModuleDict({
f'robot_{i}': MLP(latent_dim, action_dims[i])
for i in range(num_robots)
})
def forward(self, x, robot_id):
return self.projectors[robot_id](x)形态编码方法:
另一种方法是将形态描述编码为额外的输入:
def forward(self, obs, lang, morphology_desc):
# 形态描述 → embedding
morph_emb = self.morph_encoder(morphology_desc)
# 融合到主网络
x = self.vision_encoder(obs)
x = torch.cat([x, morph_emb], dim=-1)
x = self.lm(x, lang)
return self.action_head(x)8. 典型模型的数据策略对比
8.1 GR00T N1
| 方面 | 策略 |
|---|---|
| 架构 | 双系统:Eagle-2 VLM + DiT Flow-Matching |
| 数据金字塔 | 真实机器人 + 仿真 + 神经轨迹 + 人类视频 |
| 动作标签 | VQ-VAE latent action + IDM伪标签 |
| 跨具身 | MLP projector per embodiment |
| 训练阶段 | 联合预训练 + 任务微调 |
8.2 Ψ₀
| 方面 | 策略 |
|---|---|
| 架构 | SIMPLE:SigLIP + LLaMA 3.2 + Flow DiT |
| 数据来源 | USC PSI Lab人形机器人数据 |
| 训练范式 | 三阶段:VLM预训练 → 动作联合训练 → 任务微调 |
| 特色 | 专注人形机器人的locomotion + manipulation |
8.3 Being-H0.5
| 方面 | 策略 |
|---|---|
| 架构 | 统一预测头:文本回答 + 机器人动作 |
| 数据规模 | UniHand-2.0: 35K+小时,120B tokens |
| 数据组成 | 人类手部运动 + 跨形态物理控制 + 视觉-语言理解 |
| 跨具身 | 统一手部运动表示作为桥梁 |
| 训练方法 | 物理对齐 + 指令微调 |
8.4 π₀系列
| 方面 | 策略 |
|---|---|
| 架构 | VLM backbone + Flow matching action head |
| 特色 | 50Hz高频动作输出 |
| 后训练 | RL微调(π₀.5 + π₀.7) |
| 泛化 | 强调开放世界泛化能力 |
9. 训练技巧与最佳实践
9.1 数据预处理
观测归一化:
# 使用固定统计量或running stats
class ObsNorm:
def __init__(self, obs_dim):
self.running_mean = torch.zeros(obs_dim)
self.running_var = torch.ones(obs_dim)
self.count = 1e-4
def update(self, batch_obs):
batch_mean = batch_obs.mean(dim=[0, 1]) # [T, B, D] → [D]
batch_var = batch_obs.var(dim=[0, 1])
batch_count = batch_obs.shape[1]
delta = batch_mean - self.running_mean
total_count = self.count + batch_count
self.running_mean += delta * batch_count / total_count
self.running_var = (
self.running_var * self.count +
batch_var * batch_count +
delta**2 * self.count * batch_count / total_count
) / total_count
self.count = total_count数据增强:
- 图像:颜色抖动、随机裁剪、RandAugment
- 机器人状态:添加噪声、随机遮蔽
- 语言指令:同义词替换、指令改写
9.2 训练稳定性
梯度技巧:
# 梯度裁剪
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
# 梯度累积(应对小batch)
accumulation_steps = 4
effective_batch_size = batch_size * accumulation_steps
# EMA(指数移动平均)
ema = ExponentialMovingAverage(model.parameters(), decay=0.999)学习率调度:
# Warmup + Cosine衰减
def lr_lambda(step, warmup_steps=1000, total_steps=100000):
if step < warmup_steps:
return step / warmup_steps
else:
progress = (step - warmup_steps) / (total_steps - warmup_steps)
return 0.5 * (1 + cos(π * progress))9.3 动作预测技巧
动作分块(Action Chunking):
# 预测未来H步动作,减少时序依赖
action_chunk_size = 16 # 预测16步动作
def predict_action_chunk(model, obs, lang):
obs_tokens = model.vision_encoder(obs)
lang_tokens = model.lang_encoder(lang)
# 融合并通过LM
x = model.fuse(obs_tokens, lang_tokens)
x = model.transformer(x)
# 预测动作块
action_chunk = model.action_head(x) # [B, H, action_dim]
return action_chunk动作解码策略:
def decode_actions(logits, strategy='greedy'):
if strategy == 'greedy':
return logits.argmax(dim=-1)
elif strategy == 'temperature':
return (logits / temperature).softmax(dim=-1)
elif strategy == 'top_k':
top_k_logits, top_k_indices = logits.topk(k=10, dim=-1)
probs = softmax(top_k_logits / temperature, dim=-1)
return top_k_indices[torch.multinomial(probs, 1)]9.4 评测与调试
中间检查点保存:
# 每N步保存checkpoint
if global_step % save_steps == 0:
checkpoint = {
'model': model.state_dict(),
'optimizer': optimizer.state_dict(),
'step': global_step,
'metrics': compute_metrics(val_loader)
}
save_checkpoint(checkpoint, path)训练可视化:
- WandB/TensorBoard记录loss曲线、动作分布、采样结果
- 定期在仿真环境中可视化生成的动作
- 记录梯度统计检测异常
10. 总结与展望
VLA训练策略的核心挑战在于:
- 数据异构性:如何有效混合真实、仿真、人类视频等多源数据
- 形态泛化:如何让统一模型适应不同机器人形态
- 动作质量:如何在保证高频控制的同时提升动作精度
- 样本效率:如何用有限数据达到良好泛化
未来趋势:
| 方向 | 预测 |
|---|---|
| 架构创新 | 更多统一AR+Diffusion混合架构 |
| 数据策略 | 自动化的数据配比优化、合成数据质量提升 |
| RL集成 | 更高效的VLA专用RL算法、在线学习 |
| 世界模型 | 更好的世界模型用于想象训练 |
| 多模态融合 | 触觉、力觉、音频等更多模态的整合 |
参考文献
Footnotes
-
NVIDIA. GR00T N1: An Open Foundation Model for Generalist Humanoid Robots. arXiv:2503.14734, 2025. ↩ ↩2 ↩3 ↩4
-
BeingBeyond Team. Being-H0.5: Scaling Human-Centric Robot Learning for Cross-Embodiment Generalization. arXiv:2601.12993, 2026. ↩ ↩2 ↩3 ↩4
-
Wei et al. Ψ₀: An Open Foundation Model Towards Universal Humanoid Loco-Manipulation. RSS 2026. ↩ ↩2
-
Wen et al. DiffusionVLA: Scaling Robot Foundation Models via Unified Diffusion and Autoregression. ICML 2025. ↩
-
Liu et al. HybridVLA: Collaborative Diffusion and Autoregression in a Unified Vision-Language-Action Model. arXiv:2503.10631, 2025. ↩
-
Chen et al. TGRPO: Fine-tuning Vision-Language-Action Model via Trajectory-wise Group Relative Policy Optimization. arXiv:2506.08440, 2025. ↩
-
Zhang. From GRPO to DAPO and GSPO: What, Why, and How. Hugging Face Blog, 2025. ↩
-
Ye et al. VLA-R1: Enhancing Reasoning in Vision-Language-Action Models. arXiv:2510.01623, 2025. ↩