
简介《基于强化学习的无人驾驶车辆行为决策方法研究进展》是一份文档资料面向自动驾驶、人工智能与强化学习方向的研究者、工程师及高年级学生系统梳理了强化学习在无人驾驶行为决策领域的最新研究进展。资源包含1个docx文档文件大小约37KB以学术综述形式呈现内容涵盖自动驾驶系统架构、传统强化学习与深度强化学习算法的演进脉络以及DQN、DDPG等典型算法在车道保持、跟车行驶、城市道路制动等场景中的具体应用案例适合用于文献调研、开题准备或技术方案选型参考。该资源已有200人浏览学习文档从决策精度、决策广度及应对不确定因素三个维度展开归纳了当前方法的优势与不足并给出代表性文献的对比分析有助于读者快速建立该交叉领域的知识框架把握从Q-Learning到深度强化学习的技术发展主线。1. 综述论文读完了行为决策代码还是写不出来多数「基于强化学习的无人驾驶车辆行为决策方法研究进展」这类综述会把近五年的算法按 DQN、DDPG、PPO、SAC 排一遍结论通常是「混合方法有前景」。但读者合上文档回到自己的开发机往往还是不知道状态空间怎么设、动作空间怎么分、奖励函数怎么调更不清楚一个决策模型离上车到底还差多少步。这篇文章换个讲法把综述里的方法谱系当成一张地图落到问题建模、训练环境和部署验证三个层面给出可以照着改的参数表和最小代码骨架。内容定位在一线算法的工程实现不看论文原文也能直接对应到自己的实验里。适合正在搭决策算法原型、需要评估强化学习方案可行性或者想把行为决策写进仿真评测的技术人员。2. 先把行为决策问题装进 MDP状态、动作与奖励的设计边界2.1 行为决策在整个自动驾驶软件栈里的位置无人驾驶车辆的软件栈通常分成感知、预测、决策、规划、控制五层。行为决策处在预测和运动规划之间它解决的不是「方向盘转多少度」而是「下一段时间内车辆应该执行哪种驾驶意图」。常见的就是巡航、跟车、变道、超车、借道绕障、靠边停车这几类语义动作。这也是很多刚接触强化学习的人最容易混淆的边界。如果决策模块直接输出方向盘转角或加速度实质上是把强化学习用在了连续运动控制上问题规模和安全性都会急剧膨胀。真正的行为决策输出空间通常是一组离散的驾驶指令运动规划层再去把指令展开成轨迹。综述里出现的 DQN 系列、Dueling DQN、Rainbow都是在这个离散动作假设下讨论的PPO、SAC 虽然也能处理连续动作但用在行为决策上时更常见的做法是让每个动作对应一个语义指令加目标车道偏移量而不是直接接管执行器。2.2 把行车场景翻译成状态向量状态空间的设计决定了模型能不能区分「该加速」和「该让行」。常见做法是先用自车坐标系做归一化再按语义分组。我一般会分成四组自车状态当前车速、纵向加速度、航向角偏差前车状态相对距离、相对速度、前车加速度可观测时目标车道状态目标车道前车相对距离与相对速度、目标车道后车相对距离与相对速度道路与导航状态当前车道编号、目标车道编号、距出口距离、限速。这四组信息合起来构成一个低维向量维度大概在 15 到 25 之间。之所以不直接把高精地图栅格图塞给模型是因为行为决策关心的不是所有障碍物的完整轮廓而是关键交互对象的相对态势。把高维感知输出压缩成语义特征再做决策训练效率会高得多也方便事后调试。2.2.1 状态归一化里的两个细节第一相对距离一定要除以一个参考值比如 120 米保证数值落在 0 到 1 附近。第二相对速度不要只存一个 delta建议拆成「前车速度」和「自车速度」两个量让网络自己学它们之间的关系否则换道模型中「同速接近」和「前车静止」很容易被混淆。这个问题在实车数据回放时特别明显原始传感器数据里的车速波动会被直接放大进策略里。2.3 动作空间按驾驶语义分层动作空间的设计直接决定训练难度。最少可用的动作集是四选一巡航、跟车、左变道、右变道。巡航对应保持当前车道和当前速度跟车对应与前车保持时距变道则由决策层给出目标车道轨迹生成由下层完成。这里有一个工程经验提示如果仿真场景里存在车道缩减或施工改道必须增加一个「强制变道」动作即使它与巡航在当前观测下看起来等价。否则模型学到的策略在道路拓扑变化时会失灵。更细一点的动作设计会在变道动作上附加一个时间语义例如「2 秒内完成变道」。这样的动作空间不再是 4 个离散值而是 4 个行为类型加每个类型内的参数档位。用参数化动作空间可以让强化学习算法保持离散动作的训练效率又给运动规划层留出更多上下文。常见做法是将动作定义为(action_type, target_lane, gap_index)三元组。2.4 奖励函数的分层权重与稀疏性问题奖励函数是行为决策里最核心也最容易被写坏的部分。太稀疏的话模型在高速场景下几乎拿不到正向反馈太稠密的话模型会钻奖励函数的空子。我常用的奖励分层结构如下奖励项典型值说明到达奖励10.0到达目标车道或通过特定路段碰撞惩罚-50.0直接终止回合跟车时距奖励0.2 * clip(v_rel, -5, 5)保持安全时距的小幅正向激励变道惩罚-0.5防止频繁无效变道舒适度惩罚-0.1 * |jerk|抑制剧烈加加速度时间惩罚-0.01 每步鼓励尽快完成任务这里有一个容易忽略的点变道惩罚不能设成固定值应该和变道后的收益挂钩。否则模型在需要连续变道时会因为单次惩罚过高而选择放弃。更稳妥的写法是只在变道动作发起时扣一次惩罚且数值低于完成该动作可能带来的正向收益。3. 强化学习算法分类与选型从 DQN 到离线强化学习3.1 综述里的算法谱系哪些真正用于行为决策「强化学习算法分类」在行为决策语境下通常按策略更新方式分成三类基于值函数、基于策略梯度、基于 Actor-Critic。综述里高频出现的 DQN、Double DQN、Dueling DQN、Rainbow 属于第一类PPO、A2C/A3C 属于第二类TD3、SAC 属于第三类。行为决策的离散动作特性决定了 DQN 家族和 PPO 是主力SAC 只在动作空间包含连续参数如目标时距、期望速度时出现。状态价值函数的作用在这里可以做一点澄清状态价值函数衡量的是从某个状态出发能获得的期望回报。它并不直接告诉车辆此刻该变道还是跟车而是作为 Actor-Critic 架构里 Critic 网络的输出用来估计当前策略下状态或状态-动作对的长期回报。很多综述会把价值函数画进框图里但第一次看代码的人往往找不到它的数值到底用在哪里——实际上它会在每一步更新中作为 TD 目标的一部分出现值r gamma * V(s)就是算法学习的回归目标。3.2 不同算法在无人驾驶行为决策上的适配性对比算法动作类型采样效率训练稳定性行为决策适配度DQN离散低中适合车道级决策对奖励函数敏感Double DQN离散低中高缓解 Q 值过估计工程常用Dueling DQN离散低中高分离状态价值和动作优势适合稀疏奖励Rainbow离散中高工程集大成者但超参数多PPO离散/连续中高行为决策首选收敛行为更平滑SAC连续高高适合参数化动作需要调温度系数IQL离线离散/连续不适用中高适合从日志数据学习需要约束策略偏差从工程习惯上说第一版原型先用 PPO 配上离散动作因为它对奖励函数缩放不敏感也不需要像 DQN 那样维护经验回放里的众多 trick。等策略行为基本合理后再回到 DQN 家族做对比或者尝试离线强化学习。3.2.1 PPO 在行为决策中的两个调整PPO 用于无人驾驶行为决策时有两个细节和通用 benchmark 环境不一样。第一GAE 里的 lambda 建议取 0.95 而不是默认的 0.99因为驾驶任务局部性强远期回报的置信度不高。第二mini-batch 要按「回合」切不要按「transition」随机切否则同一个场景的时序关联会被打断出现训练时 loss 正常但实车行为抖动的问题。3.3 基于模型的强化学习和离线强化学习为什么被单独拿出来讲基于模型的强化学习这两年频繁出现在研究进展里核心思路是先学一个环境动力学模型再用这个模型做想象 rollout 来扩充训练数据。行为决策场景里环境模型比感知场景容易学得多因为状态转移基本由车辆运动学决定。不过常见的坑是学习到的模型误差在换道这类关键交互点上被放大策略会把模型误差当成可利用的捷径。综述里提到的 MBPO 一类做法放到驾驶任务上通常要降低想象 rollout 的长度我一般控制在 5 到 10 步。离线强化学习在行为决策里的价值则完全不同。真实驾驶日志往往没有完整的「尝试-失败-重试」数据策略很难在离线数据里学到纠正性行为。IQL 这类方法通过对价值函数做分位数回归能在不完全依赖数据集覆盖质量的前提下学到一个可用策略。它和「强化学习算法分类」里的在线方法不是替代关系更像一条从海量路采数据里直接提取决策策略的补充路径。4. 训练环境和最小实现基于 Gymnasium 的决策仿真骨架4.1 自己写环境还是用 CARLA、SUMO、SMARTS训练行为决策模型的环境选择会影响算法收敛的一切。如果只验证「能不能学会变道」一个车道级仿真器就够用如果要做感知-决策闭环就得上 CARLA 这类高保真模拟器。实际工程里我见过不少项目先用 SUMO 做交通流层面的决策验证再切到 CARLA 做闭环验证。行为决策层的环境建模核心不是物理渲染精度而是交互车辆的行为逻辑是否真实。这里给一个参考对照CARLA适合完整传感器链路的决策验证场景编辑器成熟训练速度慢SUMO适合交通流层面的宏观决策决策频率低但对单车智能行为建模粗SMARTS专为多智能体交互设计支持 social behavior 配置自研车道级环境最灵活训练速度最快适合做算法选型的第一站。4.2 一个能跑通 PPO 行为决策的最小环境代码下面给出一个基于 Gymnasium 的车道级行为决策环境骨架支持四动作决策。它复现的是「自车 前车 目标车道前后车」的最简交互模型。from typing import Optional import gymnasium as gym import numpy as np from gymnasium import spaces class LaneChangeEnv(gym.Env): 简化版车道级行为决策环境四动作决策。 状态: [自车速度, 当前车道前车距离/相对速度, 目标车道前车距离/相对速度, 目标车道后车距离/相对速度] 动作: 0-巡航, 1-跟车, 2-左变道, 3-右变道 def __init__(self, dt: float 0.1, decision_freq: int 10): super().__init__() self.dt dt self.decision_freq decision_freq # 决策频率每秒决策次数 self.action_space spaces.Discrete(4) self.observation_space spaces.Box(low-50, high120, shape(7,), dtypenp.float32) self._init_scenario() def step(self, action: int): # 动作闭合巡航保持目标速度跟车按 IDM 模型调整变道切换车道 info {} if action 0: self.speed min(self.speed 1.0, self.target_speed) elif action 1: # 简单 IDM根据前车间距调整加速度 gap self.front_gap desired_gap 2.0 self.speed * 1.0 acc 2.0 * (1 - (self.speed / self.target_speed) ** 4 - (desired_gap / max(gap, 0.1)) ** 2) self.speed np.clip(self.speed acc * self.dt, 0, self.target_speed) elif action 2: self.lane min(self.lane 1, 2) # 左变道 elif action 3: self.lane max(self.lane - 1, 0) # 右变道 # 更新前车/目标车道车辆相对关系简化按匀速假设推演 self.front_gap - (self.speed - self.front_speed) * self.dt self._update_adjacent_vehicles() terminated self.front_gap 0.5 # 碰撞判定 reward self._reward(action, terminated) obs self._get_obs() return obs.astype(np.float32), reward, terminated, False, info def reset(self, seed: Optional[int] None, optionsNone): super().reset(seedseed) self._init_scenario() return self._get_obs().astype(np.float32), {} def _init_scenario(self): self.speed 15.0 self.target_speed 30.0 self.lane 1 self.front_gap 50.0 self.front_speed 12.0 self.target_front_gap 60.0 self.target_front_speed 18.0 self.target_rear_gap 40.0 self.target_rear_speed 20.0 def _get_obs(self): return np.array([ self.speed, self.front_gap, self.speed - self.front_speed, self.target_front_gap, self.speed - self.target_front_speed, self.target_rear_gap, self.target_rear_speed - self.speed ], dtypenp.float32) def _reward(self, action: int, terminated: bool) - float: if terminated: return -50.0 r -0.01 # 时间惩罚 r 0.1 * abs(self.speed - self.target_speed) / self.target_speed if action in (2, 3): r - 0.5 # 变道惩罚 return r这段代码的逻辑并不复杂但有几个参数要单独说明。decision_freq在真实项目中不会设成 10 以下因为行为决策需要感知前车减速意图但训练阶段设成 5 到 10 可以大幅缩短回合长度让模型更快探索到变道收益。_reward里对速度偏移量用了绝对值这样即使速度高于目标也会被惩罚避免模型为了刷奖励而超速。front_gap初始值 50 米是一个偏保守的设定如果换成高速场景初始间距要按速度提高否则模型会把「远距离巡航」误学成「静止等待」。4.3 训练脚本与关键超参数使用 Stable-Baselines3 训练这个环境时我一般这样配置 PPOfrom stable_baselines3 import PPO from stable_baselines3.common.vec_env import DummyVecEnv, VecNormalize env DummyVecEnv([lambda: LaneChangeEnv(dt0.1, decision_freq10)]) env VecNormalize(env, norm_obsTrue, norm_rewardFalse) model PPO( MlpPolicy, env, learning_rate3e-4, n_steps2048, batch_size256, n_epochs10, gamma0.95, gae_lambda0.95, clip_range0.2, ent_coef0.01, verbose1 ) model.learn(total_timesteps500_000)gamma取 0.95 而不是常用的 0.99是因为决策任务通常只看未来 10 到 15 秒内的交互过大的 gamma 会让模型去优化 50 秒后的远期收益行为反而显得「犹豫」。ent_coef初始给 0.01如果训练过程中发现动作分布过早坍缩到一个动作可以上调到 0.05。VecNormalize在行为决策里默认只归一化观测不要归一化奖励否则 PPO 的价值网络会对奖励尺度失真。5. 安全约束、仿真评测指标与部署验证5.1 把安全约束写进强化学习奖励塑形还是硬约束行为决策模型训练完以后评价它好坏的第一件事不是看累计回报而是看安全指标。常见的做法是双重保险训练时在奖励里加碰撞惩罚推理时在动作层加一个规则过滤器。过滤器逻辑不复杂如果变道动作会导致目标车道后车距离小于安全阈值就退回巡航或跟车动作。这个阈值通常按下式计算min_gap self.speed * 1.2 5.01.2是时距系数5.0是车辆长度的余量。推理时把强化学习策略输出替换为安全动作称为 safety override。很多研究进展里强调的「强化学习 规则混合决策」工程上最落地的形态就是这样一个 override 层而不是把规则网络化。5.2 决策模型评测不要只看碰撞率评测行为决策模型行业主流看一组多维指标单独一个碰撞率说明不了问题。我一般固定五组指标做回归测试指标定义通过标准碰撞率碰撞回合数 / 总回合数0%平均决策频率实际决策次数 / 仿真时长不低于设定频率的 90%变道次数每次变道动作计数与场景难度呈合理关系平均速度完成任务的全程平均速度不低于自由流速度的 80%舒适度加速度变化率的 RMS 值小于 2.0 m/s³在这些指标里变道次数往往被低估。一个决策模型如果每分钟变道超过 3 次即使没有碰撞乘客体验也会很差而且说明奖励函数里的变道惩罚权重不够。5.3 从仿真到部署的验证流程仿真里收敛的模型不能直接上车。常见的做法是先在离线的真实驾驶日志上做行为分布对比计算策略动作与人类驾驶员动作的分布散度然后放到闭环仿真里跑回归最后才进入封闭场地。这里有一个频繁踩坑的点仿真环境里前车加速度通常假设为常数或按 IDM 生成但真实交通流里前车会有强烈的加加速变化。建议在仿真环境里给前车速度叠加一个高斯扰动幅度取 0.5 m/s² 到 1.0 m/s² 之间模型在这种扰动下仍然稳定才说明它对交互车辆的估计不是「记住训练分布」而是真正学会应对不确定性。6. 综述之外把策略训练引向可解释与可干预强化学习在行为决策上的落地卡点往往不在算法效果而在可解释性和可干预性。研究进展里提到的图强化学习、联邦深度强化学习都是「把模型变大」的方向但工程里更需要的是「把模型变透明」。一个实用的技巧是给行为决策模型加一个影子规则层。具体做法是在训练完成的模型旁边挂一个传统规则决策器每一轮决策后比较两者的动作。如果两者一致放心执行如果不一致把两者动作和当前状态记录到日志里。积攒一段时间后用这些不一致样本反查奖励函数里的权重配置。很多训练时的隐性错误比如变道惩罚过大、目标车道后车速度权重过小都是靠这种方法暴露出来的。另一个值得试的方向是基于模型的强化学习与规则前向推演结合用自车运动学模型把每个候选动作推演 3 秒把推演后的状态变成价值网络输入的一部分。这样价值网络不仅看当前状态还能感知动作后果模型对奖励函数的敏感度会明显降低。这个方法在工程里实现成本不高效果却接近「离线学习 在线微调」的组合。如果要进一步压榨训练效率可以在状态空间里加一个「真实动作历史」通道记录最近 5 秒实际执行过的动作序列。这让模型能区分「正在变道中」和「打算变道」避免在变道过程中反复决策也是解决策略抖动的一个低成本方案。类似地在训练时用固定的随机种子锁定场景序列可以让同一条代码在不同设备上跑出接近一致的训练曲线方便团队协作复现。本文还有配套的精品资源点击获取