Skip to content

Human-gated DAgger 纠错数据

Human-gated DAgger(Dataset Aggregation)是一种让策略先自主执行、只在需要时请求人类示范的后训练数据流程。它的重点不是把所有人工操作都收集成示范,而是把“策略在什么状态下开始不可靠、人工怎样恢复、恢复后是否真的完成任务”记录成可回放的纠错样本。

本文把一次纠错看作原始 episode 的一个有边界片段:策略 rollout 是输入,人工接管和验证结果是新增标签,经过质量检查后才进入下一轮 post-training。Episode 与 Trajectory 的边界语义可参考 Episode 与 Trajectory 数据设计,VLA 的动作和评测契约可参考 VLA 模型与主流验证方法。

Human-gated DAgger 从策略执行、低置信度触发人工纠正,到验证和新策略的闭环

给定任务指令、初始场景和机器人状态,策略读取连续观测并输出动作。记录器不能只保存最终成功或失败,还要保存每个 step 的观测、原策略动作、策略版本、置信度(如果模型提供)和动作实际生效的时间。

输入至少包括:

  • 任务条件:task_id、语言指令、任务版本、成功条件和允许的终止条件。
  • 环境与设备:场景 / 物体标识、机器人配置、相机和本体感觉流、控制器版本。
  • 策略输出:policy_version、候选动作或 action chunk、置信度、推理时间、控制频率和延迟。
  • 运行上下文:episode_id、统一时间戳、设备时钟映射、当前 split 和安全监控事件。

这里的 rollout 既可以是真实机器人闭环,也可以是 MuJoCo、Isaac Lab 等环境中的回放或仿真闭环。仿真中的失败标签可以帮助筛选难例,但不能直接替代真实执行中的延迟、遮挡、接触和操作者行为。

门控(gate)在策略出现失败风险时请求人类介入,例如:

  • 置信度低于任务或场景对应的阈值;
  • 目标跟踪丢失、进度长期不变、动作偏离可行域;
  • 即将碰撞、物体掉落或违反任务约束;
  • 策略已经失败,需要进入恢复动作。

门控事件必须记录触发原因、触发时刻、预警时刻和人类真正接管时刻。如果系统有安全监控或急停,仍应把它作为独立事件保存;急停发生后未必存在可训练的人工纠正片段。

人工接管不是一条脱离上下文的新演示。接管片段要通过 parent_episode_id、parent_step_id、handover_start 和 handover_end 绑定到原策略 rollout,并保留接管前后的观测窗口。这样训练器才能知道:人工动作是在策略已经偏离之后产生的修正,还是本来就属于正常示范。

时间对齐时,优先使用机器人或仿真器的单调设备时钟,而不是视频到达时间或界面事件时间。至少区分以下时间:

  • t_obs:观测采样或曝光结束时间;
  • t_policy:策略读取观测并生成动作的时间;
  • t_action_apply:控制器实际应用动作的时间;
  • t_gate / t_handover:门控触发和人工控制生效时间。

保存时应说明动作对应当前观测还是未来观测,记录推理、传输和执行延迟,并用 alignment_error_ms、插值 / 重采样标记和丢帧区间做质量审计。不能用接管发生的墙上时钟覆盖原始设备时间轴。

在 [handover_start, handover_end) 内,训练标签通常使用人工实际生效的动作;区间外仍保留原策略动作作为失败上下文,但默认不作为模仿学习监督。除非经过独立人工审核、可执行性验证和明确的专家标签认证,接管区间外的策略动作应标为 context_only 或 excluded。这样,已通过任务验收的 policy rollout 也不会被数据集消费者误读为专家目标。

建议以 action_source 或 label_mask 显式区分:

action_source[t] = policy | human | safety_controller | unknown
label_mask[t] = trainable | context_only | excluded

原始策略动作必须不可变地保留,人工动作作为版本化派生标签写入。若控制层对人工输入做了限幅、滤波或坐标转换,同时保存 human_command 与 applied_action,否则无法判断恢复效果来自操作者还是控制器。

回填后的样本应包含接管前的失败上下文、接管中的纠正动作、接管后的恢复结果和 episode 终止原因。成功恢复不等于整条 episode 的每个 step 都适合训练:传感器丢失、动作延迟过大或人工输入不完整的区间应单独标记。

纠错轨迹把策略版本、观测、原动作、人类动作、接管原因、时间边界、回放状态和质量标记绑定为契约

一个可回放的纠错记录至少应能回答“谁在何时、基于什么观测、用什么动作改变了什么结果”:

层级 建议字段 数据用途
身份与版本 episode_id、parent_episode_id、parent_step_id、policy_version、schema_version 将纠错片段绑定到原 episode 和触发前的父 step,区分策略轮次
观测与策略时序 RGB / 深度、本体状态、语言指令、t_obs、t_policy t_obs 是观测采样 / 曝光结束时间,t_policy 是策略读取该观测并生成动作的时间
动作 policy_action、human_command、applied_action、action_source 对比错误动作与纠正动作
动作执行时序 t_action_apply、t_handover t_action_apply 是控制器实际应用动作的时间;t_handover 是人工控制真正生效的时间,不能用界面点击时间替代
原因与边界 gate_reason、t_gate、failure_type、handover_start/end、end_reason t_gate 标记门控触发;结合父 step 和接管边界切出有效纠错窗口
回放状态 replay_status、控制器 / 环境版本、初始状态 检查纠正是否可复现
质量与授权 对齐误差、丢帧、碰撞风险、quality_flags、训练授权 决定是否准入及如何使用

