RAD-2 技术解析:生成器-判别器框架如何把扩散规划真正带进闭环强化学习
面向读者:希望把论文读成可落地的工程方案,并进一步理解 RAD-2 的核心设计为什么有效、当前开源代码实际承载了哪些关键机制,以及它和“只做扩散生成”或“直接对高维轨迹做 RL”这两条路线到底差在哪里。
参考:
- 论文(arXiv):https://arxiv.org/abs/2604.15308
- 论文 HTML:https://arxiv.org/html/2604.15308v1
- 项目主页:https://hgao-cv.github.io/RAD-2/
- 官方代码仓库:https://github.com/hustvl/RAD
备注:本文聚焦 RAD-2 的方法逻辑与工程实现思路,尽量按“问题定义 → 方法设计 → 代码映射 → 实验结论 → 工程启示”的顺序展开,而不是逐行复述公式。
另外需要提前说明:hustvl/RAD当前公开的是一套非常有价值的核心机制代码,重点覆盖 动作锚点构造、规划头、优势估计、RL 损失接口,但并不是论文完整训练系统的全部实现。因此,本文会把“论文完整设计”和“仓库已经开源的核心骨架”分开说清楚。
0. 导读:为什么 RAD-2 值得认真看
如果只用一句话概括 RAD-2,它最有价值的地方在于:
它没有把强化学习粗暴地直接压到整条高维轨迹上,而是先用扩散模型负责“生成多样候选”,再用 RL 训练出来的判别器负责“闭环重排和纠偏”。
这件事看起来像是把一个 planner 拆成两半,但它真正解决的是扩散式规划在闭环里最常见的三个老问题:
- 多模态候选会生成,但闭环不一定稳。
- 纯 imitation learning 会学到“像人”,却学不到足够强的负反馈。
- 直接对整条连续轨迹做 RL,动作空间太高维,奖励又太稀疏,训练极不稳定。
RAD-2 的回答非常明确:
- 让 diffusion-based generator 专注于覆盖多模态未来。
- 让 RL-based discriminator 专注于学习“哪条轨迹在闭环里更安全、更高效”。
- 再用 TC-GRPO、OGO 和 BEV-Warp 把这个闭环训练真正跑起来。
从论文摘要和实验部分给出的结果看,它的重要性至少体现在四点:
- 论文声称,相比强扩散规划基线,碰撞率下降了 56%。
- 在 BEV-Warp 闭环环境里,安全场景的 CR 从 0.533 降到 0.234,
Safety@1从 0.418 提升到 0.730。 - 在 photorealistic 3DGS benchmark 中,它拿到 0.250 的 CR,以及 0.723 / 0.644 的 Safety@1 / Safety@2。
- 在 Senna-2 open-loop benchmark 中,FDE / ADE / CR 也都继续刷新到 0.553 m / 0.208 m / 0.142%。
所以 RAD-2 不是“又一个扩散规划器”,而是一次很明确的方法重组:
生成负责表达能力,判别负责闭环质量,强化学习不再直接背负整个高维轨迹优化。
1. 核心判断:RAD-2 到底在解决什么问题
RAD-2 试图解决的,不是“怎么再造一个更强的生成器”,而是一个更基础的问题:
为什么扩散规划在 open-loop 看起来很好,但一到 closed-loop 交互场景里,就经常不够稳、不够敢,也不够会纠错?
论文给出的判断非常清楚:
- 扩散模型擅长拟合复杂的多模态未来分布。
- 但它对真实驾驶数据里的噪声、长尾、分布不均衡很敏感。
- 如果训练只靠 imitation learning,它得到的是“贴近专家分布”的能力,而不是“知道哪些行为在闭环里会出事故”的能力。
- 一旦想用 RL 去补这个缺口,又会立刻遇到另一个难点:轨迹是高维连续输出,稀疏标量奖励很难做有效 credit assignment。
这其实是一个自动驾驶里非常现实的矛盾:
- 你想保留扩散模型的多样性。
- 你又希望系统能从闭环反馈里学到明确的负反馈和长期收益。
- 但你不能把 PPO/GRPO 那一套语言模型微调思路,原封不动搬到整条连续轨迹上。
RAD-2 的方法,本质上是在重新切分这个问题的责任边界:
- Generator 负责提出“可能的未来”。
- Discriminator 负责学习“闭环里真正更好的未来”。
- RL 主要优化判别和重排,而不是直接生成整条轨迹。
从这个角度看,RAD-2 解决的不是单一模块性能,而是一个训练范式问题:
如何让扩散式多模态规划,真正进入可扩展、可闭环、可强化学习的工程训练体系。
2. 方法总览:从“直接优化轨迹”到“生成 + 重排”的解耦框架
RAD-2 的整体框架可以压缩成三步:
- 给定当前观测,生成器先采样出一组多样候选轨迹。
- 判别器再对这些候选做打分与重排。
- 系统执行得分最高的轨迹,并把闭环反馈继续用于优化判别器和生成器。

