引言:无条件生成与条件生成
无条件生成模型学习的是数据分布 $p(x)$——给它噪声,它随机生成一张猫或一辆车的图片。但自动驾驶场景中,我们需要的是可控生成:生成某个特定天气的、某个特定路口的、自车以某个速度行驶的场景。
这就引出了条件生成模型 $p(x|y)$,其中 $y$ 是条件变量。对于扩散模型,“如何加入条件"是这个领域的核心工程问题。
本文从引导方法(如何引导采样方向)和条件注入(如何在网络结构中加入条件)两个维度展开,最后介绍驾驶场景中的特殊条件设计和加速方案。
🧭 Classifier Guidance:利用分类器引导
基本原理
Classifier Guidance(CG)的思路很简单:在采样过程中,用一个额外的分类器 $p(y|x_t)$ 来引导去噪方向,使生成结果更符合条件 $y$。
从贝叶斯定理出发:
$$\nabla_{x_t} \log p(x_t|y) = \nabla_{x_t} \log p(x_t) + \nabla_{x_t} \log p(y|x_t)$$其中 $\nabla_{x_t} \log p(x_t)$ 是从扩散模型得到的无条件 score,$\nabla_{x_t} \log p(y|x_t)$ 是分类器在噪声图 $x_t$ 上对类别 $y$ 的对数概率梯度。
引入引导强度 $s$ 控制条件强度:
$$\nabla_{x_t} \log p(x_t|y) = \nabla_{x_t} \log p(x_t) + s \cdot \nabla_{x_t} \log p(y|x_t)$$引导强度的影响
| $s$ 值 | 效果 |
|---|---|
| $s=0$ | 无条件生成,与条件无关 |
| $s=1$ | 标准贝叶斯后验采样 |
| $s>1$ | 强条件引导,更符合条件但多样性降低 |
CG 的典型变体
CLIP Guidance:将分类器替换为 CLIP 模型,$p(y_{text}|x_t)$ 的梯度引导生成符合文本描述的图像:
$$\nabla_{x_t} \log p(x_t|y_{text}) = \nabla_{x_t} \log p(x_t) + s \cdot \nabla_{x_t} \text{sim}(E_{text}(y), E_{img}(x_t))$$深度 Guidance:在生成过程中约束深度图的估计值与给定的深度条件一致。常用于 ControlNet 等架构中,通过一个额外的深度估计网络提供的梯度信号,将生成过程约束在地形/3D 几何上。
CG 的局限
CG 面临的主要问题是分类器需要在各个噪声级别上都能正常工作($x_0$ 到 $x_T$ 都需要分类准确),这要求分类器必须在扩散过程的各个时间步数据分布上训练或适应。在加噪严重的 $x_t$ 上做分类本就困难,训练不稳定,且额外分类器的训练成本很高。
🎯 Classifier-Free Guidance:更优雅的方案
核心思想
Classifier-Free Guidance(CFG)由 Ho & Salimans 在 2022 年提出,核心洞察是:不需要额外的分类器,用扩散模型自身即可实现引导。
CFG 的核心技巧是训练时随机丢弃条件。在训练中,以概率 $p_{uncond}$(通常是 5%~10%)将条件 $y$ 替换为 $\varnothing$(空条件标记)。这样,同一个模型 $\epsilon_\theta$ 可以同时充当条件模型和无条件模型:
$$\epsilon_\theta(x_t, t, y) \quad \text{和} \quad \epsilon_\theta(x_t, t, \varnothing)$$采样公式
在采样时,将条件预测和无条件预测线性插值:
$$\tilde{\epsilon}_\theta(x_t, t, y) = \epsilon_\theta(x_t, t, \varnothing) + w \cdot (\epsilon_\theta(x_t, t, y) - \epsilon_\theta(x_t, t, \varnothing))$$其中 $w$ 是引导尺度(Guidance Scale)。
Guidance Scale 的影响
| $w$ | 含义 | 效果 |
|---|---|---|
| $w=0$ | 纯无条件生成 | 完全不遵循条件 |
| $w=1$ | 标准条件生成 | 遵循条件,多样性正常 |
| $w>1$ | 强引导 | 更符合条件,多样性下降 |
| $w<1$ | 弱引导 | 多样性更高,但条件对齐减弱 |
在实践中,CFG 的典型 $w$ 取值:
- 文本到图像:7.0 ~ 14.0(强引导,强调文本对齐)
- 驾驶场景生成:2.0 ~ 5.0(中强引导,需要保持场景多样性)
- 轨迹生成:1.0 ~ 2.0(弱引导,避免模式坍缩到单一行为)
CFG vs CG 详细对比
| 维度 | Classifier Guidance | Classifier-Free Guidance |
|---|---|---|
| 额外模型 | 需要分类器 | 不需要 |
| 训练成本 | 扩散模型 + 分类器 | 扩散模型(条件丢弃训练) |
| 采样成本 | 一次前向 + 一次梯度 | 两次前向(条件 + 无条件) |
| 条件类型 | 离散类别为主 | 任意类型(文本、图像、动作等) |
| 实现复杂度 | 高 | 低 |
| 扩展性 | 差(每增一个条件需重新训练分类器) | 好(条件类型可任意扩展) |
| 控制粒度 | 粗(类级别) | 细(特征级别) |
CFG 因其简洁和通用性,成为 Stable Diffusion、Sora 以及几乎所有扩散模型的标准配置。
🏗️ 条件注入的四种技术方案
有了引导方法(确定采样方向),还需要条件注入——如何在网络结构中让模型"看到"条件信息。以下是四种主流方案。
1. 拼接(Concatenation)
最简单直接:将条件信息和噪声图像在通道或 token 维度上拼接。
典型应用:
- 图像条件生成(Image-to-Image):$x_t$ 与条件图像在通道维拼接 $[x_t; c] \in \mathbb{R}^{2C \times H \times W}$
- BEV 条件生成:BEV 特征作为额外通道拼接到潜变量
优点:实现简单,与网络结构无关 缺点:无法处理非结构化或变长条件(如文本)
2. 交叉注意力(Cross-Attention)
Stable Diffusion 使用的标准方案。将条件编码为特征序列,在 U-Net/DiT 中通过 cross-attention 注入:
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d}}\right)V$$其中 $Q$ 来自去噪特征,$K, V$ 来自条件编码器(如 CLIP text encoder)。
条件映射过程:
$$Q = W_Q \cdot \phi(x_t), \quad K = W_K \cdot \tau_\theta(y), \quad V = W_V \cdot \tau_\theta(y)$$典型应用:
- 文本条件:文本经 CLIP/LLM 编码为 token 序列
- 图像条件:图像经 ViT 编码为 patch token 序列
优点:可处理变长条件,条件与主特征的交互是自适应的 缺点:计算量较大,尤其当条件 token 很多时
3. 自适应归一化(Adaptive Normalization)
最初在 StyleGAN 中流行,后被 DiT 推广到扩散模型中。核心思想是用条件信息预测归一化层的缩放和偏移参数:
$$\text{AdaLN}(h, y) = \gamma(y) \cdot \frac{h - \mu}{\sigma} + \beta(y)$$其中 $\gamma(y)$ 和 $\beta(y)$ 都是由条件 $y$ 经由一个小 MLP 回归得到的。
AdaLN-Zero 改进(DiT 默认方案):
在 DiT 中,条件还控制残差连接的缩放:
$$h_{out} = h + \alpha(y) \cdot \text{ModulatedFFN}(\text{AdaLN}(h, y))$$其中 $\alpha(y)$ 初始化为 0,确保训练初期 DiT block 输出为 identity,稳定训练。
优点:
- 计算开销极小(只需 MLP 回归几个标量)
- 不改变特征空间分辨率
缺点:
- 对复杂结构化条件(如多物体 bbox)的表征能力有限
- 常需配合 cross-attention 使用
4. 控制网络(ControlNet / Control Module)
ControlNet 是当前可控生成最流行的方法。核心思想是冻结主模型,额外训练一个条件控制分支:
- 冻结去噪骨干 U-Net/DiT 的所有参数
- 复制编码器的部分层作为控制分支
- 控制分支以条件 $y$(深度图、边缘图、分割图等)为输入
- 控制分支的输出通过 zero convolution 加到主模型的特征中
优势:
- 不破坏预训练模型的大规模知识
- 支持多种条件类型(深度、法线、Canny、涂鸦等)
- 每个条件只需训练一个轻量控制分支
在驾驶中的应用:
- ControlNet for Depth:用 LiDAR 深度图控制生成场景的 3D 几何
- ControlNet for HDMap:用高精地图控制生成场景中的道路拓扑
四种方案对比
| 方案 | 计算开销 | 结构化条件 | 变长条件 | 条件类型灵活度 | 代表应用 |
|---|---|---|---|---|---|
| 拼接 | 低 | ✅ | ❌ | 低 | SR3, Palette |
| 交叉注意力 | 中 | ✅ | ✅ | 高 | Stable Diffusion, Sora |
| 自适应归一化 | 极低 | ❌ | ❌ | 中 | DiT, MagicDrive |
| ControlNet | 中(额外分支) | ✅ | ❌ | 极高 | ControlNet 系列 |
🚗 驾驶场景中的条件设计
条件类型全景
自动驾驶场景生成需要的条件远多于通用图像生成:
| 条件类型 | 实例 | 注入方式 | 用途 |
|---|---|---|---|
| HDMap | 车道线、路沿、红绿灯 | Cross-attention / ControlNet | 控制道路拓扑 |
| 3D Bbox | 车辆/行人的 3D 位置和朝向 | 拼接 / BEV feature | 控制物体布局 |
| 自车轨迹 | 过去和未来的自车位置 | Cross-attention / MLP | 控制自车运动 |
| 相机参数 | 内外参矩阵 | Adaptive Norm | 多相机对齐 |
| 文本描述 | “夜间雨天下匝道” | Cross-attention | 语义场景控制 |
| 天气/光照 | 晴天/雨天/黄昏 | 拼接 / Adaptive Norm | 环境条件控制 |
| 驾驶命令 | 左转/右转/直行 | Embedding + Cross-attn | 行为控制 |
| 历史帧 | 过去 N 帧图像 | 拼接 / cross-attention | 时序上下文 |
命令与轨迹条件
驾驶场景中最重要的两个条件:
驾驶命令(Command):
- 离散条件:左转、右转、直行、靠边停车
- 注入方式:Embedding 层编码后,通过 cross-attention 或 adaptive norm 注入
- 典型应用:GAIA-1 使用文本/命令条件控制自车行为
自车轨迹(Trajectory):
- 连续条件:未来 N 个时刻的 (x, y, heading, speed)
- 注入方式:MLP 编码为条件 token,经 cross-attention 注入
- 关键挑战:轨迹与视频的时序对齐——轨迹中的每个时刻必须精确对应到视频帧
条件之间的冲突处理
当多个条件同时输入时(如 HDMap + 3D bbox + 文本),可能出现条件冲突——文本说"繁忙路口"但 bbox 只标了两辆车。常见处理策略:
- 条件融合:将不同条件编码到统一表征空间(BEV 空间)
- 条件 dropout:训练时随机丢弃某些条件,避免模型过度依赖某一条件
- 分层条件注入:先以 HDMap 条件为主生成道路,再以 3D bbox 条件为主放置物体
DriveDreamer 使用结构化条件融合:将 HDMap 渲染成 BEV 图像,3D bbox 投影到 BEV,两者叠加后作为统一的条件输入。
⚡ 截断扩散:减少步数实现实时推理
问题背景
标准扩散模型需要 50~1000 步去噪才能生成高质量结果,这对自动驾驶的实时推理是致命的。截断扩散(Truncated Diffusion)的目标是在不显著降低质量的前提下,大幅减少采样步数。
DiffusionDrive:截断采样
DiffusionDrive 为自动驾驶轨迹生成设计的截断扩散方案:
核心思想:不需要从纯噪声 $x_T$ 开始去噪。相反,从一个比较靠前的时间步开始(如 $t=10$ 而不是 $t=1000$),只去噪少量几步即可。
$$x_{t_0} \sim \mathcal{N}(\sqrt{\bar{\alpha}_{t_0}} x_0, (1-\bar{\alpha}_{t_0})I), \quad t_0 \ll T$$为什么在轨迹规划中可行:
- 轨迹的维度远低于图像(~10 个 waypoint × 2 坐标 = 20 维)
- 轨迹数据的分布比自然图像简单得多
- 轨迹的去噪过程只需少量步数就能收敛
FeaXDrive:特征空间截断
FeaXDrive 进一步将截断扩散扩展到特征空间:
核心洞察:直接在感知特征空间(BEV 特征)中做截断扩散,而非在轨迹空间。
$$z = E_{BEV}(x_t), \quad \text{Diffusion}(z, t) \rightarrow z' \rightarrow D_{traj}(z')$$优势:
- 特征空间比轨迹空间包含更丰富的交互信息
- 感知模型无需为规划单独训练
- 截断扩散 + 特征复用使得整个过程只需 2-4 步
截断扩散 vs 完整扩散在规划中的对比
| 维度 | 完整扩散 | 截断扩散 |
|---|---|---|
| 采样步数 | 50~100 步 | 2~10 步 |
| 推理时间 | 50~200ms | 2~15ms |
| 轨迹质量 | 最高 | 略低于完整(可接受) |
| 多样性 | 高 | 略低 |
| 实时能力 | ❌ | ✅(可到 30~50Hz) |
🌊 Flow Matching:扩散的替代范式
从扩散到 Flow
Flow Matching(FM)是比扩散更通用的生成框架。它与扩散的核心区别在于:
| 维度 | 扩散模型 | Flow Matching |
|---|---|---|
| 路径 | 固定的随机噪声调度 | 可学习/可设计的任意路径 |
| 前向过程 | 逐步加噪(SDE) | 插值从数据到噪声的直线路径(ODE) |
| 训练目标 | 预测噪声 $\epsilon$ | 预测速度场 $v_\theta(x,t)$ |
| 采样方式 | 去噪(数十~数百步) | ODE 求解(数步即可) |
| 调度设计 | 需要精心设计 $\beta_t$ | 路径可任意设计 |
Flow Matching 在自动驾驶中的优势
- 更少的采样步数:直线路径意味着 ODE 求解可以用更大的步长,通常 4~10 步即可达到扩散 50 步的质量
- 更稳定的训练:不需要设计复杂的噪声调度,概率路径可任意选择(如最优传输路径)
- 天然支持截断:可以只学习从 $t=0$ 到 $t=0.5$ 的路径(相当于截断扩散)
代表工作
- Flow-GRPO:用 Flow Matching 取代扩散头做轨迹生成,结合 GRPO 强化学习优化轨迹分布
- GoalFlow:以目标为条件的 Flow Matching 规划器,直接学习从当前状态到目标状态的流
- ReWorld:在世界模型的潜在空间中使用 Flow Matching 预测未来状态
CFG 在 Flow Matching 中的应用
Flow Matching 同样可以使用 CFG:
$$\tilde{v}_\theta(x_t, t, y) = v_\theta(x_t, t, \varnothing) + w \cdot (v_\theta(x_t, t, y) - v_\theta(x_t, t, \varnothing))$$与扩散 CFG 完全一致的公式,但作用对象从噪声 $\epsilon$ 变为速度场 $v$。
💭 个人思考
条件扩散模型的工程落地比理论上复杂得多。两个关键观察:
条件越多,冲突越难解决。CFG 和 cross-attention 给出了"如何注入条件"的答案,但"多个条件冲突时谁优先"没有一般性解法。在驾驶场景中,文本说"繁忙"但 bbox 只标了两辆车——到底听谁的?这需要条件之间有显式的优先级或置信度机制,但当前方法几乎没有。
CFG 的采样效率问题是最大瓶颈。CFG 需要两次前向传播(条件 + 无条件),这让本来就需要多步采样的扩散模型雪上加霜。Flow Matching + 单步 CFG(一次性预测条件和无条件的速度场)可能是未来方向。
截断扩散与 Flow Matching 实际上在解决同一个问题:用更少的步数做高质量生成。两者正在快速融合——最新的方法(如 Flow-GRPO)使用 Flow Matching 加极少的 ODE 步数(2-4 步)和 CFG 控制在 15ms 内完成轨迹生成,已经达到车端实时要求。