跳转至

数据、训练与评估

VLA 的能力来自机器人演示数据。模型不是“懂物理”后自动会动,而是在大量“观测-指令-动作”轨迹里学会哪些视觉语言状态对应哪些动作。


1. 一条机器人数据长什么样?

一条 episode 通常表示一次完整任务,例如“把方块放进盒子”。它包含:

字段 含义
image 相机图像,可能有多个视角
instruction 自然语言任务描述
state 关节角、末端位姿、夹爪状态
action 下一步动作或未来动作块
reward/success 可选,任务是否成功
is_terminal episode 是否结束
timestamp 时间同步信息

监督学习视角下,一条训练样本可以写成:

\[ (o_t, l, s_t) \rightarrow a_t \]

也就是给定当前观测、语言和状态,预测专家下一步动作。

1.1 一个 step 的具体样子

概念上,一步数据可以写成:

observation:
  image_primary: RGB image
  image_wrist: RGB image
  state:
    joint_positions: [q1, q2, ...]
    end_effector_pose: [x, y, z, qw, qx, qy, qz]
    gripper: 0.0
language_instruction: "把红色方块放进盒子"
action:
  world_vector: [dx, dy, dz]
  rotation_delta: [droll, dpitch, dyaw]
  gripper_closedness_action: 1.0
is_terminal: false
timestamp: 12.34

训练时不会真的都长这样,但你要能在任何数据格式里找到这些信息:

  • 当前看到了什么。
  • 当前机器人自己在哪里。
  • 人类给的任务是什么。
  • 专家下一步做了什么。

1.2 从 Episode 到训练样本

一条 episode 有 \(T\) 帧:

\[ (o_1,a_1),(o_2,a_2),...,(o_T,a_T) \]

如果训练下一步动作,样本是:

\[ (o_t,l,s_t)\rightarrow a_t \]

如果训练 action chunk,样本是:

\[ (o_t,l,s_t)\rightarrow [a_t,a_{t+1},...,a_{t+H}] \]

这会让模型一次学未来 \(H\) 步动作,执行时更平滑,但也要求数据频率和 chunk 长度设计合理。


2. 行为克隆:VLA 的基础训练目标

最基础的 VLA 训练就是行为克隆(Behavior Cloning):

\[ \min_\theta \mathbb{E}_{(o,l,a)\sim D} \left[\mathcal{L}(\pi_\theta(o,l), a)\right] \]

离散动作 token 用交叉熵:

\[ \mathcal{L}_{\text{CE}} = -\sum_i y_i \log p_i \]

连续动作用 MSE、负对数似然、diffusion loss 或 flow matching loss。

行为克隆的本质

行为克隆就是“看专家怎么做,然后拟合专家动作”。它简单、稳定、可扩展,是当前很多 VLA 的底层训练方式。

2.1 Teacher Forcing

离散动作 token 训练时,常用 teacher forcing:

输入:图像 + 指令 + 已知的前几个动作 token
目标:预测下一个专家动作 token

训练时模型总能看到专家历史,推理时却只能看到自己生成的历史。这会带来分布偏移:

训练:专家状态 -> 专家动作
推理:模型动作 -> 新状态 -> 模型再动作

一步小错可能让机器人到达专家数据里没见过的状态,后面错误继续放大。

2.2 离线 loss 为什么不够?

行为克隆可能出现:

  • 验证集 loss 很低,但实机失败。
  • 图像问答很好,但抓取失败。
  • 单步动作看着合理,连续执行抖动。

原因是 VLA 任务是闭环控制。评估必须看机器人执行后的下一帧,而不是只看离线动作误差。

2.3 常见训练目标

动作形式 训练目标 适合
离散动作 token Cross Entropy OpenVLA/RT-2 类自回归模型
连续动作 MSE / L1 小型 BC baseline
高斯动作分布 NLL 动作有不确定性时
Diffusion action chunk Denoising loss 多峰、平滑连续动作
Flow action chunk Flow matching loss 高效连续动作生成

3. 重要数据集与格式

3.1 Open X-Embodiment

Open X-Embodiment(OXE)把多个机构、多个机器人、多个任务的数据汇总成大规模机器人学习数据集。它的重要意义不是“某个任务特别强”,而是让跨机器人、跨任务的 generalist policy 成为可能。

你需要关注:

  • 不同机器人动作空间不一样。
  • 不同相机视角和频率不一样。
  • 语言标签粒度不一样。
  • 数据分布非常不均衡。

3.2 RLDS

RLDS 是 Google 系机器人数据常用格式,常和 TensorFlow Datasets 一起使用。它把数据组织成 episode 和 step,适合存储轨迹。

概念上可以理解为:

Dataset
  Episode 1
    Step 1: observation, action, reward, is_first, is_last
    Step 2: observation, action, reward, is_first, is_last
  Episode 2
    ...

3.3 LeRobot

LeRobot 更适合新手和工程实践。它覆盖数据采集、数据集存储、可视化、训练和推理,并且支持低成本机器人平台。想快速跑通“采数据 -> 训练 -> 推理”,优先看 LeRobot。


4. 数据采集

4.1 遥操作

