跳转至

判读线(预登记)

负结果只有在判读线先于结果落定时才算数。本页在结果产出之前写死判读标准与预测,以 git 提交时间为证。

声明时刻已知与未知

声明时(2026-09-02,UTC+8 晚)已知:YOLOv8n 三臂(baseline / esmoe / esmoe-rewire)各三 seed 的全部结果、其面积分档与路由分析;YOLO11n baseline seed 0 的总体指标。未知:YOLO11n 的 esmoe / rewire 全部三 seed 与 baseline 另两个 seed;YOLO12n、YOLO26n 的全部运行。判读线与预测约束的是这些未知结果。

判读线

对每个「主干 × 臂」组合(同预算、同数据、同增广、同评测口径、三 seed 同 seed 配对):

  • 有效:配对 mAP50 均值 > 0,且 ≥ 2/3 seed 为正,且配对 mAP50-95 均值 ≥ 0。
  • 无效:配对 mAP50 均值 ≤ 0,或 ≤ 1/3 seed 为正。
  • 证据不足:其余情形(例如均值为正但 mAP50-95 为负)。

三个 seed 不支持显著性检验:即使 3/3 胜,符号检验 p = 0.125。因此任何"有效"都只表述为"方向一致的小幅改善",不表述为可靠的单次提升。

预测(声明于结果之前)

  1. 默认接法的效应不随主干迁移的原因是接线而非主干:YOLO11n / 12n / 26n 上 rewire 臂的配对 mAP50 均值都高于同主干的默认 esmoe 臂。
  2. 默认接法在每代主干上都伤大目标:12n / 26n 的默认臂分档 APl 均值为负(P5 侧向绕过块在四代结构里都存在)。
  3. YOLO11n 在协议预算下的默认臂仍达不到"有效"(640/20ep 时为负;若 800/120ep 翻正则原"不跨主干"结论需要修正并公开说明)。

预测错了就照实记录——本页的意义正在于让"事后解释"无处遁形。

证据链

每次运行一条 JSON(results/,含 git_ref、环境、预算、seed、指标、产物路径);分档与路由分析由 scripts/buckets.py / scripts/routing.py 从 checkpoint 重算,均可复现。36 轮的 best.pt 与训练参数在 checkpoints 分支(Git LFS)。

判定(2026-09-04,全矩阵产出后)

四代主干 × 三臂 × 三 seed 共 36 轮全部按协议预算(VisDrone 全量训练、800px、120 epoch、patience 0、batch 32、同 seed 配对)跑完。按上文判读线逐格判定:

主干 默认 esmoe rewire
YOLOv8n 有效(mAP50 +0.0025,2/3;mAP50-95 +0.0004) 有效(+0.0036,3/3;+0.0011)
YOLO11n 有效(+0.0013,2/3;+0.0001) 有效(+0.0004,2/3;+0.0002)
YOLO12n 无效(−0.0018,0/3;−0.0021) 有效(+0.0001,2/3;+0.0006)
YOLO26n 无效(−0.0034,0/3;−0.0022) 无效(−0.0005,1/3;+0.0008)

判读线声明过:三 seed 不支持显著性检验,任何「有效」只表述为方向一致的小幅改善。YOLO12n 的 rewire 达线但均值近零,按「持平」理解更稳妥。

预测对账

  1. 部分成立rewire 臂的配对 mAP50 均值在 12n(+0.0001 对 −0.0018)与 26n(−0.0005 对 −0.0034)高于默认臂,在 11n(+0.0004 对 +0.0013)低于默认臂。
  2. 不成立。12n、26n 默认臂的分档 APl 均值分别为 +0.0068 与 +0.0085,都不为负;「默认接法伤大目标」是 v8n 特有的现象(v8n APl 0/3、均值 −0.0104),没有随代际迁移。26n 默认臂真正一致受损的是小目标(APs 0/3、均值 −0.0045)。
  3. 不成立,公开更正。YOLO11n 默认臂在协议预算下达到「有效」(+0.0013,2/3;mAP50-95 +0.0001)。此前基于 640px/20ep 结果给出的「效应不跨主干」结论不成立:小预算下的负结果放大预算后翻正,原结论撤回。

全矩阵可靠的规律

  • 默认接法的效应随主干代际单调衰减:+0.0025(v8n)→ +0.0013(11n)→ −0.0018(12n)→ −0.0034(26n)。主干末端越新(SPPF → C2PSA → A2C2f → E2E 头),同一嫁接点的默认接法越吃亏。此条已于第二轮判定撤回:七代凑齐后按版本号排不再单调,改按主干末端结构分组,见下文。
  • rewire 在 12n、26n 把默认臂的一致损失拉回持平附近,在 v8n 是唯一 3/3 的臂;仅在 11n 略低于默认臂。接线(消费者是否读到块输出)是比主干更大的自变量,但方向也不是处处占优。
  • 分档伤害的位置随主干变:v8n 伤大目标、26n 伤小目标、12n 方向不稳。任何「该块对某尺度有利/有害」的固定表述都过不了四代矩阵。
  • 路由四代同构塌缩:无死专家、单主导专家、平均概率近均匀、无尺度分工;26n 六个 checkpoint 有五个把主导权给了 k = 9 专家。改接线不改路由。

第二轮预登记(2026-09-05,声明于 YOLOv5 / v9 / v10 结果之前)

四代矩阵已判定完毕。未知:YOLOv5n / YOLOv9t / YOLOv10n 的全部 27 轮(同协议、三臂、三 seed)。判读线沿用上文,预测如下:

  1. v5n 默认臂配对 mAP50 均值 > 0——其主干末端是 SPPF,与 v8n 同族;「效应随主干代际单调衰减」的旧端应当为正。
  2. v10n 默认臂均值 < v5n 默认臂均值——v10 的末端是注意力块(PSA),按「末端越新默认接法越吃亏」的排序,它应落在 v5 之下。
  3. 路由塌缩在三代上继续成立——无死专家、单主导专家、平均概率近均匀、无尺度分工。这条是机制预测:若在任何一代上不成立,其信息量比前两条加起来都大。

预测错了照实记录。

补充声明(2026-09-07,仍在任何 v5/v9/v10 结果之前)