图 1:官方仓库 README 中给出的核心框架图。它把 RAD 与 RAD-2 放在同一条技术主线上来看,重点强调的正是“闭环 RL 训练 + 规划头 + 动作锚点 / 反馈回流”这套核心机制。对本文而言,这张图最适合作为全文的总览入口。
如果把候选轨迹记作 τ1:M\tau_{1:M}τ1:M,它的核心流程可以粗略写成:
τ1:M∼Gθ(ot),si=Dϕ(ot,τi),τ^=argmaxisi \tau_{1:M} \sim \mathcal{G}_{\theta}(o_t), \qquad s_i = \mathcal{D}_{\phi}(o_t, \tau_i), \qquad \hat{\tau} = \arg\max_i s_i τ1:M∼Gθ(ot),si=Dϕ(ot,τi),τ^=argimaxsi
这里最关键的不是公式本身,而是它背后的职责切分:
- 生成器只负责“提出候选”,不直接承受闭环稀疏奖励对整条高维轨迹的冲击。
- 判别器只负责“在候选里选更好的一条”,它优化的是一个相对低维、结构更稳定的 scoring 问题。
- 最终被 RL 直接塑形的,是排序能力和偏好能力,而不是从零构造整条轨迹的能力。
这也是论文 Figure 1 和 Figure 2 最想强调的主线:
RAD-2 既不同于固定词表打分式 planner,也不同于纯 diffusion planner,而是把两者的优点拼成一个闭环系统。
从工程角度理解,这种解耦带来了两个直接收益:
- 优化更稳:稀疏奖励不再直接作用于整条连续轨迹空间。
- 搜索更强:只要生成器候选集足够好,判别器就可以在 test-time 继续利用更多候选,形成推理时 scaling。
论文在 4.5 节还专门说明了这一点:模型训练时使用 M=32 个候选,但在推理时扩大候选池,EP@1.0 可以从 0.667 继续提升到 0.814。这说明它并不是一个“只能按训练时固定算力工作”的规划器。
3. 仓库阅读路径:代码应该从哪里开始看
从 https://github.com/hustvl/RAD 当前公开的结构看,仓库本身更像是 RAD / RAD-2 核心规划与 RL 机制的最小可移植实现,而不是完整训练平台。
核心文件很少,但每个都很关键:
generate_action_anchor.py:生成并筛选动作锚点。planning_head.py:规划头的 IL / RL 损失接口与推理逻辑。compute_advantage.py:把闭环 rollout 转成 advantage 和指标。utils.py:RL 微调时的归一化层冻结辅助函数。data/*.npy:离散动作锚点、yaw、mask 等预计算结果。
如果第一次读这个仓库,建议按下面顺序进入:
- 先看
README.md,明确仓库覆盖的是哪一层机制。 - 再看
generate_action_anchor.py,理解动作空间是如何被离散化的。 - 然后看
planning_head.py,理解规划头如何同时承载 IL 和 RL。 - 最后看
compute_advantage.py,理解闭环反馈如何变成可训练的信号。
如果用一句话概括这个仓库的阅读主线,那就是:
先看动作空间怎么设计,再看闭环反馈怎么回流到规划头。
这也正是 RAD 系列工作的工程重点。
4. 核心设计一:为什么 RAD-2 要用“扩散生成器 + RL 判别器”
RAD-2 最重要的结构判断,是不再直接把 RL 施加到整条轨迹生成过程,而是通过 generator-discriminator 解耦来稳定优化。
4.1 生成器负责多模态,不负责吞下全部 RL 难度
论文第 3.1.1 节里,生成器是标准的 diffusion-style multimodal planner:
- 输入当前观测 oto_tot。
- 先做 scene encoding,融合 BEV 特征、静态地图、动态 agent 和导航输入。
- 再输出一组多模态未来轨迹候选。
这意味着生成器的职责非常纯粹:
- 保留复杂分布表达能力。
- 维持候选多样性。
- 提供足够大的可搜索空间,让后面的判别器有东西可选。
4.2 判别器负责“闭环质量”的学习
论文第 3.1.2 节里,判别器的作用不是做二分类,而是做 trajectory reranking:
- 接收场景表征和候选轨迹。
- 学习一个与长期驾驶质量相关的分数。
- 让安全、效率、舒适性更好的候选在排序中靠前。
这一步非常关键,因为它把“困难的连续控制 RL”改写成了“候选之间的偏好学习”。
从工程角度看,这个改写的价值在于:
- 标量奖励终于有了更稳定的承载体。
- 判别器只需要学“谁更好”,而不是直接生成整个未来。
- 扩散生成器和 RL 判别器可以各自沿自己更擅长的方向优化。
所以 RAD-2 的核心不是“扩散 + RL 简单拼接”,而是:
让生成和选择分工,避免高维轨迹直接承受 RL 的不稳定性。
5. 核心设计二:TC-GRPO 为什么是这篇论文真正的训练关键
如果说 generator-discriminator 是结构层面的拆分,那么 Temporally Consistent Group Relative Policy Optimization,简称 TC-GRPO,就是训练层面真正把这件事跑通的关键。
论文为什么要单独强调 temporal consistency?原因很简单:
- 自动驾驶是连续决策系统。
- 如果每一帧都独立采样、独立优化,很容易得到行为跳变很大的 rollout。
- 一旦行为前后不一致,奖励归因就会变得更乱,RL 会更难学。
因此 RAD-2 在 rollout 阶段引入了一个非常重要的策略:latched execution / trajectory reuse。
也就是:
- 不是每一步都彻底重新决定。
- 选中的轨迹会在一个固定 horizon 内复用。
- 这样连续多个决策步之间就保留了行为上下文。
论文 4.5 节对这个设计做了直接消融:
- 执行 horizon Hreuse=8H_{\text{reuse}}=8Hreuse=8 时,安全性和效率取得了最平衡的结果。
- 太短,credit assignment 不稳定。
- 太长,反应性又会下降。
这和自动驾驶本身的物理属性是吻合的:
车不是语言 token,它的动作必须在时间上连续。
TC-GRPO 的第二个关键点,是 group relative 的优化方式。论文进一步说明,在当前设定下:
group size = 4时效果最好。- 更大的 group 虽然可能略微提高效率指标,但安全性会开始回落。
所以 TC-GRPO 不是把 GRPO 换个名字,而是把它做了两层真正贴近驾驶问题的改造:
- 时间一致性约束,减轻 credit assignment 噪声。
- 组内相对优化,让判别器学会更稳定的候选排序。
6. 核心设计三:OGO 到底在优化什么
RAD-2 的另一个关键设计是 On-policy Generator Optimization,OGO。
它要解决的问题是:
如果判别器越来越会选,但生成器始终停留在旧分布上,那么系统上限还是会被候选质量卡住。
所以 RAD-2 不只是训练判别器,也要逐步把生成器往“高回报轨迹流形”上推。
但这里论文非常克制。它没有直接说“对整条轨迹做 RL fine-tuning”,而是强调:
OGO 把闭环反馈转成结构化的纵向优化信号,再逐步推动生成器分布迁移。
这背后的方法论很重要:
- 轨迹是高维对象,不能硬上纯标量 RL。
- 但某些子结构,比如 longitudinal behavior,更容易承接奖励。
- 因此 generator optimization 要做成“结构化、有约束的 on-policy 更新”,而不是全空间暴力优化。
论文 4.5 节的训练管线消融也说明了这一点:
- 只做 IL,系统有先验,但闭环安全性不够强。
- 引入 OGO 后,碰撞率能从 0.533 降到 0.287,说明生成器分布确实被往更安全方向推了。
- 再加上判别器 RL 训练,性能还能继续提升。
- 最终 generator 和 discriminator 联合优化,得到 0.234 的最低碰撞率 和 0.730 的 Safety@1。
换句话说,OGO 的作用不是替代判别器,而是:
让生成器产出的候选本身越来越“可选”,从源头提高判别器的上限。
7. 核心设计四:BEV-Warp 为什么是 RAD-2 能做大规模 RL 的前提
很多 RL for driving 方法的问题,不在算法本身,而在环境跑不动。
RAD-2 专门提出 BEV-Warp,就是在解决这个现实瓶颈。
论文第 3.2 节给出的核心思路是:
- 闭环环境不再每一步都回到图像渲染层。
- 而是直接在 BEV feature space 里做状态推进。
- 通过 ego pose 和 reference pose 之间的变换,构造 warp matrix。
- 用 bilinear interpolation 把下一时刻的 BEV 特征对齐到当前模拟状态。
形式上,论文写成:
Bt+1=W(Bt+1ref,Mt+1) \mathcal{B}_{t+1}=\mathcal{W}\left(\mathcal{B}^{\text{ref}}_{t+1}, \mathbf{M}_{t+1}\right) Bt+1=W(Bt+1ref,Mt+1)
这里真正重要的是它的工程含义:
- 不需要每一步重新做昂贵图像级渲染。
- 保留了 BEV 表征的空间等变性。
- 把闭环训练吞吐量真正拉起来。
如果没有这一层环境加速,RAD-2 前面的 TC-GRPO、OGO 再漂亮,也很难支撑大规模策略迭代。
论文也明确承认了 BEV-Warp 的边界:
- 它特别适合显式 BEV-centric 的系统。
- 对纯像素输入或统一 latent 表征架构,未必能直接套用。
- 将来可能需要过渡到更一般的 latent world model。
这点也很值得工程上重视:
RAD-2 并不是说“feature warping 是终局”,而是在当前 BEV 规划体系下找到了一个非常现实的可扩展闭环训练方案。
8. 代码映射:官方仓库把哪些论文思想真正落到了代码里
这里是本文最需要小心的地方。
RAD-2 论文讲的是完整 generator-discriminator 闭环系统;而当前 hustvl/RAD 仓库开源的,是其中最关键、最容易移植的一层 RL 规划骨架。
所以代码和论文并不是“逐模块一一完全对齐”,而是“把最核心的工程机制开放出来了”。
下面分别看。
8.1 generate_action_anchor.py:动作空间先离散化,RL 才有稳定落点
这个脚本展示了一个非常明确的工程判断:
在真实系统里,闭环 RL 往往不会直接对任意连续动作裸优化,而是先把局部动作空间结构化。
脚本做了几件事:
- 用运动学自行车模型
update_vehicle_state()模拟车辆前向运动。 - 遍历大量线速度
v和转角deg组合,生成稠密轨迹库。 - 再把这些稠密轨迹和一个
61 x 61的目标网格做匹配。 - 最终得到
3721个离散动作锚点,以及对应的 yaw 和 mask。
从文件名 traj_anchor_05s_3721.npy 也能看出来,这些锚点是一个 短时域动作词表。
脚本里每条轨迹从 0.01s 积分仿真后再每 10 帧采样一次,最终保留 6 个时刻点,对应一个很典型的局部规划控制窗口。
它的价值在于:
- 给规划头提供离散、可学习、可约束的动作空间。
- 通过 mask 去掉物理上不可行的动作。
- 为后续 RL 提供一个更稳定的 policy parameterization。
这和论文里“不要直接把稀疏奖励扔进全高维轨迹空间”的思路,是一致的。
8.2 planning_head.py:IL 和 RL 在同一个规划头里接起来
planning_head.py 是当前仓库里最值得仔细看的文件。
它至少说明了三件事:
- IL 和 RL 是共用同一个 planning head 的。
- 动作不是直接回归连续轨迹,而是离散到
x_anchor和y_anchor两个轴上。 - RL loss 不是一个单一标量,而是按不同风险来源拆分后再汇总。
这个设计很像一种更工程化的“结构化策略头”:
il_loss()会先在锚点库里找到最接近 GT 的动作,然后分别对x和y分类。val()会把x/y两个离散分布组合成联合动作概率,再映射回具体 anchor。compute_rl_loss()则会把闭环反馈转成对不同动作方向的加权更新。
这里最值得强调的是:
虽然论文 RAD-2 的生成器是 diffusion-based planner,但开源代码里公开出来的,是 更靠近策略头 / 判别头 / RL 接口层 的实现。
也就是说,仓库不是在复刻论文所有前端,而是在把“RL 怎么接进规划头”这件最关键、也最容易复用的部分单独抽出来。
8.3 compute_advantage.py:闭环反馈不是一句 reward,而是拆成多个优势项
这个文件很好地体现了 RAD 系列工作的另一个工程特点:
闭环训练信号必须结构化。
脚本里并不是只算一个总 reward,而是把反馈拆成:
dynamic_collision_advantagestatic_collision_advantagedistance_deviation_advantageangle_deviation_advantage
同时它还会记录:
first_collision_positionfront_collision / back_collisionexpert_timestamplongitudinal_jerk_meanyaw_jerk_mean
这说明仓库设计者很明确地把 RL 目标拆成了多个更可解释的部分:
- 动态碰撞处理什么。
- 静态碰撞处理什么。
- 横向偏移处理什么。
- 航向偏差处理什么。
- 舒适性怎么度量。
从论文角度看,这与 OGO 和判别器训练背后的思想是一致的:
不要让一个单一稀疏奖励承担全部学习责任,而是尽可能把它拆回到有结构的驾驶语义上。
8.4 utils.py:RL 微调时,稳定性往往来自这些小细节
utils.py 只有一个函数 set_bn_eval(),但它恰好说明了 RL 微调里经常被忽略的一点:
- 规划头接到现有大模型上时,归一化层统计量很容易在 RL 阶段漂掉。
- 一旦漂掉,训练会非常不稳定。
- 因此代码里递归地把各种 normalization layer 切到 eval 模式,只放开少量需要训练的分支。
这不是论文 headline 级创新,但它是典型的“系统真正能训起来”的工程细节。
9. 一个重要观察:开源代码里的 x/y 解耦,其实很像 OGO 的工程化版本
这一点论文没有用完全相同的措辞写,但从当前开源代码看,我认为可以做一个比较稳妥的工程推断:
仓库里把动作拆成 x_anchor 和 y_anchor 两个方向,并且对不同优势项分别施加在不同方向上,本质上是在把闭环稀疏奖励转成“更结构化、更可控”的子空间优化。
比如在 compute_rl_loss() 里可以看到:
- 动态碰撞更强地影响
x方向的有效动作集合。 - 航向偏差和横向偏移更强地影响
y方向的有效动作集合。 - 前碰 / 后碰还会进一步决定是鼓励减速还是鼓励加速。
这和 OGO 的方法精神非常接近:
- 不在整个轨迹空间上直接乱推。
- 而是先识别“这类闭环失败更该由哪个控制子维度修正”。
- 再把优化信号变成有方向感的更新。
这里我需要明确说一句:
这段对应关系是根据论文方法和开源代码设计做的工程层推断,不是论文原文逐句声明的等价映射。
但从实际落地视角看,这种解释是很有帮助的,因为它让人更容易理解为什么代码里的优势项设计不是随便拍脑袋写的。
10. 训练闭环应该怎么理解:论文系统与开源代码如何拼起来
如果把 RAD-2 的完整训练流程和当前开源仓库拼在一起看,大致可以理解成下面这条主线:
- 先用 IL 预训练 generator / planning head,拿到一个能基本开车的先验。
- 在闭环环境里 rollout,论文里对应的是 BEV-Warp,仓库 README 也明确让用户自己准备 closed-loop environment。
- 把 rollout 数据转成 advantage 和指标,这一步在仓库里就是
compute_advantage.py的职责。 - 更新判别器或规划头,利用 collision / deviation / value 等信号训练排序能力与策略偏好。
- 周期性做 generator optimization,把生成分布往高回报区域迁移。
论文第 4.2 节还给了一个很关键的训练节奏:
- 判别器和生成器不是同频更新。
- 每当缓冲区写入新的 rollout batch,就先更新判别器。
- 当 buffer 被 8 个新 batch 完整刷新之后,再做一次 generator optimization。
- 也就是大约 8:1 的 discriminator / generator 更新频率。
这背后反映的是一个很典型的系统平衡:
- 判别器需要更快吸收闭环反馈。
- 生成器的分布迁移必须更慢、更稳。
- 两者共用 rollout,但不能同样激进。
这也解释了为什么仓库更优先开源的是 planning head 与 advantage 这类模块。
因为真正难复用的不是论文里的抽象框图,而是“闭环数据到底怎么转成稳定更新信号”。
11. 实验结果:RAD-2 的提升到底体现在哪里
RAD-2 的实验不是只在一个指标上“刷高一点点”,而是同时覆盖了闭环安全、闭环效率和 open-loop 轨迹质量。
11.1 BEV-Warp 闭环环境
论文第 4.3 节给出的数字很有说服力。
在 512 个 safety-oriented 场景和 512 个 efficiency-oriented 场景上:
- 安全场景中,
CR从 0.533 降到 0.234。 AF-CR从 0.264 降到 0.092。Safety@1 / Safety@2从 0.418 / 0.281 提升到 0.730 / 0.596。- 效率场景中,
EP-Mean从 0.970 提升到 0.988。 EP@1.0 / EP@0.9从 0.516 / 0.894 提升到 0.736 / 0.984。
这些数字说明它不是靠“更保守”来换安全,而是在效率上也继续提升了。

图 2:论文 Figure 11,闭环安全交互的定性对比。左列
Reference Input是前视相机画面;中列Baseline和右列Ours都分别给出了 warped BEV 输入以及对应的感知与规划输出。从同一个Start Frame出发,两个模型在后续交互里逐渐分化:到Keyframe 1,Baseline 没有及时化解风险并最终发生碰撞,而 RAD-2 已经表现出更主动的减速和避险倾向;到Keyframe 2,在威胁解除后,RAD-2 又能恢复稳定导航,而不是一直维持过度保守状态。
这张图很适合放在结果部分,因为它把前面的定量指标翻译成了更直观的行为差异:
- Baseline 的问题不是“看不见风险”,而是没有把风险足够早地转化成有效控制动作。
- RAD-2 的优势也不是简单地“全程更慢”,而是更早、更有针对性地减速处理冲突。
- 风险消失后,RAD-2 还能重新回到正常通行状态,这说明它学到的不是单一保守策略,而是更完整的闭环交互能力。
11.2 3DGS photorealistic benchmark
论文 Table 2 给出的结果说明,RAD-2 在更逼真的环境里依然成立:
CR = 0.250Safety@1 = 0.723Safety@2 = 0.644
这意味着它不是只在 feature-level environment 里成立,而是在 photorealistic 闭环评估中也有明显收益。
11.3 Senna-2 open-loop benchmark
RAD-2 并没有因为强调闭环 RL 而牺牲 open-loop 轨迹质量。
论文 Table 3 给出的结果是:
FDE = 0.553 mADE = 0.208 mCR = 0.142%
相较于前一阶段最强方法,动态碰撞和静态碰撞也都进一步下降。
这很关键,因为它说明:
RAD-2 不是“闭环更稳但轨迹更糙”,而是在候选分布质量和闭环排序能力两边都在进步。
12. 消融实验最值得带走的几个结论
RAD-2 的消融实验非常有价值,因为它没有把贡献都堆在 headline 里,而是把训练设计为什么有效一步步拆开了。
12.1 联合优化比两阶段或单边优化更能扩展
论文第 4.4 节说明:
- 只优化 discriminator,提升有限。
- 先训 generator 再训 discriminator 的两阶段方案会更好一些。
- 但 generator 和 discriminator 协同联合优化 的 scaling 最好,数据利用率也最高。
这说明 RAD-2 不是简单的“先生成再打分”,而是一个真正的 co-adaptation 系统。
12.2 H_reuse = 8 是一个很好的平衡点
论文 Table 5 表明:
- 过短的 reuse horizon,时间一致性不够。
- 过长的 reuse horizon,策略反应性下降。
8在稳定 credit assignment 和实时反应之间比较平衡。
12.3 低方差 clip 过滤真的有用
论文 Table 6 和 Figure 8 说明:
- 奖励方差很低的片段,训练价值通常有限。
- 把这些不够 informative 的 clip 过滤掉后,收敛更稳。
- 同时效率指标还能提升,而不会明显伤害安全性。
12.4 判别器初始化很重要
论文 Table 7 给出的结论很直接:
- 用 pre-trained planning head 初始化 discriminator,显著好于随机初始化。
- 这说明判别器并不是一个可以随便冷启动的小模块。
- 它需要已有规划表示提供结构先验。
12.5 group size = 4 最稳
论文 Table 8 给出的结论是:
- group 太小,相对归一化不足。
- group 太大,安全性会开始波动。
4是当前设定下最均衡的选择。
12.6 熵正则不能省
论文 Table 9 和 Figure 9 说明:
- 如果不加熵正则,轨迹分数分布会快速塌缩。
- 一旦分数接近 0/1 极端化,RL 会变得不稳。
- 熵项的作用不是锦上添花,而是维持 discriminator 学习空间。
这些消融共同说明一件事:
RAD-2 的成功不只是框架名字好听,而是它认真处理了闭环 RL 在驾驶里最容易翻车的每一个训练细节。
13. 横向看:RAD-2 和纯扩散规划路线到底差在哪里
如果把 RAD-2 和典型的 diffusion-based planner 放在一起看,差异可以概括成三点。
13.1 纯扩散规划更像“会生成”,RAD-2 更像“会选且会纠偏”
纯扩散路线的优势是:
- 对多模态未来建模自然。
- 候选生成能力强。
但它的弱点也明显:
- 闭环负反馈不够直接。
- 容易生成偶发性低质量轨迹。
- 单靠 imitation 学不到足够强的长期安全偏好。
RAD-2 则把“会生成”和“会闭环排序”拆开,让两者各自学擅长的事情。
13.2 纯 RL 直接优化轨迹太难,RAD-2 选择绕开这件事
直接对整条连续轨迹做 RL 的问题是:
- 动作维度太高。
- 即时奖励与具体轨迹细节之间相关性太弱。
- credit assignment 极难。
RAD-2 没有硬刚这个难题,而是通过 discriminator 把问题重写成候选偏好学习。
13.3 RAD-2 真正强的地方是“训练系统化”
很多方法论文会把重点放在 planner 本身,但 RAD-2 更像是:
- 一个生成器设计。
- 一个判别器设计。
- 一个 temporally consistent 的 RL 优化策略。
- 一个高吞吐闭环环境。
四者一起组成的系统。
所以它的提升,不只是某个网络结构更强,而是闭环训练链条更完整。
14. 读代码时最容易迷路的几个点
如果你后面要自己深入这个仓库,我建议特别注意下面几个容易误判的地方。
14.1 不要把当前仓库当成“论文全量训练代码”
当前 hustvl/RAD 更像核心机制开源:
- 有 planning head。
- 有 action anchors。
- 有 advantage 计算。
- 有 RL 损失接口。
但没有把论文中所有环境、模型、训练基础设施完整展开。
14.2 planning_head.py 展示的是“怎么接 RL”,不是完整前端感知系统
它更接近一个可插拔 head:
- 适合替换现有端到端模型的规划头。
- 展示 IL / RL 如何共存。
- 不是整篇论文所有模块的全集。
14.3 compute_advantage.py 是示例脚本,但设计思想非常真实
文件里有很多模拟数据和演示代码,但真正值得学的是:
- rollout 怎么定义 game over。
- 不同失败模式怎么拆 advantage。
- 指标和训练信号怎么共同产出。
14.4 锚点空间不是“落后做法”,而是实际部署里很有效的稳定器
很多人看到离散动作锚点会本能觉得它不如连续生成“高级”。
但在闭环 RL 里,锚点化动作空间常常反而是更稳、更可控、更好调的工程选择。
RAD 仓库把这件事做得很明确。
15. 总结:关于 RAD-2,最值得带走的判断
如果把整篇论文和当前开源代码一起读完,我觉得最值得带走的不是某个单点模块,而是下面这几个判断。
- 扩散规划的问题不只是“生成得不够好”,而是“缺少闭环里的负反馈和长期偏好”。
- 自动驾驶里的 RL 不应该直接压在整条高维轨迹上,而应该先把问题重写成更稳定的子问题。
- RAD-2 的 generator-discriminator 解耦,正是在做这件事。
- TC-GRPO 解决的是时间一致性和 credit assignment。
- OGO 解决的是生成分布如何逐步往高回报区域迁移。
- BEV-Warp 解决的是大规模闭环训练到底怎么跑得动。
- 当前开源代码虽然不是完整论文系统,但已经把最关键的工程骨架公开出来了:动作锚点、规划头、优势估计和 RL 更新接口。
如果再把这些判断压缩成一句话,那么就是:
RAD-2 的真正贡献,不只是把扩散和 RL 拼在一起,而是给出了一条更现实的闭环训练路径:让生成器负责多样性,让判别器负责闭环质量,再用可扩展环境把两者真正联合优化起来。
16. 后续阅读建议
如果你接下来想继续深入,我建议按这个顺序读:
- 先重读论文第 3.1、3.3、4.5 节,抓住 generator、TC-GRPO、OGO 的主线。
- 再看仓库里的
planning_head.py和compute_advantage.py,把“结构化训练信号”这件事读透。 - 如果你已经在做现有端到端驾驶栈改造,可以优先考虑把
planning_head.py的接口思想迁移到自己的 head 里。 - 如果你更关心仿真闭环训练平台,则应该重点研究论文里的 BEV-Warp 思路,以及它对 BEV-centric 架构的依赖边界。
最后,如果把 RAD-2 当作一篇“怎么把闭环 RL 真正接进扩散规划”的论文来看,它是非常值得反复读的。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)