# 模仿学习演示：行为克隆的累积误差与 DAgger 修正

> 来源：https://dqn.cn/tools/imitation ｜ 作者：DQN.CN 编辑部 ｜ 发布：2026-11-01 ｜ 更新：2026-11-01 ｜ 许可：CC BY-NC-SA 4.0（文字）/ MIT（代码）

> （此处为交互工具，请在网页中使用：https://dqn.cn/tools/imitation）

## 设定

小车以恒定速度前进，动作是转向角 $u \in [-1, 1]$。学生策略只看三个特征：偏离中心线的距离 $d$、车头相对赛道方向的偏角 $\varphi$、前方弯道的平均曲率 $\kappa$，用 k 近邻（k = 5）回归输出转向。执行时每步加一个小的高斯噪声，模拟真实世界中不可避免的误差。

内置专家是一个“纯跟踪”（pure pursuit）控制器：始终瞄准中心线前方 0.5 处的点。它在任何状态下都知道该怎么转，所以既可以录制演示，也可以充当 DAgger 中的标注员。

## 行为克隆与 DAgger

行为克隆把模仿当作监督学习：$\min_\theta \mathbb{E}_{(s,a)\sim \mathcal{D}_{\text{expert}}}\big[\ell(\pi_\theta(s), a)\big]$。问题在于训练分布是专家访问的状态，而测试时学生会访问**自己**造成的状态；一旦偏离，误差会随时间平方增长（Ross & Bagnell, 2010）。

DAgger（Ross et al., 2011）的做法：

1. 用当前数据集训练学生 $\pi_i$；
2. 让 $\pi_i$ 自己去跑，记录它访问的状态；
3. 请专家为这些状态标注动作，加入数据集；
4. 重复。

## 可以试试

- 录制专家演示后多点几次“行为克隆：测试”：大多数时候学生会在某个弯道冲出去，冲出前的轨迹往往是慢慢偏离、越偏越远。
- 点“DAgger 迭代一轮”两三次：散点图中出现大量蓝色的“偏离中心”的样本，学生开始能稳定跑完一圈。
- 把执行噪声调成 0：行为克隆也能跑完——误差累积需要“扰动”作为起点。
- 自己开一圈再训练：人的演示通常比专家“抖”，反而覆盖了更多偏离状态，但动作标签也更嘈杂。

## 相关教程

- [模仿学习](https://dqn.cn/advanced/imitation-learning)
- [离线强化学习](https://dqn.cn/advanced/offline-rl)
- [全部交互工具](https://dqn.cn/tools/)
