这套东西不是一次设计出来的。下面按时间顺序写,从换车型就失效,到能跑、能部署,再到开始怀疑指标。
2026 年 8 月:单一车型能跑,换一辆就不行
最初的端到端模型只在一辆车上验证过。相机装在哪、朝哪、FOV 多大,都是固定的,模型把这些几何关系隐式记了进去。
问题在于我们手上的车不止一种:相机数量不同,安装位置不同,内外参也不同。换一辆车,投影关系变了,模型就掉。每换一次布局就重采数据、重训一遍,这条路走不远。
8 月底先做了一轮多录制审计。原来的参考模型只在自己的训练录制上有效,换到别的录制,重建和端到端指标都崩。这次审计改掉了评估口径:以后所有对比必须跨录制、同口径。这件事看起来是评估问题,实际上决定了后面所有结论可不可信。
2026 年 9 月上旬:先把输入统一
9 月初开始评估 UniDrive。它的思路是在原始图像和感知模型之间插一层虚拟相机:定义一组虚拟相机,用 CMA-ES 优化它们的位置、朝向和 FOV,把任意配置的原始图像重投影到这组统一视图上。
我们按这个思路做了三轮:
- 9 月 3 日,多视角统一的可行性;
- 9 月 9 日,七相机候选环视的可行性;
- 9 月 11 日,真实图像管线跑通;
- 9 月 14 日,正式固化成候选几何工具。
落地路径是:七路严格同步的原生图像 → 车身为中心的等距柱面全景 → 重采样出 6 个虚拟相机,拼成 3×2 的 grid。
这一步比看上去难。9 月 14 日的侧向围栏诊断里,在约 10 米远、1 米高的合成围栏上,四个侧向过渡接缝的上沿仰角差 0.504°、下沿 0.358°,换算到虚拟视图上大约是 4.8 px 和 3.4 px 的上下错位。原因是所有相机被映射到同一个 40 米共同曲面,而侧向相邻相机的基线有 1.8 到 3.3 米;前方那对只有 0.058 米,误差就小得多。
我们试过曝光归一化和车身遮挡,它们能改善亮度和遮挡,但修不了这类几何错位。真圆柱也评估过,没有直接升级成默认方案。最后这批数据明确标成 candidate_geometry_only:它是候选几何拼接,不是生产标定。对我们来说,这一层的价值是把输入固定下来,而不是宣称拼接已经完美。
2026 年 9 月 19 日:连续 flow 头第一次跑通
输入统一之后,才开始做世界模型。第一版照 SV-WAM 的因式分解来:
| |
动作和未来视频 latent 在同一个 DiT 里联合去噪,用非对称 mask 保证动作 token 看不到未来视频 token。这条约束是硬的:部署时要删掉整个视频分支,动作路径一旦依赖它,就删不掉。
第一次跑通只用了连续 flow 头。跑通之后遇到两个问题。
第一个是 warm start。 加动作头之后,序列多出 state 和 10 个动作 token,未来视频的行号整体后移。直接联合训练,视频分支掉得厉害:从零训只能到 24.62 dB,而从已经训好的视频臂 warm start 是 28.41 dB。动作 token 对视频分支是有信息量的条件,不是噪声。
第二个是归一化。 动作目标一开始用固定范围 [-1,1],ADE 停在 0.192 m。换成零均值单位方差之后,ADE 降到 0.099 m、FDE 降到 0.158 m,第一次超过 causal-CV 基线(0.160 / 0.228)。结构没动,只是目标尺度变了。时间调度单独几乎无效,两者叠加才最好。
这段的代价是视频分支 PSNR 从 28.41 掉到 27.00,仍高于纯视频臂的 26.37。
2026 年 9 月 20 日:换成六相机 grid,删掉一条更简单的路
9 月 20 日把输入从单路换成六相机 3×2 grid,视觉后端换成冻结的 Wan2.1 VAE:8 倍下采样、16 通道 latent。
同一时期,另一台机器上实现过第二条出轨迹的路:在 pooled DiT 特征上接一个 MLP,直接回归 dx/dy/yaw,用 SmoothL1 做辅助损失。它看起来更简单,也被删了。原因是部署时视频分支整体删除,任何读视频特征的轨迹头都没有输入——这正好违反 p(A|Ω) 的出发点。
删掉之后留下一条验收准则:在非对称 mask 下,不带 V_tgt 的 action-only 采样,必须和联合采样逐位一致。这条后来变成了回归测试,实测最大差异 0.00e+00。
2026 年 9 月 22 日:promote 成主线,以及一次改名事故
9 月 22 日把这条线从“视频世界模型 + ego 轨迹头”提升为主线,改名为 wam / train_wam。提升的实质不是改名,而是部署口径变了:一次前向同时给出未来视频 latent 和 1 秒轨迹,部署时删掉视频分支,只留动作路径。
同一天加了离散 token 动作头:把 (dx, dy) 量化成词表 token 自回归预测,dψ 仍走连续回归。两种头由 action_vocab_size 切换,共用同一个视频分支。
改名的重构出过一次事故:CVAE 路径和 warm start 一起丢了,continuous 后端会直接以 --cvae is required 退出。修回来之后,warm start 的位置编码平移抽成了函数,用测试钉住平移范围、默认 delta 和不合法输入。
2026 年 9 月底到 10 月 8 日:离散 token、自行车模型、2 秒 horizon
这一段的目标是给后面的 RL 铺路:把动作改成离散 token 自回归,把 horizon 从 1 秒推到 2 秒。
三个改动:
- 去掉 teacher forcing。 训练时用模型自己的 argmax 作为下一步输入,训练分布和推理分布一致,避免 exposure bias;
- curriculum。 先只监督前 2 个 token(1 秒),再逐步加到 4 个 token(2 秒);
- 用自行车模型代替独立的 dyaw 回归。 从 token 位移直接推 heading 变化,少一个 head。
同时把数据扩到三个 session 的六相机 grid,完成了 2 秒 horizon 的 overfit 验证。这一步证明链路能走通,但没有证明泛化。
2026 年 10 月 14 日:盘一次现状
到 10 月中旬,状态需要说清楚:当前主线是 WAM 的小数据拟合,不是 episode-isolated 的 held-out。
- 连续 flow 头和离散 token 头已经合并进同一个模型,由
action_vocab_size选择; - 六相机构建代码在,但本地参考集还没换成六相机;
- 六相机编目被卡住:可计数的 session 只有 2 个,计划要求 train / val / test 各至少 3 个;
- 数据里绝大多数是直线,转弯样本非常少,聚合 ADE 被纵向项主导。
还有一个没解决的现象:高速窗口的最大误差始终在 16 米左右,不随采样步数下降。至少有一个窗口,模型预测“几乎不动”,真值走了 16 米。
2026 年 10 月 18 日:低 ADE 不等于理解动作
走到这里,有一个问题必须问:ADE 降低了,PSNR 提升了,模型真的理解到物理世界的变化了吗?
训练目标是 p(Z_fut | Ω, A),这是一个观测条件分布;真正想要的是动作的因果效应 p(Z | do(A), Ω)。存在未观测的驾驶意图或场景上下文时,两者可以完全不同。
现有数据能支持三种解释:
H1(因果):模型学到了动作的后果;
H2(场景先验):模型学到的是“看到这个场景该怎么开”,动作只是场景的代理;
H3(辅助正则):视频分支只是有用的表征正则,真正出轨迹的是动作头看到的
Ω和S。0.099 m 的 ADE、27 dB 的 PSNR 无法区分这三者。而且这个 ADE 是在同一批拟合窗口上得到的,不是 held-out。
视觉基准也提示过同一件事:Physics-IQ、VideoPhy、IntPhys 2 都显示,画面保真度和物理正确性可以脱钩。ADE 和 PSNR 衡量的是“像不像”,不是“懂不懂”。
现在的样子
工程上,链路已经打通:不同车型的输入先统一到六虚拟相机,世界模型输出 1 秒轨迹,部署删掉视频分支。延迟在 bs=1、bf16 下:动作分支 2 步 7.1 ms、20 步 64.1 ms,联合 20 步 123.2 ms;部署端到端 14.8 到 71.8 ms,同等步数下只走动作路径比联合快 1.8 倍。
但少步采样没成功:2 步误差在米级,2 到 20 步单调改善,所以部署固定 20 步。这条没有绕过去,只是接受了。
回头看,这半年分成两段:先把输入统一、把模型压成能部署的动作路径;然后承认输入统一和指标好看,都不等于理解了动作。
前者是工程,后者是因果。两者之间还差一次干预实验。