扩散模型如何赋能端到端自动驾驶轨迹规划:干净轨迹与L2损失机制解析
2026/9/15 4:22:40 网站建设 项目流程

说实话,第一次在端到端自动驾驶的框架里看到扩散模型(diffusion model)规划器时,我最大的疑惑不是它效果好不好,而是两个看起来非常基础的问题:为什么它输出的轨迹那么“干净”?以及为什么训练损失要选L2而不是 L1、不是正则化、不是别的度量?这两个问题问的人很多,但我发现能把来龙去脉讲清楚的人很少。这篇文章就把我自己的理解、跑实验的一些经验,以及复现这类模型时踩过的坑一起梳理出来。

先说清楚这篇在聊什么:围绕 diffusion model 做自动驾驶 End-to-End 轨迹规划的核心机制,回答“为什么能输出干净轨迹”和“为什么用L2”这两个灵魂拷问,顺带讲清楚扩散模型训练目标、采样策略、损失函数之间的关系。适合正在复现 diffusion planner、或者想搞清楚生成模型在规划里到底怎么起作用的人看,能帮你少走不少弯路。

1. 端到端规划为什么要请出扩散模型

1.1 传统回归头的两个致命痛点

在端到端自动驾驶里,规划模块的常规做法是:把感知到的障碍物、地图信息、自车状态、导航意图全部编码成特征,然后送进一个回归头,直接输出未来几秒的轨迹点。这个思路本身没什么毛病,真正的问题出在回归头的表达力上。

第一个痛点是单模态平均。前方有一辆车挡路,左边可以绕、右边也可以绕,合理的轨迹至少有两条。但回归头最终只能输出一条轨迹。如果你拿两条都合理的轨迹去算 L2 平均,结果大概率是直直地撞向那辆车。这就是经典的“多模态求平均”问题。你可以用多个分支、多个 anchor 来缓解,但分支之间怎么协调、anchor 怎么设,全是额外的工程复杂度,而且覆盖面始终有限。

第二个痛点是概率表达不足。就算你把回归头升级成输出一个高斯分布的均值和协方差,它本质上仍然只能表达“单峰”。真实驾驶场景中,右转和直行是两个完全不同的决策,这种概率分布明显是多峰的,单峰高斯描述不了。于是就有了一个自然的想法:能不能不要强行预测一条轨迹,而是从一个分布里“采样”出一条轨迹?这个想法正好是生成模型的强项。

1.2 扩散模型把“预测轨迹”变成“生成轨迹”

扩散模型做的事,从直觉上理解就是:从一个充满随机噪声的样本出发,一步步去噪,直到得到一个符合训练数据分布的结果。把这条路用在自动驾驶规划里,它的角色就从“预测轨迹”变成了“生成轨迹”。

用大白话对比一下:

  • 回归头的思路:输入信息,输出唯一一条轨迹,相当于在问“最可能的轨迹是什么”。
  • 扩散模型的思路:输入信息,定义一个轨迹分布,每次从中采样一条轨迹,相当于在问“有哪些轨迹是合理且可能的”。

这个转变很关键,因为多模态不再需要人为指定模态数了。你采样几条,就出来几条;采样十次,可能得到十个合理轨迹的近似,其中包含了左绕和右绕。前面说的“平均撞车”问题,在生成框架下天然消失。

不过这里有个新的疑问冒出来了:既然扩散模型是从噪声开始、一路带着随机性生成的,那最后采出来的轨迹会不会噪声残留、乱抖动?为什么实际看到的效果反而是干净的?这是很多人卡住的地方,我把它单独拿出来讲。

2. 为什么扩散模型能输出“干净”的轨迹

2.1 先定义“干净”:平滑、可行、符合专家分布

在很多讨论里,“干净”这个词被用得很随意,导致问题说不清楚。我觉得要回答这个问题,必须先明确“干净”在这里指什么。

在自动驾驶轨迹这个语境下,干净主要指这几件事:

  • 时间维度上平滑:轨迹点之间没有突然的跳变,曲率连续,加速度不会异常突变。
  • 空间维度上合理:不穿越障碍物,不压路沿,和道路走向一致。
  • 行为维度上像人:符合人类专家驾驶的统计特征,比如变道前有转向灯提醒时段的轻微偏移、跟车时有合理的速度调整。

