LIBERO还是可靠的基准测试吗?
在机器人VLA社区,许多近期工作仍在LIBERO数据集基准上进行评估,性能数字稳步攀升至接近饱和。在这篇文章中,我采用一个非常简单朴素的流匹配VLA模型,实证测试它在官方数据集上训练并通过环境 rollout 评估时,在LIBERO上的实际表现。
训练和评估脚本可以在这里找到。
1、训练数据
训练数据直接来自官方的 physical-intelligence/libero 数据集。它包含1,693个episode和273,465帧,涵盖四个套件中的40个任务:libero_spatial、libero_object、libero_goal和libero_10。
该数据集的Hugging Face版本遵循LeRobot v2.0格式。为避免处理LeRobot数据管道的复杂性,脚本直接将其转换为PyTorch DataLoader并将批次输入模型。
2、模型架构
模型由三个组件组成,没有VLA预训练。它本质上是一个普通且相对较小的模型:
- vision_encoder:ResNet18骨干网络,其中BatchNorm被GroupNorm替换。它分别编码主摄像头图像和手腕摄像头图像,每个产生512维特征
- text_encoder:默认使用Qwen3-0.6B将任务描述编码为语言特征。如果不冻结,仅对q_proj/k_proj/v_proj/o_proj应用LoRA微调。为了更快的实验,它可以简单地被冻结
- noise_pred_net:一个ConditionalUnet1D,将动作序列(x_t)作为输入并预测流匹配的速度场(v_t)。UNet骨干是一个1D卷积U-Net,通道大小为[256, 512, 1024],中间有两个残差块,每个块注入FiLM条件
3、条件如何构建
每时间步条件特征的构建如下:
- 主摄像头:512
- 手腕摄像头:512
- 机器人状态:8
- 文本嵌入
所以:
per_timestep_cond_dim = 512 * 2 + 8 + text_embed_dim
使用默认设置obs_horizon=1,UNet的global_cond_dim就是当前观察。如果obs_horizon > 1,多帧被展平并用作全局条件。实践中,大多数VLA设置使用1。
训练期间的实际拼接顺序是:
obs_features = [main_feat, wrist_feat, x_pos, text_feat]
4、流匹配过程
这遵循标准的流匹配公式:学习一个速度场,将随机噪声转换为真实动作轨迹。
真实动作轨迹是(x_{traj}),形状大约为[B, 16, 7]。生成相同形状的高斯噪声样本(x_0)。
过程是:
- 采样噪声:x_0 = torch.randn(...)
- 使用
FM.sample_location_and_conditional_flow(x0, x_traj)采样时间(t)、中间状态(x_t)和目标速度(u_t) - 模型接收(x_t)、观察条件
obs_features和时间(t),并预测速度(v_t) - 损失是预测速度和目标速度之间的MSE:
mean((v_t - u_t)^2)
本质上,模型学习:
给定任务文本、机器人状态和双视图图像,当前带噪动作(x_t)应该朝哪个方向移动才能变成真实轨迹?
5、其他超参数
动作维度:7 预测范围:16 观察范围:1 动作范围:8 文本长度:64 文本池化:最后一个有效token LoRA:r=16, alpha=32, dropout=0 优化器:AdamW (lr=1e-4, weight_decay=1e-6) 学习率调度:带500步warmup的余弦 精度:bfloat16 流匹配:sigma=0.0,速度MSE损失
6、在LIBERO上的评估
由于评估涉及机器人 rollout,它是动态的。实现遵循openpi libero示例的官方脚本。
- 加载检查点(vision_encoder、noise_pred_net和LoRA权重(如果适用))
- 遍历所有LIBERO任务套件
- 对于每个任务:首先通过
_get_libero_env(...)创建环境 检索任务描述,使用task_suite.get_task_init_states(task_id)采样初始状态 每个任务评估最多n_test=50个episode
每个episode:
- 重置环境
- 等待稳定(
num_steps_wait=10) - 维护长度为
obs_horizon的obs_deque - 提取:
主图像:agentview_image 手腕图像:robot0_eye_in_hand_image 机器人状态:位置(3) + 轴角(3) + 夹持器(2) = 8维 图像旋转180°并转换为CHW格式
观察的编码方式与训练相同:
- 两个图像 → ResNet18
- 文本 → Qwen编码器
- 与机器人状态拼接 →
obs_features
7、通过流匹配推理
- 从噪声初始化轨迹:形状(1, 16, 7)
- 执行16个Euler步骤:
- 预测速度(v_t)
- 更新轨迹:
traj = traj + v_t / timehorizon
这逐渐将噪声转换为可执行的动作序列。
只执行前8步,然后重新规划。这允许持续修正,而非承诺完整轨迹。
rollout继续直到:
done=True,或- 达到最大步数
每个episode记录成功率,然后按任务和套件平均。
8、在LIBERO上的性能
训练后(没有重度调参),性能在约2000个epoch时饱和,达到约85%成功率。
这已经相当高,表明即使是没有预训练的简单流匹配模型也能有效拟合数据集。
然而,LIBERO的一个主要问题是训练和评估场景高度相似。即使有随机初始化,变化也有限。
9、在LIBERO-plus上的性能
较新的LIBERO-plus基准引入了更多变化:
- 光照变化
- 物体位置
- 初始状态
- 摄像头角度
- 文本指令
它还提供了更大的增强训练数据集。
在这个实验中,我直接评估了在LIBERO上训练的模型(2000 epoch的检查点)在LIBERO-plus上的表现,没有重新训练。
如预期的那样,成功率急剧下降到23.4%。
10、结论
结果表明社区应该超越原始LIBERO基准。至少,仅报告LIBERO指标是不够的,可能具有误导性。
原文链接: Is LIBERO Still a Reliable Benchmark? A Simple Flow-Matching VLA Test
汇智网翻译整理,转载请标明出处