replay_status 应区分“可在原环境重放”“只能查看原始视频”“重放结果不一致”和“未验证”。人工动作成功一次,也不能推断在不同初始状态或不同控制频率下必然安全。

每轮 post-training 都应把新收集的纠错数据作为带版本的增量加入聚合数据,而不是覆盖上一轮标签。可保留如下血缘:

policy_vN rollout
→ gate events + failure windows
→ human correction labels
→ QC / replay verification
→ aggregated dataset_vN+1
→ post-training
→ policy_vN+1

DAgger 的价值在于补足策略访问到的状态分布:策略会把自己带到示范数据没有覆盖的偏离状态,人类纠正提供从这些状态恢复的动作。这样可以缓解共变量偏移(covariate shift),但只有当失败原因、状态上下文和修正窗口被保留时,数据才真正包含“如何恢复”的信息。

聚合器应先按 action_source=human、label_mask=trainable、接管区间完整、质量检查通过和 replay_training_authorized 筛选纠正动作,再按任务、失败类型和操作者做去重、配额或分层采样。[handover_start, handover_end) 之外的 policy_action 即使所在 rollout 最终成功,也必须保持 context_only / excluded,永远不能合并为模仿学习目标,除非另有独立的专家性认证记录。

聚合时要控制几个风险:

  • 同一个 episode 的相邻窗口不能跨越接管边界或混淆 action_source;
  • 高频重复采样同一失败模式会放大单一场景、操作者或门控阈值的偏差;
  • 人工动作与策略动作的表示、坐标系、控制频率和延迟必须一致,或明确提供转换版本;
  • 失败片段可以用于恢复训练、负例建模或偏好比较,但不应无标记地混入成功示范。

建议在 episode 级和接管片段级分别验收:

  1. 完整性:接管前后观测、策略动作、人类动作和结果都存在,ID 与时间戳单调且唯一。
  2. 对齐:检查观测—动作延迟、跨设备时钟偏差、插值比例、丢帧和控制器队列;异常区间标为 excluded,不要静默修正。
  3. 动作可执行性:验证单位、坐标系、关节限制、速度 / 加速度、夹爪方向、碰撞和急停事件。
  4. 标签一致性:人工接管边界与 UI、控制器和视频证据相符;action_source 不得把人工动作标成策略自主动作。
  5. 恢复结果:独立记录恢复成功、部分恢复、再次失败、超时和安全停止,任务结果与数据质量不能合并成一个布尔值。
  6. 审核与授权:记录操作者化名、审核状态、隐私处理和 replay_training_authorized;未授权样本只能留在受控评测或审计集合。

质量分数用于筛选和分层,不应把“动作像专家”自动等同于“任务成功”。对低质量但能解释失败的片段,可以保留为 context_only 或失败分析数据,避免为了提高通过率而丢失重要失败模式。

训练集可以使用通过准入的人工接管片段和验证过的纠正动作,但必须带来源和标签掩码。接管区间外的 policy_action 默认只能作为 context_only / excluded 的失败上下文,除非它有独立的专家性审核与可执行性验证;即使该 rollout 最终成功,也不能把它解释为专家目标。后训练报告至少拆分:可用于模仿监督的人工动作比例、仅作上下文的策略动作比例、按失败类型的纠正数量、恢复成功率和各轮新增数据的贡献。数据集消费者不应假设所有 action 都来自同一策略或同一控制器。

holdout 必须按任务、场景 / 物体、操作者和时间段隔离;同一原始 episode 的接管前后窗口不能分到不同 split。若评估“未见操作者”或“未见失败模式”,对应操作者和失败模式也必须从训练聚合中排除。门控阈值、策略版本和人工可用性都要固定并记录,否则轮次之间不可比较。

评估至少分为:离线动作预测、纠正片段回放、仿真闭环、真实闭环和长程任务。除了总体成功率,还应报告首次失败位置、恢复成功率、人工接管率、急停 / 碰撞风险、任务时长、按场景和操作者的分桶结果。长程任务尤其要观察错误是否在多个子任务之间累积,不能只用单步动作误差替代端到端结果。

Human-gated DAgger 的人工接管是数据采集和恢复机制,不是唯一安全机制。低层速度、力矩、关节和碰撞约束,独立的安全监控器,硬件急停,以及受训操作者的操作规程都应分别存在、分别记录。门控漏报、网络延迟或人工反应不及时都可能发生;“有人工在旁边”不能作为安全证明。

同样,纠错数据也不自动等于通用示范数据:它集中在策略已经遇到的状态分布,可能带有某个版本策略的偏差、某个操作者的恢复习惯和特定硬件的控制延迟。发布数据集时应明确它适合后训练、失败恢复和鲁棒性分析的范围,不要把纠错片段直接宣传为覆盖完整任务分布的预训练数据。

  • 能否从一个人工动作回溯到原策略观测、策略版本、父 episode 和原始文件?
  • 能否按设备时钟重建门控、接管和动作生效顺序,并量化对齐误差?
  • 能否区分策略动作、人类命令、控制器实际动作和安全控制器动作?
  • holdout 是否同时隔离任务 / 场景、操作者、时间段和父 episode?
  • 是否分别报告任务成功、恢复成功、人工接管、急停和数据质量?
  • 是否明确哪些样本可训练、仅可回放、仅可评测或仅可审计?

Human-gated DAgger 的核心产物不是一段“人类接管视频”,而是带有失败上下文、时间边界、动作来源、回放状态和质量结论的可追溯纠错轨迹;只有经过 split 隔离和安全边界说明,它才适合进入下一轮后训练。