换句话说,“干净”并不是指信号处理意义上的“无噪声”,而是指“落在专家轨迹分布的高概率区域里”。一辆真车留下的轨迹天然带有微小传感器噪声,但扩散模型生成的是“专家意图层面的轨迹”,它学到的分布已经把那些不重要的高频抖动过滤掉了。

所以理解干净轨迹的关键,不是模型有什么神奇的“过滤器”,而是它学到的数据分布本身是干净轨迹的分布

2.2 去噪过程本身就是迭代精炼

那扩散模型是怎么保证“落点”落在高概率区域的呢?这要从它的采样过程说起。

扩散模型的逆向采样过程可以看成一个不断向高概率区域移动的迭代过程。我们经常用分数函数(score function)来解释:模型学到的其实是数据分布的梯度方向,即 \( \nabla_x \log p(x) \),它告诉采样过程“往哪个方向调整,能让轨迹更像训练数据”。每一步去噪,都是在把带噪轨迹向这个方向推一点点。

数学上,DDPM 的采样更新可以写成:

\[ x_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}t}} \epsilon\theta(x_t, t, c) \right) + \sigma_t z \]

这个式子看着复杂,但直觉很简单:预测出当前轨迹里混入的噪声,把它减掉,再补一点随机扰动,得到更干净的一步。这个过程重复 T 次,每一步都在修正上一步留下的瑕疵。只要 T 足够大、网络训得足够好,最终结果就会非常接近真实数据分布里的样本。

打个比方:给你一团泥巴,让你捏一个头像。如果让你一次成型,难度极高;但如果允许你上千次微调,每次只削掉一点点多余的部分,最终成品就会相当精细。扩散模型的迭代去噪,就是这种“逐步雕刻”的过程。干净不是某一步的功劳,而是整个链条共同作用的结果。

2.3 条件生成把轨迹绑在专家的“支撑集”上

如果只是无条件的生成,模型当然不知道该怎么生成“自动驾驶轨迹”。所以实际的 diffusion planner 全是条件扩散模型(conditional diffusion model),条件信息一般包括:

  • 自车历史状态(位置、朝向、速度、加速度)
  • 高精地图信息(车道线、路沿、中心线)
  • 障碍物信息(其他车、行人、静态障碍的包围框或占据网格)
  • 导航意图(下一目标点、意图类型)

有了这些条件,模型学到的就不是一个笼统的“所有轨迹分布”,而是“在当前场景条件 c 下的轨迹分布 p(x | c)”。这个条件分布的高概率区域,集中在“当前场景下专家会怎么开”的流形上。因此采样过程即便从随机噪声出发,也会被条件一步步拉回到合法轨迹附近。

这也能解释为什么实际推理时,即使两次采样用了不同的随机种子,生成结果在宏观走向上往往是稳定一致的——条件信息把分布约束得很紧,模型在高概率区域内做小幅波动,而不是在全部空间里乱逛。当然,如果你把引导强度调得过高,可能又会走向另一个极端——轨迹过于保守,多样性下降,这个后面会提到。

2.4 工程上的“清洗”策略:候选采样与最后一步直出

理论上讲,扩散模型只要训练好、采样步数够,输出就会干净。但工程落地时,大家通常还会叠几个“保险”手段,这些手段进一步强化了“干净”的观感。

第一个策略是并行采样多个候选轨迹,再用成本函数筛选。比如一次采样 8 条轨迹,然后用碰撞成本、舒适性成本、偏移中心线成本去打分,选一条最优的。相当于在“模型觉得不错”的轨迹里再套一层“物理校验”,多模态候选和安全性都兼顾了,这是 diffusion planner 比单支回归头更容易做好的地方。

第二个策略是最后一个去噪步直接返回模型预测的 x0。在一些实现里,推理时最后一步并不执行完整采样,而是直接用网络输出的干净轨迹预测值作为最终结果。因为最后一步的网络头已经在预测去噪后的 x0,把它取出来自然就是一条干净轨迹,完全省掉了最后一步的随机噪声注入。这种做法非常实用,也是“为什么输出很干净”的重要工程原因之一。

