先记住一句话
Episode 是一次有边界的交互轨迹;每一步必须把“何时观察到什么、何时发出什么命令、命令作用多久”写清楚,训练窗口只是从中切出的一个条件—目标片段。
1. 最小形式
episode = {
task / language,
metadata: robot, scene, cameras, success, ...,
steps[t]: {
timestamp,
observation.images[view],
observation.state,
action,
reward / done / validity
}
}
数学上可写成轨迹 $\tau=(g,o_0,a_0,o_1,a_1,\ldots,o_T)$。关键语义是:$a_t$ 通常由 $o_t$ 决策,并在之后的时间区间作用,导致 $o_{t+1}$。如果记录器把动作和执行后的图像放在同一索引,模型就会学到偷看结果的错位监督。
2. Observation、state 与 action 不要混叫
| 字段 | 例子 | 问题 |
|---|---|---|
| 外感观测 | 第三视角、腕部 RGB、深度、触觉 | 世界现在看起来怎样? |
| 本体状态 | 关节角/速度、EEF pose、夹爪、力矩 | 机器人身体现在怎样? |
| 动作 | 目标关节、EEF delta、速度、夹爪命令 | 控制器接下来要执行什么? |
| 任务条件 | 语言、目标图、task ID | 应该达到什么结果? |
同一个数值有时既出现在 state 又出现在 action,例如当前关节角与下一时刻目标关节角;字段名相似不代表语义相同。
3. 一条轨迹怎样变成训练样本
历史观测索引: t-2, t-1, t
动作目标索引: t, t+1, ... t+H-1
未来视频索引: t+k1, t+k2, ...
sample = condition(history, task, state_t) → target(action_chunk, future)
delta_indices 或 delta_timestamps 定义的不是文件位置技巧,而是模型能看多远、要预测多远。负 offset 是历史,零是当前,正 offset 是未来。跨越 episode 末尾时必须 padding 并提供 mask,不能悄悄读入下一条轨迹。
4. 三种频率要分开
- 传感器频率:相机可能 30 Hz,关节状态可能 100–1000 Hz。
- 记录/训练频率:常重采样到 5–30 Hz。
- 控制执行频率:高层 policy 可能 5–20 Hz,底层 controller 更高。
“40 步 action horizon”没有时间含义,除非同时知道采样周期。例如 8 Hz 时是约 5 秒,20 Hz 时只有 2 秒。
5. Episode metadata 决定能否做科学实验
至少保留 robot/embodiment、任务、场景、对象实例、采集者、时间、软件版本、标定版本、成功/失败、终止原因和 train/eval split 单元。否则你很难回答性能提升来自新对象泛化,还是同一场景泄漏。
6. 四个必须手算的 dataset 数字
例 1:episode 长度
一条轨迹从 12.0 s 到 27.5 s,以 10 Hz 重采样,持续 15.5 s,若两端都取样则约有 $15.5×10+1=156$ 个 steps。
例 2:切窗样本数
Episode 有 100 steps,history 需当前及过去 3 步,action horizon 8 步,不 padding。合法当前索引从 3 到 92,共 $92-3+1=90$ 个训练窗口。
例 3:频率换算
相机 30 Hz、policy 10 Hz:每个 policy tick 间隔约 3 帧。40-step action horizon 在 10 Hz 是 4 秒;同样 40 steps 在 20 Hz 只有 2 秒。
例 4:padding mask
在剩余 3 steps 的 episode 末尾请求 8-step chunk,真实 mask 是 [1,1,1,0,0,0,0,0]。若逐步 loss 总和为 6,只能除以 3 个有效 step 得 2;除以 8 会错误稀释成 0.75。
图像、state 和 action 形状都对,loss 也下降,但时间戳错位 100–300 ms。模型学到的是操作者延迟或未来泄漏,闭环时才暴露。
自测
1. 为什么不能随机按帧切 train/test?
相邻帧高度相关,同一 episode、场景和对象会泄漏到两边,使泛化指标虚高。
2. action horizon 的物理意义由什么决定?
步数与动作采样周期共同决定持续时间。
3. episode 末尾 padding 为什么需要 mask?
否则伪造的零动作/重复帧会进入 loss,模型会把填充值当作真实行为。
原始资料
DROID 展示多相机、状态、动作和语言的 episode;LeRobotDataset v3 给出 episode-aware 的多模态时序存储方案。