diff --git a/docs/experiment_round36_kmf_e1.json b/docs/experiment_round36_kmf_e1.json new file mode 100644 index 0000000..c280585 --- /dev/null +++ b/docs/experiment_round36_kmf_e1.json @@ -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 +} \ No newline at end of file diff --git a/docs/experiment_round36_kmf_e1b.json b/docs/experiment_round36_kmf_e1b.json new file mode 100644 index 0000000..fa7d4cf --- /dev/null +++ b/docs/experiment_round36_kmf_e1b.json @@ -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 无单位权重,越小越贴老师" +} \ No newline at end of file diff --git a/docs/探索日志.md b/docs/探索日志.md index 00d4520..4e3057f 100644 --- a/docs/探索日志.md +++ b/docs/探索日志.md @@ -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。 diff --git a/ml/eval/eval_cl.py b/ml/eval/eval_cl.py index f2388f6..5863496 100644 --- a/ml/eval/eval_cl.py +++ b/ml/eval/eval_cl.py @@ -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,