3. 域与域偏移
在机器人学习中,我们很少能在一个“完美世界”里训练并部署模型。训练数据来自某个环境、某台机器人、某组传感器配置,而部署时面对的是另一个环境、另一台机器人、另一组传感器配置。这种训练与部署之间的分布差异,就是域偏移(Domain Shift)问题的根源。理解域的定义与偏移类型,是域随机化与域适应工程的第一块基石。
一、什么是“域”:从数据生成过程理解
在机器学习中,域(Domain)通常被定义为一个联合概率分布 \(P(X, Y)\),其中 \(X\) 是输入特征空间,\(Y\) 是标签或输出空间。一个域由三要素共同决定:
- 输入分布 \(P(X)\):机器人看到的观测数据长什么样,例如相机图像、激光雷达点云、关节角度序列。
- 标签分布 \(P(Y)\):任务输出的统计特性,例如抓取成功/失败的比例、目标类别出现的频率。
- 条件分布 \(P(Y|X)\):给定观测后输出的规律,也就是“看到什么就该做什么”的映射关系。
在机器人任务中,一个“域”可以具体到:某款机械臂 + 某型号相机 + 某光照条件 + 某类物体集合 + 某操作任务。改变其中任何一个因素,都可能产生一个新的域。
核心公式:域 = \(P(X, Y)\) = \(P(X) \cdot P(Y|X)\)。域偏移就是训练域与部署域之间这个联合分布的差异。
二、源域与目标域:训练与部署的两端
在域适应文献中,我们通常区分两个域:
- 源域(Source Domain):有充足标注数据、用于训练模型的域。例如在仿真环境中采集的十万条抓取轨迹。
- 目标域(Target Domain):模型实际部署、但标注稀缺或没有标注的域。例如真实机器人上只有少量人工示教数据。
域适应的目标,就是利用源域的知识,在目标域上取得良好性能。根据目标域是否有标签,可分为无监督域适应、半监督域适应和少样本域适应。机器人领域常见的是“仿真到现实”(Sim-to-Real),即源域为仿真器,目标域为真实物理世界。
三、三类典型域偏移
域偏移并非单一现象,根据联合分布中哪一部分发生变化,可分为三种经典类型。下面的 SVG 图展示了三者的结构差异与机器人中的典型表现。
四、三类偏移的对比与机器人场景映射
下表从数学条件、机器人典型场景和应对策略三个维度对三类偏移进行对比。
| 偏移类型 | 数学条件 | 机器人典型场景 | 主要应对策略 |
|---|---|---|---|
| 协变量偏移 | \(P_S(X) \neq P_T(X)\),\(P(Y|X)\) 相同 | 仿真到真实的视觉差异、不同相机型号、光照变化 | 域随机化、图像风格迁移、特征对齐 |
| 标签偏移 | \(P_S(Y) \neq P_T(Y)\),\(P(X|Y)\) 相同 | 训练集抓取成功率分布与部署场景不同、类别不平衡 | 重加权、重采样、先验校正 |
| 概念偏移 | \(P_S(Y|X) \neq P_T(Y|X)\) | 刚性物体到可变形物体、同一指令在不同机器人上的动作语义变化 | 在线适应、元学习、持续学习 |
五、案例:抓取任务中的域偏移诊断
假设我们训练了一个基于视觉的抓取策略,在仿真中成功率 92%,部署到真实机器人后骤降到 48%。如何判断属于哪类偏移?可以按以下流程排查:
- 检查输入分布:对比仿真图像与真实图像的像素统计、边缘分布、颜色直方图。若差异显著,说明存在协变量偏移。
- 检查标签分布:统计真实场景中成功/失败比例、物体类别频率。若与训练集差异大,说明存在标签偏移。
- 检查条件映射:固定同一观测输入,比较模型输出与真实最优动作。若映射关系本身改变,说明存在概念偏移。
实用技巧:在机器人日志中记录每次推理的输入特征均值、方差和输出置信度。当目标域置信度分布整体偏移时,往往是协变量偏移的早期信号。
六、常见误区与复盘
- 误区一:把所有域偏移都当成协变量偏移。 很多团队只做图像增强,却忽略了标签分布和条件映射的变化,导致模型在真实场景中仍然失效。
- 误区二:认为域随机化可以解决一切。 域随机化主要针对协变量偏移,对概念偏移效果有限。若任务语义改变,必须引入在线适应或重新标注。
- 误区三:忽视目标域的标签分布。 在抓取任务中,如果真实场景失败样本极少,模型可能永远学不会恢复策略。需要主动采集稀有失败案例。
- 复盘要点: 建立“域偏移诊断清单”,在每次部署前分别评估 \(P(X)\)、\(P(Y)\) 和 \(P(Y|X)\) 的差异,而不是只看整体准确率。
# 域偏移诊断伪代码
def diagnose_domain_shift(source_data, target_data, model):
# 1. 协变量偏移:比较输入分布
cov_shift = compare_distributions(source_data.X, target_data.X)
# 2. 标签偏移:比较标签先验
label_shift = compare_priors(source_data.Y, target_data.Y)
# 3. 概念偏移:比较条件映射
concept_shift = compare_conditional(model, source_data, target_data)
return cov_shift, label_shift, concept_shift
理解域与域偏移,是后续设计域随机化策略和域适应算法的前提。只有先判断清楚“偏移发生在哪里”,才能选择正确的工程手段,避免盲目增加数据或算力。