还有一个容易被忽视的点:如果模型在推理时用 DDIM 之类的加速采样器并且步数太少,反而会产生明显的残噪或锯齿。很多“扩散模型输出不干净”的报告,最后排查下来都是采样步数不足、或者跳过最后一步 x0 预测导致的。所以严格说,“输出干净轨迹”是“训练目标正确 + 采样策略合理”共同作用的结果,不是模型单方面自带的神奇属性。

2.5 一个小弯路:干净不等于越干净越好

这里我想插一句个人经验:在尝试调高条件引导强度来让轨迹更“干净”时,我踩过坑。Classifier-free guidance 的引导权重调高以后,轨迹确实更贴近车道中心、更平滑了,代价是变道行为变得极其保守,有点“死板”。因为引导越强,模型就越倾向生成训练数据里出现频率最高的那类轨迹,而真实驾驶中合理且多样的行为会被牺牲掉。

所以,扩散模型的输出具有一种“可调性”:你可以在干净(保守)和多样(激进)之间做取舍。在端到端系统里,这个取舍通常不是由模型结构决定的,而是由采样策略和引导强度决定的。这是生成式规划器非常独特的一个优点。

3. 为什么扩散模型训练一定要用L2损失

3.1 从高斯加噪到L2:数学上的必然

很多人误以为 L2 损失只是工程上随便选的默认项,其实错了。在扩散模型的训练目标里,L2 几乎是推导出来的必然结论。

扩散模型的前向过程是逐步加高斯噪声:

\[ q(x_t | x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t} x_0, (1 - \bar{\alpha}_t) I) \]

逆向过程也被建模成高斯分布。训练时优化的目标是最小化变分下界(ELBO),而 ELBO 展开后包含多个 KL 散度项,每一项都是在比较两个高斯分布。高斯分布之间的 KL 散度化简到最后,是一个期望形式的 L2 范数。

经典的 DDPM 推导把逆向过程的均值参数化之后,训练目标最终写成:

\[ L = \mathbb{E}{t, x_0, \epsilon} \left[ \| \epsilon\theta(x_t, t, c) - \epsilon \|^2 \right] \]

也就是说,训练目标就是让模型预测出的噪声与真实注入的噪声尽量一致,误差用 L2 范数衡量。如果换成 x0-prediction 的形式,目标变为:

\[ L = \mathbb{E} \left[ \| x_0^\theta(x_t, t, c) - x_0 \|^2 \right] \]

归根结底还是 L2。为什么高斯噪声假设下 L2 这么自然?因为高斯分布的负对数似然里,指数部分本身就是二次型。你没法在不改变概率假设的前提下,随便把 L2 换成 L1,否则你实际上是在假设“噪声服从拉普拉斯分布”,那个模型就不是标准扩散模型了。

3.2 L1 vs L2:谁的轨迹更“干净”

既然训练目标出自高斯假设,那是不是意味着 L1 完全不能用?也不是,但换 L1 会有代价,尤其在轨迹生成这个具体任务里。

L1 损失对离群点更鲁棒,因为它的梯度幅度恒定,不会因为某个点误差特别大而疯狂放大梯度。这在一些回归任务里是优点。但在扩散模型的去噪训练里,你会遇到一个更实际的问题:L1 在误差接近零时梯度仍然是常数,模型在收敛后期容易在一个小范围内来回震荡,导致最终生成的轨迹出现高频抖动。而 L2 的梯度幅度是随误差减小而减小的,训练后期梯度越来越小,优化过程更平滑,生成的轨迹在时间序列上更稳定。

另外,自动驾驶轨迹评估的常用指标 ADE(Average Displacement Error)和 FDE(Final Displacement Error)本质上都是 L2 距离。你用 L2 做训练目标,和评估指标天然同源,训练时优化的方向直接对齐了最终线上评测的指标。用 L1 训练可能在鲁棒性上有好处,但评估分数上往往不如 L2 好看。

3.3 别搞混:L2损失、L2正则化、轨迹回归L2

