引言:离散扩散 + 端到端驾驶 = 新范式?
2025-2026 年,端到端自动驾驶的路线之争愈演愈烈。主流阵营分为两派:
| 方案 | 代表 | 核心思路 | 痛点 |
|---|---|---|---|
| 自回归 (AR) | GPT-driver, VLA 系列 | 顺序 token-by-token 输出轨迹 | 串行解码慢,端侧只能跑小模型 |
| 连续 Diffusion | UniAD, DriveWM, PlanningDiffuser | 连续空间去噪生成轨迹 | anchor/goal 引入额外系统,破坏数据分布 |
理想汽车(Li Auto)的 ReflectDrive-2(CVPR 2026)选择了第三条路:离散扩散模型做端到端自动驾驶。
乍一看以为是 ReflectDrive 的升级版,但仔细研究后发现——这可能是对量产级端到端方案的全新思考。
本文将从建模选择、推理架构、训练策略、工程部署四个维度进行完整技术解析。
一、为什么选离散扩散?——从第一性原理出发
三条路线的本质对比
flowchart LR
subgraph AR["自回归 (AR)"]
direction TB
AR1[t₁: 输出 token 1]
AR2["t₂: 输出 token 2 ⬅️ 依赖 t₁"]
AR3["t₃: 输出 token 3 ⬅️ 依赖 t₁,t₂"]
AR1 --> AR2 --> AR3
AR_style["❌ 串行瓶颈
❌ 端侧小模型
✅ 探索成熟"]
end
subgraph ContDiff["连续 Diffusion"]
direction TB
CD1[连续噪声注入]
CD2[连续空间去噪 N 步]
CD3[输出连续轨迹坐标]
CD1 --> CD2 --> CD3
CD_style["⚠️ 需要额外 anchor 系统
⚠️ 打破数据分布规律
✅ 并行生成"]
end
subgraph DiscDiff["离散扩散 (本方案)"]
direction TB
DD1[Token 级掩码注入]
DD2[双向并行去噪 N 步]
DD3[输出离散 token 序列]
DD1 --> DD2 --> DD3
DD_style["✅ 全并行解码
✅ 统一词表方便预训练
✅ Token2Token 支持 AutoEdit
✅ RL 探索空间清晰"]
end
AR --- ContDiff --- DiscDiff离散扩散的五大优势
| # | 优势 | 对比 AR | 对比连续 Diffusion |
|---|---|---|---|
| 1 | 统一词表 | 同 | 所有输入(视觉/状态/导航)可离散化为统一 token → 信息交互自然、支持预训练任务 |
| 2 | 高效采样 | ❌ 串行 O(n) | ✅ 并行解码 O(1) 每步 |
| 3 | AutoEdit 天然支持 | ❌ 不支持 | ✅ Token-to-token 直接改写 |
| 4 | RL 友好 | 困难(序列信用分配) | ✅ 离散 action space,探索清晰 |
| 5 | 端到端 Scaling | 受限于串行解码 | ✅ 独立 Action Expert FFN,参数效率高 |
二、模型架构:0.8B 参数的紧凑设计
整体架构
flowchart LR
subgraph Input["多模态输入"]
CAM["三路环视相机
左前 / 正前 / 右前
各 2 个时间帧"]
NAV["导航指令 tokens
(文本编码后)"]
EGO["自车状态 tokens
速度 / 航向等"]
end
subgraph Encoder["视觉编码器 ViT (0.1B)"]
direction TB
V1[Patch Embedding]
V2[Transformer Blocks]
V1 --> V2
end
subgraph Backbone["掩码扩散语言模型 (0.7B)"]
direction TB
B1["Prompt Tokens
因果注意力 Causal Attention
⬆️ 支持 KV 缓存复用"]
B2["Trajectory Token 块
双向注意力 Bidirectional Attention
⬆️ 支持扩散去噪"]
B3["Action Expert FFN
隐层 4096→1024 精简
+ Action Head 输出层"]
B1 --> B2 --> B3
end
subgraph Output["输出"]
OUT["16 个离散 trajectory tokens
8 个航路点 × 2 坐标
(纵向 x + 横向 y)"]
end
CAM --> Encoder
Encoder --> Backbone
NAV --> Backbone
EGO --> Backbone
Backbone --> OUT
style Encoder fill:#e1f5fe
style Backbone fill:#fff3e0
style Output fill:#e8f5e9关键设计决策
注意力模式混合
模型在同一个 Transformer 中混合使用两种注意力机制:
- Prompt 部分(因果注意力):历史帧信息按时间因果传播 → 支持 KV Cache 复用 → 流式场景中前一帧计算结果可直接复用
- Trajectory 部分(双向注意力):轨迹 token 之间充分交互 → 扩散去噪需要全局上下文
Action Expert FFN 精简
标准 FFN 隐层维度为 4096,但 Action Expert 将其缩减至 1024:
这一精简在 Thor 芯片上将 FFN 延迟从 2.47ms 降至 0.95ms(2.6x 加速),且不显著影响精度。
三、离散扩散建模:数学框架
前向过程(Masking)
以概率 独立地将每个轨迹 token 替换为 [MASK]:
其中 是 mask ratio,从 (全 mask)逐步降低到接近 0。
去噪过程
双向 Transformer 根据多模态上下文(视觉特征 + 导航 + 自车状态 + 已恢复的轨迹 token)预测被遮蔽位置的原值:
损失函数:全位置交叉熵
关键设计选择:在所有位置(而非仅 mask 位置)计算损失:
这比仅对 mask 位置计算损失(如 LLaDA 采用的 加权)更稳定,因为它为未 mask 位置也提供了梯度信号,使预测分布更加连贯一致。
四、“决策-起草-反思”:三阶段推理范式
这是 ReflectDrive-2 最核心的创新——将人类"先定方向→写草稿→反复修改"的思维过程形式化为一个可微分的推理流程。
flowchart TB
subgraph Stage1["🔷 阶段一:决策 Decision"]
direction TB
GP["目标点后验 p(goal)
从 BEV 离散坐标中
top-k 采样 + NMS"]
GP --> SAMPLES["多个候选目标 tokens
每个代表一种行为意图:
保持车道 / 让行 / 超车 ..."]
end
subgraph Stage2["🔷 阶段二:起草 Drafting"]
direction TB
ANCHOR["固定目标 token 于轨迹末端
其余位置初始化为 [MASK]"]
ANCHOR --> DENOISE["少量并行去噪轮次 (3步)
每步提交最高置信度预测"]
DENOISE --> DRAFT["草稿轨迹
(蓝色:结构合理但细节粗糙)"]
end
subgraph Stage3["🔷 阶段三:反思/自动编辑 AutoEdit"]
direction TB
INPUT_EDIT["输入:具体轨迹 token(非 [MASK])
模型预测每个位置的替换 token"]
INPUT_EDIT --> COMMIT["置信度 Commit Mask
决定哪些位置需要更新"]
COMMIT --> EDITED["编辑后最终轨迹(绿色)
目标 token 始终不变
⬅️ 可迭代多轮"]
end
Stage1 -->|"选择一个目标"| Stage2 -->|"token-to-token 改写"| Stage3
style Stage1 fill:#e3f2fd
style Stage2 fill:#fff8e1
style Stage3 fill:#e8f5e9阶段一:决策 —— 目标点后验
每个目标点是离散 BEV 坐标对 ,固定为轨迹序列的最后一个航路点,作为行为锚点:
通过 NMS 去重后获得多样化候选,每种候选代表一种高层行为假设(超车/让行/变道等)。
阶段二:起草 —— 锚定式并行解码
选定目标后:
- 将目标 token 固定于轨迹末端(第 16 个 token 位置)
- 其余 15 个位置初始化为
[MASK] - 运行 3 轮并行去噪:每轮所有位置同时预测,取最高置信度结果 commit
阶段三:反思 —— AutoEdit
AutoEdit 是整个范式的灵魂。与传统 diffusion 的"迭代去噪"不同,AutoEdit 做的是 token-level 的就地改写:
关键特性:
- 输入是具体 token(不是 [MASK])→ 模型看到的是"当前方案"
- 逐位置评估是否需要改写 → 通过 commit mask 控制
- 目标 token 始终锁定 → 行为意图不被篡改
- 可迭代多轮 → 反复打磨直到收敛
sequenceDiagram
participant D as 起草器 Drafting
participant T as 轨迹 Tokens
participant E as 编辑器 AutoEdit
D->>T: 初始化 [goal, [MASK], ..., [MASK]]
loop 去噪轮次 × 3
D->>T: 双向预测所有 [MASK] 位置
T->>D: 提交最高置信度预测
end
Note over T: 草稿完成 (Draft)
loop AutoEdit 轮次 × 3
E->>T: 读取完整轨迹 token 序列
T->>E: 上下文 + 当前轨迹
E->>E: 逐位置预测替换 token
E->>T: 仅更新置信度超过阈值的位置
Note over T: 部分位置被改写
end
Note over T: 最终规划输出 ✓五、训练策略:从 SFT 到 RL 的联合优化
第一阶段:监督微调(SFT)
采用三重损失联合训练:
flowchart LR
subgraph Losses["三重联合损失"]
L1["𝓛_DLM
掩码扩散损失
全位置 CE loss
训练基础去噪能力"]
L2["𝓛_SAP
结构感知扰动损失
纵向缩放 + 横向旋转
训练从扰动恢复能力"]
L3["𝓛_field
可行驶区域场损失
距离变换代价场
对数屏障函数约束"]
end
L1 --> TOTAL["𝓛_total = 𝓛_DLM + λ_SAP·𝓛_SAP + λ_f·𝓛_field"]
L2 --> TOTAL
L3 --> TOTAL
style L1 fill:#e1f5fe
style L2 fill:#fff3e0
style L3 fill:#e8f5e91. 掩码扩散损失
标准的全位置交叉熵损失(见第三节定义),是训练的基础。
2. 结构感知扰动损失
专门为 AutoEdit 设计的监督信号。对专家轨迹施加两类物理合理的扰动,然后训练模型将其恢复:
纵向进度扰动(模拟超速/欠速):
沿弧长方向随机缩放轨迹点位置, 模拟激进/超速, 模拟保守/进度不足。
横向航向扰动(模拟偏航漂移):
在自车坐标系中旋转轨迹,模拟偏航和横向漂移。
3. 可行驶区域场损失
利用感知模块输出的可行驶区域(drivable area)构造距离变换代价场,直接在 logits 上施加空间惩罚:
其中 DAC 代价场定义为:
为像素到最近可行驶区域边界的距离。如果模型给不可行驶区域分配了高概率,代价场产生的大梯度会强制纠正。
总监督目标:
第二阶段:RL 联合优化 —— 核心突破
这是整篇论文最重要的贡献。传统方法中起草器和编辑器解耦独立优化:
flowchart TB
subgraph Traditional["传统解耦优化"]
direction LR
TD["起草器
token级损失优化"] <--> TE["编辑器
修正损失优化"]
TR["❌ 各自为战
❌ AutoEdit 增益仅 +0.3"]
end
subgraph RLOpt["RL 联合优化 (本文)"]
direction TB
RD["Rollout: 完整 决策→起草→编辑"]
RD --> RW["终端奖励 r = PDMS 分数"]
RW --> PG["策略梯度 ∇J(θ)
group-relative advantage"]
PG --> CB["信用回传至
起草阶段所有 token +
编辑阶段所有 token"]
end
Traditional -.-> RLOpt
style Traditional fill:#ffebee
style RLOpt fill:#e8f5e9为什么传统解耦不够?
当起草器和编辑器分别优化时:
- 起草器只管生成"看起来像专家"的草稿 → 但不知道编辑器能修正什么
- 编辑器只管"把草稿修得更像专家" → 但没有驾驶奖励方向的引导
结果:AutoEdit 的增益只有约 +0.3 PDMS,几乎可以忽略不计。
RL 联合优化的做法
将起草阶段的 token 转换和 AutoEdit 阶段的 token 转换拼接成一个完整的动作序列:
终端奖励(NAVSIM PDMS 闭环规划分数)只分配给编辑后的最终轨迹,然后通过 PPO 策略梯度 + group-relative advantage 回传至所有实际发生 token 变更的位置:
关键设计细节:
- Group-relative advantage: ,同一采样组内相对化,降低方差
- Token 变更指示器 :信用仅分配给实际被更新的 tokens,避免对"保持不变"的 token 产生虚假梯度
- PPO clip 机制:限制策略更新幅度,防止训练崩溃
- KL 正则项:约束 不偏离参考模型 (即 SFT 后的 checkpoint)过远
联合优化的涌现效应
| 效果 | 传统解耦 | RL 联合优化 |
|---|---|---|
| 草稿质量 | “看起来对就行” | 学会产出 可修正的草稿(编辑后得分 > 编辑前) |
| 编辑方向 | 降低 token 级不确定性 | 朝 驾驶奖励方向修正 |
| AutoEdit 增益 | ~+0.3 PDMS | +1.9 PDMS(6 倍+放大) |
这是从 89.1 → 91.0 PDMS 的核心提升来源,也是超越其他纯相机 VLA 方法的关键驱动力。
六、实验结果
主实验:NAVSIM Benchmark(完整对比)
| 方法 | 传感器 | NC↑ | DAC↑ | TTC↑ | Comf.↑ | EP↑ | PDMS↑ |
|---|---|---|---|---|---|---|---|
| UniAD | Cam | 97.8 | 91.9 | 92.9 | 100.0 | 78.8 | 83.4 |
| TransFuser | C&L | 97.7 | 92.8 | 92.8 | 100.0 | 79.2 | 84.0 |
| Hydra-MDP | C&L | 98.3 | 96.0 | 94.6 | 100.0 | 78.7 | 86.5 |
| DiffusionDrive | C&L | 98.2 | 96.2 | 94.7 | 100.0 | 82.2 | 88.1 |
| GoalFlow | C&L | 98.4 | 98.3 | 94.6 | 100.0 | 85.0 | 90.3 |
| AutoVLA | Cam | 98.4 | 95.6 | 98.0 | 99.9 | 81.9 | 89.1 |
| DriveVLA-W0 | Cam | 98.7 | 99.1 | 95.3 | 99.3 | 83.3 | 90.2 |
| ReCogDrive | Cam | 97.9 | 97.3 | 94.9 | 100.0 | 87.3 | 90.8 |
| ReflectDrive-2 | Cam | 97.3 | 98.1 | 92.5 | 100.0 | 89.4 | 91.0 🏆 |
EP(前进效率)= 89.4 是最大亮点,远超竞品(GoalFlow 85.0, ReCogDrive 87.3),说明离散扩散规划的轨迹在空间利用率上最优。纯相机输入全面超越 camera+LiDAR 的 GoalFlow。
AutoEdit 增益:RL 是放大器(核心发现 ⭐)
| 训练设置 | w/o AutoEdit | w/ AutoEdit | Δ PDMS | 增益倍数 |
|---|---|---|---|---|
| DLM only | 84.8 | 85.0 | +0.2 | — |
| DLM + DACF (field loss) | 87.2 | 87.3 | +0.1 | — |
| DLM + DACF + AutoEdit train | 87.7 | 88.0 | +0.3 | 基线 |
| DLM + DACF + AutoEdit + RL | 89.1 | 91.0 | +1.9 | 6.3x 🚀 |
监督训练下 AutoEdit 最多贡献 +0.3 PDMS;RL 联合优化后增益暴增 6.3 倍。这是从 89.1 → 91.0 的全部来源。
Best-of-6 Oracle:追平人类
| Setting | NC↑ | DAC↑ | TTC↑ | Comf.↑ | EP↑ | PDMS↑ |
|---|---|---|---|---|---|---|
| ReflectDrive-2 (single) | 97.3 | 98.1 | 92.5 | 100.0 | 89.4 | 91.0 |
| Best-of-6 oracle | 98.5 | 99.2 | 95.5 | 99.8 | 93.8 | 94.8 |
| Human reference | 100.0 | 100.0 | 100.0 | 99.9 | 87.5 | 94.8 |
94.8 PDMS = 人类水平。
消融实验:每个组件都有效
| 训练目标 | NC↑ | DAC↑ | TTC↑ | Comf.↑ | EP↑ | PDMS↑ | Δ |
|---|---|---|---|---|---|---|---|
| DLM only | 97.5 | 93.9 | 92.8 | 99.5 | 79.5 | 84.8 | baseline |
| + DACF (field loss) | 97.4 | 97.0 | 93.1 | 99.9 | 81.4 | 87.2 | +2.4 |
| + AutoEdit training | 97.8 | 96.7 | 93.6 | 99.9 | 82.2 | 87.7 | +0.5 |
| + RL over full rollout | 96.3 | 97.9 | 88.9 | 99.7 | 89.3 | 89.1 | +1.4 |
| + 推理时 AutoEdit(最终) | — | — | — | — | — | 91.0 | +1.9 |
注意:RL 阶段后 TTC 略有下降(88.9),但 EP 和整体 PDMS 显著提升——模型学会了用更高的前进效率补偿碰撞时间的小幅牺牲。
七、部署工程:NVIDIA Thor 上的 31.8ms 实时性
论文不仅在算法层面创新,更完成了芯片级的端到端验证。在 NVIDIAThor 芯片上通过五项系统性优化,将全步推理延迟从 45.0ms 压缩至平均 31.8ms/帧,满足 ≤33.3ms (30fps) 的实车要求。
flowchart TB
subgraph Optimizations["部署优化链路: 45.0ms → 31.8ms"]
direction TB
O1["① 共享前缀 KV 缓存复用
0.28ms → 0.08ms
加速 3.5×"]
O2["② 可变缓存回退与合并改写
14.7ms → 11.5ms
加速 1.28×"]
O3["③ Action Expert FFN 精简
2.47ms → 0.95ms
加速 2.6×"]
O4["④ CUDA Kernel 融合 token 更新
0.45ms → 0.06ms/步
加速 7.5×"]
O5["⑤ ASD 交替步解码
26.2ms → 7.6ms
加速 3.4×"]
end
O1 --> O2 --> O3 --> O4 --> O5
style O1 fill:#e3f2fd
style O2 fill:#e8f5e9
style O3 fill:#fff3e0
style O4 fill:#fce4ec
style O5 fill:#f3e5f5Action Expert FFN 精简的质量验证
一个值得注意的现象——轻量化反而改善了轨迹精度:
| 指标 | Original FFN (4096) | Action-expert FFN (1024) | Δ |
|---|---|---|---|
| meanSADE↓ | 1.710 | 1.539 | -0.171 ✅ |
| path-minFDE@20↓ | 0.167 | 0.145 | -0.022 ✅ |
| path-minFDE@40↓ | 0.427 | 0.346 | -0.081 ✅ |
| path-meanADE@80↓ | 0.462 | 0.406 | -0.056 ✅ |
隐层维度从 4096 砍到 1024,不仅没有降质,反而在多数轨迹指标上有所提升。这暗示了过大的 FFN 可能在小规模数据上引入了过拟合。
交替步解码(ASD):时间换空间的智慧
不需要每帧都运行完整的三阶段流程:
sequenceDiagram
participant F_N as 帧 N (全步帧)
participant F_N1 as 帧 N+1 (轻量帧)
participant F_N2 as 帧 N+2 (全步帧)
participant F_N3 as 帧 N+3 (轻量帧)
Note over F_N: 决策(1步) + 起草(3步) + 反思(3步)
F_N->>F_N: 完整三阶段推理
Note right of F_N: ⏱️ 45.0 ms
Note over F_N1: 上一帧规划 → 刚体变换 + 时间裁剪
F_N1->>F_N1: 仅 1+1 步短时 AutoEdit
Note right of F_N1: ⏱️ 18.6 ms
Note over F_N2: 决策(1步) + 起草(3步) + 反思(3步)
F_N2->>F_N2: 完整三阶段推理
Note right of F_N2: ⏱️ 45.0 ms
Note over F_N3: 上一帧规划 → 刚体变换 + 时间裁剪
F_N3->F_N3: 仅 1+1 步短时 AutoEdit
Note right of F_N3: ⏱️ 18.6 ms
rect rgb(232, 245, 233)
Note over F_N,F_N3: 平均: (45.0 + 18.6) / 2 = **31.8 ms/帧** ✓
endASD 的代价比想象中小得多:
| Setting | NC↑ | DAC↑ | TTC↑ | Comf.↑ | EP↑ | Overall | Δ |
|---|---|---|---|---|---|---|---|
| Full pipeline (baseline) | 79.51 | 76.99 | 96.27 | 88.52 | 75.13 | 83.70 | — |
| ASD (交替步解码) | 79.19 | 77.21 | 96.20 | 87.88 | 75.01 | 83.51 | -0.20 |
整体仅损失 0.20,DAC(可行驶区域合规性)甚至略有提升。轻量帧继承了全步帧的高质量规划并做保守更新。
性能汇总
| 指标 | 数值 |
|---|---|
| 平均延迟 (ASD) | 31.8 ms/帧 |
| 全步帧延迟 | 45.0 ms |
| 轻量帧延迟 | 18.6 ms |
| 总参数量 | ~0.8B (0.7B backbone + 0.1B encoder) |
| 目标平台 | NVIDIAThor |
| 实时性要求 | ≤33.3ms (30fps) |
| 达标? | ✅ 31.8 < 33.3 |
八、讨论与启示
为什么"自修正"之前效果不好?
自修正要真正发挥作用,仅训练一个编辑器远远不够。必须通过强化学习在完整的「起草 + 编辑」rollout 上联合优化,让起草器和编辑器在同一闭环奖励下协同进化。
这个结论的意义超出自动驾驶领域——它适用于任何包含"生成 + 修正"两阶段的系统:
| 领域 | 类似模式 | 启示 |
|---|---|---|
| 代码生成 | LLM 写代码 → Agent 修复 bug | 不要单独训修复器,要在完整执行链路上 RL 优化 |
| 文本写作 | 起草 → 编辑/润色 | 起草者应学会"留出可改进的空间" |
| 多模态推理 | 先回答 → 再自我校验 | 校验信号应反向指导初始回答的质量 |
离散扩散用于端到端的可行性论证
ReflectDrive-2 用 SOTA 结果证明了离散扩散在端到端自动驾驶中的可行性。相比 AR 和连续 Diffusion:
- Efficiency:并行解码 + ASD 交替步 → 31.8ms 实时
- Quality:RL 联合优化 → 91.0 PDMS SOTA
- Deployability:紧凑 0.8B 参数 + Thor 验证 → 量产可行
局限性与开放问题
- 纯相机输入的上限:91.0 PDMS 很强,但复杂天气/长尾场景可能仍需 LiDAR 融入
- 离散化的精度损失:坐标量化到离散 bin 可能损失精细控制能力
- RL 训练稳定性:联合优化起草+编辑的策略梯度方差较大,需精心调参
- 泛化到其他任务:离散扩散 + AutoEdit 范式能否迁移到机械臂操控、通用机器人等领域尚待验证
参考文献
- ReflectDrive-2: Reinforcement-Learning-Aligned Self-Editing for Discrete Diffusion Driving
- ReflectDrive (v1): 前作,首次将 self-editing 引入端到端规划
- NAVSIM: End-to-end autonomous driving benchmark
本文基于「自动驾驶之心」公众号文章及 arXiv 论文整理撰写。