4. DAgger算法原理

DAgger(Dataset Aggregation,数据集聚合)是模仿学习从“一次性监督”走向“交互式纠偏”的关键算法。普通行为克隆只在专家轨迹上训练,一旦策略在自身访问到的状态上出现微小偏差,就会进入专家数据从未覆盖的区域,误差随步数累积,形成所谓的复合误差。DAgger 的核心思想是:让当前策略去驾驶、去犯错,再由专家在这些“策略自己走出来的状态”上给出正确动作,并把新样本不断并入训练集,从而把学习分布逐步拉回到专家可纠正的范围。

DAgger 的一句话本质:不是只学专家走过的路,而是让策略自己开路,再请专家在策略到达的每个状态上标注“应该怎么打方向”。

4.1 数据集聚合:从固定数据集到滚动聚合

设专家策略为 π*,当前学习策略为 πi。标准行为克隆的损失是:

L_BC(θ) = E_{s~d_{π*}} [ ℓ(π_θ(s), π*(s)) ]

其中 dπ* 表示专家轨迹的状态分布。问题在于,部署时策略访问的是 dπi,而不是 dπ*。DAgger 把目标改为在混合分布上最小化:

L_DAgger(θ) = E_{s~d_{π_i}} [ ℓ(π_θ(s), π*(s)) ]

数据集聚合的具体做法是:第 i 轮用当前策略 πi 在仿真或真实环境中采集轨迹,得到状态序列 {s1, s2, …, sT};然后把这些状态逐一交给专家,由专家输出动作标签 a*t = π*(st);最后把 (st, a*t) 追加到总数据集 D 中。下一轮训练时,D 中既有早期专家演示,也有策略自己探索后被纠正的样本。随着轮次增加,D 的覆盖范围从“专家常走的状态”扩展到“策略容易走偏的状态”,这正是“聚合”的含义。

4.2 专家纠正:交互式标注与在线纠偏

专家纠正不是简单地把专家轨迹再录一遍,而是针对策略当前犯错的场景进行“对症下药”。在自动驾驶中,这通常表现为:策略在弯道出口转向不足、在跟车时制动过晚、在并线时犹豫不决,专家就在这些具体状态点上给出方向盘转角、油门或制动量。这样得到的标签具有更强的针对性,能直接修正策略的薄弱环节。

专家纠正有两种常见形式:

  • 在线纠正:策略驾驶,专家实时接管或通过安全员修正,记录修正动作。
  • 离线标注:先保存策略行驶的状态序列,再由专家离线逐帧标注正确动作,适合仿真和大规模回放。

无论哪种形式,关键都是让训练分布与部署分布一致。若专家只在策略偏离后接管,那么接管点附近的状态会被重点采样,策略会逐渐学会“如何从错误中恢复”,而不是只会走完美轨迹。

4.3 策略迭代:训练—采集—标注—再训练

DAgger 是一个迭代闭环。每一轮包含四个步骤:

  1. 训练:用当前聚合数据集 D 训练策略 πi。
  2. 采集:让 πi 在环境中运行,记录访问到的状态。
  3. 标注:专家对采集到的状态给出动作标签。
  4. 聚合:将新样本并入 D,得到 D ← D ∪ Di,进入下一轮。

随着迭代推进,策略访问的状态分布会越来越接近专家分布,复合误差上界也随之收紧。实际工程中,通常设置最大迭代轮数、每轮采集步数、专家标注预算和验证集性能阈值作为停止条件。

DAgger 策略迭代闭环:训练 → 采集 → 专家纠正 → 数据集聚合 ① 策略训练 用聚合数据集 D 训练 π_i ② 策略采集 π_i 驾驶,记录状态 s_t ③ 专家纠正 专家标注 a*_t = π*(s_t) ④ 数据集聚合 D ← D ∪ {(s_t, a*_t)} ⑤ 损失评估 L = E[ℓ(π_θ(s), π*(s))] ⑥ 收敛判断 验证误差 ≤ 阈值? 未收敛:继续迭代 关键点:训练分布 d_πi 逐步逼近专家分布 d_π*,复合误差上界随迭代轮数收紧 停止条件:最大轮数 / 标注预算耗尽 / 验证集损失不再下降

