把弯曲的路拉直:GoalFlow、GuideFlow,与扩散解码器的约束之争

生成式规划器有两条省步路线——扩散靠锚点和截断,流匹配靠把噪声到轨迹的路径拉直。GoalFlow 用 goal point 一步出轨迹,GuideFlow 再把安全硬约束焊进生成过程本身。三篇论文放在一起,其实是在回答同一个问题:约束到底该在哪个环节进场。

上篇拆开了冻结特征的接口,里面顺带讲过 DiffusionDrive 的 anchored Gaussian:扩散解码器的去噪起点不是纯噪声,而是 20 个聚类出来的「常见驾驶模式」锚点附近,配合截断 schedule 把去噪压到 2 步。当时留了个尾巴没说透——生成式规划器到底能不能一步出轨迹? 本篇换一条路径来回答:不用扩散,用 Flow Matching。主角是 CVPR 2025 的 GoalFlow,以及它的 2026 后继 GuideFlow。一路看下来你会发现,这两篇和扩散解码器的分歧,表面是「几步推理」,底层是「约束从哪进场」。


先补一段被略过的历史:为什么扩散解码器要费那么大劲

在那篇接口文里,DiffusionDrive 的省钱办法被概括成两句:锚点定起点、截断定步数。但值得回头问一句——为什么非省不可?

因为标准扩散天生就是个「多步迭代」的框架:从纯噪声出发,沿着一条弯曲的随机路径,一步一小段地去噪,几十步才能走到目标分布。对图像生成,慢一点无所谓;对车载规划器,这是要命的。规划每 100ms 就要重算一次,几十步去噪的延迟直接把它踢出实时预算。

所以扩散系的做法本质是「把一条长路拆成必须走完的段,然后想办法少走几段」:锚点让起点就离目标近,截断让总段数从几十降到 2。省得很聪明,但它没有改变路径是弯的这件事——只是从一条弯路上砍掉了大半。

Flow Matching 走的是另一条路:与其少走几步,不如把路拉直。

GoalFlow:把噪声到轨迹的路径学成直线

GoalFlow(CVPR 2025,arXiv:2503.05689,地平线 + 国科大 + 南大 + 华科 + 上海 AI Lab,代码 YvanYin/GoalFlow)用的具体变体叫 Rectified Flow。它的核心思想朴素得像一句废话:

噪声 x0 ~ N(0, σ²I)
目标轨迹 τ_norm
插值路径   x_t = (1 - t)·x0 + t·τ_norm
网络学的速度场 v_t = τ_norm - x0

扩散是「沿弯曲概率流逐步去噪」,Rectified Flow 直接把「噪声点到真实轨迹点」连一条直线,让网络去回归这条直线上的速度方向。路径是直的,意味着从 t=0 一步跳到 t=1 就能到终点——理论上一次前向就够了。

代价是这个「直」不是白来的:直线插值要求训练时看到的起点终点配对是「最优传输」意义上的匹配,网络才能把速度场学成常量。学得好,一步到位;学不好,还是发散。GoalFlow 用来兜底的那半套机制,就是解决「不让它乱跑」。

它整条流水线三个模块。感知那套是 Transfuser 风格,相机加 LiDAR 融成 BEV 特征,带 HD map 分割和 3D 检测辅助监督,这部分没太多新意。

真正有想法的是中间那个 Goal Point Construction Module。它不接受「从一张 BEV 图上直接回归一条轨迹」这种没法约束的设定,而是先干一件很具体的事:把训练集里所有真实轨迹的末端点拿出来聚类,建一个密集的 goal point 词表。推理时,从词表里挑一个最合适的点当作「这几十秒我要去哪」的条件。怎么挑?两个分加权:

  • 距离分:候选点到真值终点的欧氏距离,取 softmax(-d),越近越高;
  • DAC 分(Drivable Area Compliance):在候选点放一辆影子车(shadow vehicle),看它是不是完全落在可行驶区多边形内——是个 0/1 的合规判定。

两个分加权取最高,选出来的 goal point 连同 BEV 特征一起,作为条件喂给 Rectified Flow 网络。最后再有一个 Trajectory Scorer,用「影子轨迹」回头检查这个 goal point 是不是把规划器带沟里了,从候选里挑最优的一条。

