看到世界模型能预测未来画面,就默认它对所有任务都合适,是评估标准选错的最常见起点。悟界·RoboBrain Orca 这类模型在推理时通常会同时给出隐表征和重建观测两类输出,但“画面像不像”和“表征能不能支撑下游决策”是两件事。做法是先写下下游任务需要的输出形式,再决定评估走哪条路;如果下游是分类、检索、位姿回归,评估就该落在表征上,像素指标只作为辅助观察。
判断依据是下游任务要的输出,而不是模型演示里最好看的那一段画面。如果下游头吃的是隐向量或 token 序列,就先做表征侧评估(相似度、下游探针);如果需要的是画面回放或仿真观测,才用重建侧指标(MSE、SSIM 等)。两条路可以用同一批输入跑,但评分不能互相替换。边界:模型是否真的学到可迁移表征,必须由下游探针或任务指标回答,不能由重建分数推断。
先写下自己的下游任务到底要什么输出
这一步不写代码,只写清楚任务本身。先把输入输出形式、可接受的误差形式、评价依据三件事落到纸面,后面的评估才有取舍标准。
- 任务输入输出示例:例如输入是连续 T 帧观测加本体状态,输出是未来若干步的抓取位姿序列;或者输入是单帧观测,输出是未来一帧的观测画面。
- 可接受的误差形式:位姿回归可以接受平移误差在某个量级内、姿态角度在若干度内;检索类任务只要求近邻排序正确;画面生成类任务关注结构是否错位、运动是否连贯。
- 评价依据:用哪一组指标判定“这次实验比上次好”,以及谁来判定——是标注好的下游标签,还是人眼抽查的少量样本。
把这三项写成一个任务定义文件,后续评估脚本只读这个文件,避免中途换标准。
task: future_pose_regression
input:
observation: [T, H, W, 3]
proprio: [T, P]
output:
future_pose: [K, 7]
metric:
primary: ade_fde # 只作用于位姿序列
secondary: visual_probe # 表征侧探针,用于解释主指标变化
accept:
- 与同配置基线在同一份验证集上比较
- 不接受用重建分数替代 ade_fde 作为主判据
把模型输出分成表征向量和重建画面两类分别观察
不要只看推理脚本打印的最后一个张量。先把一次前向的所有输出字段列出来,标注每个字段的名字、形状、是否含时间维度、以及打算怎么落盘。很多模型会把中间层表征和最终解码画面一起返回,字段命名相近,混起来很容易把画面张量当成特征去做相似度。
import numpy as np
out = model.forward(batch) # 以本地封装为准,字段名按实际替换
for k, v in out.items():
arr = np.asarray(v)
print(k, arr.shape, arr.dtype)
# 期望看到类似:
# z_future (T, N, D) float32 -> 表征
# z_global (N, D) float32 -> 表征
# rgb_future (T, H, W, 3) uint8 -> 重建画面
# depth_future (T, H, W) float32 -> 重建画面
保存方式要固定:表征存为 npy 或 parquet(保留浮点精度即可),画面存为 png 或按批次打包的 npz。时间维度的处理要写清楚——是逐帧比较,还是把 T 帧整体当作一个样本,两者算出来的数值不可比。
为两类输出各选一个可验证的评估方式
两类输出用两套互不替代的指标。下面是一份选择清单,按下游任务挑一列执行即可。
| 维度 | 表征学习路线 | 像素重建路线 |
|---|---|---|
| 目标 | 隐空间对下游任务有区分度 | 还原未来观测的画面细节 |
| 典型任务 | 状态分类、位姿回归、检索、少样本迁移 | 视觉回放、仿真观测生成、运动演示 |
| 输出 | 向量或 token 序列 | 图像或视频帧 |
| 通用评估 | 余弦相似度、最近邻命中、线性探针(冻结主干只训一层) | MSE / MAE、SSIM、可选的感知类指标 |
| 常见误用 | 用重建分数证明表征质量 | 用特征相似度证明画面质量 |
- 表征侧:先固定主干参数,只在冻结特征上训练一个线性分类或回归头,报告其在固定验证集上的任务指标;对照可以再加一个随机初始化主干的同结构探针,用来确认增益来自模型而不是探针容量。
- 重建侧:逐帧或逐片段计算像素差异与结构相似度,长序列再单独看末段的漂移情况。数值只和同一评估脚本、同一分辨率下的基线比,跨脚本比较没有意义。
用同一批输入跑两条评估,比较结论是否冲突
选一批固定输入(可以从验证集里抽样,也可用固定随机种子生成),让两条评估读同一份输入清单,只换评估器,不换数据。把结果记在一张对照表里:输入片段 ID、表征侧得分、重建侧得分、下游探针是否达标、备注。
冲突一般有三种形态:表征探针达标但画面模糊,说明隐空间抓到了任务相关结构,此时以下游任务为准,画面指标只做辅助;画面清晰但探针不达标,常见于模型把容量花在纹理细节上,此时不要把重建分数当作任务能力,需要回到第 1 步确认下游到底要不要画面;两边都不达标,优先查输入清单、时间维度对齐和预处理是否一致,再判断模型。
最终取舍要写一句理由,落到记录里,例如“下游是位姿回归,主判据取探针指标,重建指标仅用于回归视觉合理性”。理由写不出来的,说明还没想清楚任务要什么。
在配置里固定所选评估方式,再复跑一次确认结果一致
把输入清单、输出字段、指标、种子写进配置文件,评估脚本只从配置读参数,不在命令行临时覆盖关键项,这样后续换权重、换数据才有可比性。
# configs/eval_orca.yaml
eval:
input_manifest: ./manifests/val_subset.jsonl
outputs:
- field: z_future
kind: embedding
save: npy
- field: rgb_future
kind: image
save: png
metrics:
representation:
- cosine_similarity
- linear_probe
reconstruction:
- mse
- ssim
time_axis: per_frame
seed: 0
save_dir: ./eval_runs/orca_base
python eval_world_model.py \
`--config` configs/eval_orca.yaml \
`--ckpt` runs/orca/checkpoint.pt \
`--split` val
复跑时检查三点:输出目录里的字段名与配置文件一致;两次运行使用相同种子时,逐样本指标应基本一致,出现明显漂移先查数据加载顺序和随机性来源;换权重后只对比同一配置文件下的结果,跨配置比较要先确认输入清单和分辨率没变。这三点通过,后面调模型才有可比较的基准。