自动驾驶决策算法:从MDP建模到强化学习落地实践
1. 从“规则驱动”到“学习驱动”自动驾驶决策算法的范式转移自动驾驶的决策模块是整个系统里最像“人”的部分。感知告诉车“周围有什么”规划告诉车“大致往哪走”而决策要回答的是“此刻到底该怎么动”——跟车还是变道、抢行还是让行、加速还是点刹。这个模块做得好不好直接决定了乘客敢不敢闭眼、后车会不会骂娘。过去十年决策算法的主流是规则驱动。有限状态机、行为树、代价地图工程师把人类驾驶经验拆成一条条 if-else再配上参数标定。这套东西在高速巡航、简单跟车场景里跑得挺稳因为场景封闭、交互对象少。但一进城区就露怯路口博弈、加塞处理、非机动车乱窜规则写不完参数调不动最后变成“打补丁式开发”一个场景一个补丁维护成本指数级上升。于是行业把目光转向学习驱动尤其是基于MDP马尔可夫决策过程的强化学习框架。MDP 把决策问题形式化成五元组状态空间、动作空间、转移概率、奖励函数、折扣因子。自动驾驶天然适配这个框架——状态是自车与周围交通参与者的运动学信息动作是油门、刹车、转向或更高级的轨迹选择奖励是安全、效率、舒适度的加权组合。一旦形式化完成剩下的就是怎么解这个 MDP。但“怎么解”恰恰是最大的坑。真实驾驶的状态空间连续且高维转移概率未知且随机奖励函数设计稍有不慎就会学出“原地转圈”或“猛冲猛刹”的奇葩策略。这就引出了本文要聊的核心决策算法到底该怎么选、怎么训、怎么落地。我会从 MDP 建模、强化学习算法选型、深度学习融合、离线数据利用、多智能体交互几个层面把踩过的坑和验证过的思路摊开讲。适合已经了解自动驾驶基础模块划分、想深入决策层实现细节的工程师也适合做强化学习应用、想看看真实物理系统怎么落地的研究者。2. 决策问题的 MDP 建模状态、动作与奖励的工程化拆解2.1 状态空间设计别把感知原始输出直接塞进去新手最容易犯的错是把感知的原始输出——比如 64 线激光雷达点云、多摄像头 BEV 特征图——直接作为决策网络的状态输入。理论上可行实践中灾难。原因有三维度太高导致采样效率极低感知噪声直接污染决策以及训练时容易过拟合到特定传感器的噪声模式。工程上更稳妥的做法是分层抽象。决策层不关心“前方 30 米处有一个置信度 0.87 的锥桶”它关心的是“左前方有一个静止障碍物距离 28 米横向偏移 1.2 米”。所以状态空间通常构造成结构化向量自车状态速度、加速度、航向角、角速度、当前位置与车道线关系周围车辆状态相对距离、相对速度、相对加速度、所在车道、历史轨迹片段道路结构车道数、曲率、限速、路口拓扑交互特征碰撞时间、车头时距、博弈意图估计每个维度的量纲不同必须做归一化。速度除以限速距离除以安全跟车距离角度除以 π。归一化不是可选项是必选项——否则梯度下降会被大量纲维度主导学出来的策略对速度变化极其敏感对距离变化几乎无感。注意状态里一定要包含历史信息。纯当前帧的 MDP 假设是马尔可夫的但真实驾驶中前车的加速度趋势、旁边车辆的犹豫行为都需要历史窗口才能判断。常用做法是堆叠最近 5-10 帧的状态向量或者用 LSTM/GRU 编码历史序列。2.2 动作空间选择离散还是连续这是个问题动作空间的设计直接决定算法选型。离散动作空间把驾驶行为切成有限个选项保持、左变道、右变道、加速、减速组合起来可能几十个动作。优点是可以用 DQN 这类值函数方法训练稳定、容易收敛。缺点是动作粒度粗变道过程中的连续轨迹控制还得靠下层规划器补决策与规划割裂。连续动作空间直接输出油门、刹车、转向角或者输出一条轨迹的终点位姿。优点是端到端、控制平滑适合用 DDPG、TD3、SAC 这类确定性策略梯度方法。缺点是训练不稳定探索效率低容易陷入局部最优。我的经验是高速场景用离散城区场景用连续或混合。高速上行为选择有限离散动作足够而且值函数方法对奖励稀疏的容忍度更高。城区里跟车距离的微调、博弈中的渐进式挤压需要连续控制才能表达。混合方案是上层离散选行为、下层连续生成轨迹两层用不同的奖励函数分别训练。2.3 奖励函数安全、效率、舒适的三角博弈奖励函数是强化学习里最像“艺术”的部分。自动驾驶的奖励通常由三块组成安全项碰撞大负奖励距离过近小负奖励可通行区域外负奖励效率项速度接近期望速度给正奖励到达目标给大正奖励耗时给负奖励舒适项加速度绝对值、 jerk加速度变化率、曲率变化给负奖励难点在于权重分配。安全权重太高车会龟速爬行甚至原地不动效率权重太高车会激进穿插、急刹急加速舒适权重太高车会反应迟钝、被加塞到怀疑人生。我试过的一种有效做法是动态权重。低速时提高安全权重高速时适当放宽安全权重、提高效率权重。拥堵时舒适权重降低因为频繁启停不可避免畅通时舒适权重提高因为乘客对平顺性更敏感。动态权重可以用一个简单的状态机切换也可以让网络自己学——把权重作为状态的一部分输入网络输出动作的同时也隐式调整了对各目标的偏好。实操心得奖励函数不要用绝对数值用相对变化。比如“距离前车 20 米”不如“距离前车 20 米相对于安全跟车距离的比值”。这样策略对不同速度、不同路况的泛化能力会强很多。3. 强化学习算法选型从 DQN 到 SAC 再到离线 RL3.1 值函数方法DQN 及其变体在高速场景的落地DQN 是最早被用到自动驾驶决策的深度强化学习算法。它的核心是用神经网络近似 Q 值函数输入状态、输出每个离散动作的预期回报。训练时用经验回放池打破样本相关性用目标网络稳定训练。在高速跟车和变道场景DQN 的表现可圈可点。状态维度控制在 20-30 维动作空间 5-7 个离散选项奖励函数设计合理的话几百万步仿真就能学到不错的策略。Double DQN 解决 Q 值高估问题Dueling DQN 把状态价值和动作优势分开估计Prioritized Replay 优先回放高 TD 误差的样本这些变体都能显著提升收敛速度和最终性能。但 DQN 的天花板也很明显。离散动作空间限制了控制精度值函数方法对连续动作无能为力而且 Q 值网络对状态空间的覆盖要求高遇到训练集里没见过的场景容易输出荒谬的 Q 值。3.2 策略梯度方法DDPG、TD3、SAC 的连续控制之路连续控制场景下策略梯度方法是主流。DDPG 用确定性策略网络输出动作再用 Critic 网络评估动作价值训练时加噪声探索。TD3 在 DDPG 基础上做了三个改进双 Critic 取最小值抑制高估、延迟更新 Actor 网络、目标动作加噪声平滑。SAC 则引入最大熵框架在最大化回报的同时最大化策略熵探索更充分、训练更稳定。我在城区跟车场景对比过这三种算法。DDPG 训练曲线震荡严重经常学出“猛踩油门然后猛刹车”的振荡策略。TD3 稳定很多但探索效率一般需要精心设计噪声方差。SAC 综合表现最好自动调节的熵温度让它在探索和利用之间平衡得不错学出来的策略平顺性明显优于前两者。不过 SAC 的计算开销也最大每次更新要跑两个 Critic 网络和一次策略采样。实时推理时只跑 Actor 网络延迟可以接受但训练阶段对算力要求高。如果仿真环境本身就很慢SAC 的训练周期会拉得很长。3.3 离线强化学习IQL 与 CQL 如何利用真实驾驶数据仿真环境再逼真也有 sim-to-real gap。真实驾驶数据里蕴含的交互模式、博弈策略是仿真器很难完全复现的。离线强化学习的目标就是只用一个固定的真实驾驶数据集不与环境交互学出一个可用的策略。IQLImplicit Q-Learning的核心思路是避免查询分布外动作的 Q 值。它不直接最大化 Q而是用期望回归估计状态价值再用优势加权回归提取策略。CQLConservative Q-Learning则在 Q 值更新时加一个保守项压低分布外动作的 Q 值防止策略跑偏。实际用下来IQL 在跟车和变道场景的离线训练效果不错学出来的策略保守但安全。CQL 更激进一些效率指标更好但偶尔会输出数据集里没见过的动作组合需要加安全层兜底。离线 RL 的最大价值在于冷启动先用真实数据训一个基础策略再放到仿真里微调比从零开始探索快得多。注意离线 RL 对数据集质量极其敏感。如果数据里全是人类司机的保守驾驶学出来的策略也会偏保守如果数据里混入了激进驾驶片段策略可能学会危险动作。数据清洗和场景筛选是离线 RL 落地的前置条件。4. 深度学习与决策算法的融合CNN、LSTM 与多任务学习4.1 用 CNN 提取鸟瞰图特征感知与决策的接口设计决策网络的状态输入如果包含栅格化地图或 BEV 特征图CNN 就是天然的编码器。把周围环境投影到鸟瞰视角每个通道代表一类信息自车、其他车辆、车道线、可行驶区域、障碍物。几层卷积下来网络能学到“左前方有车且距离近”这类空间关系。但 CNN 的输出不能直接接全连接层做决策因为空间信息会被展平丢失。更好的做法是用 CNN 提取特征图后通过空间注意力机制让决策网络关注关键区域。比如用一个小网络预测每个空间位置的权重加权求和后再输入策略网络。这样网络能自动学会“看”前车、看旁车、看路口而不是均匀处理整个场景。4.2 LSTM 与 GRU 处理时序依赖为什么历史窗口很重要驾驶决策本质上是时序问题。前车突然减速你需要根据它过去几秒的速度变化判断是轻刹还是急刹旁车打转向灯后犹豫不决你需要根据它过去几帧的横向位移判断它是否真的要变道。LSTM 和 GRU 就是用来捕捉这种时序依赖的。工程上我通常把最近 10 帧的状态向量输入 LSTM取最后一个时间步的隐状态作为当前决策的时序特征。GRU 参数更少、训练更快在实时性要求高的场景下更实用。LSTM 表达能力强一些但容易过拟合需要配合 Dropout 和正则化。实操心得时序窗口不是越长越好。10 帧约 0.5 秒对大多数城区场景够用20 帧以上收益递减而且增加计算负担。关键是窗口内的采样频率要和感知输出对齐不能有丢帧或时间戳跳变。4.3 多任务学习同时预测轨迹、意图与价值决策网络可以同时输出多个任务的结果动作策略、状态价值、周围车辆意图、未来轨迹预测。多任务学习的好处是共享底层特征提升泛化能力而且辅助任务能提供额外的监督信号。但多任务学习的难点在于损失权重平衡。策略损失、价值损失、意图分类损失、轨迹回归损失量纲和尺度都不一样。如果直接相加某个损失会主导梯度。常见做法是用不确定性加权让网络自己学习每个任务的噪声参数损失函数变成各任务损失除以噪声方差再加 log 方差。这样网络会自动给难任务更多权重给简单任务更少权重。另一种做法是 GradNorm 或 PCGrad动态调整梯度方向避免任务间冲突。我在实际项目里用过不确定性加权实现简单、效果稳定推荐优先尝试。5. 多智能体交互与因果强化学习从 MADL 到 CRL5.1 多智能体决策的挑战非平稳性与信用分配真实道路上的决策不是单智能体问题。你的策略影响旁车旁车的策略也影响你。多智能体强化学习里每个智能体都在学习环境对彼此来说都是非平稳的。这导致训练极不稳定今天学到的策略明天就失效。MADLMulti-Agent Deep Learning的思路是集中训练、分散执行。训练时用一个全局 Critic 评估联合动作价值执行时每个智能体只用局部观测选动作。这样既考虑了交互又保证了执行的独立性。但全局 Critic 的状态空间随智能体数量指数增长实际用的时候通常只考虑自车周围 3-5 辆关键车。信用分配是另一个难题。一次碰撞发生了是自车决策的错还是旁车突然变道的错奖励信号是全局的但每个智能体的贡献不同。常见做法是用反事实基线如果自车采取另一个动作碰撞是否避免用这个差值作为自车的优势估计。5.2 因果强化学习 CRL 的核心机制把因果推断嵌入 RL 流程因果强化学习CRL是最近比较热的方向。核心思想是策略学到的相关性不等于因果性。网络可能学到“打转向灯的车都会变道”但真实因果是“车有变道意图才打转向灯”。如果只学相关性遇到打转向灯但不换道的车就会误判。CRL 把因果推断工具嵌入强化学习流程关键能力包括因果发现从数据中学习状态变量之间的因果图区分原因和结果反事实推理给定当前状态和动作推断如果采取不同动作会怎样干预不变性学到的策略在不同干预下保持稳定不依赖虚假相关具体实现上可以用结构因果模型建模状态转移用 do-calculus 估计干预分布再把因果约束加到策略优化目标里。实际落地时完全因果化的 RL 计算量太大通常只对关键变量做因果建模比如前车意图、路口通行权。5.3 基于模型的强化学习Dreamer 与 MuZero 的启示基于模型的 RL 学一个环境动力学模型然后用模型生成虚拟经验来训练策略。Dreamer 在隐空间里学世界模型MuZero 学的是价值预测模型。两者都在游戏和仿真环境里表现惊艳但在自动驾驶上落地还有距离。主要障碍是模型误差累积。驾驶环境的动力学虽然大致确定但交互对象的意图高度随机。模型预测 1 秒还准预测 3 秒就偏得离谱。策略在模型里学得再好放到真实环境也可能崩。不过基于模型的 RL 在数据效率上有巨大优势。真实驾驶数据采集成本高仿真环境搭建也费时。如果能用少量真实数据学一个粗略模型再用模型生成大量虚拟经验做预训练最后用真实数据微调整体效率会高很多。这个思路在工业界已经开始尝试效果值得期待。6. 实操落地训练流程、调参经验与常见问题排查6.1 仿真环境搭建与课程学习训练决策算法离不开仿真环境。CARLA、SUMO、Gazebo 各有优劣。CARLA 视觉逼真、物理引擎好但计算开销大SUMO 交通流仿真强但车辆动力学简化Gazebo 适合机器人系统集成但场景库少。我的建议是分层使用早期用 SUMO 做大规模交通流训练快速迭代策略中期用 CARLA 做感知-决策联合调试后期用真实数据做离线微调。课程学习也很关键先学直道跟车再学弯道再学变道最后学路口博弈。每个阶段训练到收敛再进入下一阶段比一上来就扔进复杂场景快得多。6.2 超参数调优学习率、折扣因子、回放池大小强化学习的超参数比监督学习敏感得多。学习率太大策略震荡太小收敛慢到怀疑人生。折扣因子 γ 决定智能体看多远0.99 对应约 100 步的视野城区场景够用高速场景可以降到 0.95因为决策影响更短。回放池大小影响样本多样性。太小样本相关性高训练不稳定太大旧策略的数据占比高与当前策略分布不匹配。经验值是 10 万到 100 万条 transition具体看状态维度和动作空间。注意回放池里的数据要定期清理。旧策略产生的数据对当前策略的参考价值低尤其是策略已经更新了很多代之后。可以用优先回放机制自动给旧数据降权。6.3 常见问题速查表问题现象可能原因排查方向解决方法策略收敛到原地不动安全惩罚过高效率奖励不足检查奖励函数权重降低碰撞惩罚增加速度奖励训练曲线剧烈震荡学习率过大或回放池太小打印每轮回报方差降低学习率增大回放池仿真表现好实车表现差sim-to-real gap对比仿真与实车状态分布加域随机化用真实数据微调变道策略犹豫不决折扣因子过低或舒适惩罚过高检查 γ 和 jerk 权重提高 γ降低舒适惩罚多车场景训练不收敛非平稳性太强检查是否用了集中训练改用 MADL 或独立 PPO离线 RL 策略过于保守数据集偏保守分析数据动作分布混合仿真数据加探索噪声6.4 安全层设计学习策略不能直接控车无论策略学得多好都不能让它直接输出油门刹车。必须加安全层碰撞时间低于阈值强制刹车横向加速度超限限制转向可行驶区域外禁止变道。安全层是规则驱动的但参数可以自适应调整。学习策略负责“怎么开得好”安全层负责“怎么开不撞”。实操心得安全层的阈值不要设得太死。太保守会导致策略学到的动作被频繁覆盖训练信号失真。可以先让安全层只做紧急兜底等策略稳定后再逐步收紧。7. 数据、算力与工程化的现实约束7.1 自动驾驶数据集的选择与使用公开数据集里nuScenes、Waymo Open Dataset、Argoverse 是决策算法常用的。nuScenes 场景丰富、标注详细适合做行为预测和决策联合训练。Waymo 数据量大、质量高但获取门槛高。Argoverse 有高清地图和轨迹预测标注适合做交互博弈研究。用这些数据集做离线 RL 时要注意动作空间对齐。数据集里的动作是离散的驾驶行为标签还是连续的轨迹如果是轨迹怎么映射到你的动作空间这个映射关系直接影响策略能否学到有效行为。7.2 训练算力估算与云平台选择一个中等规模的决策网络参数量在 100 万到 1000 万之间。用 SAC 训练单卡 V100 或 A100 跑 100 万步大约需要 2-3 天。如果仿真环境本身很慢瓶颈在环境交互而不是梯度更新这时候多开并行环境比换显卡更有效。云平台选择上AWS、GCP、Azure 都提供 GPU 实例。如果团队有自建集群优先用本地因为数据传输和调试更方便。云平台适合短期大规模实验长期训练还是本地划算。7.3 从仿真到实车的迁移策略sim-to-real 是决策算法落地的最后一公里。域随机化是最常用的手段在仿真里随机化传感器噪声、车辆动力学参数、交通参与者行为模型让策略见过足够多的变化到真实世界才不会慌。另一种思路是残差学习仿真里训一个基础策略实车上加一个小网络学残差修正。基础策略负责大部分决策残差网络补偿仿真与真实的差异。这样实车训练数据需求少安全性也更容易保证。8. 一些个人体会决策算法这个方向理论很漂亮落地很磨人。MDP 框架清晰但状态设计、奖励塑形、算法调参每一步都是坑。强化学习在游戏里能超人类在驾驶里能追上人类司机就不错了。原因在于驾驶的奖励函数太模糊安全、效率、舒适的权衡没有标准答案不同乘客的偏好还不一样。我自己的经验是别追求端到端替代规则先做规则和学习的混合。规则负责安全底线和常见场景学习负责复杂交互和个性化风格。离线 RL 做冷启动仿真 RL 做迭代实车数据做微调。多智能体交互和因果推断是值得关注的方向但别指望一上来就解决所有问题。最后分享一个小技巧训练决策策略时把“人类司机的动作”作为辅助监督信号加进损失函数。不用完全模仿只要让策略在探索时有个大致方向收敛速度会快很多。这个思路在 IQL 和 TD3BC 里都有体现实测有效。