4.4 损失函数:动作回归与分布匹配

DAgger 的损失函数通常沿用行为克隆的监督形式,但样本分布不同。连续控制中常用均方误差:

L_MSE(θ) = (1/N) Σ_t || π_θ(s_t) - a*_t ||²

若动作是离散的(如左转、直行、右转),则用交叉熵:

L_CE(θ) = -(1/N) Σ_t Σ_c y_{t,c} log π_θ(c | s_t)

在自动驾驶中,动作常包含转向角、油门、制动等多个维度,可对每个维度加权:

L = w_steer · MSE(δ, δ*) + w_throttle · MSE(a, a*) + w_brake · MSE(b, b*)

权重设置反映安全优先级:制动和转向通常比油门权重更高。若只优化平均误差,策略可能在直道上表现很好,却在弯道和紧急场景中失效,因此还需要在损失中加入困难样本加权或安全惩罚项。

4.5 收敛性分析:复合误差为什么能被控制

行为克隆的复合误差上界通常为 O(T²ε),其中 T 是时间步,ε 是单步模仿误差。原因是:单步小误差会让策略进入新状态,新状态又产生新误差,误差随步数平方级累积。DAgger 通过让专家在策略访问的状态上提供标签,使训练分布与测试分布逐渐一致,理论上可将上界改善为 O(Tε) 量级。

直观理解:如果策略只在专家轨迹附近学习,它不知道偏离后怎么办;而 DAgger 反复把“偏离后的状态”加入训练集,策略就学会了恢复。随着迭代轮数增加,策略访问的状态分布 dπi 与专家分布 dπ* 的差距缩小,单步误差不再被分布偏移放大,收敛性因此得到保证。

实际收敛判断不能只看训练损失。应同时观察验证集损失、闭环仿真成功率、接管次数和关键场景通过率。训练损失下降但闭环表现变差,往往说明数据聚合不足或专家标注噪声过大。

4.6 案例与误区复盘

以城市道路跟车为例:初始策略在专家数据上训练后,直行跟车尚可,但前车突然减速时制动偏晚。DAgger 第一轮让策略驾驶,记录下“制动偏晚”的状态,专家标注更早的制动量;第二轮训练后,策略在类似场景中制动提前。第三轮继续采集策略自己产生的“制动后跟车距离过近”状态,专家再修正。经过 3~5 轮,策略在跟车场景中的平均制动延迟明显下降。

常见误区 表现 修正方法
只聚合不纠正 数据集变大,但标签仍是旧策略动作 确保新样本由专家重新标注
专家标注噪声大 损失震荡,闭环表现不稳定 多专家交叉校验,过滤异常标签
采集分布过窄 只在少数场景迭代,泛化差 增加场景多样性,覆盖弯道、并线、紧急制动
忽略安全约束 策略学会危险动作 加入安全惩罚项与动作边界裁剪
停止条件单一 训练损失很低但闭环失败 结合闭环成功率与接管率综合判断
DAgger 的专家纠正成本较高,尤其在线接管需要安全员实时参与。工程上常用“仿真预训练 + 真实少量纠正”的混合方案:先在仿真中完成多轮聚合,再把真实道路中策略暴露出的困难状态回传标注,以较低成本获得关键纠偏样本。

总结来看,DAgger 通过数据集聚合把策略自己访问到的状态纳入训练,通过专家纠正提供高质量动作标签,通过策略迭代不断缩小训练分布与部署分布的差距,并在损失函数和收敛性分析上给出了可解释的改进路径。它并不是一个“更复杂的模仿学习技巧”,而是对行为克隆分布偏移问题的直接回应:让策略在犯错的地方学习,而不是只在专家完美的地方学习。