两台曦云 C500 到位后,排产为 v9t 九轮、v10n 九轮、v5n 九轮。两点需要提前写明:

  1. v5n 整代重跑,补齐缺的 rewire 臂,同时得到一份同配置换主机的复现记录。scripts/report.py 的分组键加入硬件栈,两台主机的同名配置各成一组,不被当作重复样本折进同一格。
  2. v10n 加跑 seed 3、4。box b 的排队比 box a 短,空出的机时用于把 v10n 的三条臂同时扩到五个 seed。三臂一起扩、且在任何 v10n 结果产出之前决定,避免"看到结果再决定给哪个格子加样本"。判读线不变;五个 seed 的符号检验 p 最低为 0.031,仍不足以支撑单次运行的可靠性表述。

第二轮判定(2026-09-09,33 轮产出后)

YOLOv5n / v9t / v10n 全部按协议跑完。v5n 在新硬件栈上整代重跑,v10n 三臂各扩到五个 seed。逐格判定:

主干 默认 esmoe rewire
YOLOv5n(metax3.3 有效(+0.0055,3/3;mAP50-95 +0.0038) 有效(+0.0024,2/3;+0.0018)
YOLOv5n(metax3.7 有效(+0.0041,3/3;+0.0026) 仅 seed 0,不判定
YOLOv9t 有效(+0.0025,2/3;+0.0009) 无效(−0.0013,1/3;−0.0021)
YOLOv10n(5 seed) 无效(−0.0002,3/5;−0.0003) 无效(−0.0031,1/5;−0.0016)

YOLOv10n 默认臂的均值压在零上、5 个 seed 里 3 个为正,按判读线归入无效,读作持平更准确。

预测对账

  1. 成立。v5n 默认臂两套硬件栈上都为正:+0.0055(3/3)与 +0.0041(3/3)。
  2. 成立。v10n 默认臂(−0.0002)低于 v5n 默认臂(+0.0055)。
  3. 成立。22 个 checkpoint 上路由塌缩照旧:死专家 0,主导专家 top-1 份额 0.491–0.921(三代均值 0.71–0.82),平均概率熵为最大值的 89.8%–97.2%,主导者随 seed 变,核 3 从未当过主导。

换主机复现

同一套 v5n 配置在两台曦云上各跑九轮:默认臂 +0.0041(metax3.7)对 +0.0055(metax3.3),符号、胜负与量级一致。配对差值是可复现的量。

顺带一个自证:v5n 的 rewire 臂在只有一个 seed 时是 +0.0074,补满三个 seed 后是 +0.0024。图上「不满三个 seed 不画均值」防的正是这种读法。

七代之后,原表述需要改

四代时写的是「效应随主干代际单调衰减」。七代凑齐后按版本号排不再单调——v10n(−0.0002)低于 11n(+0.0013)。按主干末端的结构分组则是齐的:

末端 主干 默认臂均值
SPPF 系 v5n / v8n / v9t +0.0055 / +0.0025 / +0.0025
注意力 v10n(PSA)/ 11n(C2PSA) −0.0002 / +0.0013
区域注意力 12n(A2C2f) −0.0018
E2E 头 26n −0.0034

分界在末端换成注意力块这一步,不在发布顺序。原「按代际单调衰减」的说法撤回。

第三轮预登记(2026-09-09,声明于任何 gshard 臂结果之前)

核对 YOLO-Master 的 ES_MOE 源码后发现,它优化的负载均衡项与本工具包默认的不是同一个:

公式 只读什么
上游 ES_MOE N · Σ usage²(GShard) 平均路由概率
本包默认 switch_balance E · Σ p̄ᵢfᵢ(Switch) 平均概率 × 实际负载

两者在我们实测到的那种塌缩上都取到最小值:平均概率近均匀、而单个专家吃下 62%–92% 的 top-1 时,Switch 项恒等于 k、GShard 项恒等于 1.0,改变 top-k 的分派都不会让它们动。差别只在概率本身集中时——那时两者都会上升。

gshard_balance 已实现并导出,scripts/train.py --balance gshard 可选。未知:v5n 与 v10n 各三 seed 的 gshard 臂。预测:

  1. 换成上游的 GShard 目标不会解除路由塌缩gshard 臂的主导专家 top-1 份额仍在 0.6 以上,平均概率熵仍在最大值的 90% 以上,死专家仍为 0。这是机制预测——若塌缩真的消失,说明目标函数的选择才是主因,本包的默认值要改。
  2. 精度不因此显著改变:v5n 与 v10n 的 gshard 臂配对 mAP50 均值与各自的 switch 臂之差落在 ±0.003 以内(即 seed 间离散度的量级)。

预测错了照实记录。

更正(2026-09-09,仍在 gshard 臂结果之前)

上文「两者在实测塌缩上都取到最小值」是在人工构造的均匀矩阵上算的,真实记录上不成立,照实更正。取 yolov9t-esmoe-s0 的路由记录:平均概率 [0.206, 0.213, 0.200, 0.381] 并不均匀,GShard 项算得 1.0919,高于最小值 1.0——它确实看见了概率集中。

真正的差距在系数。上游 ES_MOEbalance_loss_coeff = 1.0,经 moe_gain = 1.0 后直接 total = native_loss + aux;本包默认 attach_aux_loss(weight=0.01)。在同一条真实记录上,对平均概率的平衡梯度:本包 0.0200,上游 0.6159,相差 31 倍

因此两条预测的理由改写为:塌缩多半不因换目标而解除,是因为本包把平衡项压到了上游的百分之一,而不是因为两个目标都盲。预测本身不变。新增第三条

  1. 把权重抬到上游的 1.0 会明显改变路由--aux-weight 1.0 下主导专家 top-1 份额较 0.01 时下降,且降幅大于换目标(switch → gshard)带来的降幅。若抬权重也不动,问题就不在平衡项,而在路由器本身。

第四轮预登记(2026-09-09,声明于任何 master 臂结果之前)

读原论文正文(arXiv 2512.23273 第 3.5 节)后发现,论文指定的平衡项与上游代码实现的不是同一个。论文式 (13):

\[ \mathcal{L}_{LB} = \frac{1}{E}\sum_{i=1}^{E}\left(\mu_i - \frac{1}{E}\right)^2 \]

其中 μᵢ 由 Ω_train——即 top-K 掩码并重归一之后的权重(论文式 8)——在批与空间位置上取平均得到。上游 ES_MOE 则把 GShard 式 N·Σusage² 用在原始 router 概率上。三者在同一对输入上的表现:

目标 均衡分派 塌缩分派 能否分辨
switch_balance(本包默认) 2.00000 2.00000
gshard_balance(上游代码) 1.00000 1.00000
master_balance(论文式 13) 0.00000 0.00383

两组输入的平均概率都均匀,区别只在 top-k 分派是否塌到单个专家。前两者只读概率,读不出差别;论文那条读的是门控后的权重,读得出。我们此前七代实测的塌缩,正落在前两者的盲区内。

master_balance 已实现并可用 --balance master 选择。未知:v5n 与 v10n 的 master 臂各两个 seed。预测:

  1. 换成论文指定的平衡项会明显降低主导专家的 top-1 份额master 臂的主导份额低于同主干 switch 臂,且降幅大于 gshard 臂相对 switch 臂的降幅。这是本轮最强的机制预测——若它也不动,那么塌缩就与平衡项的形式无关,责任在路由器或嫁接点,前三轮的解释都要让位。

注:论文只写 λ_LB > 0,未给具体值,故 master 臂沿用本包默认权重 0.01,不与系数对照混淆。

更正(2026-09-09 晚,仍在 master/结构臂结果之前)

上文第四轮那张「三个目标只有论文能分辨塌缩」的表前提有误,照实更正。

逐句读上游后确认:ES_MOE._compute_load_balancing_loss 把 GShard 式施加在 DynamicRoutingLayer 的返回值上,而它训练期返回 _soft_top_k(...) 的输出——掩码并重归一后的门控。论文式 (12) 的 μ 取的也是门控。于是

\[\mathcal{L}_{\text{论文}}=\frac{\mathcal{L}_{\text{上游}}-1}{E^2}\]

论文与上游代码是同一个目标,仅差仿射变换,最小值点相同、梯度成正比。此前说「两者不是同一个」是错的。

错的是本包:gshard_balance 被写成读原始 softmax,那既非上游亦非论文。已修正为读门控;读概率的版本更名 gshard_probs_balance 保留。因此:

  • 那张表里 gshard 一行测的是 gshard_probs须按此重新标注;已跑完的五条记录的 balance 字段已就地改为 gshard_probs
  • 第四轮预测不撤回:它问的是「读门控的目标能否解除塌缩」,这个问题依然未知且成立。master 臂正在跑。
  • 真正的分水岭因此改写为:读概率还是读门控,而不是 Switch 与 GShard 之别。

第五轮预登记(2026-09-09 晚,声明于任何结构臂结果之前)

逐句对照后另有三处结构差异,此前从未纳入实验。三处都做成可配置项,默认保持旧行为以保既有 77 条记录可复现,各自跑成对照臂:

与上游的差异 开关
stages 上游主干每 stage 一块共四块,本包一块 --at backbone_stages
norm 上游加权求和后有 BatchNorm+SiLU(论文式 2 的 Norm --out-norm
dense 上游训练期跑满专家,未选权重为 0 但 BN 统计仍更新 --dense-training

预测:

  1. 块数是精度差异的主因,stages 臂的配对 mAP50 均值高于单块臂,且提升幅度大于任何一个平衡项换来的幅度。四块的容量与嫁接面都是单块的四倍,若它也抬不动指标,那么「嫁接位置/容量」这一条解释就该退场。
  2. dense 臂的主导专家 top-1 份额低于对应的稀疏臂。未被选中的专家在本包实现里 BN 统计冻结、彻底"冷却",上游让它们保持"温热";若塌缩确与此有关,这一臂应当把份额压下来。
  3. norm 臂对精度的影响落在 ±0.003 以内,即 seed 间离散度的量级——它是结构完整性问题,不预期是精度来源。

预测错了照实记录。

更正(2026-09-09 深夜,仍在任何结构臂结果之前)

上一节把五条记录的 balance 改标为 gshard_probs那次改标也是错的,连同 --balance--out-norm--dense-training 三个开关的全部结果,一并在此更正。

训练器会照 model.yaml 重建模型。YOLO(cfg) 返回实例之后再设到块上的目标函数与开关,落在一个随即被丢弃的对象上,不报错、不留痕。因此这三个开关从未进入真正训练的模型:请求 master 的跑了构造函数默认值,请求输出归一化的训练出来没有归一化,而记录照命令行写,说的是另一回事。

判据取自权重本身,不取自日志:

model = torch.load("best.pt", map_location="cpu", weights_only=False)["model"]
[b.balance.__name__ for b in esmoe.blocks(model)]  # ['switch_balance']

早于某设置的块连对应属性都没有,缺失本身即答案。据此:

  • 那五条记录训练的是 switch_balance,与默认臂同配置、同 seed 的另一次运行。它们改标为 switch,并入默认臂的重复项——同卡运行间离散度的直接测量,正是三 seed 置信区间稀缺的东西。
  • 标为 master 的两轮实际优化的是读门控的 GShardesmoe/module.py 的 md5 对应「读门控」那次提交,esmoe_aux 稳定在 0.0101,与均匀门控下 \(N\sum u^2 = 1\) 相符)。按 gshard 记。
  • 第四轮预测仍然成立且仍未回答:读门控的目标能否解除塌缩。回答它的是这两轮,不是原先以为的那两轮。

修法与复核。 graft() 把设置写进配置文件([4, 2, null, {balance: …, out_norm: …, dense_training: …}]),ESMoE 接受 options 映射并按名解析目标函数——重建多少次都在。scripts/train.py 改为从训练完的模型上读块配置写进记录,请求与实际不符即在开跑前退出;tests/test_ultralytics.py 真训一轮守住这条路径。

复核不靠回忆:scripts/blockspec.py 在存权重的机器上读出每个 checkpoint 的块设置,scripts/backfill.py --settings 按它改写记录并把改动写进记录本身。本仓 120 条记录逐条比对,0 条需要更正——已发布的数据是准的,错的只是尚未并入的新臂。

一般化的一条:记录里写着 --flag,不等于 --flag 进了模型。记录要从训练完的模型上读,不要复述命令行。

第四轮判定(2026-09-10,读门控的目标产出后)

第四轮问的是:换成能看见塌缩的目标,塌缩会不会解除。 两轮 v5n(seed 0、1)跑完,答案是不会,而且方向相反。

同一套 scripts/routing.py 在 VisDrone val 548 张上量出来:

目标 checkpoint 数 前两名用量之和(满分 2.0) 最低用量 出现死专家 概率熵
Switch(此前全部记录) 46 1.265–1.777(均 1.468) 0.0365 0 / 46 90%–97%
GShard 读门控 2 1.610–1.898(均 1.754) 0.0091 1 / 2 97%–98%

两个 checkpoint 都落在 Switch 那组的上半段或之上;seed 1 的 1.898 是全部 48 个 checkpoint 里最集中的一个。seed 0 出现了本项目第一个死专家(用量 0.0091),此前 46 个 checkpoint 一个都没有。同时概率熵反而更高(97%–98% 对 90%–97%)——路由概率更平,分派却更集中,正是这条线一直在追的那个背离。

配对精度是 +0.0018(两 seed,1/2 胜),落在同配置重复运行的离散度之内,说明不了什么。

混淆项曾被我写反,此处更正。 起初写的是「两项在同一权重下尺度差一倍,这一臂只承受一半压力」——那是拿两项在最优点的取值去比,而取值说明不了压力。真正决定一个权重买到多少的是该项加在路由 logits 上的梯度。按各 checkpoint 实际收敛到的平均路由概率量(scripts/pressure.py,结果在 results/pressure.md):

目标 相对 Switch 的梯度(v5n 各 checkpoint)
gshard(读门控) 0.59× – 1.48×
master(论文式 13) 约 1/11 – 1/134,即 1/E² 那个因子

同一个 weight=0.01 下,读门控的项与对照臂受力同量级,并非只有一半。「压力不够」这条退路因此不成立,本轮的判定反而更硬:在与对照臂相当的平衡压力下,读门控没有解除塌缩,分派反而更集中。

仍需说明的是样本量:两个 seed 对四十六个,单一主干对七代。

预登记的第四条预测不成立,照实记录。 master 那一档确实受力低一个数量级,要单独回答「论文那个尺度够不够」,需要把权重按 1/E² 抬上去再跑一轮,本轮没有跑。

同配置重复运行的离散度(2026-09-09,非计划所得)

上一节那六轮误标的运行,实际训练的与默认臂完全相同——同配置、同 seed、同一张卡上的另一次运行。它们因此不是重复样本,而是一把直接的尺子:同一个配置跑两遍,指标能差多少。

results/summary.md 末尾的表由 scripts/report.py 逐条算出:

硬件栈 epoch 重复对数 平均差 最大差
metaxc500 / metax3.3 120 5 0.0045 0.0130
metaxc500 / metax3.3 1 1 0.0000 0.0000
4090d / torch2.6 20 1 0.0000 0.0000

这把尺子量的是我们全部结论的分母。七代主干上,默认臂的配对差值均值是 v5n +0.0055、v8n +0.0025、v9t +0.0025、v10n −0.0002、11n +0.0013、12n −0.0018、26n −0.0034——七个里有六个落在同配置重复运行的平均差(0.0045)之内;只有 v5n 的 +0.0055 越过了它,而它仍远在最大差 0.0130 之内。

三点必须写明:

  1. deterministic=True 在这张加速卡上没有兑现。 训练器设了固定 seed 与确定性标志,4090 上同配置重跑逐位相同(一对,20 epoch),曦云 C500 上不同(五对,120 epoch)。差异随训练变长累积:1 epoch 时为零。
  2. 正效应最大的那一代,恰好在噪声最大的那台机器上。 v5n 的 +0.0055 与 +0.0041 都出自曦云;4090 上的四代(v8n、11n、12n、26n)目前只有一对同配置重复可依。
  3. 这不推翻符号的一致性,但推翻幅度的可读性。 「某代为正、某代为负」这一层由多 seed 的符号统计支撑;「+0.0055 是这个块带来的」这一层不成立——单次运行的差别就能有 0.0130。

因此本项目对精度的表述只保留到方向一层,且明确标注样本量与置信区间;此前判读线里凡以幅度为据的推断,一律降级为方向。这组负结果来自一个实现缺陷:那六次运行被误标,才有了同配置的重复运行。

第五轮判定(2026-09-10,三条结构臂产出后)

三条臂各三个 seed 跑完,同卡同 seed 配对:

与上游的关系 配对 mAP50 95% CI mAP50-95
norm(v5n) 上游恒开,本包默认关 +0.0038 [−0.0033, +0.0109] 3/3 +0.0022(3/3)
dense(v5n) 上游恒开,本包默认关 +0.0031 [−0.0006, +0.0068] 3/3 +0.0034(3/3)
stages(v10n,四块) 上游布局,本包默认一块 −0.0071 [−0.0162, +0.0019] 0/3 −0.0048(0/3)

一句话:上游块内部的两个默认都是正的且 3/3,上游的块数布局是负的且 0/3。 我们此前没抄的东西里,好的是块内那两项,坏的是块数那一项。

预测对账

第五条(stages 应高于单块臂,且幅度大于任何平衡项换来的)——推翻,方向相反。 四块非但没抬,反而是全部二十一个配对格里唯一 0/3 且两个指标同向为负的。预测里写着「若它也抬不动指标,那么『嫁接位置/容量』这一条解释就该退场」——按此自陈,该解释退场。参数是多的(3.15M 对 3.03M),不是容量不足。

混淆项已实测:四块把辅助项按块求和,同权重下 esmoe_aux 从 0.020 涨到 0.080,正好四倍。要把「块数」与「四倍平衡压力」拆开,需要在 weight=0.0025 下重跑四块;该臂已排队,结论待它。

第六条(dense 的主导专家 top-1 份额低于稀疏臂)——部分成立,按预登记的量不成立。 逐 seed:−0.277、+0.095、−0.017,均值 −0.066,2/3,且几乎全由 seed 0 一个点撑着。改看前两名专家占掉的用量则是 3/3 更低(1.392/1.403/1.555 对 1.431/1.610/1.646)。预登记的是 top-1 份额,按那个量只能算未确立;「dense 让分派更散」在另一个量上成立。

第七条(norm 对精度的影响在 ±0.003 以内)——推翻,且方向为正。 +0.0038 超出所划的带。更值得记的是它顺带带出的反向观察:norm 臂的主导专家 top-1 份额比稀疏臂 0.089(3/3),更集中却更准

由此得到的一条,比三条预测都重要

把「分派有多集中」与「配对涨了多少」放在一起看,58 个既有路由分析又有配对差值的运行上:

\[r = +0.160\]

主导专家的 top-1 份额从 0.49 到 0.92,配对 mAP50 差值从 −0.0113 到 +0.0109,两者几乎不相关,且相关的方向还是正的norm 更集中却更准、dense 更散也更准,都是这条的实例。

这动摇的是整条追问的前提。 本项目此前四轮都在问「怎么解除路由塌缩」,隐含假设是塌缩在拖累精度。在本口径下这个假设没有证据支持:塌缩与精度在这批数据上不相干。 平衡项该不该存在、该多大,因此不能从「防塌缩」推出来,得由它对指标的影响直接定——而那个影响,目前落在同配置重复运行的噪声里。

这条由 scripts/routing.py --summarise 逐次算出,写在 results/routing.md 开头,不是手抄。

对照臂结果

结果产出后自动填入,数字与 results/summary.md 同源。

第六轮判定(2026-09-11,去掉平衡项与四块降权产出后)

第五轮留下两件事没有定:四块的负效应来自块数还是来自四倍的辅助项;集中程度与精度无关之后,平衡项还起什么作用。第四轮也还差一问:论文的目标把压力抬足以后,能不能解除塌缩。本轮五条臂各三个 seed,同卡同 seed 配对:

回答什么 配对 mAP50 95% CI mAP50-95
四块,每块权重 0.0025(v10n) 辅助项总量与单块相同时,四块还差不差 −0.0113 [−0.0242, +0.0015] 0/3 −0.0075(0/3,区间 [−0.0132, −0.0018])
四块(v5n,补第三个 seed) 换一个主干,四块还差不差 −0.0049 [−0.0118, +0.0019] 0/3 −0.0035(0/3)
去掉平衡项(v5n) 平衡项起什么作用 +0.0005 [−0.0080, +0.0090] 2/3 +0.0006(1/3)
去掉平衡项(v10n) 同上 −0.0027 [−0.0170, +0.0116] 1/3 −0.0025(1/3)
论文式 13,权重 0.32(v5n) 论文的目标压力抬足后能否解除塌缩 +0.0021 [−0.0018, +0.0059] 3/3 +0.0009(2/3)

四块差在块数,不在辅助项的量

每块权重降到 0.0025 后,训练末期 esmoe_aux 为 0.020,与单块臂相同;权重 0.01 的四块臂是 0.080。辅助项总量对齐后四块没有回升,同 seed 下反而比权重 0.01 的四块臂更低(−0.0003、−0.0008、−0.0114),mAP50-95 的区间也不再跨零。v5n 补齐第三个 seed 后同样 0/3。两个主干、两档权重,四块布局的 9 个 seed 全部为负。「四倍平衡压力」这一混淆项排除,负效应来自块数本身。

去掉平衡项,专家直接死掉

按 checkpoint 数死专家(进入 top-2 的图不足 1% 的专家):

平衡项 每块权重 块数 checkpoint 有死专家的
Switch(本包默认) 0.01 1 60 0
Switch 0.01 4 6 0
Switch 0.0025 4 3 1
0 1 6 6
GShard 读门控(上游) 0.01 1 3 2
论文式 13 0.32 1 3 3

去掉平衡项的六个 checkpoint 无一例外死掉两个专家,剩下两个包揽全部 548 张图的 top-2(用量之和恰为 2.0),块退化为两个固定专家的加权;v10n 上主导专家的 top-1 份额为 0.964、1.000、1.000。权重 0.01 的 Switch 项在 66 个 checkpoint 上一个死专家都没有,每块降到 0.0025 就出现了。平衡项在本口径下保住的是每个专家都有图可分,不是均匀分派:带着它,分派照样集中(第四、五轮)。

精度上,去掉平衡项的臂与默认臂共用同一组基线,逐 seed 相减即得平衡项的作用:mAP50 上 v5n −0.0083、+0.0005、−0.0072,v10n −0.0016、−0.0062、−0.0002,6 个里 5 个更低;mAP50-95 也是 5/6 更低。但均值只有 −0.0050 与 −0.0027,而 v5n 默认臂 seed 2 自己跑两遍就差 0.0130。方向偏低,幅度在噪声之内,不下精度结论。

论文那一族目标为什么防不住

读门控的两种目标,6 个 checkpoint 里 5 个有死专家。压力不是原因:式 13 与读门控的 GShard 只差仿射(斜率 1/E²),权重 0.32 的式 13 在梯度上恰等于权重 0.02 的读门控 GShard,即第四轮那条臂的两倍;按 results/pressure.md,这在 v5n 各 checkpoint 上是 Switch 0.01 的 1.2–3.0 倍,仍然 3/3 有死专家。

原因在门控的形式。式 8 与式 9 是同一个数,而式 9 只含 top-K 子集里的 logit:

\[\Omega_{\text{train},i}=\frac{e^{L_i}}{\sum_{j\in I_K}e^{L_j}},\qquad i\in I_K\]

所以只读门控的平衡项,对当下没进 top-K 的专家,logit 梯度恒为零,不论这个专家还剩多少概率。一个专家在所有图上都掉出 top-K 以后,这一项再也够不着它。Switch 项读完整的 softmax,对子集外的专家有同量级的梯度,方向是把它拉回 top-K。数值断言见 tests/test_paper_parity.pytest_a_gate_reading_balance_cannot_reach_an_expert_outside_the_top_k

上游自己的配方里也是这样。此前在上游仓库 d5afc4b(2026-07-28)原生训练的 YOLO-Master-EsMoE-N 上,平衡项同样读门控(ES_MOE._compute_load_balancing_loss_soft_top_k 的输出),四个块里前三个各有两个专家利用率恰为 0,最后一个四个都用上;剪掉死专家后 mAP50 从 0.4271 到 0.4269,延迟降 24.5%(yolomoe-lnDISCUSSION_POST.md)。那次训练是 imgsz 1024、100 epoch、单次运行、YOLO-Master 自己的架构,与本项目协议不同,只作机制佐证,不进入任何精度比较。

预测对账

第四条(论文的平衡项会明显降低主导专家的 top-1 份额,降幅大于读门控 GShard)——按字面成立,背后的机制假设不成立。 登记的是权重 0.01 的 master,那一档从未真正跑过(见第四轮前的更正);按第四轮判定末尾的做法把压力抬足后,top-1 份额 2/3 个 seed 下降,均值 0.697 对默认臂 0.812,降 0.115,而读门控 GShard 反升 0.034。但同一批 checkpoint 3/3 有死专家,前两名用量 3/3 更高(1.704、2.000、1.692 对 1.431、1.610、1.646)。份额降下来,是因为分派从一个专家主导变成两个专家固定包揽,不是变均匀。读门控 GShard 补齐 seed 2 后也死掉两个专家。

第五轮留下的混淆项(四块的负效应是否来自四倍辅助项)——排除。

第五轮「由此得到的一条」修正后半句。 前半句仍成立:集中程度不预测精度,并入本轮后 81 个既有路由分析又有配对差值的运行上 r = +0.044(第五轮 58 个时为 +0.160)。后半句「平衡项该不该存在不能从防塌缩推出来」说过了头。塌缩分两层:主导专家份额高是一层,专家死掉是另一层。前一层与精度无关,平衡项也管不住;后一层 Switch 项管得住,0/66 对去掉它后的 6/6。它对精度的作用仍在噪声之内。

第七轮预登记(2026-09-11,声明于任何同配置对比满协议结果之前)

与 YOLO-Master 在同一配置下对照:同一个模型(上游 yolo-master-n.yaml,主干每个 stage 后一块,共四块),同一份协议(VisDrone 全量、imgsz 800、120 epoch、batch 32、patience=0,其余参数取默认),分别在上游分支(锁定基线 acce839c)与官方 ultralytics 8.4.101 加本包上训练。四臂,每个 seed 的四臂在同一张卡上:

框架 模型 训练方式
A 上游分支 yolo-master-n,4 个 ES_MOE 上游默认
A0 上游分支 同一模型去掉 4 个块 上游默认
B 官方 8.4.101 + esmoe 同一模型,4 个 ESMoE(读门控的 GShard、输出归一化、训练期跑满专家、推理剪枝 0.4) recipe="upstream"
C 官方 8.4.101 同一模型去掉 4 个块 默认

声明时已知:

  • 上游分支的训练器对所有模型有两处与官方不同:每个 epoch 最后一个 batch 强制更新;梯度一出现非有限值,就从上一个健康 checkpoint 恢复、重跑该 epoch,并关闭混合精度直到训练结束。
  • B 与 A 逐层参数一致(10 类时 2,814,406)。recipe="upstream" 复刻上游训练器对路由模型的三项处理:辅助项按自身幅值的滑动平均归一并封顶 3.0,路由器参数半学习率且不进 Muon,前 3 个 epoch 冻结专家。逐步数值与上游源码一致(tests/test_recipe.py)。
  • 曦云 C500 上 seed 0、1 的 A 与 A0 都在第 1 个 epoch 触发回滚,此后为 FP32;B、C 在冒烟中始终是混合精度。A 在 FP32 下单跑占显存 37 GB,因此每卡按「A 单跑,A0 与 C 同跑,B 单跑」排。

未知: 四臂全部 120 epoch 的指标;seed 2 所在的卡尚待平台修复。

判读线。 配对差都在同一张卡内求,三个 seed。同配置重复运行的离散度为均值 0.0045、最大 0.0130。

  • 等效:A − B 的配对 mAP50 均值绝对值 ≤ 0.0045,且 95% 置信区间跨零。
  • 不等效:A − B 的均值绝对值 > 0.0130,或三个 seed 同号且区间不跨零。
  • 无法判定:其余情形。
  • (A − A0) − (B − C) 按同样三档判定,回答块在两个框架里的作用是否一致。

预测:

  1. 两个实现等效:A − B 落在「等效」档。若落在「不等效」档,差异来自本包的块或训练方式的复刻,逐项排查。
  2. 块在两个框架里作用一致:(A − A0) − (B − C) 落在「等效」档,且 A − A0 与 B − C 的均值同号。
  3. 四块布局在这个预算下不带来提升:B − C 与 A − A0 按本页开头的判读线都落在「无效」。依据是第五、六轮四块布局在 v5n、v10n 上 9 个 seed 全负。若 A − A0 达到「有效」而 B − C 没有,四块的负效应就与训练方式有关,第五、六轮的结论要限定在 recipe="esmoe" 下。
  4. 读门控的平衡项在这里仍留下死专家:B 的 checkpoint 中至少三分之二有块出现死专家(进入 top-2 的图不足 1%)。依据是第六轮读门控的目标 6 个 checkpoint 里 5 个有死专家;上游的归一化把辅助项放大,但不改变它对 top-K 外专家梯度为零。若 B 一个死专家都没有,说明训练期跑满专家或专家预热补上了这一缺口,第六轮的机制解释要补充。

预测错了照实记录。

补充:训练过程逐步核对(2026-09-11,仍在任何满协议结果之前)

在 CPU 上以 FP32,让上游分支的训练器与本包各训 5 个 epoch:VisDrone 取 192 张图,每 epoch 12 个 iteration,MuSGD。两边起始权重相同,读到的 batch 逐个核对数据指纹也相同。脚本为 scripts/recipe_parity.py,结果在 results/recipe_parity.md

  • 块本身。 同权重、同输入下,ES_MOEESMoE 训练期输出差 1.9e-6(输出量级 7.07);对输入、路由器、专家的梯度差分别为 1e-11、2e-9、6e-10。
  • 不含块时。 A0 与 C 的损失在 epoch 0、1 逐位相同,epoch 1 末参数开始分开。这与上游每个 epoch 末个 batch 强制更新相符:预热期间累积步数在变,这一步与官方不再对齐。
  • 含块时。 A 与 B 每一步各参数组学习率相同,专家冻结一致(前 3 个 epoch 0/64,之后 64/64),但 epoch 0 的损失已相差 1.8%。
  • 对照。 把同一实现第一个路由层的权重放大 1e-6 再训:A 对自身差 2.3%,B 对自身差 1.5%,与 A 对 B 同一量级。第 0 个 iteration 的损失在两组数值之间来回跳:路由分数近乎打平时,舍入级的差异就会翻转 top-2 的选择。

结论:在 CPU 轨迹能分辨的精度内,B 与 A 的差别不超出舍入噪声。满协议上 A − B 的判读线不变。

补充:B 臂验证路径的缺陷与重测口径(2026-09-12,seed 2 尚未跑完)

B 臂三张卡的训练期验证都塌到 mAP50 0.043 左右,训练损失却与 A、C 持平。原因在本包的块:推理剪枝把 dynamic_threshold 与 top-k 重归一之前的原始概率比较,上游比的是重归一之后的份额。四选二时四个概率和为 1,第二名极少到 0.4,于是验证时几乎每张图都被剪成单专家,而训练是两专家混合。同一份权重换回上游次序即得 mAP50 0.374,不剪枝 0.375。已修于 d6f4dcc,默认 dynamic_threshold=0.0 不经过这条路径,本页前六轮的记录与论文发布模型复核都不受影响。

因此本轮四臂的指标改由 scripts/measure.py 统一重测:按各 run 自己的配置重建模型、装回 last.pt 里的 EMA 权重,同一套验证参数各测一遍。取 last.pt 而非 best.pt,因为 B 的 best 是按坏掉的指标挑的;四臂都设 patience=0,都跑满 120 epoch,末轮权重是可比的。记录本身不改写,训练器原来测到的值保留为 metrics_by_trainer

声明时已知:seed 0(c 卡)A 0.36370、A0 0.35419、B 0.37390、C 0.35972;seed 1(d 卡)A 0.37034、A0 0.35339、B 0.37240、C 0.35890。seed 2 的 B 臂仍在跑。同一份权重重复测量差约 0.0002。

判读线不变,仍按上面预登记的三档与四条预测对账。预测 4(死专家)读的是 checkpoint 的路由统计,与验证路径无关。

第七轮判定(2026-09-12,三个 seed 齐全)

指标为 scripts/measure.py 统一重测的值,配对差在卡内求(seed 0 在 c、1 在 d、2 在 e,同型号同栈)。

差(mAP50) 均值 95% 置信区间 为正 判定
A − B −0.0069 [−0.0175, +0.0037] 0/3 无法判定
A − A0 +0.0122 [+0.0019, +0.0225] 3/3 有效
B − C +0.0126 [+0.0070, +0.0181] 3/3 有效
(A − A0) − (B − C) −0.0004 [−0.0105, +0.0098] 2/3 等效
  • 预测 1(两个实现等效)未获证实,也未被推翻。 A − B 的均值绝对值 0.0069 落在两条线之间(等效要 ≤0.0045,不等效要 >0.0130 或同号且区间不跨零),三个 seed 虽同号但区间跨零,按预登记只能记「无法判定」。并且这一项含混杂:上游训练器在第 1 个 epoch 就关掉混合精度,A 与 A0 整程 FP32,B 与 C 走混合精度,所以 A − B 同时含实现差与精度差。两个框架各自内部作差的 A − A0 与 B − C 不含这一项。
  • 预测 2(块在两个框架里作用一致)成立。 差之差落在等效档,且 A − A0 与 B − C 同号为正。
  • 预测 3(四块布局在这个预算下不带来提升)不成立。 两个框架里四块都判「有效」,区间都不跨零。第五、六轮四块为负,是在 recipe="esmoe"、单块权重 0.01、无输出归一化、训练期不跑满专家的配置下得到的;换成上游那一整套(读门控的 GShard、输出归一化、训练期跑满专家、辅助项按自身幅值归一并封顶、前三轮冻专家、路由器半学习率)之后,四块在两个框架里都为正。原结论应限定为「在 recipe="esmoe" 下」,这正是预登记里写明的那条替代解释。
  • 预测 4(读门控的目标仍留下死专家)成立。 三个 B checkpoint 每个都有块出现死专家:四个块里各有三个(块 3 三次都没有),路由概率的熵是最大值的 98.5%,而 top-2 组合恒定——概率均匀掩盖了分派塌缩。训练期跑满专家与前三轮冻专家都没有补上这一缺口。

第八轮预登记(2026-09-13,B、C 臂结果之前)

第七轮的 A − B 含精度混杂:上游训练器第 1 轮就关掉混合精度,A、A0 整程 FP32,B、C 是混合精度。本轮四臂全部 --amp 0,其余与第七轮相同。

设计:同一台机器(f)的三张 C500 各跑一个 seed(0/1/2),每个 seed 的四臂同卡、串行。与第七轮不同机,所以两轮之间只比方向,不做配对。指标沿用第七轮补充的口径,由 scripts/measure.pylast.pt 统一重测。

声明时已知: - A 三个 seed、A0 的 seed 0 与 seed 1 已跑完。训练器测得的 mAP50:A 为 0.3682 / 0.3674 / 0.3686,A0 为 0.3568 / 0.3580。四条都是 amp_at_end=Falsebatch_at_end=32epochs_replayed=0。 - seed 2 的 A0 在第 43 轮被设备故障打断(Xnack Error/ATU Fault),正在重跑。 - B、C 尚无结果,A − B 与差之差都还不存在。

判读线:与第七轮相同的三档。噪声底 0.0045 / 0.0130 是在混合精度的运行上量的;FP32 没有重复运行,本轮沿用这两个数,这是已知局限。

预测: 1. A − B 落在等效档。去掉精度混杂后,两个实现在满协议上等效。若 |均值| > 0.0130,或三个 seed 同号且区间不跨零,就说明实现差是真的,逐项排查块与配方的复刻。 2. (A − A0) − (B − C) 仍落在等效档,且 A − A0 与 B − C 同号为正,复现第七轮。 3. A − A0 与 B − C 都仍判「有效」:精度不改变四块在上游配方下的作用。若任一变成「无效」,第七轮的「有效」就要限定在混合精度下。 4. B 的三个 checkpoint 仍都有死专家的块

补充:FP32 下的同卡噪声底(2026-09-13,重复运行开跑之前)

第八轮沿用的噪声底是在混合精度上量的。本补充在卡 f 上补五对 FP32 下的同卡重复运行:每对是第八轮的一条原运行,加上同一张卡、同一个 seed、同一个配置再跑一遍(标签 -p800fr)。

seed 类别
gpu0 B(官方 + 本包四块) 0 带块
gpu0 C(官方去块) 0 基线
gpu1 A(上游分支 + 四块) 1 带块
gpu1 A0(上游分支去块) 1 基线
gpu2 C(官方去块) 2 基线

口径:两条都由 scripts/measure.pylast.pt 重测,取 mAP50 之差的绝对值,报五对的均值与最大值,带块与基线再分开各报一次。先开跑的那条是第八轮的实验,后跑的只进噪声底,不进第八轮的对照表。

用法:第八轮的判定按两套噪声底各给一遍,一套是混合精度的 0.0045 / 0.0130,一套是本次 FP32 量出的均值 / 最大值。两套给出的档位不同时,两个都报,不择一。

声明时已知:五条原运行里,A(seed 1)与 A0(seed 1)已跑完,训练器测得 mAP50 为 0.3674、0.3580;B(seed 0)在跑,C(seed 0)未开跑,C(seed 2)在跑。五条重复运行都还没开始。

预测: 1. 带块两对的差都大于基线三对的均值。依据是第七轮补充的逐步核对:路由分数近乎打平时,舍入级差异会翻转 top-2。若带块的差不大于基线,这条依据在满协议上不成立。 2. FP32 的均值差在 0.0090 以内,即与混合精度的 0.0045 同一量级。若超过,说明精度改变了重复运行的离散度,此前各轮共用同一把尺子的做法要重新审视。

补充:seed 2 的 A0 从检查点续跑(2026-09-14,续跑之前)

seed 2 的 A0 在 gpu2 上三次被同一个设备故障打断(Xnack Error/ATU Fault,三次都出在卷积算子 MckFlexgemm256x64Tf32Gl__fwd_cross_tfround_a_nhwc_b_nhwc_c_nhwc),分别停在第 43、115、73 轮。三次合计训练约 10.6 小时、故障三次,按这个频率,从头跑满一条 A0(5.5 小时)难以完成。同卡的 A、B、C 与另两张卡上的 A0 都没有出现过这个故障。三条失败记录留在 results/,运行目录留在 runs/_failed/

做法:不再从头重跑,改为从走得最远的一次(已完成 114 轮)的 last.pt,在同一张卡上续跑余下 6 轮(scripts/train.py --resume)。检查点带优化器、EMA 与步数;最后 10 轮本就关闭 mosaic,续跑时训练器照此处理。检查点里没有随机数状态,所以这 6 轮的数据顺序与不中断时不同。从头重跑换掉的是整条 120 轮的轨迹,续跑只换最后 6 轮。

记录:新增 resumed 字段,写检查点、哈希、已完成轮数与这些轮的用时;gpu_hours 是两段之和。续跑若再被打断,从最新的 last.pt 接着续,不改用从头重跑。

声明时已知:完成 114 轮时训练器测得 mAP50 0.3574。第八轮其余 11 条已跑完,训练器测得的 mAP50:A 0.3682 / 0.3674 / 0.3686,A0 0.3568 / 0.3580(seed 0、1),B 0.3627 / 0.3613 / 0.3699,C 0.3600 / 0.3508 / 0.3564。这些都还没有经 scripts/measure.py 重测。

判读线、两套噪声底的用法与预测都不变。

第八轮判定(2026-09-14,三个 seed 齐全;FP32 噪声底待重复运行跑完)

指标为 scripts/measure.py 统一重测的值,四臂全程 FP32,配对差在卡内求(卡 f 的三张 C500,一张卡一个 seed)。seed 2 的 A0 由完成 114 轮的检查点续跑完成,见上一节补充。

差(mAP50) 均值 95% 置信区间 为正 判定(混合精度噪声底)
A − B +0.0046 [−0.0071, +0.0164] 2/3 无法判定
A − A0 +0.0104 [+0.0015, +0.0193] 3/3 有效
B − C +0.0095 [−0.0047, +0.0237] 3/3 无法判定
(A − A0) − (B − C) +0.0009 [−0.0221, +0.0239] 2/3 等效
  • 预测 1(A − B 等效)未获证实。 均值 +0.00462,比等效线 0.0045 高 0.0001;三个 seed 不同号、区间跨零,按预登记记「无法判定」。第七轮在混合精度下是 −0.0069、三个 seed 同为负,这一轮 FP32 下符号翻转,第七轮的负值没有重现。两轮不同机,只比方向。
  • 预测 2(差之差等效,且 A − A0 与 B − C 同号为正)成立。
  • 预测 3(A − A0 与 B − C 都仍判「有效」)成立。 这条预测登记的是本页开头的判读线(有效 = 配对 mAP50 均值 > 0、≥ 2/3 seed 为正、配对 mAP50-95 均值 ≥ 0):A − A0 为 +0.0104、3/3、mAP50-95 +0.0076,B − C 为 +0.0095、3/3、mAP50-95 +0.0066,两者都判「有效」。上表判定列用的是噪声底三档,按那一套 B − C 区间跨零,记「无法判定」;两套回答的问题不同,各自照报。本条初稿按噪声底三档写成「未获证实」,套错了预登记的判读线,2026-09-14 补判时改正。
  • 预测 4(B 的三个 checkpoint 仍都有死专家的块)成立。 格局与第七轮相同:每个 checkpoint 四个块里有三个出现死专家,块 3 三次都没有;出现死专家的九个块里八个 top-2 组合恒定,十二个块的路由概率平均熵为最大值的 98.8%。

另记两项: - 训练成本。B 在 FP32 下每条 10.6 小时,与 A 相同;第七轮 A 与 B 的耗时差(10.8 对 4.7 小时)来自精度,不来自实现。 - 面积分档(results/buckets.md)。两个框架里加块后都是大目标涨得最多,但都只有 2/3 为正。上游一侧小目标增益仍最小(+0.0086,中目标 +0.0106);本包一侧小目标与中目标相当(+0.0069 与 +0.0063)。第七轮两侧都是小目标最小(+0.0049、+0.0080)。

补判:FP32 噪声底(2026-09-14,五对重复运行重测后)

五对重复运行都跑满 120 个 epoch、全程 FP32,两条都由 scripts/measure.pylast.pt 重测:

类别 原运行 重复运行 差的绝对值
B,seed 0 带块 0.3601 0.3636 0.0035
A,seed 1 带块 0.3651 0.3634 0.0018
C,seed 0 基线 0.3559 0.3560 0.0001
A0,seed 1 基线 0.3552 0.3519 0.0033
C,seed 2 基线 0.3521 0.3625 0.0103

五对的均值 0.0038、最大 0.0103。results/summary.md 按硬件栈分组列出:官方栈三对 0.0046 / 0.0103,分支栈两对 0.0025 / 0.0033;判定按预登记用五对合并的值。C 的 seed 2 那条重复运行,第 28 个 epoch 的验证损失记为 nan,训练损失与该 epoch 的 mAP50 正常,此后逐轮回升;重测取的是 last.pt,不受影响。

  • 预测 1(带块两对的差都大于基线三对的均值)不成立。 带块两对是 0.0035、0.0018,基线三对的均值是 0.0046,最大的差出在基线。按预登记,「路由分数近乎打平时舍入级差异会翻转 top-2」这条依据在满协议上不成立。
  • 预测 2(FP32 的均值差在 0.0090 以内)成立。 0.0038,与混合精度的 0.0045 同一量级,此前各轮共用同一把尺子的做法不需要重新审视。

按两套噪声底再判第八轮:

差(mAP50) 均值 混合精度底 0.0045 / 0.0130 FP32 底 0.0038 / 0.0103 本页开头的判读线
A − B +0.0046 无法判定 无法判定
A − A0 +0.0104 有效 有效 有效
B − C +0.0095 无法判定 无法判定 有效
(A − A0) − (B − C) +0.0009 等效 等效

两套噪声底给出的档位相同。A − B 在两套底下都记不了「等效」:均值 +0.0046 高于两条低线(0.0045、0.0038),也没到不等效的条件。