TD3WD:离散动作辅助连续强化学习,解决自动驾驶直线行驶抖动

发布时间:2026/9/18 14:14:45
TD3WD:离散动作辅助连续强化学习,解决自动驾驶直线行驶抖动
简介这份文档面向自动驾驶决策方向的研究者与研究生聚焦端到端行为决策中强化学习探索效率低、动作不平滑等痛点提出融合离散动作的双延迟深度确定性策略梯度算法TD3WD。内容从基于规则与模仿学习的局限切入梳理A3C、DDPG、DQN等深度强化学习在车道保持、跟车等任务中的应用进而给出TD3WD的马尔可夫决策过程建模、Actor-Critic双Critic结构设计以及融合不同动作空间网络输出、预训练提取图像特征降低算力成本、改善连续控制动作平滑性的完整思路并在Carla仿真平台验证可行性。资源包为1个docx文档约290KB结构完整、公式与图示清晰适合作为算法复现、论文写作与仿真实验设计的参考。目前已有94人学习便于快速把握该方向的研究脉络与创新点。1. 为什么直线行驶反而成了连续动作强化学习的软肋做过端到端自动驾驶决策的人大多有个共同体验弯道、路口这些看起来复杂的场景训练出来的模型反而能应付真正让人头疼的是最简单的直线行驶。用 DDPG、TD3 这类输出连续动作的算法跑 Carla收敛之后车辆会在车道里小幅左右摆动方向盘转角一直在零附近抖。原因不复杂——连续动作空间里精确输出 0 这件事本身很难加上训练前期大量低回报经验堆在回放池里Actor 网络学不到直行就该不动方向盘这个先验。TD3WDTwin Delayed Deep Deterministic Policy Gradient with Discrete就是冲着这个矛盾来的。它在标准 TD3 的 Actor-Critic 结构上挂了一组离散动作网络Eval Q / Target Q用离散动作辅助连续动作探索训练前期让离散输出占较大权重随着迭代把权重衰减到 0最终完全交回 Actor。这套思路对做自动驾驶仿真、深度强化学习决策的工程师有直接参考价值尤其是那些卡在模型能跑但不够平滑阶段的团队。2. TD3WD 的网络结构与动作融合机制2.1 从 TD3 到 TD3WD多挂了什么网络标准 TD3 的结构是 1 组 ActorActor Target Actor加 2 组 CriticCritic1/2 Target Critic1/2双 Critic 取最小值抑制 Q 值过估计Actor 延迟更新。TD3WD 在此基础上增加了一组深度 Q 网络Eval Q 负责输出离散动作Target Q 负责输出对应的目标值。所有 Target 网络结构与对应的主网络完全一致。这里的关键设计是Eval Q 不是用来替代 Actor 的而是作为探索向导。离散动作空间只有 12 个组合数值变化幅度大在直线场景下可以直接输出转向盘转角为 0天然规避了连续网络在零点附近的抖动。代价是弯道场景下转向不够平滑所以它只在训练前期起主导作用。2.2 动作加权融合公式与权重衰减最终输出动作由连续动作和离散动作加权得到at α * aCt (1 - α) * aDt其中 α 是动作比重系数aCt 是 Actor 输出aDt 是 Eval Q 输出。初始 α 设为 0.6意味着训练开始时 Actor 占 60%、离散网络占 40%。随着训练迭代α 逐步增大到 1Eval Q 的贡献衰减到 0训练结束时动作完全由 Actor 输出。这个融合不只用在环境交互上。在 Target Actor 输出端原本 TD3 是加正态分布随机噪声来鼓励探索TD3WD 改成把 Target Q 网络输出作为噪声与 Target Actor 输出加权融合权重同样用 α。Actor 网络更新时也做同样的融合处理。收集经验时融合前后的动作都存进回放池——用 at 训练原 TD3 各网络用 aDt 单独训练附加的 Q 网络。2.3 各网络的损失函数与更新方式Critic 网络的损失函数沿用 TD3 的双网络取最小L1 (1/N) * Σ (Q(si, ai | θQj) - yi)^2 yi ri γ1 * min_{j1,2} Qj(si1, a | θQj)Actor 用确定性策略梯度更新延迟更新每更新 2 次 Critic 更新 1 次。Target 网络用软更新θQj ← τ * θQj (1 - τ) * θQj θμ ← τ * θμ (1 - τ) * θμEval Q 网络用独立的损失函数 L2Target Q 网络采用硬更新——每迭代一定次数直接把 Eval Q 的参数复制过去保证两者存在差异。网络输入维度隐藏层结构输出维度激活函数Actor / Target Actor状态向量256-256-128-643转向、油门、刹车reluCritic / Target Critic状态动作256-256-128-641Q值reluEval Q / Target Q状态向量256-2563离散动作relu注意所有子网络都是全连接层因为输入是特征编码向量而非原始图像。这一点和直接吃图像的端到端网络不同后面状态空间设计会解释原因。3. 状态空间、动作空间与奖惩函数的工程实现3.1 用预训练网络提取图像特征代替原始像素输入直接把 800×400 的 RGB 图像喂进全连接网络不现实计算量太大。TD3WD 的做法是用 Carla 官方提供的端到端模仿学习网络作为特征提取器把前方道路图像编码成特征向量 β再和车辆速度 v、上一时刻动作转向盘转角 ω、油门开度 t、刹车开度 b拼接成完整状态st {β, v, ω, t, b}这样做的直接好处是降低训练过程的算力成本——强化学习本身就要跑几千轮如果每轮都从原始像素开始前向传播训练时间会成倍增长。用预训练网络离线提取特征相当于把感知和决策解耦决策网络只负责在特征空间里学策略。3.2 12 组离散动作的设计逻辑离散动作空间的设计不是随便凑数而是按驾驶场景分类的。转向盘转角取 {0, ±0.3, ±0.6, ±1.0}油门和刹车取 {0.3, 0.6, 1.0} 三个级别。直行加速和减速各有 3 个级别转弯时为了避免速度剧烈变化所有转弯动作的油门统一设为 0.6用不同的转向盘数值表示转弯幅度# 12组离散动作定义 (转向盘转角, 油门开度, 刹车开度) discrete_actions [ (0, 0.3, 0), # a0: 直行低速 (0, 0.6, 0), # a1: 直行中速 (0, 1.0, 0), # a2: 直行高速 (-0.3, 0.6, 0), # a3: 左转小幅 (-0.6, 0.6, 0), # a4: 左转中幅 (-1.0, 0.6, 0), # a5: 左转大幅 (0.3, 0.6, 0), # a6: 右转小幅 (0.6, 0.6, 0), # a7: 右转中幅 (1.0, 0.6, 0), # a8: 右转大幅 (0, 0, 0.3), # a9: 刹车轻 (0, 0, 0.6), # a10: 刹车中 (0, 0, 1.0), # a11: 刹车重 ]连续动作空间则做归一化处理转向盘转角归一化到 [-1, 1]油门和刹车归一化到 [0, 1]。另外有个安全约束——当车速超过 8.5 m/s 时最大油门开度限制为 0.5防止车辆在高速下继续猛加速。3.3 奖惩函数速度奖励加安全惩罚奖惩函数分两部分速度奖励 rv 和安全惩罚 rsrv v * [1 - ωt^2 - (ωt - ωt-1)^2] rs -12 * (lol lor) rc rt rv rs速度奖励里v 是车速ωt 和 ωt-1 是当前和上一时刻的转向盘转角。这个设计同时奖励前进速度、惩罚大转向角和大转角变化率——后两项直接对应乘坐舒适性。安全惩罚里lol 和 lor 分别是超出车道线和马路边线的面积比rc 是碰撞惩罚发生碰撞时取 -100。终止条件设了三条连续 20 步不移动回报 -2、道路侵占比超过 0.2、发生碰撞。这三条都是为了在训练前期尽快跳出低回报区域避免回放池被大量无效经验占满。3.4 超参数配置与训练循环参数数值说明训练轮次数 E3000总训练轮次折扣系数 γ10.99Critic 折扣因子折扣系数 γ20.9Eval Q 折扣因子Actor 学习率 lrA0.0001Critic 学习率 lrC0.001Q 网络学习率 lrQ0.001初始动作比重 α0.6衰减到 1训练最大步数 Ns1000每轮上限经验回放池容量 M500000经验采集样本数 N256batch size软更新系数 τ0.001训练循环的核心逻辑每轮开始随机初始化仿真环境随机初始地点 随机天气与环境交互直到达到 1000 步或触发终止条件然后重新开始下一轮。每步交互时按 α 融合连续和离散动作输出把融合前后的动作都存入回放池采样 batch 训练各网络。4. Carla 仿真环境搭建与训练结果验证4.1 Carla 0.8.2 环境配置与传感器接入实验用的是 Carla 0.8.2 稳定版选了两个小镇地图 Town1 和 Town2双车道道路包含丁字路口和交叉路口。Town1 用于训练Town2 用于泛化测试。Carla 的 Python API 可以获取车辆实时速度、转向、加速度、坐标以及红绿灯和交通标志信息也支持自主添加 RGB 相机、激光雷达、景深传感器。import carla # 连接Carla服务器 client carla.Client(localhost, 2000) client.set_timeout(10.0) world client.load_world(Town01) # 获取蓝图并生成车辆 blueprint_library world.get_blueprint_library() vehicle_bp blueprint_library.filter(vehicle.*)[0] spawn_point world.get_map().get_spawn_points()[0] vehicle world.spawn_actor(vehicle_bp, spawn_point) # 添加前向RGB相机 camera_bp blueprint_library.find(sensor.camera.rgb) camera_bp.set_attribute(image_size_x, 800) camera_bp.set_attribute(image_size_y, 400) camera_bp.set_attribute(fov, 90) camera_transform carla.Transform(carla.Location(x1.5, z2.4)) camera world.spawn_actor(camera_bp, camera_transform, attach_tovehicle)相机参数里 image_size_x/y 设为 800×400 与状态空间设计一致fov 设为 90 度覆盖前方视野。相机安装在车辆前方 x1.5m、z2.4m 的位置模拟驾驶员视角。4.2 训练收敛对比TD3WD vs TD3 vs DDPG四种算法TD3WD、TD3、DDPG、DDPGWD在 Town1 上各训练 3000 轮统计三个指标轮次平均奖励每 10 轮取均值、轮次平均行驶距离、单步平均奖励。TD3 因为双 Critic 抑制了高估偏差收敛后各项指标都优于 DDPG。TD3WD 在 1750 轮左右完成收敛比 DDPG 的收敛速度快了约 30%收敛后的累计奖励、行驶距离和单步奖励全面超过其他三种算法。把融合动作的思想加到 DDPG 上得到的 DDPGWD同样超过了原始 DDPG 和 TD3说明这套融合机制不依赖特定算法有通用性。4.3 测试指标压线率、转角变化与碰撞次数训练完的模型在 Town1 上针对直线行驶、弯道转弯、穿过交叉路口、丁字路口转弯四个任务各测 10 轮评价指标是压线率、转角变化和碰撞次数。TD3WD 在四个任务中碰撞次数全部为 0压线率也基本为 0。和原版 TD3 相比平均压线率降低 74.4%平均转向盘转角变化降低 56.4%。DDPG 在直线行驶任务中压线率 0.6%、转角变化 0.41说明车辆确实在车道里摆动。TD3 虽然压线率为 0但转角变化 0.39摆动幅度依然偏大。TD3WD 的转角变化只有 0.09输出平滑度提升明显。4.4 泛化验证新天气与 Town2 环境为了验证泛化能力在 Town1 中选了训练时没见过的天气条件又在 Town2 新环境下各做一组测试。新天气下 DDPG 在直线行驶任务中压线率飙到 6.1%发生 2 次碰撞TD3WD 压线率 0碰撞 0。Town2 环境下 DDPG 在弯道转弯任务中压线率 7.3%而 TD3WD 只有 0.1%。这组数据说明 TD3WD 学到的不是对特定地图或天气的过拟合策略而是更本质的驾驶行为。离散动作网络在训练前期提供的探索引导让 Actor 网络在早期就接触到了更合理的动作分布避免了在低回报区域反复试错。5. 动作比重系数 α 的调参与训练稳定性技巧α 的衰减策略是 TD3WD 落地时最需要调的部分。原文设定初始 α0.6训练到 2000 轮时 α 达到 1之后 Eval Q 完全退出。如果 α 衰减太快离散网络的探索引导还没起作用就被关掉直线摆动问题会复现衰减太慢弯道场景下离散动作的粗糙转向会持续影响输出平滑度。我一般会按训练轮次线性衰减而不是固定步数切换def get_alpha(current_episode, total_episodes3000, alpha_start0.6): 动作比重系数线性衰减 alpha alpha_start (1.0 - alpha_start) * (current_episode / total_episodes) return min(alpha, 1.0) # 在训练循环中 for episode in range(total_episodes): alpha get_alpha(episode) # 环境交互时用 alpha 融合动作 action alpha * actor_action (1 - alpha) * discrete_action线性衰减的好处是每轮的变化量恒定不会出现某个阶段 α 突变导致策略震荡。如果训练轮次不是 3000 而是更少比如 1500 轮可以把衰减终点提前到 1000 轮左右给 Actor 网络留出足够的独立训练时间。另一个容易踩的坑是经验回放池的存储策略。TD3WD 要求把融合前后的动作都存进去用 at 训练 TD3 各网络用 aDt 训练 Eval Q。如果只存融合后的动作Eval Q 网络拿不到离散动作的监督信号训练会发散。实现时经验元组至少包含 (s, aC, aD, a_fused, r, s_next, done) 七个字段。验证训练是否正常收敛可以盯两个信号一是 Eval Q 网络的损失 L2 是否在前期快速下降然后趋于平稳如果 L2 一直震荡说明离散动作空间设计有问题二是 Actor 输出的转向盘转角在直线场景下的方差收敛后应该接近 0。如果方差始终降不下来检查 α 衰减是否太慢或者 Critic 学习率是否偏大导致 Q 值估计不稳。本文还有配套的精品资源点击获取