训练时他们做了三档 condition 的消融,这一档最能说明问题:无条件 / 仅场景信息 / 场景信息 + goal point。不给 goal 的话,网络在推理时根本理解不了终点的空间约束,直接退化成普通的流匹配轨迹生成,长程发散照旧。goal point 不是锦上添花,是那条「直线」的锚。

结果:一步 vs 两步,以及一个容易被误读的数字

NAVSIM 测试集上的 PDMS(数值越高越好):

方法类型PDMS
TransFuser回归式84.0
UniAD回归式(多任务)83.4
PARA-Drive回归式84.0
DiffusionDrive扩散式(2 步)88.1
Hydra-MDP蒸馏式89.9
DriveDPO偏好对齐90.0
GoalFlow流匹配(1 步)90.3
iPad感知无关91.7
DriveSuprim—93.5
人类参考上界94.8

几个值得单独拎出来的点。

一是一步就够。论文报告单步去噪能到约 88.9 PDMS,只比多步的最优解低一点点——也就是说 Flow Matching 对去噪步数的鲁棒性,跟扩散那种「步数一砍质量断崖」完全不同。

二是goal point 的质量决定上限。如果他们不用预测的 goal point,而是直接拿真值轨迹的终点当条件,PDMS 会从 90.3 涨到 92.1,逼近人类驾驶的 94.8。这说明当前的天花板很大程度上卡在「猜终点」这一步,而不是「生成轨迹」这一步。

三是可行驶区合规这个指标。GoalFlow 的 SDAC 到了 98.3,比第二名高出 5.5 个点。这恰恰是过去生成式方法的软肋:大家卷的是碰撞率和 L2 距离,没人认真管「轨迹是不是跑到马路外面去了」。goal point 用 DAC 分把「终点得在可行驶区里」这条约束前移到了选条件这一步,等于从源头把漂移压住了。

有个延迟数字流传很广:多步推理约 178ms,单步约 10ms。这个数我是从第三方解读文章拿到的,没有回原文表格核对过——写出来是为了说明量级,真要引用得自己验一遍。

但 goal point 是一种「软约束」

GoalFlow 的聪明之处,也是它的边界:它把约束做成了一个条件,而不是一条硬规则。

goal point 是从预定义词表里挑的,词表又来自训练集轨迹端点的聚类。这意味着两件事:词表外的新目的地(没见过的终点分布)它没法表达;而且「终点挑对了」不等于「中间那段路一定合规」——goal point 只钉死了终点,从当前位姿到终点之间会不会压线、会不会贴太近,仍然靠网络自己学,靠 Trajectory Scorer 事后补救。DAC 分管的是终点那个点,不是整条轨迹。

说到底,GoalFlow 把「约束」外包给了打分机制。它极大地缓解了发散,但约束本身还是在生成过程之外。

GuideFlow:把硬约束焊进生成过程

一年后的 GuideFlow(CVPR 2026,arXiv:2511.18729,北京交大 + 轻舟智航 + 燕山大学 + 中科院 + 昆士兰大学)盯的就是这个缝。

它先把问题定义得很干净。模仿式规划器(UniAD、VAD、SparseDrive 这类)用 L2/Huber 回归专家轨迹,可一个场景只有一条真值,标称的多模态输出最后会塌成单一主导模态——就是模态坍缩(mode collapse)。生成式规划器(DiffusionDrive、DiffusionPlanner)能从分布里采样出多模态,但采样的随机性没法保证生成的轨迹满足硬约束:不碰撞、不压车道线、符合运动学。过去的办法是生成完再做一个后优化阶段去修——作者认为这一步不可靠。

于是 GuideFlow 选 Rectified Flow 做生成主干(理由跟 GoalFlow 一样:路径接近线性,采样快且稳),但往上焊了三个干预点,把约束直接塞进生成过程本身:

  • CVF(Constrained Velocity Field):纠正速度场的方向,让每一步的去噪方向都朝合规区域偏;
  • CF(Constrained Flow states):采样中途把流状态替换成「约束锚点」,别让它在违规区里自由漂;
  • RFE(Refining the Flow by EBM):把 Flow Matching 和一个 Energy-Based Model 联合训练,定义「违规 = 高能量」,让样本天然落进可行域。

