实战 | 从模仿学习到强化学习:自动驾驶轨迹规划的范式演进与代码实践

张开发
2026/4/18 1:10:18 15 分钟阅读

分享文章

实战 | 从模仿学习到强化学习:自动驾驶轨迹规划的范式演进与代码实践
1. 自动驾驶轨迹规划的技术演进之路第一次接触自动驾驶轨迹规划时我和大多数工程师一样选择了模仿学习方案。当时用行为克隆Behavior Cloning在封闭园区测试看着车辆完美复现人类驾驶员的轨迹确实有种技术真简单的错觉。直到某天测试场突然出现施工锥桶车辆毫不犹豫地撞上去时我才意识到问题的严重性——这就像教孩子临摹字帖写得再像也理解不了文字含义。传统模仿学习的局限性在三个场景尤为明显长尾场景遇到训练集未覆盖的特殊情况如道路施工时表现失控动态交互无法应对其他交通参与者的突发行为如加塞车辆因果混淆难以区分关键特征比如到底是红灯还是前车刹车导致停车强化学习的突破在于将问题转化为动态博弈过程。2016年DeepMind的AlphaGo已经展示了这种范式在复杂决策中的潜力。在自动驾驶领域强化学习的优势就像围棋中的大局观通过reward机制建立长期收益判断在仿真环境中自我进化应对罕见场景能主动探索更优策略而非简单模仿# 模仿学习vs强化学习的决策差异示例 def imitation_learning(observation): return expert_demo[observation] # 查表式响应 def reinforcement_learning(state): action policy_network(state) next_state, reward env.step(action) return action # 考虑环境反馈的决策2. 从行为克隆到PPO算法实战2.1 模仿学习的快速实现行为克隆的代码实现确实简单我用PyTorch 3小时就完成了第一个可运行版本class BehaviorCloning(nn.Module): def __init__(self, input_dim, output_dim): super().__init__() self.net nn.Sequential( nn.Linear(input_dim, 128), nn.ReLU(), nn.Linear(128, output_dim) ) def forward(self, x): return self.net(x) # 训练过程 model BehaviorCloning(obs_dim, act_dim) optimizer torch.optim.Adam(model.parameters()) loss_fn nn.MSELoss() for epoch in range(100): for obs, act in expert_dataset: pred model(obs) loss loss_fn(pred, act) optimizer.zero_grad() loss.backward() optimizer.step()但这种方案在实际路测时暴露了两个致命问题复合误差累积小偏差会随时间放大就像复印件的清晰度逐代下降分布偏移测试时遇到训练集未覆盖的状态表现会断崖式下跌2.2 PPO算法的工程化改进转向强化学习后我选择了PPOProximal Policy Optimization这个平衡了效果与实现难度的算法。与模仿学习相比PPO的核心改进在于优势函数计算通过GAEGeneralized Advantage Estimation评估动作价值策略约束机制使用clip函数防止更新步长过大价值函数辅助critic网络提供基线参考class PPOPolicy: def __init__(self, obs_dim, act_dim): self.actor nn.Sequential( nn.Linear(obs_dim, 256), nn.Tanh(), nn.Linear(256, act_dim) ) self.critic nn.Sequential( nn.Linear(obs_dim, 256), nn.Tanh(), nn.Linear(256, 1) ) def update(self, samples): states, actions, old_log_probs, returns, advantages samples # 策略损失计算 new_log_probs self.get_log_prob(states, actions) ratio (new_log_probs - old_log_probs).exp() surr1 ratio * advantages surr2 torch.clamp(ratio, 1-0.2, 10.2) * advantages policy_loss -torch.min(surr1, surr2).mean() # 价值函数损失 values self.critic(states) value_loss F.mse_loss(values, returns) # 联合优化 loss policy_loss 0.5*value_loss self.optimizer.zero_grad() loss.backward() self.optimizer.step()在CARLA仿真中的测试数据显示PPO在复杂场景的通过率比行为克隆提升47%特别是在这些场景表现突出交叉路口无保护左转密集车流中的变道施工路段的绕行决策3. 奖励函数设计的艺术强化学习的效果90%取决于reward设计。早期我直接使用简单规则def naive_reward(state): reward 0 if collision: reward - 10 if reach_goal: reward 5 return reward结果训练出的策略要么过于保守龟速行驶要么危险激进。后来通过分层奖励结构解决了这个问题安全层碰撞惩罚、偏离道路惩罚舒适层加速度变化率惩罚、急转向惩罚效率层进度奖励、速度保持奖励风格层跟车距离偏好、变道频率控制def advanced_reward(vehicle): # 安全计算 collision_penalty -10 if collision else 0 road_penalty -2 * abs(lateral_offset) # 舒适计算 jerk_penalty -0.1 * abs(acceleration_diff) steer_penalty -0.05 * abs(steering_rate) # 效率计算 progress current_speed * cos(heading_error) speed_reward 0.1 * min(speed, speed_limit) # 风格调节 distance_penalty -0.01 * (follow_distance - desired_distance)**2 return sum([collision_penalty, road_penalty, jerk_penalty, steer_penalty, progress, speed_reward, distance_penalty])实际项目中还发现三个实用技巧奖励缩放保持各项reward在相近数量级滞后惩罚对危险状态给予持续惩罚而非单次惩罚课程学习逐步提高难度先空旷道路再复杂交通4. 仿真环境构建的关键细节没有高质量的仿真环境强化学习就是无本之木。在搭建训练系统时这些经验值得注意4.1 感知-决策闭环构建早期方案将感知和决策分开训练导致感知误差传导问题。后来改用端到端训练框架class EndToEndSystem: def __init__(self): self.perception ResNet18(pretrainedTrue) self.policy PPOPolicy(feature_dim, act_dim) def forward(self, rgb_image): features self.perception(rgb_image) actions self.policy(features) return actions4.2 多智能体交互建模真实交通是动态博弈过程我们使用混合架构主车PPO算法控制NPC车辆IDMMOBIL模型行人社会力模型def step_simulation(): ego_action policy_network(ego_observation) npc_actions [npc_model(obs) for npc_model, obs in zip(npc_models, npc_observations)] env.step([ego_action] npc_actions)4.3 并行化训练加速通过Ray框架实现200个环境的并行采样使训练速度提升40倍ray.remote class Worker: def rollout(self, policy_params): env CarlaEnv(townTown03) policy load_policy(policy_params) return run_episode(env, policy) # 主训练循环 workers [Worker.remote() for _ in range(200)] while True: params ray.put(policy.state_dict()) results ray.get([w.rollout.remote(params) for w in workers]) update_policy(results)在工程实践中这些陷阱需要特别注意仿真与现实差距物理引擎参数要校准如摩擦系数过拟合风险定期在未见过的地图测试评估指标设计不能只看成功率还要考虑舒适度等主观指标从模仿学习到强化学习的升级不是简单的算法替换而是思维模式的转变。这个过程就像从临摹画作到自主创作需要建立对驾驶本质的理解。在最近的城市道路测试中我们的强化学习方案已经能处理90%以上的复杂场景但剩下的长尾问题仍然需要持续优化。

更多文章