4. 条件模仿学习核心
条件模仿学习(Conditional Imitation Learning, CIL)要解决的核心问题是:同一段道路场景下,专家可能因为导航目标、交通规则、驾驶风格或历史轨迹不同而做出完全不同的动作。如果只学习“观测→动作”的单一映射,策略会把多种合理行为平均化,导致路口犹豫、变道摇摆甚至撞向路缘。因此,CIL 的关键在于把“决定行为分支的条件”显式建模,并让策略在给定条件下复现对应的专家分布。
一、条件变量设计:把“行为分支”变成可输入信号
条件变量不是随便加一个 one-hot 向量,而是要覆盖导致专家行为分叉的真实因素。在自动驾驶中,常见的条件变量可分为四类:
- 导航级条件:左转、右转、直行、掉头、靠边停车。它决定路口处的宏观动作分支,是最常用的高层条件。
- 目标级条件:未来 2~5 秒的目标点、目标车道 ID、目标速度或目标航向。它比导航命令更细,能约束轨迹的局部形状。
- 风格级条件:激进/保守、舒适/高效、跟车距离偏好。它解释同一路口下不同驾驶员的差异。
- 历史级条件:自车历史轨迹、前轮转角、加速度。它提供动力学连续性,避免条件切换时动作跳变。
设计条件变量时要遵循三个原则:可观测(推理时能拿到)、可区分(不同条件确实对应不同专家动作)、平滑可插值(连续条件如目标速度应能渐变,而不是硬切换)。例如导航命令用 one-hot,目标点用归一化坐标,风格用低维连续向量,历史用 GRU 编码。
二、条件策略建模:让网络“看见”条件
条件策略建模决定条件如何进入网络。常见做法有三类:
- 输入拼接:把条件向量与图像特征、BEV 特征拼接后送入 MLP 或 Transformer。实现简单,适合离散导航命令。
- 条件归一化:用 FiLM、Conditional BatchNorm 或 AdaIN,把条件映射成缩放和偏移参数,调制中间特征。它能让条件影响更深入,适合风格和目标点。
- 条件注意力:把条件作为 query,对观测 token 做 cross-attention,让策略动态选择与当前条件相关的区域。适合多模态输入和复杂路口。
无论哪种方式,都要保证条件在训练和推理时分布一致。若训练时用真实导航命令,推理时用预测命令,就必须加入命令噪声或命令 dropout,否则策略会对错误命令过敏。
# 条件策略网络示意(PyTorch 风格)
cond = encode_condition(nav_cmd, target_point, style_vec) # [B, D_c]
obs = bev_encoder(cameras, lidar) # [B, N, D_o]
fused = cross_attention(query=cond, key=obs, value=obs) # 条件注意力
traj = trajectory_head(fused) # 输出未来轨迹或动作
三、条件分布匹配:从“平均动作”到“条件分布”
行为克隆若只用 L1/L2 回归,会学到条件分布的均值。当同一条件下存在多峰(例如路口既可左转也可直行),均值可能落在两个模式之间,造成危险。条件分布匹配的目标是让策略输出分布与专家条件分布对齐,常用手段包括:
- 条件变分自编码器(CVAE):引入隐变量 z,学习 p(a | o, c, z),推理时从先验采样或取均值,能表达多模态。
- 条件扩散策略:把动作生成建模为去噪过程,条件 c 作为去噪网络输入,适合高维轨迹和复杂多峰分布。
- 条件 GAN / 条件流匹配:用对抗或流匹配损失逼近条件分布,训练稳定性需重点调参。
- 条件能量模型:学习能量函数 E(a, o, c),低能量对应专家动作,推理时优化动作。
分布匹配的评估不能只看 MSE,还要看条件一致性:在给定 c 下,策略采样出的动作是否覆盖专家在该条件下的模式,且不越出安全边界。
四、条件行为克隆:训练目标与工程落地
条件行为克隆(Conditional Behavior Cloning, CBC)是把上述三部分串起来的训练范式。其损失通常由三部分组成:
| 损失项 | 作用 | 典型形式 |
|---|---|---|
| 条件动作损失 | 在给定条件下拟合专家动作 | L1 / NLL / 扩散去噪损失 |
| 条件一致性损失 | 保证条件与动作分支对应 | 对比损失、条件分类辅助损失 |
| 时序平滑损失 | 抑制条件切换时的动作抖动 | 相邻帧动作差分惩罚 |
工程落地时,数据要按条件分层采样,避免直行样本淹没左转样本;条件标签要经过一致性校验,剔除导航命令与专家轨迹矛盾的脏数据;推理时条件可来自导航地图、目标点预测或人工指令,并保留条件置信度,低置信度时降级到保守策略。
五、典型场景与误区复盘
以无保护左转为例:观测相同,但条件 c 可以是“左转且对向有车”或“左转且对向无车”。若不加条件,策略可能学到“缓慢蠕行”的平均行为;加入目标点和冲突车距离作为条件后,策略能在无车时果断通过、有车时等待或绕行。再如变道场景,条件可设为“目标车道 ID + 目标速度”,策略就能区分加速变道与减速让行。
1. 条件变量与动作标签不一致,例如导航说直行但专家轨迹左转,网络会学到矛盾映射。
2. 条件只在训练时使用,推理时被丢弃或置零,导致分布偏移。
3. 用离散条件硬切换,忽略条件之间的连续性,造成轨迹跳变。
4. 只优化动作 MSE,忽略条件分布的多峰性,导致路口犹豫。
5. 条件维度过高且无正则,网络会忽略观测,退化成“条件→动作”查表。
复盘时建议按条件分组统计:每个导航命令下的轨迹误差、碰撞率、舒适度指标,以及条件切换瞬间的 jerk 峰值。只有条件分组指标都稳定,才说明条件策略真正学到了“在什么条件下做什么动作”,而不是记住了训练集的平均轨迹。
总结来看,条件模仿学习的四个环节不是孤立的:条件变量设计决定策略能看到什么,条件策略建模决定条件如何影响动作,条件分布匹配决定多峰行为能否被保留,条件行为克隆决定训练目标与工程落地。只有四者对齐,策略才能在“同一观测、不同条件”下做出正确且安全的行为分支。