热搜词里同时出现了“L1正则化和L2正则化”“l2范数”这些词,这提醒我很多人会把几类 L2 概念混在一起谈。这里我做一个清晰的对表。

概念作用对象形式作用
L2 损失(MSE)模型预测值与真值\(|pred - true|^2\)训练目标,让预测逼近真值
L2 正则化(Weight Decay)模型权重\(\lambda |W|^2\)约束权重不要过大,抑制过拟合
轨迹回归 L2轨迹点集合对轨迹点逐点算欧氏距离平方再平均直接回归轨迹时的目标函数
扩散模型 L2 去噪损失噪声残差或 x0 残差\(|\epsilon_\theta - \epsilon|^2\)让模型学会还原干净样本

在扩散模型里,论文里提到的“L2 loss”指的是最后一行,即去噪目标函数的 L2 范数形式。它不是正则项,不参与约束网络复杂度;它是主损失函数。这个区分非常重要,因为如果你把它当成正则化去理解,整个训练目标就会理解错。

3.4 直接用L2路径回归的问题,在扩散模型里为什么不存在

现在到了最容易绕晕的地方。既然轨迹可以用 L2 直接回归,扩散模型的去噪损失也是 L2,那扩散模型凭什么比直接回归好?这不矛盾吗?

关键在于同样是 L2,作用的位置完全不同

直接回归轨迹时,模型是一步到位输出轨迹的,它把多模态场景下所有可能轨迹的“期望”都算成一个点。在 L2 的均值回归作用下,两条合理路径会被平均成一条不合理的中间路径。这是本质缺陷:L2 作为“点到点”的损失,天生鼓励求均值

扩散模型里的 L2 作用在噪声残差上,目标是“把当前带噪轨迹的噪声分量估出来”,它不做端到端的均值回归。生成轨迹是通过采样完成的,每次采样都会在数据分布里重新选一个点。多模态信息是在采样过程中被保持住的,而不是在 L2 求均值时被磨平的。

用一句大白话总结:回归 L2 是在逼模型输出“平均答案”,扩散 L2 是在教模型识别“什么是脏的”,然后靠自己一步步把脏的去掉。所以扩散模型没有继承回归 L2 的“平均病”,这是它能在多模态轨迹预测上胜出的核心原因之一。

4. 复现过程中的实操细节与常见问题排查

4.1 训练与推理的步数该怎么选

标准 DDPM 训练一般会用到 T=1000 步加噪,训练数据里每个样本都会随机抽一个时间步 t 来做去噪学习。推理时如果也按 1000 步反向采样,速度太慢,端到端系统基本扛不住。实际部署会把反向采样缩短到 20~50 步,常用的是 DDIM 或者 DPM-Solver 这类加速采样器。

跑实验时我习惯先按 100 步采样验证模型是否正常,确认训练没问题后再缩到 20 步左右测实时性。有一个规律是:采样步数越少,对条件信息的依赖越强,条件引导的作用就越明显。如果步数太少,轨迹细碎的噪声会变明显,此时可以尝试最后一步直接输出模型预测的 x0,而不是继续采样,通常能压掉大部分残噪。

4.2 训练时预测ε还是预测x0

这是另一个影响 L2 损失具体形式的选择。

  • ε-prediction:网络预测噪声,损失为 \(\|\epsilon_\theta - \epsilon\|^2\),这是最经典的做法,训练稳定,不用额外处理。
  • x0-prediction:网络直接预测干净轨迹,损失为 \(\|x_0^\theta - x_0\|^2\),更直观,方便推理时直接取最后一步结果,但在训练后期容易出现预测均值偏移的问题。

我之前复现时优先用 ε-prediction,稳定之后如果推理速度不够再考虑在最后一步切换成预测 x0。注意训练目标和推理方式最好保持一致,别训练用 ε-prediction,推理却硬要从轨迹输出里抠 x0,那样会引入不必要的误差。

4.3 我踩过的坑:轨迹太保守、抖动、发散

这里列几个我实际遇到的问题和解法,应该能帮到正在复现的人。

问题一:轨迹太保守,全程贴着车道中心不敢变道。排查后发现是条件信息里导航意图表达得太弱,模型感知到前方有障碍但不知道导航希望它变道。解决方法是把导航意图做成显式的 token 或向量拼接到条件里,并加大它在训练时被随机 mask 的概率,让模型学会更积极地利用意图信息。

