第 3 章 数据、表示与分布偏移¶
训练数据决定策略能学到什么,算法只决定逼近到什么程度。机器人数据的组织方式与视觉数据集差别很大:它以回合为单位、带时间戳、状态与动作成对出现,而且采集过程本身要占用设备。数据的形状一旦定错,后面的算法再好也只是在错的分布上拟合。
数据的来源、组织与表示决定了策略的上限;而"训练分布"与"策略访问的分布"从来不是一回事。
1. 示范数据的三种来源¶
机器人数据按来源分三路,成本与偏差各不相同:
| 来源 | 采集成本 | 分布贴近度 | 主要偏差 |
|---|---|---|---|
| 遥操作(主从臂、手柄、VR、动捕) | 高:设备与专家时间一对一 | 高:就是真机的传感器与执行器 | 操作者习惯、动作抖动、标注延迟 |
| 脚本 / 仿真生成 | 低:可批量并行 | 取决于仿真保真度 | 接触与摩擦模型误差、视觉外观差异 |
| 人类视频 | 低:网上大量可得 | 低:视角与本体不同 | 缺动作标签、需重定向或逆动力学 |
遥操作数据质量最高,因为它天然落在目标硬件上:同样的相机、同样的延迟、同样的关节限位。代价是采集速度——一次演示要一位熟练操作者全程在场,失败样本还要重来。设备形态随平台与 SDK 变化,具体接入方式归 isaac-note 第 7 章「模仿学习与数据生成」。
脚本与仿真数据把成本换成算力:程序化地摆放物体、扰动初始状态、批量录制,覆盖度远高于人工。偏差集中在仿真与真机的差距上——接触刚度、摩擦系数、相机噪声与光照都不同,第 10 章「训练工程、评测与迁移」会给出迁移的判据。
人类视频的数据量最大,但没有关节指令与力信息,只能提供视觉与任务语义。要用它训练策略,得先解决"视频里的手到机器人末端"的映射(重定向),或者用它做表征预训练而非直接监督动作。
2. 回合与转移的组织¶
一份机器人数据集是两级结构:回合(episode) 记录一次完整尝试,转移(transition) 记录其中一步。元数据放在回合级,避免每帧重复:
from dataclasses import dataclass, field
@dataclass
class Transition:
t: float # 采样时刻(秒),用于跨传感器对齐
obs: dict # {"joint_pos": ..., "image": ..., ...}
action: list # 下发给控制器的指令(原始量,不归一化)
reward: float = 0.0 # 示范数据通常无回报,留字段便于混入 RL
done: bool = False
@dataclass
class Episode:
task: str # 任务或语言指令
success: bool # 结局判定,失败示范也要如实标
operator: str = "" # 采集者标识,用于分析操作者偏差
frames: list = field(default_factory=list) # list[Transition]
字段设计有三条实用约束。第一,action 存下发量而不是回读量:控制器可能对指令做限幅与滤波,回读量已经混入了执行器的行为,用它当标签会让策略学到一个不存在的映射。第二,观测与动作都要带时间戳,跨传感器对齐才有依据。第三,失败回合不删,用 success 标注——失败样本对判别式模型是负例,对策略则是"不该去的状态",用途不同(isaac-note 第 6 章「奖励与课程学习」讲终止条件的设计)。
对齐是个容易被低估的工程问题。相机 30 Hz、控制环 100 Hz 时,一帧图像对应三个控制步。常用做法是以控制周期为基准重采样,图像取时间戳最近的一帧并限制最大偏差(超过阈值就丢该步);插值只对连续量做,类别与离散动作不能插值。消息级同步工具见 ROS2-note 第 7 章「传感器驱动接入」。
3. 状态与动作的表示¶
状态分两类:本体感受(关节位置、速度、力矩、夹爪开合、末端位姿)与外部感知(图像、点云、力/力矩)。前者量纲各异但可靠,后者信息丰富但带噪声与延迟。两类的拼接顺序与归一化方式必须在训练与部署两侧完全一致。
动作空间的选择直接改变学习难度:
- 关节位置目标(绝对):策略输出每个关节的目标角,底层位置环跟踪。最常用,因为它与现有控制器接口一致;缺点是策略必须隐式学会标定与限位。
- 关节增量:输出相对当前位姿的小增量。对零点偏差更鲁棒,但连续积分会漂移,且必须限幅。
- 速度或力矩:更底层,需要策略自己承担稳定控制,样本需求显著上升。
- 末端位姿增量:任务空间直觉强,适合抓放;要靠逆解落到关节,接近奇异位形时增量会被放大(
robotics-note第 4 章「速度运动学与雅可比」)。 - 动作块:一次输出
K步动作,降低决策频率、缓解延迟(第 8 章「模仿学习与动作分块」)。
归一化按维度做,不按整体做。逐维 min-max 把每维压到 [-1, 1],均值方差标准化让每维尺度可比;两者都要保存统计量并随策略分发。动作归一化后若在部署时反归一化到越界值,必须限幅——限幅位置放在控制器之前,且训练时就应该模拟这个限幅。
坑:单位与四元数顺序
关节角用弧度还是度、四元数按 wxyz 还是 xyzw,是跨库交换数据时最高频的错误来源。欧拉角还有旋转顺序(xyz 与 zyx 不等价)。读入数据后先打印一个已知姿态的数值,比在训练后排查偏差便宜得多。约定见 control-note 第 7 章「姿态与坐标表达」。
4. 观测设计与延迟¶
机器人任务几乎总是部分可观测:单帧图像看不出运动方向,单帧关节角看不出速度,遮挡也会让关键物体消失。补齐手段有三种——历史帧堆叠(把最近 T 帧拼成 (T, obs_dim))、循环结构(把历史压进隐状态)、显式估计(用滤波或观测器给出速度与外部力,control-note 第 9 章「里程计与观测器」)。
观测设计要回答三个问题:看什么(哪些模态与任务成败相关)、看多快(频率是否覆盖最快的动态)、看多准(噪声与量化是否在可接受范围)。图像分辨率与频率是一对预算:提高分辨率能看清细节,但编码器计算量与显存同步上升,策略频率下降。
延迟是观测设计里最实际的一条。从传感器曝光到动作真正作用在机构上,中间有采集、传输、推理、总线四段延迟;训练时若按"零延迟"拼接观测与动作,策略会学到时间上错位的对应关系。缓解方式有三种:把历史动作一并放进观测、显式建模延迟并随机化、用动作块降低决策频率。迁移侧的延迟随机化归 isaac-note 第 9 章「Sim-to-Real 与 ROS 2 桥接」。
5. 分布偏移与误差累积¶
监督学习假设训练与测试同分布,策略学习不满足这条假设:数据由示范者采集,策略却按自己的动作走,访问到的状态分布不同。
形式地说,示范数据的分布是 \(p_{\text{demo}}(s)\),策略 \(\pi\) 的访问分布是 \(d^\pi(s)\);训练时最小化的是前者上的误差 \(\epsilon\),部署时承受的是后者上的误差。两者之间的差距就是协变量偏移(covariate shift)。
更麻烦的是它自我放大。行为克隆的误差上界随回合长度 \(T\) 以 \(O(T^2\epsilon)\) 增长(Ross、Gordon、Bagnell,2011):一步小偏差把状态推到示范没覆盖的区域,那里没有正确标签,偏差进一步变大。对比之下,若每步都能得到纠正信号,上界是 \(O(T\epsilon)\)——这一条差别正是第 8 章「模仿学习与动作分块」里 DAgger 的动机。
缓解手段按成本排序:
- 数据侧:多操作者、多初始状态、加入扰动与恢复示范;覆盖越宽,偏移后的"无人区"越小。
- 训练侧:对观测加噪声、对动作加平滑约束,让策略对偏差不敏感。
- 算法侧:让策略在偏离后获得纠正信号(交互式采集或在线微调),这是从监督学习跨到强化学习的那一步。
flowchart LR
demos["示范数据<br/>p_demo(s)"] --> bc["行为克隆"]
bc --> pol["策略 π"]
pol -->|"执行"| states["访问状态 d^π(s)"]
states -->|"偏离示范分布"| gap["无标签区域"]
gap -->|"误差放大"| pol
states -->|"补充纠正数据"| demos
6. 数据质量判据¶
数据规模不是唯一变量,质量判据更影响上限:
- 动作平滑度:相邻步的加速度与加加速度(jerk)若出现尖峰,通常是遥操作抖动或时间戳错位;尖峰会被策略原样学走。
- 重复与多样性:同一轨迹重复千次只增加样本量不增加覆盖;按初始状态与物体位姿统计覆盖更有意义。
- 成功与失败的比例:失败示范要保留并标注,混入训练时要明确用途(负例、恢复示范、还是纯监督目标)。
- 标签一致性:语言指令与任务实际内容是否对应;同一任务多种说法会让条件策略学到互相矛盾的映射。
- 留出集的设计:按任务或物体整组留出,才能测泛化;随机留帧测的只是插值能力。
判据:数据先于算法
在调超参之前,先回答"训练集覆盖了哪些初始状态、动作是否干净、留出集是否真没被污染"。这三问答不上来时,换算法不会改善结果。
数据管线的顺序固定下来,能避免大部分返工:
flowchart LR
raw["原始采集<br/>多传感器、带时间戳"] --> align["按控制周期对齐<br/>最近邻 + 偏差阈值"]
align --> seg["切回合<br/>成功判定、元数据"]
seg --> clean["清洗<br/>抖动、丢帧、重复"]
clean --> norm["归一化<br/>统计量仅来自训练集"]
norm --> split["按回合分组划分"]
split --> train["训练 / 回放池"]
7. 要点¶
- 示范数据三路来源:遥操作贴近但昂贵、仿真可批量但有保真度差距、人类视频量大但缺动作标签。
- 数据集是回合与转移两级结构;动作存下发量,观测与动作都带时间戳,失败回合保留并标注。
- 跨传感器对齐以控制周期为基准,图像取最近帧并设偏差阈值;离散量不插值。
- 动作空间从绝对关节目标到力矩各有难度与鲁棒性代价;归一化逐维做,统计量随策略保存,反归一化后限幅。
- 观测设计回答看什么、看多快、看多准;延迟要显式处理,不能按零延迟拼接。
- 协变量偏移使行为克隆误差随回合长度以 \(O(T^2\epsilon)\) 放大;缓解从数据覆盖、训练扰动到交互式纠正逐级加成本。
- 质量判据是动作平滑度、覆盖多样性、失败样本标注与留出集设计;数据决定上限,算法只决定逼近程度。
参考文献与延伸阅读¶
- Argall, B. D., Chernova, S., Veloso, M., & Browning, B. A Survey of Robot Learning from Demonstration. Robotics and Autonomous Systems, 2009. DOI
- Levine, S., Kumar, A., Tucker, G., & Fu, J. Offline Reinforcement Learning: Tutorial, Review, and Perspectives on Open Problems. arXiv:2005.01643, 2020. arXiv
- LeRobot. 数据集格式与策略实现. 仓库
- ROS 2. message_filters 文档. 文档