VLA视觉-语言-动作模型训练策略

1. 概述

视觉-语言-动作(Vision-Language-Action, VLA)模型是具身智能领域的核心研究方向,旨在构建能够理解视觉感知、自然语言指令,并生成机器人动作策略的通用基础模型。与传统视觉-语言模型不同,VLA需要在连续的动作空间中进行决策,这对训练策略提出了独特的挑战。1

本文系统梳理VLA模型训练中的关键策略,涵盖数据来源、混合策略、多阶段训练流程、RL后训练方法等方面,为研究者和工程师提供实践参考。

2. VLA训练数据来源

高质量、大规模的训练数据是VLA模型能力的基础。根据数据来源和特性,可以分为以下几类:

2.1 真实机器人数据

真实机器人数据是最直接、最可靠的数据来源,但获取成本高昂。

数据集规模特点
RT-1130K episodesGoogle Robotics大规模演示数据
Bridge25K episodes家庭环境任务
DROID76K episodes多场景、多种机械臂
Open X-Embodiment100+机器人跨具身汇集数据

真实数据的优势:

  • 动作质量高,符合物理约束
  • 真实的传感器噪声和延迟
  • 任务完成率可直接评估

真实数据的局限:

  • 采集成本高,扩展性受限
  • 覆盖的任务空间有限
  • 难以获取极端情况数据

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

从人类视频学习动作的挑战:

  1. 形态差异:人类与机器人的身体结构不同
  2. 动作标签缺失:视频中没有显式的动作标签
  3. 时序对应:如何将视频帧与机器人动作对应

解决方案——潜在动作模型(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 3B3B
动作生成器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 2Eagle-2 VLM~1Hz高层规划、任务理解
System 1DiT 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等研究探索了统一两种范式:

方法核心思想
DiffusionVLALLM生成高层计划,扩散模型生成动作序列
HybridVLA自回归预测目标状态,扩散生成轨迹
BlockVLAAR模型输出关键帧,扩散模型插值

统一架构的优势:

  • 发挥LLM的推理能力
  • 利用扩散模型的高质量动作生成
  • 支持不同任务类型自适应切换

6. RL后训练在VLA中的应用

6.1 为什么VLA需要RL?

VLA的模仿学习(行为克隆)存在固有局限:

  1. 分布外泛化差:遇到训练集未覆盖的情况容易失败
  2. 动作精度不足:模仿学习倾向于预测均值行为
  3. 奖励信号利用:无法直接优化任务成功指标

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训练:

核心改进:

  1. 解耦clipping:将clip范围与采样分布解耦
  2. 动态采样:根据样本质量动态调整采样概率
  3. 过度优势裁剪:允许更大的正向优势
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度..."

输出动作序列:...

训练方法:

  1. 使用CoT数据微调VLA
  2. 通过RL进一步优化推理质量
  3. 推理时可选择输出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训练策略的核心挑战在于:

  1. 数据异构性:如何有效混合真实、仿真、人类视频等多源数据
  2. 形态泛化:如何让统一模型适应不同机器人形态
  3. 动作质量:如何在保证高频控制的同时提升动作精度
  4. 样本效率:如何用有限数据达到良好泛化

未来趋势:

方向预测
架构创新更多统一AR+Diffusion混合架构
数据策略自动化的数据配比优化、合成数据质量提升
RL集成更高效的VLA专用RL算法、在线学习
世界模型更好的世界模型用于想象训练
多模态融合触觉、力觉、音频等更多模态的整合

参考文献

Footnotes

  1. NVIDIA. GR00T N1: An Open Foundation Model for Generalist Humanoid Robots. arXiv:2503.14734, 2025. 2 3 4

  2. BeingBeyond Team. Being-H0.5: Scaling Human-Centric Robot Learning for Cross-Embodiment Generalization. arXiv:2601.12993, 2026. 2 3 4

  3. Wei et al. Ψ₀: An Open Foundation Model Towards Universal Humanoid Loco-Manipulation. RSS 2026. 2

  4. Wen et al. DiffusionVLA: Scaling Robot Foundation Models via Unified Diffusion and Autoregression. ICML 2025.

  5. Liu et al. HybridVLA: Collaborative Diffusion and Autoregression in a Unified Vision-Language-Action Model. arXiv:2503.10631, 2025.

  6. Chen et al. TGRPO: Fine-tuning Vision-Language-Action Model via Trajectory-wise Group Relative Policy Optimization. arXiv:2506.08440, 2025.

  7. Zhang. From GRPO to DAPO and GSPO: What, Why, and How. Hugging Face Blog, 2025.

  8. Ye et al. VLA-R1: Enhancing Reasoning in Vision-Language-Action Models. arXiv:2510.01623, 2025.