从模仿到自我纠正:深入理解DAgger在自动驾驶策略学习中的应用
随着端到端自动驾驶、世界模型(World Models)、人类反馈强化学习(RLHF)等技术的发展,DAgger 有望成为它们之间的“桥梁”
模仿学习的局限性
在自动驾驶的策略学习中,模仿学习(Imitation Learning)曾一度被视为“最自然的起点”。毕竟,人类司机的驾驶行为本身就是最宝贵的经验财富。但随着技术的深入,我们逐渐发现:只学“师傅怎么开”,远远不够。
🧭 行为克隆:从人类数据中“照猫画虎”
行为克隆(Behavior Cloning)是模仿学习中最基础的一种方式。它的核心思想非常简单:
给模型一堆人类驾驶数据(状态 → 动作),让它学会在相同状态下做出相同动作。
比如:
- 状态:前方红灯,车速 40km/h,距离停止线 30 米;
- 动作:轻踩刹车,减速至 0。
模型通过监督学习拟合这个“状态-动作”映射关系,就像学生在背标准答案。
⚠️ 问题一:分布偏移(Covariate Shift)
现实中,模型一旦开始“自己开车”,就会遇到一个严重的问题:它看到的状态,和训练时的数据分布不一样。
举个例子:
- 人类司机通常不会偏离车道,所以训练数据中“偏离车道”的状态很少;
- 但模型一旦轻微偏离车道,它就进入了“没见过的状态”;
- 然后它可能进一步偏离,错误会像雪球一样越滚越大。
这就是所谓的分布偏移:训练数据和实际运行时的数据分布不一致,导致模型在“未知状态”下表现不稳定。
🔁 问题二:错误无法自我纠正
更严重的是,行为克隆模型没有“后悔机制”。它不会意识到自己做错了,也不会主动修正。
比如:
- 模型误判绿灯为红灯,停在路口;
- 它不知道这是错误,也不会尝试重新判断;
- 结果就是“卡死”在原地,或者做出更糟糕的决策。
模仿学习就像是让模型“看录像学开车”。它能快速掌握基本技能,但一旦进入真实世界,面对复杂多变的路况,它就容易“懵圈”。
我们需要一种方法,让模型不仅能模仿,还能在犯错时被及时纠正、从错误中学习。这正是 DAgger 登场的时刻。
DAgger 原理详解
DAgger,全称 Dataset Aggregation,是一种解决模仿学习中“分布偏移”问题的策略学习方法。它的核心思想非常直白:让模型自己“上路”,然后请专家在它犯错时及时纠正,并把这些纠正过的数据加入训练集,反复迭代,直到模型足够稳健。
🔁 核心思想:从“只学师傅”到“边做边学”
传统模仿学习只依赖人类驾驶数据,模型从未真正“自己开车”。而 DAgger 的关键在于:
让模型自己做决策,暴露它真实运行时会遇到的状态分布,然后请专家来“补课”。
这个过程可以类比为:
- 第一次考试,学生只靠背书,结果错了一堆;
- 老师把错题讲一遍,学生再练;
- 下一次考试,学生就不会再犯同样的错。
🛠️ 执行流程:训练 - 执行 - 纠正 - 再训练
DAgger 的标准流程如下:
- 初始训练:用人类专家数据训练一个初始策略(π₀);
- 模型执行:让 π₀ 在仿真环境中“自己开车”,收集它实际遇到的状态;
- 专家纠正:在这些状态下,请专家提供正确动作(即 π* 的行为);
- 数据聚合:将这些新数据(状态,专家动作)加入训练集;
- 策略更新:用聚合后的数据重新训练策略 π₁;
- 重复步骤 2-5,直到模型性能收敛。
这个过程形成了一个闭环学习系统,模型不断暴露自己的“盲区”,并通过专家指导逐步修正。
📊 与传统模仿学习的对比
| 特性 | 行为克隆(Behavior Cloning) | DAgger |
|---|---|---|
| 数据来源 | 仅来自专家演示 | 来自专家 + 模型执行过程 |
| 状态分布 | 训练时 ≠ 测试时 | 训练时 ≈ 测试时(逐步对齐) |
| 错误纠正能力 | 无 | 有(专家实时纠正) |
| 鲁棒性 | 差,容易“雪崩” | 强,能自我修正 |
DAgger 的本质,是让模型主动暴露自己的弱点,而不是被动接受专家演示。它不再“只学别人怎么做”,而是“自己做错了再学”,这使得它在面对复杂、长尾、非典型场景时更具鲁棒性。
DAgger 在自动驾驶中的实际应用
🧪 仿真环境:模型“试着开”,专家“盯着看”
在真实道路上让模型“试错”显然不现实,因此主流自动驾驶公司(如 Waymo、Cruise、Aurora 等)通常会在高保真仿真环境中部署 DAgger。
流程如下:
- 模型在仿真中执行策略,模拟真实驾驶;
- 系统记录模型在每个状态下的决策;
- 专家(人类或专家策略模型)对这些状态提供“正确动作”作为参考;
- 将这些状态-动作对加入训练集,进行下一轮训练。
这种方式可以在不影响安全的前提下,让模型暴露大量“真实运行时的错误行为”。
🧑🏫 专家策略的来源:人类 or 模型
DAgger 中的“专家”可以有多种形式:
- 人类专家:直接由工程师或专业司机在仿真中标注正确操作;
- 规则引擎:使用传统规则系统作为“参考标准”;
- 强化学习策略:用性能更强的 RL 策略作为教师模型;
- 混合专家系统:根据场景动态选择专家来源。
这种灵活性使得 DAgger 能适配不同阶段、不同复杂度的训练任务。
🧩 示例:Waymo 如何用 DAgger 优化策略模型
Waymo 在其端到端策略学习研究中,曾使用 DAgger 变体来训练其驾驶策略网络。具体做法包括:
- 在仿真中部署初始策略;
- 记录模型在复杂交叉口、非结构化道路等场景下的行为;
- 使用高性能规划模块作为“专家”提供纠正;
- 将这些数据加入训练集,迭代优化策略网络。
这种方式显著提升了模型在“长尾场景”中的表现能力。
🔗 与强化学习的结合:Hybrid DAgger
DAgger 也常与强化学习(RL)结合使用,形成所谓的“Hybrid Imitation + RL”框架:
- 初期用 DAgger 快速收敛到一个可用策略;
- 后期用 RL 微调策略,优化长期回报;
- 结合两者的优势:DAgger 快速稳定,RL 更具探索性。
这种组合在端到端自动驾驶策略学习中越来越常见。
工程挑战与优化方向
DAgger 在理论上非常优雅、在仿真中效果显著,但在实际工程落地过程中,仍面临不少挑战。
💰 挑战一:专家成本高,标注效率低
DAgger 的核心在于“专家纠正”,但这也意味着:
- 每次模型执行后,都需要专家重新标注大量状态;
- 如果专家是人类司机,成本极高;
- 如果是规则系统或 RL 策略,可能存在精度或泛化问题。
优化方向:
- 使用“半自动专家系统”,结合规则引擎和人类复核;
- 引入“主动学习”机制,仅在模型不确定或高风险状态下请求专家;
- 利用历史数据构建“专家缓存”,减少重复标注。
📉 挑战二:数据分布不均,训练不稳定
DAgger 会不断聚合新数据,但这些数据往往集中在模型容易出错的“边缘场景”,导致训练集分布偏移,模型可能过拟合这些“异常状态”。
优化方向:
- 设计采样策略,平衡“专家数据”和“模型数据”的比例;
- 引入“经验回放池”,控制不同类型数据的采样频率;
- 使用“重要性采样”或“加权损失函数”缓解分布不均问题。
🧪 挑战三:仿真与现实存在差距(Sim2Real Gap)
DAgger 多数在仿真中执行,但仿真环境再真实,也难以完全还原现实世界的复杂性。这会导致模型在仿真中表现良好,但上线后仍可能出错。
优化方向:
- 提高仿真环境的保真度(如 Waymo 的“Replay Simulation”);
- 引入“Domain Randomization”技术,增强模型泛化能力;
- 在安全可控的封闭道路上进行小规模真实部署,收集真实 DAgger 数据。
🧠 挑战四:策略更新频繁,部署成本高
DAgger 是一个持续迭代的过程,每轮都需要重新训练并部署新策略,这在大规模系统中会带来工程复杂度和部署风险。
优化方向:
- 使用“在线蒸馏”技术,将频繁更新的策略压缩为稳定版本;
- 构建“策略版本管理系统”,支持灰度发布与回滚;
- 结合强化学习,减少 DAgger 迭代次数。
🔬 挑战五:DAgger 本身的变体设计
原始 DAgger 算法虽然有效,但在实际应用中往往需要根据任务特性进行调整。例如:
- SafeDAgger:引入安全策略,避免模型执行高风险动作;
- MetaDAgger:结合元学习,提升在新场景下的适应能力;
- AggreVaTe / LOLS:将 DAgger 推广到结构化决策和非确定性任务中。
这些变体为 DAgger 在更复杂的自动驾驶任务中提供了更强的适应性和灵活性。
CARLA 中的“左转失败”问题
在使用 CARLA 训练端到端策略模型时,研究者常遇到一个典型问题:模型在左转时容易失败,表现为:
- 提前转向,压线;
- 误判对向来车,强行左转;
- 或者犹豫不决,卡在路口。
这些问题在训练数据中很少出现,因为人类司机通常能顺利完成左转,导致模型在训练时几乎没见过“左转失败”的状态。
📍阶段一:初始策略训练(π₀)
- 数据来源:人类驾驶演示,覆盖城市道路、红绿灯、简单交叉口;
- 训练结果:模型在直行和右转表现良好,但左转成功率 < 50%。
📍阶段二:DAgger 第一次迭代
- 执行策略:π₀ 在仿真中执行左转任务;
- 问题观察:
- 提前转向,压线;
- 对向车道判断不准确;
- 专家介入:人工标注 120 个关键状态下的正确操作;
- 训练数据扩展:原始数据 + 新增专家纠正数据;
- 策略更新:π₁
📍阶段三:DAgger 第二次迭代
- 执行策略:π₁ 在新场景中测试;
- 改进表现:左转成功率提升至 75%,但在夜间/雨天表现不稳定;
- 优化措施:
- 引入天气扰动(domain randomization);
- 增加仿真中“低能见度”场景;
- 专家再次标注 80 个状态;
- 策略更新:π₂
📍阶段四:策略稳定 + 蒸馏部署
- π₂ 表现:左转成功率 > 90%,在多种天气和交通密度下均表现稳定;
- 部署优化:
- 使用策略蒸馏压缩模型;
- 部署至低功耗推理平台;
- 进行封闭道路实车验证。
✅ 总结
通过 2 轮 DAgger 迭代,模型从“左转频繁失败”成长为“稳健应对复杂交叉口”,整个过程耗时约 3 天,专家标注约 200 条状态,仿真执行约 10 小时。
随着自动驾驶系统越来越多地采用端到端策略学习、世界模型、强化学习等方法,DAgger 的角色也在演化:
- 在 世界模型 中,它可以作为“虚拟世界中的纠错机制”;
- 在 RLHF 框架 中,它可以高效采集“人类反馈数据”;
- 在 多模态大模型 驱动的系统中,它可以帮助策略模块快速适应新场景。
未来的自动驾驶系统,可能不再依赖单一范式,而是融合模仿、强化、反馈、规划等多种机制。而 DAgger,正是连接这些机制的关键一环。
更多推荐




所有评论(0)