常见采集方式:

  • 手柄/键盘控制机械臂。
  • 主从机械臂遥操作。
  • VR 设备或 3D 鼠标。
  • 人手示范视频再做动作恢复。

遥操作数据的核心不是“采很多”,而是“采得一致”:

  • 任务起始状态要有多样性。
  • 成功轨迹要覆盖不同物体位置。
  • 失败轨迹要标注清楚,不要混进成功数据。
  • 相机、机器人和动作时间戳要同步。

4.2 语言标注

语言指令可以有不同粒度:

粒度 示例 适用
任务级 把红色方块放进盒子 最常见
子任务级 接近方块、闭合夹爪、移动到盒子 长程任务
状态反馈 已经抓住方块 进度判断、层级策略

对新手项目,先用任务级语言就够了。等模型能稳定完成短任务,再加入子任务标签。


5. 数据预处理

5.1 图像处理

  • 统一分辨率。
  • 保持相机视角一致。
  • 记录相机内参/外参。
  • 做必要的数据增强,但不要破坏空间关系。

图像预处理要特别注意:

操作 风险
随机裁剪 可能把目标物体或夹爪裁掉
水平翻转 左右关系和机器人坐标系可能反了
强颜色增强 颜色指令任务可能被破坏
resize 过小 小物体只剩几个像素,ViT patch token 无法保留

对机器人任务,增强不是越多越好。任何会改变空间关系、颜色语义或相机几何的增强,都要谨慎。

5.2 动作归一化

动作通常需要归一化到固定范围,例如 \([-1,1]\)。常见做法:

\[ a_{\text{norm}} = \frac{a - \mu}{\sigma} \]

或按最大最小值缩放:

\[ a_{\text{norm}} = 2 \cdot \frac{a-a_{\min}}{a_{\max}-a_{\min}} - 1 \]

注意:如果异常动作进入统计,会让正常动作被压得很小,模型会学得很差。

5.3 频率重采样

如果数据是 30Hz,底层控制是 100Hz,模型推理是 5Hz,就必须设计清楚:

  • 模型每次预测几步?
  • 每步动作持续多久?
  • 低层控制器如何插值?
  • 新观测来了以后是否覆盖旧动作?

5.4 数据质量检查

训练前建议逐条可视化并检查:

检查项 问题表现
图像-动作同步 夹爪已经闭合,但动作标签还在接近
坐标系方向 模型总是向目标反方向移动
动作尺度 输出太小不动,太大乱撞
夹爪标签 到目标前提前闭合,或抓住后又打开
成功/失败混杂 模型学到失败示范
语言标签 指令说红色,轨迹实际抓蓝色

先做 overfit 小测试

用 5 到 10 条轨迹训练到几乎记住。如果小数据都学不会,优先查数据格式、动作归一化、坐标系和训练目标。


6. 微调与部署

6.1 全量微调

全量微调效果可能好,但显存和数据要求高,也更容易过拟合小数据集。

6.2 LoRA/PEFT

LoRA 只训练低秩适配矩阵:

\[ W' = W + BA \]

其中 \(A,B\) 是小矩阵。优点是显存占用低,适合在自己的小数据上微调大模型。

6.3 量化

量化把权重从 FP16/BF16 压到 INT8/INT4,降低显存和推理成本。上机器人时要重新验证成功率,因为微小数值误差可能影响连续控制。


7. 评估指标

VLA 不能只看训练 loss。更重要的是实机/仿真任务表现:

指标 含义
成功率 任务是否完成
平均完成时间 是否高效
碰撞/越界次数 是否安全
动作平滑性 是否抖动
泛化能力 新物体、新位置、新背景是否能做
语言泛化 换一种说法是否仍能理解
恢复能力 中途被打断后是否能继续

推荐评估集划分

集合 示例
Seen 训练中出现过的物体和位置
Unseen object 新物体
Unseen layout 新位置和遮挡
Unseen instruction 同义指令或更长指令
Disturbance 中途移动物体或人为干扰

8. Sim-to-Real

仿真能降低成本,但现实差异很大:

  • 图像渲染差异。
  • 摩擦、质量、碰撞模型不准。
  • 夹爪柔性和物体形变难模拟。
  • 相机延迟和控制延迟。

常见缓解方法:

  • Domain randomization:随机纹理、光照、相机位姿、物理参数。
  • System identification:让仿真参数贴近实机。
  • Real data fine-tuning:用少量真实数据微调。
  • Safety wrapper:实机外层加限幅、碰撞检测和人工接管。

9. 最小可行训练路线

对新手,建议不要一开始训练大 VLA。更稳的路线是:

  1. 选一个短任务:例如抓方块、推按钮、放杯子。
  2. 采 50 到 200 条成功遥操作轨迹。
  3. 可视化每条轨迹,删掉时间戳错乱和失败数据。
  4. 先训练小型行为克隆策略,确认动作空间和控制接口没问题。
  5. 再切到 SmolVLA/Octo/OpenVLA 微调。
  6. 在仿真或低速实机验证,逐步提高速度和难度。

上实机前必须检查

模型输出任何异常值时,底层控制器都应该能限幅、停止或交给人工接管。不要让神经网络直接拥有无限制的电机控制权。