问题二:静态障碍物旁边轨迹抖动。采样后轨迹本身没有碰撞,但在障碍物附近出现反复的微幅摆动,像在犹豫。原因是我纯靠训练时的碰撞损失来让模型避障,推理时没有把碰撞成本显式加到采样指导里。后来改成在推理时对候选轨迹做碰撞校验,并对过近轨迹惩罚,抖动明显消失。

问题三:训练发散。扩散模型对学习率比普通回归头敏感得多。我一开始用标准规划模型惯用的 3e-4 学习率,结果损失曲线前期下降正常,中途突然跳变。降到 1e-4 并加上线性 warmup 之后训练就稳定了。扩散模型的去噪任务是逐时刻学习的,不同 t 的难度差异很大,学习率太高会破坏已经学好的低噪声步。

问题四:训练正常,但测试输出脏噪声。基本是采样器步数不足或者没有对数噪声尺度做校正。优先检查是否用对了噪声调度器对应的采样器,以及有没有在最后一步跳过随机噪声注入。

4.4 评测指标怎么选

扩散模型规划器的评测,我习惯看这几项:ADE/FDE 用来衡量轨迹精确度;碰撞率用来衡量安全性;加速度/曲率变化用来衡量舒适性;多次采样的轨迹方差用来衡量多样性。

需要提醒一点:ADE/FDE 都是 L2 类的指标,扩散模型整体性能通常是通过“采样一批轨迹然后选最优”的方式评测的,这时它更容易拿到好的 FDE,因为候选多,最终点的命中概率更高。但如果只看单次采样,扩散模型不一定比精细调优过的回归头强。实际部署时要根据你的场景决定用哪种评测口径,别被指标刷得过于乐观。

5. 一些更进一步的思考

5.1 从“生成轨迹”到“生成策略”

扩散模型在自动驾驶里的潜力不止于输出一条轨迹。现在很多工作在试图把扩散模型用到更底层的控制策略上,比如 Diffusion Policy 这类思路,在机器人操作里已经验证了效果。它的核心优势是一致的:能表达多模态行为,而且训练目标统一。往这个方向延伸,未来端到端模型完全可能把决策、规划、控制放在一个生成式框架里统一建模,中间层的很多手工设计就有机会被取代。

5.2 与端到端感知-规划大框架的配合

在实际的端到端框架中,扩散规划器并不是孤立的模块。它需要感知模块提供障碍物和地图的向量化表达,也需要有机制把多帧历史信息和导航意图编码成条件向量。我在实验里的体会是:感知特征的质量直接决定扩散模型条件分布的质量。如果感知输出的框抖动很大,再好的生成式规划器也只能在“脏条件”上生成“看似平滑但语义不一致”的轨迹。所以做 diffusion planner 之前,先保证你的感知特征是可用的,别一上来就调采样参数。

比较值得留意的方向是把地图、障碍物、历史轨迹、导航意图如何做成一个统一的条件编码器,这个编码器的信息泄露会直接反映在轨迹多样性上。我们团队在实验中发现,把导航意图做得越清楚,模型输出的轨迹就越“有主见”,而不是在多个合理行为之间犹豫。

5.3 一个很有用的工程小技巧

最后分享一个对我帮助很大的操作:在训练条件扩散模型时,对条件信息做随机的“信息丢弃”,也就是类似 classifier-free guidance 的做法。以一定概率把导航意图丢成空,或者把历史轨迹对齐失败的数据随机混入。一开始我以为这会损害精度,结果反而提升了鲁棒性,模型在条件信息不完整时也不会崩坏,生成轨迹的干净程度和稳定性都有提升。如果遇到推理时感知结果偶发抖动的情况,这个技巧值得一试。

这是我复现扩散模型规划器以来,收获最大的一个经验。生成式规划器不是简单地把回归头换成 UNet 就完事了,它的训练、采样、条件设计、评测方式是一个整体系统。把每个环节的关系理清楚,“为什么输出干净”和“为什么用L2”这类问题,自然就有了答案。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询