4. DAgger算法原理
DAgger(Dataset Aggregation,数据集聚合)是模仿学习从“一次性监督”走向“交互式纠偏”的关键算法。普通行为克隆只在专家轨迹上训练,一旦策略在自身访问到的状态上出现微小偏差,就会进入专家数据从未覆盖的区域,误差随步数累积,形成所谓的复合误差。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 是一个迭代闭环。每一轮包含四个步骤:
- 训练:用当前聚合数据集 D 训练策略 πi。
- 采集:让 πi 在环境中运行,记录访问到的状态。
- 标注:专家对采集到的状态给出动作标签。
- 聚合:将新样本并入 D,得到 D ← D ∪ Di,进入下一轮。
随着迭代推进,策略访问的状态分布会越来越接近专家分布,复合误差上界也随之收紧。实际工程中,通常设置最大迭代轮数、每轮采集步数、专家标注预算和验证集性能阈值作为停止条件。
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 通过数据集聚合把策略自己访问到的状态纳入训练,通过专家纠正提供高质量动作标签,通过策略迭代不断缩小训练分布与部署分布的差距,并在损失函数和收敛性分析上给出了可解释的改进路径。它并不是一个“更复杂的模仿学习技巧”,而是对行为克隆分布偏移问题的直接回应:让策略在犯错的地方学习,而不是只在专家完美的地方学习。