exp: 轮次37——K-MF 方案核查:Eq.7 抄法不动点不自洽(1.87×),一步输出比自身2段采样离老师远10倍

This commit is contained in:
cbb
2026-10-20 21:38:40 +08:00
parent 349814db7e
commit a4cac354ea
4 changed files with 457 additions and 1 deletions
+337
View File
@@ -0,0 +1,337 @@
{
"checkpoint": "ml/runs/base_dag2_dag1/best.pt",
"n": 256,
"nref_steps": 128,
"reference": "瞬时场 r=t 的流图(与损失无关)",
"per_rt": [
{
"r": 0.0,
"t": 0.05,
"span": 0.05,
"norm_u_true": 4.152298927307129,
"norm_dudt": 156.59774780273438,
"mf_abs": 2.629317283630371,
"mf_rel": 0.6185885667800903,
"mf_cos_true": -0.2586098909378052,
"mf_cos_eps": -0.08821636438369751,
"kmf_sq_abs": 3.808063507080078,
"kmf_lin_abs": 2.105757713317871,
"kmf_lin_rel": 0.4867732524871826,
"kmf_lin_cos_eps": -0.19339147210121155,
"mid_only_abs": 2.467759370803833,
"midstate_abs": 2.475457191467285,
"midstate_rel": 0.5789506435394287,
"heun_abs": 2.465583324432373,
"heun_rel": 0.5782649517059326,
"d1_norm": 157.7960968017578,
"d2_norm": 150.50238037109375,
"d3_norm": 153.35733032226562,
"net_abs": 2.7900571823120117,
"net_rel": 0.686574399471283
},
{
"r": 0.0,
"t": 0.1,
"span": 0.1,
"norm_u_true": 6.895779609680176,
"norm_dudt": 25.08617401123047,
"mf_abs": 2.9073116779327393,
"mf_rel": 0.4195072650909424,
"mf_cos_true": 0.7109781503677368,
"mf_cos_eps": 0.6336730718612671,
"kmf_sq_abs": 1.5212182998657227,
"kmf_lin_abs": 5.014378070831299,
"kmf_lin_rel": 0.7285130023956299,
"kmf_lin_cos_eps": -0.707574188709259,
"mid_only_abs": 11.992480278015137,
"midstate_abs": 2.770589828491211,
"midstate_rel": 0.39942666888237,
"heun_abs": 1.8834517002105713,
"heun_rel": 0.2704611122608185,
"d1_norm": 24.996402740478516,
"d2_norm": 156.59774780273438,
"d3_norm": 59.145477294921875,
"net_abs": 3.2193822860717773,
"net_rel": 0.4677886366844177
},
{
"r": 0.0,
"t": 0.2,
"span": 0.2,
"norm_u_true": 8.788705825805664,
"norm_dudt": 6.331303596496582,
"mf_abs": 2.572011947631836,
"mf_rel": 0.29417163133621216,
"mf_cos_true": 0.8289472460746765,
"mf_cos_eps": 0.795153021812439,
"kmf_sq_abs": 1.7290871143341064,
"kmf_lin_abs": 1.926774501800537,
"kmf_lin_rel": 0.2203272432088852,
"kmf_lin_cos_eps": 0.08155926316976547,
"mid_only_abs": 3.628005266189575,
"midstate_abs": 3.9586117267608643,
"midstate_rel": 0.4504213333129883,
"heun_abs": 1.7300267219543457,
"heun_rel": 0.19759969413280487,
"d1_norm": 4.81895637512207,
"d2_norm": 25.08617401123047,
"d3_norm": 28.122135162353516,
"net_abs": 1.9169456958770752,
"net_rel": 0.2185157686471939
},
{
"r": 0.0,
"t": 0.3,
"span": 0.3,
"norm_u_true": 9.446111679077148,
"norm_dudt": 4.131267547607422,
"mf_abs": 2.354419231414795,
"mf_rel": 0.2489214837551117,
"mf_cos_true": 0.8489015102386475,
"mf_cos_eps": 0.8029109239578247,
"kmf_sq_abs": 1.4227628707885742,
"kmf_lin_abs": 1.530599594116211,
"kmf_lin_rel": 0.16132134199142456,
"kmf_lin_cos_eps": 0.09631951153278351,
"mid_only_abs": 2.57088565826416,
"midstate_abs": 4.304656982421875,
"midstate_rel": 0.4555080831050873,
"heun_abs": 1.8236483335494995,
"heun_rel": 0.1927146017551422,
"d1_norm": 3.2171449661254883,
"d2_norm": 11.126049041748047,
"d3_norm": 18.29114532470703,
"net_abs": 1.3471484184265137,
"net_rel": 0.14259807765483856
},
{
"r": 0.0,
"t": 0.4,
"span": 0.4,
"norm_u_true": 9.78399658203125,
"norm_dudt": 2.373415946960449,
"mf_abs": 1.7019946575164795,
"mf_rel": 0.17237165570259094,
"mf_cos_true": 0.8364542722702026,
"mf_cos_eps": 0.80040043592453,
"kmf_sq_abs": 1.4873857498168945,
"kmf_lin_abs": 1.8382024765014648,
"kmf_lin_rel": 0.18990299105644226,
"kmf_lin_cos_eps": 0.6340612173080444,
"mid_only_abs": 2.7560770511627197,
"midstate_abs": 4.497618675231934,
"midstate_rel": 0.4598080515861511,
"heun_abs": 2.0347068309783936,
"heun_rel": 0.20750463008880615,
"d1_norm": 2.2074503898620605,
"d2_norm": 6.331303596496582,
"d3_norm": 13.588470458984375,
"net_abs": 0.9387868642807007,
"net_rel": 0.09583067893981934
},
{
"r": 0.0,
"t": 0.5,
"span": 0.5,
"norm_u_true": 9.98532772064209,
"norm_dudt": 2.658200263977051,
"mf_abs": 0.8106092214584351,
"mf_rel": 0.0805797278881073,
"mf_cos_true": -0.3406544327735901,
"mf_cos_eps": -0.19956746697425842,
"kmf_sq_abs": 1.2309105396270752,
"kmf_lin_abs": 1.5382835865020752,
"kmf_lin_rel": 0.15414834022521973,
"kmf_lin_cos_eps": 0.5139043927192688,
"mid_only_abs": 2.382789134979248,
"midstate_abs": 5.330208778381348,
"midstate_rel": 0.5345790982246399,
"heun_abs": 2.8818538188934326,
"heun_rel": 0.28885430097579956,
"d1_norm": 1.423255443572998,
"d2_norm": 4.9012861251831055,
"d3_norm": 12.108942031860352,
"net_abs": 0.8207994103431702,
"net_rel": 0.08221843093633652
},
{
"r": 0.0,
"t": 0.6,
"span": 0.6,
"norm_u_true": 10.118559837341309,
"norm_dudt": 4.046132564544678,
"mf_abs": 3.044166088104248,
"mf_rel": 0.3003576099872589,
"mf_cos_true": 0.9172172546386719,
"mf_cos_eps": 0.841435432434082,
"kmf_sq_abs": 1.3112163543701172,
"kmf_lin_abs": 1.7851487398147583,
"kmf_lin_rel": 0.17629936337471008,
"kmf_lin_cos_eps": 0.7054632306098938,
"mid_only_abs": 2.974583625793457,
"midstate_abs": 3.8119943141937256,
"midstate_rel": 0.37495750188827515,
"heun_abs": 0.9826163649559021,
"heun_rel": 0.09552386403083801,
"d1_norm": 1.021875023841858,
"d2_norm": 4.131267547607422,
"d3_norm": 7.380629539489746,
"net_abs": 0.5622822046279907,
"net_rel": 0.0555611215531826
},
{
"r": 0.0,
"t": 0.7,
"span": 0.7,
"norm_u_true": 10.210578918457031,
"norm_dudt": 1.5618565082550049,
"mf_abs": 0.7238559722900391,
"mf_rel": 0.0707138329744339,
"mf_cos_true": 0.01889939233660698,
"mf_cos_eps": 0.0709509551525116,
"kmf_sq_abs": 1.1261842250823975,
"kmf_lin_abs": 1.562591552734375,
"kmf_lin_rel": 0.15248213708400726,
"kmf_lin_cos_eps": 0.6589925289154053,
"mid_only_abs": 2.7245984077453613,
"midstate_abs": 5.200009346008301,
"midstate_rel": 0.509149432182312,
"heun_abs": 2.7610363960266113,
"heun_rel": 0.27028360962867737,
"d1_norm": 0.9923672080039978,
"d2_norm": 3.2669692039489746,
"d3_norm": 8.216880798339844,
"net_abs": 0.6127126216888428,
"net_rel": 0.06004098802804947
},
{
"r": 0.0,
"t": 0.8,
"span": 0.8,
"norm_u_true": 10.280738830566406,
"norm_dudt": 3.559027671813965,
"mf_abs": 3.139580726623535,
"mf_rel": 0.3054307699203491,
"mf_cos_true": 0.841235876083374,
"mf_cos_eps": 0.7405093908309937,
"kmf_sq_abs": 0.9379472732543945,
"kmf_lin_abs": 1.278116226196289,
"kmf_lin_rel": 0.12322138249874115,
"kmf_lin_cos_eps": 0.6785725951194763,
"mid_only_abs": 2.1469192504882812,
"midstate_abs": 3.9412341117858887,
"midstate_rel": 0.3837699890136719,
"heun_abs": 1.2848330736160278,
"heun_rel": 0.12474364042282104,
"d1_norm": 0.6407566070556641,
"d2_norm": 2.373415946960449,
"d3_norm": 5.565019130706787,
"net_abs": 0.544069766998291,
"net_rel": 0.05294711887836456
},
{
"r": 0.0,
"t": 0.9,
"span": 0.9,
"norm_u_true": 10.333314895629883,
"norm_dudt": 17.87816619873047,
"mf_abs": 16.365367889404297,
"mf_rel": 1.5846014022827148,
"mf_cos_true": 0.949444055557251,
"mf_cos_eps": 0.8185906410217285,
"kmf_sq_abs": 0.7964116334915161,
"kmf_lin_abs": 1.5619468688964844,
"kmf_lin_rel": 0.14914938807487488,
"kmf_lin_cos_eps": -0.682485818862915,
"mid_only_abs": 2.9376566410064697,
"midstate_abs": 4.5689287185668945,
"midstate_rel": 0.44398587942123413,
"heun_abs": 10.097332000732422,
"heun_rel": 0.9785149693489075,
"d1_norm": 0.9012945890426636,
"d2_norm": 3.5273427963256836,
"d3_norm": 4.809117794036865,
"net_abs": 0.19002258777618408,
"net_rel": 0.018513960763812065
},
{
"r": 0.0,
"t": 0.95,
"span": 0.95,
"norm_u_true": 10.35672664642334,
"norm_dudt": 64.29971313476562,
"mf_abs": 61.504981994628906,
"mf_rel": 5.942716598510742,
"mf_cos_true": 0.9920964241027832,
"mf_cos_eps": 0.938286304473877,
"kmf_sq_abs": 0.6677861213684082,
"kmf_lin_abs": 1.1961216926574707,
"kmf_lin_rel": 0.1146148070693016,
"kmf_lin_cos_eps": -0.46628355979919434,
"mid_only_abs": 2.5505270957946777,
"midstate_abs": 26.227705001831055,
"midstate_rel": 2.537191390991211,
"heun_abs": 43.71785354614258,
"heun_rel": 4.225504398345947,
"d1_norm": 0.9435088634490967,
"d2_norm": 2.9939303398132324,
"d3_norm": 27.214248657226562,
"net_abs": 2.2616631984710693,
"net_rel": 0.2185918092727661
},
{
"r": 0.0,
"t": 1.0,
"span": 1.0,
"norm_u_true": 10.378573417663574,
"norm_dudt": 4.240537643432617,
"mf_abs": 3.8513689041137695,
"mf_rel": 0.3713422417640686,
"mf_cos_true": -0.9887999892234802,
"mf_cos_eps": -0.916346549987793,
"kmf_sq_abs": 7.18745231628418,
"kmf_lin_abs": 14.660856246948242,
"kmf_lin_rel": 1.412999153137207,
"kmf_lin_cos_eps": -0.8949825167655945,
"mid_only_abs": 2.364427328109741,
"midstate_abs": 4.872905731201172,
"midstate_rel": 0.4697429835796356,
"heun_abs": 4.360708236694336,
"heun_rel": 0.4204045832157135,
"d1_norm": 28.04054832458496,
"d2_norm": 2.658200263977051,
"d3_norm": 5.2787017822265625,
"net_abs": 3.9062576293945312,
"net_rel": 0.3766472339630127
}
],
"ref_discretization": {
"norm_128": 10.378573417663574,
"norm_512": 10.360570907592773,
"diff_mean": 0.018837258219718933,
"diff_rel": 0.0018179214093834162
},
"gate_corner": {
"mf": 3.8513689041137695,
"kmf_sq": 7.18745231628418,
"kmf_lin": 14.660856246948242,
"mid_only": 2.364427328109741,
"midstate": 4.872905731201172,
"heun": 4.360708236694336,
"net_1step": 3.9062576293945312,
"ratio_lin_over_mf": 3.8066611150358813,
"ratio_mid_over_mf": 0.6139186837137884,
"ratio_midstate_over_mf": 1.265239932221571,
"ratio_heun_over_mf": 1.132248908183406
},
"gate_worst_accel": {
"t": 0.05,
"dudt": 156.59774780273438,
"mf": 2.629317283630371,
"kmf_sq": 3.808063507080078,
"kmf_lin": 2.105757713317871,
"mid_only": 2.467759370803833,
"ratio_lin_over_mf": 0.8008762298973645
},
"wall_s": 13.092682200003765
}
+97
View File
@@ -0,0 +1,97 @@
{
"n": 512,
"steps": {
"2": {
"vs_teacher_l2": 0.4342995882034302,
"vs_32step_l2": 0.30502474308013916,
"vs_1step_l2": 4.2227020263671875
},
"3": {
"vs_teacher_l2": 0.43872418999671936,
"vs_32step_l2": 0.29536527395248413,
"vs_1step_l2": 4.216776371002197
},
"4": {
"vs_teacher_l2": 0.42935511469841003,
"vs_32step_l2": 0.29940515756607056,
"vs_1step_l2": 4.232732772827148
},
"8": {
"vs_teacher_l2": 0.4444255232810974,
"vs_32step_l2": 0.2452448457479477,
"vs_1step_l2": 4.195967197418213
},
"16": {
"vs_teacher_l2": 0.5166380405426025,
"vs_32step_l2": 0.12673738598823547,
"vs_1step_l2": 4.085569381713867
},
"32": {
"vs_teacher_l2": 0.6008902192115784,
"vs_32step_l2": 0.0,
"vs_1step_l2": 3.970090866088867
}
},
"vs_teacher": {
"a1_1step": {
"l2_mean": 4.325636386871338,
"l2_p95": 4.9564337730407715,
"per_axis_norm": [
0.3975203335285187,
0.36649173498153687,
0.3425973951816559,
0.3447648882865906,
0.3368167281150818,
0.32962310314178467
]
},
"aU_32step_rneq_t": {
"l2_mean": 0.6008902192115784,
"l2_p95": 1.9733507633209229,
"per_axis_norm": [
0.05318881571292877,
0.04853545129299164,
0.04775547981262207,
0.04531646892428398,
0.0381026417016983,
0.034751877188682556
]
},
"aF_flow_map_r_eq_t": {
"l2_mean": 0.6651337146759033,
"l2_p95": 1.9794291257858276,
"per_axis_norm": [
0.06039007008075714,
0.05440700799226761,
0.05297258496284485,
0.05065540224313736,
0.04315900802612305,
0.03988185524940491
]
}
},
"mutual": [
{
"l2_mean": 3.970090866088867,
"pair": [
"a1",
"aU_32"
]
},
{
"l2_mean": 3.891127109527588,
"pair": [
"a1",
"aF_flow"
]
},
{
"l2_mean": 0.08254596590995789,
"pair": [
"aU_32",
"aF_flow"
]
}
],
"note": "动作块是 ±1 归一化的 16×6;l2_mean 无单位权重,越小越贴老师"
}
+21
View File
@@ -770,6 +770,27 @@
- **改动(默认关,`--backoff`)**:全拒时不再站住,把首选候选按 1/2、1/4、1/8…(档数 = backoff)**并进同一次批量认证**(零额外几何调用),只在原候选连第 1 步都不安全时顶上;缩步候选不参与"前缀更长者优先"的比较,所以正常路径的选择逐位不变。新增 `backoff_mean` 指标记录缩步次数。测试 35→38 项(全拒→慢爬、有安全前缀时插手无效、未开批量认证时报错)。
- **待测**:256 题 A/B(`--inc_cap 1 --cert_batch 1 --backoff 0/1/2/3`)——GPU 先让给 K-MF E1,这轮排在其后。
## 轮次 37:K-MF(运动学 MeanFlow)方案核查——先测"一步 vs 多步",结果比论文那条更要命
- **交来的方案里那几条 file:line 断言,逐条回代码核过(都成立)**:`ml/model/meanflow.py:38-39` 是标准 Eq.4 单段自举(`jvp` 切向量 (v,0,1),目标 `v − (t−r)·du/dt`);`ml/train.py:162` 调 `meanflow_loss` 时**没接 ada_p** ⇒ 自适应加权一直是默认 `ada_p=1.0`(配置里改不了,与方案说的一致);`p_neq` 在第 `p_neq_warm=5000` 步从 0 硬切到 0.5;`p_edge=0.1` 把 10% 样本钉在部署角 (r=0,t=1);`policy.sample_k(..., steps=1)` 是默认,`ml/model/policy.py:153` ⇒ **历史发布的所有数字都是一步推理**。
- **方案里过时的两条要先改掉,否则会拿旧靶子做新实验**:「闭环 0% 到达、79% 碰撞」是 DAgger 之前的状态,现在是 256 题到达 57.4%、实际执行碰撞 0(轮次 30/33);「DAgger 全量是主线,先做」也已完成(`base_dag2_dag1` 就是两轮的产物)。所以 E 系列的判据不能再用"能不能从 0 救起来"。
- **E1 第一版判据是自证的,作废**:我先拿"网络自己的 r≠t 切片走 32 段"当平均速度真值——那正是 MF 损失直接训练的切片,等于用被测公式的收敛解当真值。改成**与损失无关的参考**:平均速度的定义是瞬时场(r=t 切片,由纯流匹配监督)的流图 `u_true = (z_t − Φ_{t→r}(z_t))/(t−r)`,128 段欧拉;离散化自证:128 段与 512 段的真值差 0.019(相对 **0.18%**)⇒ 参考本身稳。
- **E1 结果(`docs/experiment_round36_kmf_e1.json`,256 个 val 样本,λ=0.5,‖u_true‖ 均值 10.38)**:目标与真值的距离(越小越好)
| 目标写法 | (r=0,t=1) 部署角 | 最差 ‖du/dt‖ 处 (t=0.05) |
|---|---|---|
| MF(现行 Eq.4) | **3.851** | 2.629 |
| K-MF 按方案抄的 (1−λ)²/λ² | 7.187(1.87×,更差) | 3.808 |
| K-MF 把平方换成线性权重 (1−λ)/λ | 14.661(更差) | 2.106 |
| 把整条修正移到中点时刻 `du(z_c,r,c)/dc` | **2.364(0.61×)** | 2.468 |
| 网络现在的一步输出 u(ε,0,1) | 3.906 | — |
- **两条硬结论**:
1. **方案抄来的 Eq.7 系数在收敛解上不自洽**:λ=0.5 时两项系数和 = (1−λ)²+λ² = 0.5,不动点变成 `v − 0.5(t−r)u'`,不是平均速度;实测也印证——部署角 `‖du(z_t,c,t)/dt‖ = 28.0` 而 `‖du/dt‖ = 4.24`(把 r 槽钉在中点后对 t 的导数大 6.6 倍),组合被这一项主导,所以偏差反而更大。**K-MF 仓库只有 README,论文只能引公式,这条是我们自己的数**:要么抄漏了子区间时长因子,要么 c 的定义不同。判据「K-MF 偏差 ≤ MF 的一半」在这个写法下不成立(1.87×)。
2. **自举污染是真的,而且就在部署角**:网络一步输出与自己的流图差 3.906(相对 38%),而 MF 目标的偏差 3.851 几乎一样 ⇒ 训练把目标的偏差原样灌进了线上那一步。`‖du/dt‖` 在两端炸开(t=0.05 为 156.6、t=0.95 为 64.3,中段只有 1.6–4.1),与论文 Fig.1a 的形态一致(他们报 76×,我们这里 0.05↔0.4 是 **66×**)。
- **E1-b(`docs/experiment_round36_kmf_e1b.json`,512 样本,比的是"离老师多远",归一化动作块 L2)**:一步 **4.326**;同模型 2 段 **0.434**、4 段 0.429、32 段 0.601;流图(r=t,128 段)0.665。**一步比多步差 10 倍**,而 2 段就基本到位(再多段反而偏离老师——那是模型自身场的偏差,不是采样误差)。
- **这一条比 K-MF 本身更要命**:57.4% 的到达是在"线上一步输出偏离自己场 10 倍"的前提下拿到的,安全层/反馈/DAgger 都在替这个角点擦屁股。所以先把 `--steps` 打通,量它对闭环到达的影响,再决定要不要为"把一步训好"付一次训练。
## 分支清理(2026-10-20)
- `feat/fb-mix`(8e5431c):反馈混合方案的中间分支,**已验证是 `exp/dagger-deploy` 的祖先**(所有提交都在后者历史里),本地/远端分支删除,内容保留在 exp/dagger-deploy。
+2 -1
View File
@@ -93,6 +93,7 @@ def main():
ap.add_argument('--inc_cap', type=int, default=0, help='1=反馈叠加后再按每轴 VMAX·DT 限幅')
ap.add_argument('--gap_margin', type=float, default=0.0, help='安全层要求的间隙余量 mm(>0 时宽相位 cap 自动抬到 margin+0.5)')
ap.add_argument('--cert_batch', type=int, default=0, help='1=一次 gaps 调用覆盖全部候选(压最坏情况,典型路径略贵)')
ap.add_argument('--steps', type=int, default=1, help='MeanFlow 采样段数;1=线上一口径(历史发布数字全是 1)')
ap.add_argument('--backoff', type=int, default=0, help='全拒时把首选候选按 1/2、1/4…缩步重试的档数(需 --cert_batch 1)')
ap.add_argument('--max_sec', type=float, default=None)
ap.add_argument('--seed', type=int, default=0)
@@ -116,7 +117,7 @@ def main():
'kin_fp': kin.fp, 'act_scale': float(model.act_scale),
}
t0 = time.perf_counter()
r, pers = run(model, kin, tasks, a.device, K=a.K, safety=bool(a.safety), seed=a.seed, max_sec=a.max_sec,
r, pers = run(model, kin, tasks, a.device, K=a.K, safety=bool(a.safety), seed=a.seed, max_sec=a.max_sec, steps=a.steps,
safety_partial=(a.commit if (a.safety and a.partial) else 0), commit_n=a.commit,
select=a.select, replan=a.replan, fb_gain=a.fb, fb_scale=a.fb_scale, fb_near=a.fb_near, fb_fallback=a.fb_fallback, fb_ki=a.ki, fb_decay=a.kdecay, fb_imax=a.kimax,
fb_every=a.fb_every, safety_try=a.safety_try, sel_w=a.sel_w, dls_safety=a.dls_safety, fb_clear=a.fb_clear, fb_cmin=a.fb_cmin, sub_refresh=a.sub_refresh, fb_block_gain=a.fb_block_gain,