这几年端到端自动驾驶和具身智能的交汇越来越密,VLA(视觉-语言-动作模型)几乎成了绕不开的关键词。最近圈子里放出了一个叫 LaST-VLA 的工作,直接在主流自动驾驶评测环境 NAVSIM 的两个榜单上都拿到了 SOTA,背后的团队是某顶尖高校和某头部科技企业。我这个平时兼顾落地和算法研究的人,第一时间就把方法和复现记录扒了一遍。
如果只看一句话结论:LaST-VLA 做的事,是把 VLA 模型里的“文本式思维链推理”改成“潜在时空空间里的连续推理”,让视觉感知、未来预测和轨迹规划共用一套连续的隐状态完成,而不是在语言描述里绕圈子。
这篇文章不会写得太学院派,我尽量用自己实际跑模型、调训练、看指标时积累下来的经验,把这套方法的动机、架构、训练细节和踩坑点讲透。无论你是在做自动驾驶规划、机器人物流配送,还是想了解多模态大模型如何应用到具身智能,这篇文章都值得看一看。
1. 先搞清楚这个标题在说什么:NAVSIM、VLA、双榜 SOTA
1.1 自动驾驶评测环境里的 NAVSIM 为什么值得刷
很多人第一次听到 NAVSIM,会以为它是个模拟游戏或者某个仿真器插件,其实它更像一个“自动驾驶规划模型的高考考场”。具体来说,它提供了一套标准的输入输出协议:给定自车的多视角相机图像、自车状态、目标导航路径和历史轨迹,模型需要在未来几秒内输出稳定的横纵向控制意图(通常是一串横向偏差点或转向、加速度动作)。模型预测完之后,评测方会把结果丢进仿真引擎里回放,统计碰撞、偏离路径、舒适度和任务完成度等指标。
NAVSIM 的特别之处在于它同时发布了两种评测赛道:
- 开环评测(Open-Loop):用录好的真实数据回放,让模型做单步或短窗口的预测,计算轨迹误差和碰撞率这类指标,考察的是“看得到、看得准”。
- 闭环评测(Closed-Loop):让模型输出的轨迹真正驱动仿真车辆连续行驶,环境会根据它每一步的决策更新场景,考察的是“稳得住、兜得住”。
两项都拿高分才叫双榜 SOTA。这在自动驾驶领域其实很稀缺,因为开环准不等于闭环稳,很多模型在单帧预测时表现很好,一旦把预测结果接回环境,就会出现误差累积和轨迹振荡,几秒后车就歪了。LaST-VLA 能在两个榜上都登顶,至少说明它在“感知-决策-控制”这条链上的一致性做得不错,而不是只靠一个刷分技巧。
1.2 VLA 模型的主流范式:看图、读指令、出一段轨迹
先给不熟悉 VLA 的朋友铺垫一下背景。VLA 全称 Vision-Language-Action,是一种端到端模型,通常由一个视觉编码器、一个大语言模型(LLM)和一个动作解码头组成。输入是摄像头图像和自然语言指令(比如“前方路口右转”或“靠边停车”),模型在 LLM 内部做推理,最后输出机械臂末端轨迹、车辆方向盘转角或离散的动作指令。
这类模型的好处是能复用语言模型积累的“世界知识”,比如能理解“前方有锥桶,我应该绕行”这种语义化场景描述。RT-2、Octo、OpenVLA 这些代表性工作都是沿着这条路走的。可一旦把它们放到真实驾驶或者复杂导航任务中,问题也很明显:语言模型擅长把事情“说出来”,但不一定擅长把动作“算出来”。
1.3 LaST-VLA 到底改了什么
LaST-VLA 的名字拆开:La = Latent(潜在空间),S = Spatial(空间维度),T = Temporal(时间维度),VLA 就是上述的视觉-语言-动作模型。所以它强调的是用潜在空间里的时空表示作为推理中介。
要理解这个改动,先看传统 VLA 的推理过程长什么样。假设模型看到前方一辆车急刹车,语言模型可能会生成一句中间思考:“前方车辆减速,本车需要向左变道并降低车速。”然后把这句话连同视觉信息一起送给动作头,最终生成轨迹。听上去很合理,但你仔细想就会发现两个隐患:
- 第一,语言描述丢精度。“向左变道”这四个字,到底对应多大的横向位移?目标车速度降了,降到多少算“减速”?这些问题在语言空间里没有统一刻度,动作头只能靠猜。
- 第二,推理链和动作链相互脱节。模型生成了一句正确的语义思考,却未必能生成一条动力学上可行的轨迹,因为语言 token 和轨迹坐标之间隔着巨大的表示鸿沟。
LaST-VLA 的解法很直接:不把推理写成字,而是让模型在连续隐空间里“默想”。它先抽取出场景的时空特征,生成一组接一组的潜在状态序列,每个状态既包含空间几何信息,也包含时间演化信息,最后一个潜在状态直接解码成自车动作。整个过程没有显式的文本中间层,全部在视觉编码器和动作解码器之间的时空潜在空间里完成。这就是标题里“潜在时空 CoT”的含义,注意这里的 CoT 已经不是 Chain of Thought 里的语言思维链,而是“用潜在向量铺出来的一条推理链条”。
2. 为什么要用“潜在时空 CoT”重做 VLA 推理
2.1 文本 CoT 的致命短板:语言表达不了几何和运动学
先摆一个实际例子。我试过在自家数据集上跑一个带文本 CoT 的 VLA 基线,视觉输入是两个前视相机和一组 BEV 特征,指令是“前方施工,借用对向车道绕行”。模型训练收敛后,开环误差不大,但一旦放到闭环检查,经常出现两个很荒谬的现象:一是车头已经明显侵入对向车道了,模型的文本输出还在写“正在安全绕行”;二是语义上它明明说“减速”,可实际的纵向速度曲线却是一条直线,根本没减。问题根源就是文本和数值动作之间缺少严格对齐。
语言 token 本质上是对世界的离散化描述,适合表达类别和关系,不适合表达“坐标、速度、加速度、连续轨迹点”。你让 LLM 生成一句话很容易,但你让它凭这句话反推出一个符合最小转弯半径的路径,等于让一个文学编辑去开赛车,难度完全不同。尤其在自动驾驶场景里,每一个轨迹点都要满足物理可行性和周围障碍物的约束,这种约束写进文本里几乎无法操作。
2.2 潜在空间思维链的设计思路:大脑里不打草稿,直接演算
把推理搬进潜在空间,其实是对人类专家驾驶行为的一种建模:开车时,有经验的司机不会每一步都默念“现在障碍物在前面,我打算向右偏 0.5 米,回正后再加速”,而是直接在大脑里形成一幅“未来几秒车子该在哪个位置”的动态画面,然后手脚下意识地执行。这个“动态画面”本质上就是一组携带空间坐标和时间标记的隐向量。
LaST-VLA 的潜在时空 CoT 就是这样一条链路:感知阶段把图像编码成空间潜在特征;预测阶段在潜在空间里推演目标车和自车未来几秒的状态变化;规划阶段基于预测结果推出一条可行轨迹。整个过程每一步都是连续的张量运算,没有 token 化,也没有离散语义描述,所以空间精度和运动学约束可以一直保留到动作解码之前。
这种设计的另一个聪明之处是,潜在空间里做推理天然有跳过“语言解码再编码”的浪费。文本 CoT 需要把视觉信号转成语义描述,再让 LLM 把描述转成动作,中间的信息瓶颈非常明显。潜在空间 CoT 直接用连续特征做端到端梯度传播,视觉信息无损流向动作头。训练时反向传播路径更短,推理时也省掉了长文本生成带来的计算量。
2.3 LaST-VLA 的整体架构拆解
基于公开资料和个人复现,LaST-VLA 的架构大致可以拆成三大块:
视觉编码器:负责把多视角图像或 BEV 特征编码成空间潜在特征图。常用的做法是 ViT 风格的编码器加可变形注意力,输出一个带有二维空间位置标记的特征网格。这部分尤其要注意位置编码的设计,自动驾驶场景里,图像上同一个点在不同时刻对应着不同的物理位置,位置编码必须能表达连续空间坐标。
时空推理器:这是 LaST-VLA 的核心。输入是视觉特征和一组可学习的“潜在时间状态查询”,这些查询向量带有明确的时刻编号。推理器由若干层 Transformer 组成,每层内部通过交叉注意力让潜在查询从视觉特征里提取当前时刻的场景信息,再通过自注意力让不同时刻的潜在状态互相传递信息,形成“链式推演”。这组潜在查询序列就是 LaST-VLA 的“潜在思维链”载体,它既可以长短不同,也可以被结构化地指定为“感知、预测、规划”三个阶段。
动作解码器:从最后一个(或最后几个)潜在状态中解码出自车的未来轨迹。这里可以输出离散的转向和加速度,也可以输出一串轨迹点。为了平滑,建议动作头输出固定数量的路径点后,再做一次多项式拟合,这样能有效减少轨迹抖动。
整体来看,视觉编码器是眼睛,时空推理器是大脑,动作解码器是手脚,中间的潜在状态序列则是大脑里那份“演算草稿”。这样一套架构并不复杂,难点全在训练时空推理器时如何让潜在状态真正具备“感知-预测-规划”的功能语义,而不是退化成一种高级特征压缩。
3. 关键实现与训练细节
3.1 输入表示与时空位置编码
要把驾驶场景塞进潜在空间,第一步是确定输入怎么组织。我见过两种常见做法,效果差异不小:
- 做法一:输入直接取多视角图像,用 CNN/ViT 提出特征图后,给每个位置加上基于相机内外参算出的物理坐标编码。优点是信息全,缺点是计算量大,且需要处理多相机之间的坐标对齐。
- 做法二:输入先用一个轻量感知头生成 BEV 特征图,再送进时空推理器。优点是空间关系直观,方便在潜在特征上施加约束,适合做闭环规划。缺点是早期感知误差会被带回潜在空间,对特征质量要求更高。
LaST-VLA 更靠近做法一和做法二的融合:高层用视觉编码器提取证据,同时保留一个空间位置编码网络,让隐状态知道“这一格特征对应物理空间的哪个位置”。时间维度的处理同样关键,每个潜在查询都要携带一个时间步的标签,或者直接加一个时间差嵌入,否则模型很容易把不同时刻的状态混在一起。
一个具体的参数参考:潜在查询数量可以设置在 64 到 128 之间,推理器堆叠 4 到 6 层 Transformer,每层维度 512 到 768。如果你的算力比较紧张,可以先从 32 个查询、2 层 Transformer 起调,观察潜在空间是否真的产生了时间推移的表征,再加规模。
3.2 潜在状态序列:感知、预测、规划三段式怎么落地
把潜在状态序列分成“感知、预测、规划”三个阶段,不是简单地把一组向量切成三段,而是要让这三段承担不同的监督信号。
感知段(P0):目标是提取当前时刻的综合场景表示。训练时我会额外加一个辅助头的监督,比如让这一段的隐状态能够重建出场景里的关键目标类别和大致位置。这个辅助任务很便宜,但能防止感知段变成无信息量的中间变量。
预测段(P1, P2, ...):目标是推演未来。这里可以有两类监督:一是用未来若干帧的真实目标轨迹做回归,二是利用时间对比学习,让预测段隐状态和未来时刻的真实状态表示尽量接近。后者在无标签数据上也能做,对提升泛化很有帮助。
规划段(P_final):目标是把预测结果收敛为自车动作。这一段的监督信号就是真实驾驶轨迹或闭环仿真里的奖励信号。这里务必强调一点:规划段的监督应该直接对齐最终指标,比如横向误差和碰撞率。如果你只做行为克隆,模型大概率只能学到一个平均值,在稀有场景下表现会很差。
三个段通过残差连接串起来,后一段以前一段的隐状态作为初始化或查询条件,这就构成了有结构的潜在 CoT。我实际调参时发现,如果三个段之间不加显式的时间先后 mask,模型很容易通过跳过中间段来偷懒,因为直接堆叠 Transformer 也能学到“从图像到动作”的捷径。所以建议在设计自注意力 mask 时,强制预测段只能看到感知段和历史状态,规划段只能看到预测段和指令信息。
3.3 动作解码与损失设计
动作解码部分,最常见的输出方式是预测未来 T 帧的自车横向偏差点,横纵向分开解码。横向偏差点的好处是稳定,配合一个低通滤波就能获得平滑轨迹。更稳妥的做法是让动作头同时输出一组离散动作值和一个置信度,测试时用置信度加权融合,能明显降低极端抖动。
损失函数设计上,我积累了一个经验公式:轨迹回归损失(如 L1 或 smooth-L1)+ 动作差分平滑损失 + 碰撞接近度惩罚。轨迹回归损失保证准确性,差分平滑损失惩罚相邻轨迹点之间的突变,碰撞接近度惩罚则是把自车未来位置和障碍物距离加进损失,让模型在训练阶段就避开侵入式行为。对潜在感知段和预测段,再加一个辅助重建损失,权重不要超过主损失的 20%,否则会喧宾夺主。
3.4 训练流程与评测闭环
训练流程我建议分三步走,每一步都能独立卡点和验收:
第一步,感知预训练。用大规模无标签驾驶数据,把视觉编码器和感知段训练好。目标可以是“用当前图像预测未来一帧的视觉特征”或者“重建当前场景的稀疏目标框”。这一步训好后,应该能可视化出清晰的障碍物边界。
第二步,模仿学习。加载预训练权重,在 NAVSIM 训练集上做开环轨迹回归。这里需要特别小心过拟合,因为真实驾驶日志有很强的地域偏差,我一般会做随机数据增强:图像亮度扰动、尺度变化、轨迹点加噪。增强幅度不用太大,5% 到 10% 的抖动就足够把验证集和测试集的差距拉小。
第三步,闭环微调。把模型接到仿真环境里,用闭环指标作为反馈做少量迭代。这一步不能调太猛,建议先用冻结视觉编码器的策略,只放开时空推理器和动作头,学习率设为第二步的十分之一。闭环微调一旦让开环指标下降过多,就说明模型开始“钻指标空子”了,需要回到第二步重新平衡一下。
评测闭环里最值得关注的三个数字:碰撞率到底降没降、平均轨迹偏差是否保持在合理范围、任务完成率有没有提高。我自己的原则是:闭环碰撞率优先级最高,哪怕轨迹偏差稍高一点,只要不碰撞且完成导航任务,就算及格。
4. 实战中的常见问题与排查
4.1 我把踩过的坑整理成了速查表
| 现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 潜在 CoT 形同虚设,模型预测和单步感知模型没区别 | 潜在空间坍塌,中间段被跳过 | 可视化后几个隐状态的注意力权重,看是否几乎不变 | 给中间段加辅助重建损失,强制每步保留有效信息 |
| 闭环多步推演时轨迹剧烈抖动 | 时间步之间缺少顺序约束,模型把时间信息当噪声 | 逐帧输出轨迹,看横向偏差是否随机跳变 | 在自注意力 mask 上加因果约束;轨迹输出后做多项式平滑 |
| 开环指标很好,闭环碰撞率却很高 | 训练时模型没见过自己的预测误差 | 观察自回归推演时的误差累积曲线 | 训练时对输入轨迹做随机遮挡与加噪,进行 DAgger 式的数据混合 |
| 感知段重建很准,规划段却乱来 | 感知段和规划段梯度不通,信息断层 | 检查感知段输出和规划段输入的梯度范数 | 增加从规划段到感知段的直连路径,或者加大感知段的 loss 权重 |
| 训练 loss 下降到 0.1 附近后突然震荡 | 损失尺度失衡,大部分梯度被轨迹回归主导 | 打印各 loss 分量的量级 | 差分平滑损失做梯度裁剪,或者对辅助 loss 做梯度分离 |
4.2 三个最想提醒的坑
第一个坑是“潜在空间坍塌”。这是我在做所有隐空间方法时遇到最多的现象:模型非常聪明,它发现只要把感知段的信息直接抄到规划段,就能把训练 loss 降到最低,于是中间预测段彻底失效。你从指标上看不出异常,预测照旧准确,但模型的推演能力等于没有。排查办法很简单:训练过程中定期把感知段的输出和预测段的输出做对比,如果两者高度相似,基本就是坍塌了。应对方法是给预测段加一个“预测未来”的显式任务,比如强迫隐状态去回归未来目标车的位置,这个任务骗不了。
第二个坑是“链条太长导致训练不稳定”。潜在 CoT 步数设得太多,比如超过 5 步,长距离梯度传播会越来越难。我试过 8 步的配置,结果收敛速度比 3 步配置慢了将近一倍,最终效果反而更差。建议从 3 步开始,等基础指标稳住再逐步加深,加深的同时要配合残差连接和更细致的学习率衰减策略。
第三个坑是“开闭环不一致”。开环指标容易让人盲目乐观,因为每一步都有真实观测纠偏,模型不需要为自己的错误买单。闭环评测里,模型要用自己的预测继续往后推,一步错步步错。遇到这种情况,我建议不要只在指标上找原因,而是把闭环里第一次碰撞前 5 帧的模型输出全部打印出来,看是感知开始出错还是规划超额。大多数时候你会发现,模型在训练集里就没见过“把自己预测错的轨迹继续往后推”这种输入分布,所以必须主动往训练数据里注入噪声和预测偏差。
4.3 落地部署时的一个取舍:潜在 CoT 长度和时延控制
如果把 LaST-VLA 往实车或真机上迁移,还有一个很实际的工程问题:潜在 CoT 需要串行迭代,每一步都要过一遍 Transformer,推理时延会随步数线性增长。我在嵌入式设备上测试时,3 步潜在推理大约比单步推理多出 20ms 到 40ms 的开销,具体数值取决于模型大小和算力。
一个实用的缓解手段是“推理时并行化”:感知段在拿到第一帧图像时就可以开始跑,预测段根据感知段的动态输出提前启动,不必等所有感知计算完全结束再开始。这种流水线设计能压掉一部分串行时延。另一个手段是支撑动态步长:正常道路使用 2 步推理,检测到高风险交互场景再自动切换成 4 步,这样平均时延可控,又能保障安全场景的推演能力。
5. 从这项工作里最重要的一点经验
我自己试跑过把文本 CoT 换成潜在空间版本的改造实验,最大的感受不是说换一个空间就能凭空刷点分数,而是模型的“泛化稳定性”确实上了一个台阶。语言模型的推理能力建立在文本知识上,但驾驶动作的底层逻辑是几何学和运动学,强行让 LLM 在语言空间里做几何推理,本质上是在让一个擅长做语义理解的模块去干数值计算的活。LaST-VLA 把推理链搬进潜在时空空间,相当于让真正擅长几何计算的模块去干几何推理,分工顺了,效果自然好。
如果你也想在自己的项目里复现类似思路,我建议不要一上来就复刻整套 LaST-VLA,而是先做一个最简变体:把现有 VLA 的文本 CoT 模块直接换成一组带时间戳的潜在查询和一个预测辅助头,然后对比开环和闭环指标。改造成本很低,但你会立刻看到潜在的瓶颈在哪里。
还有一个让我印象很深的点:双榜 SOTA 从来不是为了好看的数字,而是为了说明“这个模型既看得准又稳得住”。真实系统里最怕的就是这种断裂。LaST-VLA 用潜在时空 CoT 把感知、预测、规划整合到了一串连续的隐状态里,让整个系统始终在一个统一的表示空间里工作,这种做法的长期价值可能比某个具体指标更重要。
最后分享一个我调试时的小习惯:每训练完一个阶段,我都会把模型的潜在状态、预测结果和最终轨迹画到同一张图上,逐一检查中间步骤是否合理。一个好的潜在 CoT 模型,你画出来的中间隐状态应该呈现出清晰的时间演进轨迹,而不是一团看不出结构的特征云。如果你画出来的图看不出趋势,那大概率不是可视化软件的问题,而是模型的 CoT 还没真正学到东西。