自动驾驶圈这几天都在传这样一个结果:NAVSIM 榜单又刷新了,拿下 SOTA 的是一套叫 LatentVLA 的自驾 VLA 方案,核心思路非常直接——用“潜在动作预测”代替“文本坐标输出”。先给没跟进的读者一句话版本:以往 VLA 模型要像写作文一样把轨迹逐字吐出来,LatentVLA 则是让大模型先学会一个低维动作潜空间,规划时只输出几十维的紧凑向量,再交给解码器还原成完整轨迹。好处很明显:推理更快、上下文更短、还能保持甚至超过原来的规划质量。这篇文章顺着这条线,把 LatentVLA 为什么能上 NAVSIM SOTA、它内部到底怎么拆解、以及复现这类方案时会踩的坑,一次性讲透。
1. 为什么自驾 VLA 要做“潜在动作”:从文本轨迹 token 化说起
1.1 传统 VLA 的“一个数字一个 token”成本
自驾 VLA 的标准链路,是拿一个视觉编码器把环视相机图像变成视觉 token,再叠加大语言模型,让模型直接输出动作。早期大家习惯把动作写成文本坐标,比如“未来 8 秒,每 0.1 秒一个点,横坐标 y=3.2、纵坐标 x=15.4、速度 v=8.5……”,语言模型再把这些字符串一个 token 一个 token 地生成出来。
问题恰恰出在这里。LLM 的自回归解码是逐 token 进行的,每生成一个 token,都要把大模型完整前向跑一遍。想象一条 8 秒、20Hz 的轨迹,就是 160 个轨迹点,每个点如果由横坐标、纵坐标、速度、朝向四个字段组成,再算上逗号、括号、单位符号,往少了算也有大几百个 token。也就是说,规划一次动作,你等于让大模型连续推理几百步。在车端 Orin / 高算力域控上做实时推理,这个开销直接吃掉大量算力预算。
这也是很多团队的尴尬点:VLA 在感知和理解上确实强,但一旦到了规划输出,就成了“会思考但嘴巴特别慢”的选手。文本动作表示还有一个隐藏问题,模型需要把坐标作为离散词表来学,而数字本身是连续量,同一个坐标换个写法就可能不认识了,token 效率非常低。
我见过许多团队绕着弯优化,比如限制输出位数、用定长小数、或者干脆加一个专用轨迹头绕过语言模型。但专用头又会造成能力回退:LLM 的推理能力用不上了,规划又退回传统的两段式。
1.2 潜在动作的本质:把“说话”改成“编码”
LatentVLA 换了一个思路。不去纠结模型怎么把数字“说出来”,而是提前准备一个动作编解码器,把一条轨迹压缩成一个连续向量,这个向量就叫潜在动作。规划时,LLM 只负责输出这个潜在向量,然后由解码器一次性还原轨迹。
用日常例子理解:过去是让模型用嘴报出一串电话号码,现在你让模型直接“扫二维码”,二维码里承载的信息量和效率完全不一样。潜在向量本身没有所谓“标准写法”,它是一种分布式的连续表示,LLM 不需要为每一个小数位分配一个 token,它只需要回归出一组数值。
这样一来,动作部分的解码步数从几百步降到一步或者几步,自回归开销大幅缩减。视觉 token 和指令 token 还在,但最影响实时性的动作 token 被砍掉了大部分,整个规划的端到端时延自然就压下来了。
这里有一个容易被忽略的细节:潜在动作并不只是“用 MLP 输出一个向量”这么简单,关键在编解码器质量。如果潜空间压缩得太狠,轨迹细节丢失,车辆会走不直;如果压缩得太松,向量维度太高,效率优势又没了。LatentVLA 的核心工作之一,就是把动作潜空间这件事做扎实。
2. LatentVLA 核心设计拆解
2.1 总览:先学潜空间,再学预测
LatentVLA 整体上是两阶段思路。第一阶段先离线训练一个条件变分自编码器,把驾驶场景里的多模态上下文作为条件,把自车未来轨迹作为学习目标,压缩成一个低维潜在动作空间。第二阶段再把这个潜空间接到大语言模型上,让 LLM 学会“看完路况、听完导航指令,直接给出潜在动作”。
这跟“先发明一套密码,再训练翻译官”的逻辑一样。密码本如果设计得好,翻译官的工作就简单;密码本如果设计得稀烂,后面再怎么调 LLM 都是白费。两阶段先验知识解耦的好处,是动作表示质量和语言推理能力可以分别迭代,而不是全堆在一起训练。
实际训练流程可以简化成两步:
- 阶段 A:用大量驾驶数据拟合动作 CVAE,学出“场景上下文 → 动作潜分布”的映射。
- 阶段 B:把图像 token、导航指令 token 输入 LLM,LLM 输出潜向量,通过重建轨迹的方式做端到端微调。
阶段 A 决定了潜空间的信息密度,阶段 B 决定了模型能不能准确“命中”潜空间里合适的区域。两个阶段缺一不可,若跳过阶段 A 直接让 LLM 回归轨迹向量,通常会出现潜空间语义不明确、训练不收敛的问题。
2.2 潜在动作编码:条件先验与重建质量
老式轨迹 VAE 很容易犯一个错误:编码器只看轨迹本身,不看场景。这样学出来的潜空间是一个“无条件球形先验”,模型根本不知道这个动作是在路口左转还是在高速巡航。LatentVLA 的关键点之一,是把场景上下文作为条件同时送进编码器和解码器。
什么意思?就是我要压缩的轨迹,必须结合“当前图像里有什么障碍物、导航要我往哪走”这个背景去压缩。相同的一段横向位移,在高速直道上可能是危险变道,在停车场里可能就是正常绕桩。上下文条件先验,让潜空间是场景相关的,不是孤立存在的。
这样带来的直接好处是 LLM 预测潜向量的难度降低了。因为它本来读的就是同一份上下文,只要它输出一个对应于该上下文的潜向量,解码器就能大概率重建出一条合理轨迹。如果先验是无条件的,模型就要在更大的空间里搜索,效率和质量都会受影响。
训练细节上,CVAE 会用重建误差加 KL 散度的组合损失。重建误差保证轨迹还原精度,KL 散度保证潜空间和条件先验分布贴近。实际操作时,这个平衡非常敏感。解码器如果太强,什么轨迹都能硬解出来,潜向量就退化成噪声,称为后验坍缩;解码器如果太弱,潜向量要承载太多细节,重建又跟不上。一般起步建议是在 0.1 到 1.0 之间找一个 KL 权重,同时观察潜空间里“有效维度”的利用率。
2.3 LLM 怎样完成“动作预测”与轻量上下文长度
第二阶段,LLM 的角色更像一个“决策头”。输入序列依然包含图像 token、历史状态 token、导航指令 token,但在输出端不再要求它逐字报坐标,而是把最后一层隐藏状态接上一个预测头,直接映射成潜在动作向量。整体框架可以理解为:大模型负责把所有模态的信息融合、推理,最后吐出一个压缩后的动作编码。
这里有个工程选型上的取舍:潜向量维度不能太贪。定得太高,比如 256 维,预测难度大且上下文压缩效果有限;定得太低,比如 4 维,轨迹信息会严重丢失。从一般驾驶场景看,8 到 32 维是一个比较合理的区间,具体要看轨迹长度、采样频率和场景复杂度。
上下文长度方面,潜动作方案的收益非常直接。图像 token 和指令 token 省不掉,但动作 token 可以从“几百个”降到“几十个甚至一个”。整体上下文长度能压缩 40% 到 50%,如果原本轨迹文本特别冗长,压缩比例会更夸张。这意味着 KV Cache 更小、显存占用更低、首 token 延迟明显下降。
另外一个好事情是,潜动作预测天然支持“一次前向生成多候选”。文本自回归方式要生成多条轨迹,往往得重复解码或者做 beam search,开销很大。而潜动作方案可以同时采样多个潜向量,并行解码出多条候选轨迹,然后用一个轻量 scorer 做选择,这对规划模块来说更友好。
3. NAVSIM 基准上的 SOTA 表现:效率与精度怎么兼得
3.1 NAVSIM 考核的是什么
NAVSIM 是目前自驾圈比较常用的开源闭环仿真评估基准之一。它会给规划模型提供视觉输入、道路拓扑、交通参与者状态和导航指令,让模型输出未来一段时间的轨迹,然后在仿真器里闭环评测,最后算出一个综合分数。比纯开环指标更贴近真实的“车能不能开得稳、是否安全”的问题。
核心指标是 PDM Score,也就是 PDM 分数,由轨迹贴合度、行驶进度、乘客舒适度等多个小项组成。有时候还看碰撞率。因为要在闭环仿真里跑,模型的轨迹不仅要看起来合理,还要能应对动态车辆和行人交互,这比静态的误差指标难啃得多。
LatentVLA 能拿下 NAVSIM SOTA,意味着它不仅仅是把动作输出变成潜向量这么简单,而是在改变表示方式之后,规划质量和驾驶风格依然保持了第一梯队水平。之前有一种声音,说轻量化方案往往牺牲精度,LatentVLA 算是回应了这个问题。
3.2 关键数字与对比维度
我根据公开思路和同类方案的经验,列一个直观对比,方便理解效率上的差异:
| 对比维度 | 传统文本动作 VLA | LatentVLA 式潜动作 VLA |
|---|---|---|
| 动作 token 数量 | 数百,甚至上千 | 几十,甚至个位数 |
| 轨迹解码步数 | 逐 token 自回归 | 一次前向,一次性还原 |
| 端到端推理时延 | 100% 基准 | 约降低 30%~50% |
| PDM Score | 一般水平 | 可达到同量级或更高 |
| 多候选轨迹生成 | 开销大 | 潜向量并行采样,成本低 |
这里的时延降幅不是拍脑袋写死的,具体取决于原本的轨迹文本有多长、LLM 尺寸有多大。如果原来的动作部分占了上下文的一半以上,潜动作方案的收益会更明显。需要注意的是,感知部分的 token 依然占大头,别指望靠潜动作把端到端时延压缩到原来的三分之一以下,那不现实。
性能上,LatentVLA 能拿到 SOTA,通常是因为潜空间经过精心训练之后,天然带有“平滑性”和“语义一致性”。两个相似的潜向量对应到轨迹上也是相似的,这让模型的决策空间更连续,不会出现文本输出那种“一个 token 偏差导致轨迹突变”的毛病。
3.3 为什么这类方案比“文本动作”更适合车端
车载环境的算力约束是硬杠杠。一套大模型方案如果推理超过 200 毫秒,就算精度再好也很难上车,因为规划周期撑不住。潜动作方案把最耗时的自回归解码砍掉,是直接命中痛点的做法。
另外,从系统架构看,潜动作方案更容易和传统规划栈衔接。传统规控模块最后需要的就是一条轨迹数组,潜解码器输出可以直接对接,不需要再写一层文本解析器。文本动作输出反而要处理格式化、异常截断、越界数值等问题,部署时非常啰嗦。
还有一个容易被忽略的优势:潜向量天然适合做“决策特征”复用。后续如果要做轨迹预测、交互博弈或者多模态规划,可以共享同一个潜空间,把不确定性建模和驾驶风格控制加进去,扩展空间比文本路线大得多。
4. 实操过程与复现思路(从建模到部署)
4.1 数据准备与预训练阶段选择
如果要复现一个类似 LatentVLA 的方案,第一步是数据。你需要四类东西:图像序列、导航指令、地图信息、自车真值轨迹。图像建议至少用前视加环视,分辨率够用就行,重点是视角要稳定。导航指令要跟图像时间戳对齐,很多开源数据集里指令和轨迹是分开存的,不做对齐训练时会出现“模型听到左转却看到直行”的矛盾。
轨迹真值是训练 CVAE 的监督信号,建议保留 8 秒、20Hz 的完整轨迹,同时记录速度、加速度、转向角。采样时不要只挑简单场景,要多包含路口、并线、施工绕行这些难例,否则潜空间学出来“只会走直线”。
预训练阶段,视觉骨干可以用 ImageNet 或自驾大模型预训练的权重初始化,LLM 保持原版权重。至于动作编解码器,CVAE 从零训练就行,因为轨迹数据本身相对充足。重点是把输入特征标准化:横纵坐标转到自车坐标系,速度归一化到合理范围,避免模型为了硬学数值范围浪费容量。
4.2 端到端训练要点与参数
阶段 A 训练时,我建议先固定一个基准配置:潜向量维度 32,KL 权重 0.1,解码器用 4 层 MLP。先看重建误差,如果轨迹还原得太糙,就把潜向量维度加到 64;如果 KL 散度一直很小而潜变量几乎没被用到,就要警惕后验坍缩,增加 KL 权重或者减少解码器容量。
阶段 B 接 LLM 时,通常会冻结视觉骨干前半部分,对后半部分和 LLM 做 LoRA 或全参微调。损失函数可以设计成三项:
- 重建损失:潜向量经过解码器后还原出轨迹,和真值比 L1 误差。
- 潜空间损失:预测的潜向量和真值潜向量做 MSE 或余弦相似度。
- 辅助碰撞损失:可视化轨迹是否压线或者贴近障碍物,这相当于一个软约束。
伪代码可以理解为:
for each batch: context_tokens = image_encoder(images) + instr_embedding(nav) z_pred = llm_head(llm(context_tokens)) traj_pred = action_decoder(z_pred) loss_recon = L1(traj_pred, traj_gt) loss_prior = MSE(z_pred, z_gt_detached) loss = loss_recon + 0.5 * loss_prior + comfort_loss(traj_pred)注意一个坑:z_gt 最好用阶段 A 的编码器把真值轨迹编码得到,并且切断梯度,不要和 LLM 一起端到端乱耦合,否则潜空间会被 LLM 带偏。
学习率方面,LLM 用 1e-5 到 5e-5,视觉塔用 5e-6,预测头可以适当放大到 1e-4。潜解码器在阶段 B 保持冻结,严格来说解码器只负责“还原动作”,不需要跟着 LLM 继续学习。
4.3 推理链路与工程化部署
推理流程比训练更简单。拿到当前时刻环视图像后,过视觉编码器得到图像 token;导航指令通过分词器变成指令 token;两者拼起来送到 LLM,取最后一层隐藏状态,过一个线性预测头得到潜向量;最后潜解码器一步还原轨迹。整个过程没有循环采样,没有逐步生成,天然适合 TensorRT 或者 ONNX 落地。
工程部署时,LLM 主体建议用 FP16 或 INT8 量化,注意潜向量输出头要保持 FP32 精度,因为量化误差对连续回归影响很大。潜解码器很小,完全可以放在一个小核上跑,甚至可以 CPU 执行。
缓存这块要留意:图像 token 占据绝大多数 KV Cache,如果显存吃紧,可以减少视觉 token 数量,比如用更激进的 patch 融合,或者只保留关键视角。导航指令部分很短,开销很小。
端到端时延预算可以这么规划:视觉编码 30 到 50 毫秒,LLM 单次前向 40 到 80 毫秒,预测头加解码器 5 到 10 毫秒。整体控制在 100 毫秒级别并不是难事。相比之下,文本动作 VLA 要反复解码几百步,光是 LLM 解码部分就可能超过 300 毫秒。差距一下子就拉开了。
5. 常见问题、踩坑与经验实录
5.1 潜在空间容易坍塌怎么办
我实际观察下来,潜动作方案的第一个大坑就是后验坍缩。症状是训练过程中 KL 散度很快归零,重建误差却不降,或者潜变量在任何输入下都差不多。这通常有三个原因:解码器太强、KL 权重大小失配、潜向量维度设置不合理。
排查顺序建议这样走:先把解码器缩小,比如从 8 层 MLP 降到 4 层,看看 KL 散度是否恢复活力。如果还不行,把 KL 权重从 0.1 提到 0.5,同时观察重建误差。最后再调整维度,有时 16 维比 32 维更适合小规模数据。还有一种工程上很好用的办法,是 KL annealing:前 10 个 epoch 让 KL 权重从 0 线性涨到目标值,让模型先把重建学好,再逐渐规范潜空间。
5.2 训练稳定性和解码精度
LLM 回归连续向量,比回归文本要敏感得多。第一个常见问题是 loss 发成 NaN,尤其在混合精度训练下。解决办法是把潜向量归一化到单位长度或者零均值单位方差,同时给输出头加一个小的初始化 scale,比如 0.01。别小看这个初始化,很多模型跑飞都是因为输出头方差太大。
第二个问题是轨迹输出抖动。潜向量稍有偏差,解码出的轨迹就可能出现小锯齿。一个副作用小的处理方式,是在解码器输出后再接一个轻量平滑层,比如 B 样条或者移动平均。但要注意,平滑过头会丢失真实转向意图,在紧急避让场景反而更危险,所以平滑力度要跟碰撞率一起看,别只看美观程度。
第三个问题是多候选轨迹质量分化。潜空间采样多个 z 时,有的候选可能离分布中心太远,还原出明显不合理的轨迹。建议给采样加上先验约束,限制潜向量到条件先验中心的距离,或者用 scorer 过滤掉低置信度的候选。
5.3 评估指标与 NAVSIM 的小提醒
NAVSIM 的评分规则要仔细看版本,不同版本对舒适度、进度权重不同,直接对比旧榜单位置没有意义。做复现时,应该锁定同一个评估版本,并且保证闭环仿真里的车辆物理参数一致,否则分数会莫名波动。
另外,不要只看 PDM Score,碰撞率才是安全底线。有的模型靠激进驾驶也能拿高分,但在真实场景里根本不敢用。LatentVLA 这类潜动作方案因为轨迹本身平滑,碰撞率通常表现不错,但你如果为了冲分数把舒适度权重调得太高,保守路线又会拉低进度分,这个平衡要反复试。
还有一个小提醒:NAVSIM 的闭环环境里,感知延迟、规划频率、执行周期都会影响最终分数。同样的模型,在不同延迟设定下可能差出好几个百分点。对比论文结果时,先把这些系统参数对齐,再下结论,否则很容易误判方案优劣。
结尾
如果完全按文本动作的思路去追 VLA,你迟早会被自回归这个瓶颈卡住。LatentVLA 给我的最大启发是,动作不一定非要变成语言,模型可以“想”但不必“说”。在实际做同类实验时,我体会最深的是两件事:第一,潜空间的质量决定了整个方案的天花板,前期把动作编解码器练扎实,后面 LLM 和落地方案都会轻松很多;第二,不要因为看到 SOTA 就照搬参数,潜向量维度、KL 权重、解码器容量这些变量,强依赖你的场景数据和轨迹格式,存在很大调整空间。顺着“潜在动作预测”这条路继续挖,后面还能接入驾驶风格控制、交互博弈、多模态轨迹预测,扩展方向很值得期待。