量产 VLA 做工程选择时大量依据是"试过其他做法、最后没选"——某个 loss 试过被换掉、某个精巧设计验证没收益、某条蒸馏路径走不通。这些经验在论文和发布会里都很少展开。
下面是 8 个判断 + 4 个反例。每个判断都对应一个具体的取舍背景。具体数字已脱敏,焦点放在架构选择和代价。
一、VLM 全打开训,比谁都激进
最反直觉的一个判断:视觉编码器(ViT)、LLM 主干、轨迹 head 全部打开训练,连 QA 和 CoT 这些常见的多任务监督都不加,纯轨迹回归 loss 驱动整个 backbone 更新。
flowchart LR
A[7v 相机
4 帧历史] --> B[ViT 28 层
全打开]
B --> C[LLM 4×7 层
全打开]
C --> D[最后一层 24 token]
D --> E[Head
GMM regression + RL]
style B fill:#3b82f6,color:#fff
style C fill:#3b82f6,color:#fff
style E fill:#3b82f6,color:#fff为什么这么做?因为他们试过冻结实验,结论是:
- ViT 打不打开几乎没差别——这反过来说明 ViT 的预训练表征已经够用,不是关键瓶颈
- LLM 必须打开,且后半部分变化挺大、前半部分有衰减——前半层只做轻微适配,后半层是动作决策的真正承担者
- head 必须打开——纯监督头是规划信号的最后一公里
这个组合背后是一个清晰的判断:在大数据规模下,monolithic 训练比精巧的冻结策略更可靠。“打开所有层、只用一个 loss"看起来粗暴,但在两千万级 clip 数据上反而最不容易出错——因为没有冻结边界处的梯度断层。
代价是显然的:训练成本高、迭代周期长、单次实验失败的损失大。这条路只有把 infra 做到极致才走得通。
二、24 token 出轨迹:选 attention head 而不是 AR
模型最后一层取最后 24 个 token 的特征过 head,head 是 GMM 回归损失 + RL 微调。这个选择对应的是另一条没走的路:自回归(AR)逐点生成轨迹。
| 方案 | 优势 | 代价 |
|---|---|---|
| Attention head 一股脑出 | 一次前向出全部 48 个轨迹点;误差不累积;延迟可预测 | 失去 AR 的序列内部因果性 |
| AR token-by-token | 序列内一致性强;可对中间动作做干预 | 第一步偏一点点,后续累积放大;延迟随长度线性增长 |
这里的核心判断是 “AR 第一点偏容易误差累积”——这是一个部署侧硬约束:48 个点的轨迹只要前 1-2 个点偏,后面整个轨迹就废了。基础模型(fm)方向也在试 AR,但量产线上选了 attention head。
这背后是一个更普遍的设计哲学:在 deterministic latency 要求下,一次性 decode 远比序列 decode 鲁棒。AR 的优雅是为了开放式生成;规划是闭式输出,没必要承担 AR 的额外风险。
三、Cross-attention 权重观察:文本/导航很低,cam0/cam2 很高
把训好的模型拿出来观察 cross-attention 权重分布,发现一个让人警惕的事实:
- 图像相机(cam0、cam2)attention 权重最高——符合预期
- 文本指令、导航 token 权重很低——这就是问题
直接后果是:模型容易偏航。导航说"在下个路口右转”,但 attention 几乎不看导航 token,模型就只会按视觉惯性继续走。
这个观察推出来一个很硬的工程决定:导航文本必须打开训才能学会——只做 RAG 或冻结文本投影都不够。同时也解释了为什么早期"4 个 linear 层训的模型只会跟车"的失败——文本通路没有真正参与梯度更新,模型从未学会用语言信号。
这是一个值得每个做多模态 policy 的人都看一眼的现象:cross-attention 的权重分布是诊断模态对齐质量的最直接信号。如果某个模态的权重接近零,那个模态对模型而言就是装饰,无论你的架构图画得多好看。
四、Cross-attention 时序:CA 用时序,SA 不用
时序处理上一个看似细节但很关键的选择:cross-attention 层引入时序(多帧 K/V),self-attention 层不引入。
这个区分对应的是计算预算分配的逻辑:
- CA 的时序是必须的——决策需要看历史帧才能区分"静止的车"和"刚停下的车"
- SA 引入时序会带来巨大开销——单帧内部的 token 数已经很大,再叠 4 帧历史会让 attention 矩阵爆炸
- CA 的时序成本可控——只在 K/V 端拼接历史,Q 还是当前帧
这是一个对工程师友好但对论文写作不友好的选择——它不是某个 fancy 的"时空注意力"——本质上是"哪里能省就在哪里省"的实用主义。
五、不定长 stream membank:StreamPETR 路线
时序方案用的是不定长 stream 形式——类似 StreamPETR 的 memory bank 思路,ViT 的特征存到 membank 里,每次只用单帧前向 + 历史特征聚合。
flowchart LR
F1[t-3 帧] -->|ViT 编码| M1[membank]
F2[t-2 帧] -->|ViT 编码| M2[membank]
F3[t-1 帧] -->|ViT 编码| M3[membank]
F4[t 帧] -->|ViT 编码| M4[membank]
M1 & M2 & M3 & M4 --> CA[Cross-Attn
聚合]
CA --> H[LLM + Head]
style M4 fill:#fde047,color:#000
style CA fill:#3b82f6,color:#fff为什么这个方案在车端特别合适?
- ViT 只前向当前帧——历史帧的特征已经在 membank 里,不需要重算
- 延迟不随历史长度线性增长——存储换计算
- 历史长度可以动态调整——不定长意味着可以根据场景复杂度自适应
如果对比固定 4 帧拼接的做法,stream membank 的边际优势在于每帧的 ViT 计算只做一次,而拼接方案在滑动窗口下每帧会被重复编码 4 次。
六、同构蒸馏:teacher 和 student 共享架构,不用 KD loss
蒸馏路径选了同构特征蒸馏 + 轨迹蒸馏,但显式拒绝了经典的 KD loss。
为什么不用 KD loss?只有一句关键说法:“tricky 的是得看数据集”——这句话需要展开理解:KD loss 假设 teacher 的 soft target 始终比 hard label 更优。但在驾驶场景下,teacher 自己在某些 corner case 上就是错的(VIT 跑下匝道分不清死车这类情况),强行让 student 模仿 teacher 的 soft target 反而把错误固化了。
替代方案是特征级蒸馏:
| 蒸馏对象 | 监督形式 |
|---|---|
| LLM 后几层特征 | L2 / cosine loss 拉齐 student 和 teacher 的 hidden states |
| 最后一层 24 个 token | 同上,只蒸馏轨迹相关的子集 |
| 轨迹输出 | teacher 输出当作伪标注,student 学这个伪标注 |
特征级蒸馏的优势是它不依赖 teacher 输出概率的"全局正确性"——只要 teacher 学到的内部表征是有用的,student 就能受益。在大模型蒸馏到小模型的场景下,这比 KD loss 鲁棒得多。
七、SFT / AFT / RL 三段式:迭代频率倒挂
先解一个跟 §一 的潜在冲突:§一 说 “ViT 打不打开没差别” 是 SFT 阶段的实验观察——自驾场景数据下视觉分布已经比较稳,ViT 反向更新边际收益小。AFT 不是这个情况:跑通用场景数据,ViT 必须更新才能 cover 新分布。这两段的存在意义就是从这条差别出来的。
三段在数据量、训练时长、迭代频率上的真实关系:
| 阶段 | ViT | 数据规模 | 数据来源 | 单版训练时长 | 迭代频率 |
|---|---|---|---|---|---|
| AFT | 打开 | 2500w 全量帧 | 通用场景 | 长 | 慢(2-4 周/版) |
| SFT | 冻 | 2600w | 70w × 100+ 数据集配比出来 | 中 | 快(一天好几版) |
| RL | 视情况 | 几w | 自驾 last-mile case | 短(7-8 小时) | 最快(一天几十版) |
直觉先说:单看数据量,SFT 跟 AFT 几乎一样多(2500w / 2600w),按"数据多 → 迭代慢"的常识两段应该差不多快。
反直觉的真正落点在 SFT vs AFT 的迭代频率差:数据量基本相同,但 AFT 一版要 2-4 周、SFT 一天可以好几版——差了一个数量级。
差距全部来自 ViT 是否 freeze:
- AFT 把 ViT 全打开训——反向 graph 一直贯穿 vision tower,每个 batch 计算量 / 显存翻倍以上,且需要 vision-relevant 数据保证 vision tower 不跑偏。任务是"通用 vision capability 深训",2-4 周一版是必要 trade-off。
- SFT 冻住 ViT——vision feature 当 fixed extractor 用,反向只到 LLM block 跟 head。算力降一个数量级,可以快速 reweight 数据补 corner case。任务是"自驾场景过拟合"——70w 一份的子集做 100+ 份,再按场景重要性配比成 2600w,每天针对 bad case 调比例重训。
- RL 数据少 + 几w clip 量级 + 7-8 小时一版——最 last-mile,几十版/天的迭代频率主要贡献上车版本微调。
为什么这么分工:
把 ViT 的训练隔离到 AFT 这条"慢档",让 SFT 这条"快迭代通道"完全不被 vision tower 反向拖累。这是工程组织的核心 trade-off——量产 VLA 每天都有新发现的 corner case,需要快速补丁;但 vision tower 不能被快速补丁牵着走(不然不稳定,容易 overfit 到具体场景)。两段分开是把"通用基础能力训练"跟"场景定向 fine-tune"在算力 budget 上解耦。
RL 这一段反而是数据最少、迭代最快、对上车体验影响最直接的环节。它的成本极低(几小时一版),但因为直接对最终轨迹质量做 reward shaping,每次迭代都直接作用在上车可见的指标上。这也是为什么量产 VLA 反复强调 RL “挺管用的”——投入产出比在三段里最高。
八、单板部署:算力砍半还要保 12Hz
部署目标是从两块板子方案砍到单板,算力直接减半,但还要保证:
- 12 Hz 推理频率(约 70ms 一次前向)
- 每次输出 8 Hz 的轨迹(48 个轨迹点)
这意味着 70ms 内要完成 7 路相机 + 4 帧历史 + 全 backbone 前向 + 48 点轨迹生成。这是为什么前面所有架构选择都倾向于牺牲优雅、保推理效率:
- attention head 不选 AR——AR 70ms 跑不完 48 步
- CA 用时序、SA 不用——SA 时序的算力预算根本不够
- stream membank 而不是 4 帧拼接——拼接方案的 ViT 算力会爆
- 同构蒸馏 2B→1B——再大的模型单板根本塞不下
部署约束反向决定了整个架构的形态。这一点是很多研究端 VLA 论文忽略的:它们在 H100 上做实验,得出"AR 蒸馏特征"等漂亮结论,但这些方案到了车规芯片上跑不起来。量产团队的所有看似"不优雅"的选择,本质都是对单板算力预算的妥协。
几个"试过没用"的反例
除了 8 个正向判断,还有几条反例值得记:
- VLM 前面加表征学习特征——把 ViT 转成 BEV 再喂给 VLM,相比直接 ViT 没收益。表征学习的领域知识在大数据 + 大模型范式下被稀释
- CoT 监督——纯轨迹任务下 CoT 没明显帮助,但在更复杂的指令场景下(如靠边停车、舱驾一体多任务),CoT 还在试
- 前置 BEV 加在 head 前面——动态响应改善有限,倒是对静态目标识别有帮助,但优先级不高
- 4 层 linear 注意力的早期方案——退化为"只跟车道",因为文本通路没充分训
这些"试过没用"的反例和正向选择同样重要——它们标定了搜索空间的边界。