注意第三点是关键——它不是外挂一个打分器,而是把能量函数和流匹配一起训练,让模型「自主优化」而不是靠外部惩罚。它还顺带做了件很工程的事:把「驾驶激进度」参数化成生成时的控制信号,可以精确调轨迹风格,想要保守还是激进不用重训。

结果上,GuideFlow 在 NavSim 的 Navhard(测试硬集)拿到 43.0 EPDMS,论文称 SOTA,并在 Bench2Drive、nuScenes、ADV-NuScenes 上都有验证。注意 Navhard 用的是 EPDMS,跟前面 Navsim test 的 PDMS 不是同一口径,数字不能直接横比。

三种约束哲学,摆在一条轴上

把扩散系、GoalFlow、GuideFlow 排一起,会发现它们真正的分歧不在「几步」,而在约束在哪个环节进场:

方法族生成路径约束形态约束进场的位置
DiffusionDrive 等扩散解码器弯曲、多步锚点(隐式先验)+ 事后 HD map 打分起点附近 + 生成之后
GoalFlow直线(Rectified Flow)goal point 当条件 + DAC 打分生成之前(定条件)+ 生成之后(选轨迹)
GuideFlow直线(Rectified Flow)能量函数联合训练 + 中途锚点替换生成过程之中(每一步都管)

从左到右,约束从「事后修」变成「事前定」,最后变成「过程内嵌」。这条轴的终点,其实就是那句老话:最好的约束,是让模型根本生不出违规解,而不是生出来再筛掉。 GuideFlow 的 RFE 八成就是这个意思——用能量把违规区域的概率密度压下去。

回到 DINOv3 系列的那个母题

这个博客前几篇一直在讲 DINOv3 上车,主线是「接口先于能力」:谁冻谁训、query 从哪来、KV 怎么翻译。这篇其实讲的是同一种结构的另一面。

DINOv3 那几篇解决的是输入侧的接口——怎么把干净、域不变的世界表示喂给规划头。GoalFlow 和 GuideFlow 解决的是输出侧的接口——怎么把「我要去哪、不能撞、不能压线」这些约束,翻译成生成过程能听懂的条件或能量。

两头画到一块,一段式端到端的真正难点就露出来了:它把感知、预测、规划压成一个可微系统,省掉了模块间的手工接口,但约束不会因为模块合并就自动进到网络里。它得被显式地重新设计成条件、锚点、能量,或者别的什么形态,塞回生成过程。这跟 agent 专栏「壳 vs 模型」 里那个结构问题也还是同一回事:能力是模型给的,但对齐和约束得靠壳来补——只不过这里的「壳」,长在了生成过程内部。


几句得说在前面的话

NAVSIM 上那一串 PDMS 全是各篇论文自报的,模型规模、训练数据、评测口径都不完全一致,横比只能看趋势不能抠小数点。GoalFlow 的评测限于 NAVSIM 这类仿真基准,闭环的真实性和反应性都有限;它依赖预定义 goal point 词表是论文自己承认的局限;延迟那个 178ms→10ms 的数字来自第三方解读,我没回原文核。GuideFlow 我目前只读到项目页和论文笔记级的材料,代码那边标注的还是 coming soon,43.0 EPDMS 的复现性要等社区跑一遍才作数。能确定的是路线本身:从「多步去噪」到「直线生成」,再从「生成后修」到「生成中约束」,这个方向是清楚的。

论文:GoalFlow — Goal-Driven Flow Matching for Multimodal Trajectories Generation in End-to-End Autonomous Driving (arXiv:2503.05689, CVPR 2025);GuideFlow — Constraint-Guided Flow Matching for Planning in End-to-End Autonomous Driving (arXiv:2511.18729, CVPR 2026);DiffusionDrive — Truncated Diffusion Model for End-to-End Autonomous Driving (arXiv:2411.15139, CVPR 2025)。NAVSIM 横向数据参考 DAWN 论文表 1 与各方法原论文。