Noise and Statistics: Why +6.76 Doesn't Count, Part 1
重跑噪声(rerun noise):同一模型、同一路线集、同一评测配置下,完整重跑一遍所产生的分数波动幅度。它量的是测量仪器自身的抖动,不是任何干预的效果。
设路线集为 ,驾驶分数为 DS(Driving Score,CARLA leaderboard 口径:路线完成度 RC 乘以违章罚分系数)。
取绝对值是因为噪声的符号没有意义——这次涨下次跌,带符号求和会让涨跌互相抵消,把一把很抖的尺子误报成很稳(本实验 UE4 侧带符号均值仅 +2.23,绝对值均值却是 12.91,相差近 6 倍)。
任何”批 A 比批 B 高 X 分”的断言,都必须先回答:同一批自己重跑会差多少?如果 小于重跑噪声,这个差异就落进仪器的抖动带内,无法归因于任何干预。这和分析化学里”先称十次空烧杯测漂移,再称样品”是同一条规矩:不标定噪声,一切差异分析都是空中楼阁。
本项目两模型的实测标定值:SimLingo UE4/UE5 侧 12.91 / 20.74 分,AutoMoT 1.90 / 0.00 分(数据源:EXP-T3.0 / EXP-T3.3 / EXP-T3.4 的 metrics.json)。
开环评测(给定数据集算 loss)里,同样的输入必然得到同样的输出,分数严格可复现。闭环评测完全不同——模型的输出会改变它下一步的输入:
是策略(模型), 是仿真器的状态转移, 是第 帧相机画面。某一帧模型输出差一丝(车速差 0.1 m/s、方向盘差半度),下一帧的画面构图就变了;模型看到不同的画面,输出进一步不同——轨迹从此分叉,且分叉会被回路逐帧放大。
这类系统的偏差增长近似指数律:
是初始微小差异, 是最大李雅普诺夫指数(Lyapunov exponent),它衡量邻近轨迹分离的速率。 的系统叫混沌系统:方程完全确定,长期行为却不可预测。天气预报报不准就是同一个数学原理(洛伦兹的蝴蝶效应),闭环驾驶评测只是它的一个工程化身。
即使代码里没有显式随机源,闭环链路里仍有大量微观扰动:
s0 为基线批,s0r 为同设置重跑批。DS 为驾驶分数(0–100)。数据来自 experiments/EXP-T3.0-ue4-baseline/metrics.json:
| 路线 | s0 DS | s0 结局 | s0r DS | s0r 结局 | ΔDS |
|---|---|---|---|---|---|
| 10000 | 24.00 | blocked 卡死终止 | 88.73 | Completed | +64.7 |
| 10001 | 5.98 | 偏航 | 3.65 | blocked | −2.3 |
| 10002 | 24.50 | TickRuntime | 35.23 | blocked | +10.7 |
| 10007 | 98.88 | Completed | 98.88 | Completed | 0.0 |
| 10008 | 2.92 | 偏航 | 2.92 | 偏航 | 0.0 |
| 10009 | 26.11 | TickRuntime | 19.55 | TickRuntime | −6.6 |
| 10010 | 67.36 | Completed | 67.36 | Completed | 0.0 |
| 10011 | 98.95 | Completed | 54.62 | blocked | −44.3 |
| 10016 | 15.01 | 偏航 | 14.86 | 偏航 | −0.2 |
| 10017 | 96.41 | Completed | 96.68 | Completed | +0.3 |
批次均分:46.01 → 48.25,只挪动了 +2.24。
只看均分,结论会是”两次运行基本一致”。逐路线看,10 条里有 2 条发生了生死级翻转(+64.7 和 −44.3),方向相反、在均分里几乎恰好抵消。这是配对数据最经典的陷阱:
左边是带符号均值(+2.23),右边是绝对值均值(12.91)。前者量净漂移,后者才量抖动幅度——评估”这批分数稳不稳”必须用后者。
把 SimLingo UE4 侧 10 条路线的重跑差值(+64.7, −2.3, +10.7, 0, 0, −6.6, 0, −44.3, −0.2, +0.3)汇总:
带符号均值回答的是”重跑整体偏涨还是偏跌”,绝对值均值回答的是”重跑平均抖多大幅度”。噪声的特征恰恰是双向对称:+64.7 与 −44.3 这种大翻转在符号求和里互相抵消,带符号均值被压到 +2.23,看上去风平浪静;但仪器实际抖动着 12.91 分。只报带符号均值,等于把尺子抖动伪装成零。
差值总量 ,其中 10000(+64.7)与 10011(−44.3)两条合计 109.0,占 84%;其余 8 条合计 20.1,其中 3 条差值精确为零。噪声不是雨露均沾地每条抖一点,而是少数路线的极端事件主导——这个形态直接决定了它不能用高斯模型处理(见”二元翻转”一篇)。
bootstrap(自助法)通过对 10 个差值有放回重抽样估计统计量的分布,不假设数据服从任何分布,适合这种明显非高斯的样本。但 n=10 且两个极端值主导时,重抽样样本里极端值出现 0 次或多次都会剧烈摆动估计——CI 宽达 [0.25, 18.9] 正是小样本+重尾的真实写照,它本身就在提醒:这个噪声水平只配当粗粒度标尺。
直觉里的噪声是高斯(Gaussian)的:每条路线的分数围绕真值小幅对称波动,钟形曲线堆在均值附近, 能概括一切。
本实验实测的噪声是二元翻转:单条路线的结局只有两档台阶——
重跑一次,路线不”抖几分”,而是在两个台阶之间整档跳变:UE4 侧 10000 跳 +64.7(24.0→88.7),10011 跳 −44.3(98.9→54.6);UE5 侧更极端,10000 跳 +99.7(0.34→100 满分),10001 跳 +99.6(0.37→100)。UE5 侧 10 条差值总量约 207,这两条独占约 199,即 96%。
把单条路线建模为:以概率 落在完成台阶(高分 ),以概率 落在卡死台阶(低分 ), 为示性变量:
代入 、、(最不稳定的情形):单条路线的标准差高达 分。方差不是来自测量误差,而是来自结局类别本身的跳变——这就是”均值加减标准差”的直觉在这里失效的原因:一个双峰分布的均值和标准差加起来,描述的是一个没人落在其中的”中间地带”。
项目坑录(AGENTS.md T3.0 条目)记录了一个可复现的临界点位:对齐集坐标 (72, 24) 路口,绿灯亮起时 SimLingo 输出满刹车加锁死方向盘,车辆偏航约 7 米后彻底卡死;agent 自带的防卡死兜底 force_move 强推也救不回来。路线 10000 与 10007 在同一点位触发同一失败。
对照之下,AutoMoT 跑这两条路线是满分——排除了”场景本身不可通行”,确认这是模型间的真实行为差异。
单独的弱点只是一次卡死;放进闭环混沌系统里,它就变成了翻转发生器:
10000 的两次运行正是这条链路的两个分支:s0 批 blocked 于 24 分,s0r 批 Completed 拿 88.73 分,什么都没改。
闭环评测对”卡死”有明确的判停机制(agent blocked 判定):车辆速度长时间低于阈值即罚分终止。本项目两侧口径不同并已在 CP3 报告登记——UE4 侧 leaderboard 为 min_speed=0.5 m/s 持续 60s,UE5 侧自建 executor 为 200s 硬顶。临界弱点一旦触发判停,该路线的剩余完成度就被截断,这正是”卡死台阶”分数只有个位数到 20 几分的来源。
同一张路线卷,AutoMoT 的 s0→s0r 逐路线差值:10002 差 −18.8,10016 差 −0.2,其余 8 条全部精确为零;绝对值均值 1.90,带符号均值 −1.90。满分路线逐分不差地复现。(数据源:EXP-T3.0-ue4-baseline/metrics.json · models.automot.noise_calibration)
两个模型的失败模式在统计形态上完全不同:
| SimLingo | AutoMoT | |
|---|---|---|
| 失败性质 | 混沌性:临界点位随机翻转 | 系统性:超时就次次超时 |
| 重跑噪声 | 12.91(UE4)/ 20.74(UE5) | 1.90 / 0.00 |
| 逐路线形态 | 二元台阶跳变 | 逐分复现 |
系统性失败意味着失败由路线的稳定属性决定(比如某类场景模型就是处理不了),重跑自然落在同一个结局上;混沌性失败意味着失败由运行时微扰决定,重跑就是重新掷一次骰子。行为越稳定,重跑噪声越小——噪声大小是模型行为稳定性的直接度量。
噪声 1.90 意味着 AutoMoT 的尺子分辨率极高:n=10 配对下检测下限(MDE)只有 1.89 分,观测到 +32.90 的提升是下限的 17 倍,显著性毫无悬念。同样的十条路线、同一个评分器、同样的评测约定,模型行为的稳定性直接决定了实验能看清多小的差异(MDE 的推导见下半集)。
AutoMoT 在 UE5 侧(CARLA 0.10 自建 executor 管线)四个批次共 40 条记录,逐路线完全一致:重跑噪声 0.00,连一个比特都不差;满分批次重跑仍是满分批次(数据源:EXP-T3.4-automot-ue5/metrics.json)。
在闭环评测里这相当罕见——对照 SimLingo 同侧 20.74 的噪声,差异不是来自仿真器或评测器,而是来自模型行为的确定性程度。
第二条的价值超出本实验本身:后续 M4 阶段的采数与微调评测直接把 AutoMoT 当健全性锚点(sanity anchor)用——任何管线改动后先跑 AutoMoT,若不再零噪声复现,说明管线坏了而不是模型变了。
假设检验的对象是:“重跑噪声主要来自随机种子的抽样差异”。证伪它的办法是把种子间波动(seed_spread:同一批路线在 seeds s0/s1/s2 三个不同种子下的批次间差异)与重跑噪声(同种子原样重跑的差异)放在同一尺度上比较:
| 模型 | 种子间波动 | 重跑噪声(UE4 / UE5) |
|---|---|---|
| SimLingo | 19.9 | 12.91 / 20.74 |
| AutoMoT | 2.04 | 1.90 / 0.00 |
数据源:EXP-T3.0-ue4-baseline/metrics.json(seed_spread 与 noise_calibration 同表)。
如果噪声的根源是种子——即每个种子采样到不同的背景交通/初始条件,而这些外部随机源主导分数抖动——那么:
实测恰恰相反:种子间波动与重跑噪声同样大(19.9 ≈ 12.9~20.7;2.04 ≈ 1.90)。换一个种子得到的新分数,和固定种子重跑一遍得到的新分数,抖动幅度没有区别——每个种子只是重新进入同一个混沌系统掷了一次骰子。种子不是噪声的源头,模型行为的混沌分叉才是。
总方差可粗分为 。实测 seed_spread ≈ rerun noise 说明 并不比 大——而真正的大头在 route 维度:翻转集中在 2/10 条临界路线上。扩容预算应该砸向方差最大的分量:扩路线(把单条翻转的权重从 1/10 摊薄),而不是扩种子。CP3 据此否决了 seeds 3→5 的扩容分支(CP3 报告 §六)。
任何对比实验本质上是一次测量:用实验设计这把”尺子”去量”干预带来的真实差异” 。尺子自身的抖动幅度(重跑噪声) 是它的分辨率下限。只有当
时,观测差异才能从噪声中分离出来。本实验的实际比值:
同样的实验设计、同样的十条路线,一个结论是”测不出”,一个结论是”显著”——分野不在差异本身的大小,而在差异与噪声的比值。
“+6.76 不算数”的完整含义是:本设计测不出。它同时排除了两种过度解读:
这两种误读在一字之差之间,而后者正是科学写作里最常见的违规(对应下半集”不显著的正确表述”)。
噪声大不是”运气不好”,而是设计参数:噪声水平由模型行为稳定性决定(SimLingo 12.91/20.74 vs AutoMoT 1.90/0.00,同卷同尺差出一个数量级),并可被设计手段压缩(扩路线、换更稳的评测口径)。把噪声当成必须先标定、再治理、最后随结论一起报告的显式变量,是对比实验方法论的第一课。