exp: 轮次49——#31 门控地平线成立:终端段 20 mm 时时限收益与精度代价解耦

预注册判据(err_success_med 回到 ~0.22mm 且 time_ok>=0.31)由 20mm 臂满足:
0.2248 mm / 0.3281;到达题组内末态误差符号检验 67差/57好 p=0.42 ⇒ 与控制不可分
(pre h=2 是 82/42 p=4.2e-4,门控5mm 是 79/45 p=0.0029 仍显著变差)。
5→20mm 的分级响应是机理证据:病名是"终端代价的作用区间不够长",不是"缺终端代价"。

不许只报好的那半:不存在同时占优的阈值——20mm 把 A 类到达打到 94/128(控制与5mm 都是 96),
5mm 到达最高 0.5469 且行程比最好 2.4218 但精度仍显著变差。到达率在整条轴上都没跨过显著
(净 +3/+6/+5 题,McNemar p=0.68/0.33/0.42),所以主口径仍写控制值。

四列 collision_rate/over_vmax_rate 全 0、n_plans_mean 全 195.0 ⇒ 没有放松判据、规划次数不变。
下一步 seed=1 复现(控制臂复用 round47_ep_s1),判读规则已预注册。
This commit is contained in:
cbb
2026-10-21 01:24:21 +08:00
parent 801724bda2
commit 97f746077a
3 changed files with 244 additions and 0 deletions
+110
View File
@@ -0,0 +1,110 @@
{
"config": {
"ckpt": "ml/runs/base_dag2_dag1/best.pt",
"samples": "ml/data/samples",
"tasks": null,
"split": "val",
"n": 256,
"K": 8,
"commit": 2,
"fb": 2.2,
"ki": 0.0,
"fb_scale": 0.0,
"fb_near": 0.2,
"fb_fallback": 0.0,
"kdecay": 0.9,
"kimax": 0.5,
"fb_every": 1,
"safety_try": 0,
"sel_w": 0.1,
"dls_safety": 1,
"fb_clear": 0.0,
"fb_cmin": 0.3,
"sub_refresh": 0,
"fb_block_gain": 0.5,
"dump": "ml/runs/round49_gate20_rows.json",
"out": "docs/experiment_round49_gate20.json",
"trace": null,
"select": "pre",
"replan": "empty",
"safety": 1,
"partial": 1,
"inc_cap": 1,
"gap_margin": 0.0,
"cert_batch": 1,
"steps": 1,
"z_scale": 1.0,
"len_w": 0.0,
"tie": 0,
"pre_h": 0,
"pre_near": 20.0,
"backoff": 0,
"max_sec": null,
"seed": 0,
"dls": "analytic",
"device": "cuda"
},
"batch_size": 256,
"batch_seed_rule": "same seed per batch",
"checkpoint_sha256": "f7f686fd8ee92fb6948fbcc4ee954636065ad87bb54f661c4f8f575bc16c2ce1",
"tasks_sha256": "249bd93457825cda98c59e64d9a096d3473c69aeb3553de1dea6d9e56be71772",
"kin_fp": "2ebcbf17",
"act_scale": 1.0,
"metrics": {
"n": 256,
"n_ref": 256,
"success": 0.53515625,
"collision_free_success": 0.53515625,
"time_ok_1p3": 0.328125,
"collision_rate": 0.0,
"collision_steps_mean": 0.0,
"travel_ratio_median": 2.5145769119262695,
"time_mean_s": 2.3382482528686523,
"brakes_mean": 19.63671875,
"start_fail": 0.0,
"goal_ratio_2s": 0.17014972865581512,
"err_fail_med": 182.09060668945312,
"err_success_med": 0.2248138189315796,
"dls_share": 0.63671875,
"time_budget": "teacher×2(≥3 s)",
"speed_ratio_p50": 1.0000016689300537,
"speed_ratio_p95": 1.0000101327896118,
"speed_ratio_max": 1.0000101327896118,
"over_vmax_rate": 0.0,
"accel_ratio_p95": 1.0000016689300537,
"accel_ratio_max": 1.0000101327896118,
"reverse_p50": 0.24203822016716003,
"reverse_mean": 0.24321714043617249,
"reverse_moving_p50": 0.2936508059501648,
"moving_share_p50": 0.9595959782600403,
"brake_rate_mean": 0.10070113092660904,
"brake_rate_p50": 0.0051282052882015705,
"brake_rate_p90": 0.35384616255760193,
"stuck_share": 0.2421875,
"n_plans_mean": 195.0,
"success_reachable": 0.5637860298156738,
"by_cat": {
"A": [
128,
94
],
"B": [
74,
21
],
"C": [
32,
14
],
"D": [
13,
0
],
"Dr": [
9,
8
]
}
},
"simulation_wall_s": 285.5599780000048
}
+110
View File
@@ -0,0 +1,110 @@
{
"config": {
"ckpt": "ml/runs/base_dag2_dag1/best.pt",
"samples": "ml/data/samples",
"tasks": null,
"split": "val",
"n": 256,
"K": 8,
"commit": 2,
"fb": 2.2,
"ki": 0.0,
"fb_scale": 0.0,
"fb_near": 0.2,
"fb_fallback": 0.0,
"kdecay": 0.9,
"kimax": 0.5,
"fb_every": 1,
"safety_try": 0,
"sel_w": 0.1,
"dls_safety": 1,
"fb_clear": 0.0,
"fb_cmin": 0.3,
"sub_refresh": 0,
"fb_block_gain": 0.5,
"dump": "ml/runs/round49_gate5_rows.json",
"out": "docs/experiment_round49_gate5.json",
"trace": null,
"select": "pre",
"replan": "empty",
"safety": 1,
"partial": 1,
"inc_cap": 1,
"gap_margin": 0.0,
"cert_batch": 1,
"steps": 1,
"z_scale": 1.0,
"len_w": 0.0,
"tie": 0,
"pre_h": 0,
"pre_near": 5.0,
"backoff": 0,
"max_sec": null,
"seed": 0,
"dls": "analytic",
"device": "cuda"
},
"batch_size": 256,
"batch_seed_rule": "same seed per batch",
"checkpoint_sha256": "f7f686fd8ee92fb6948fbcc4ee954636065ad87bb54f661c4f8f575bc16c2ce1",
"tasks_sha256": "249bd93457825cda98c59e64d9a096d3473c69aeb3553de1dea6d9e56be71772",
"kin_fp": "2ebcbf17",
"act_scale": 1.0,
"metrics": {
"n": 256,
"n_ref": 256,
"success": 0.546875,
"collision_free_success": 0.546875,
"time_ok_1p3": 0.33203125,
"collision_rate": 0.0,
"collision_steps_mean": 0.0,
"travel_ratio_median": 2.4217512607574463,
"time_mean_s": 2.3379998207092285,
"brakes_mean": 19.83984375,
"start_fail": 0.0,
"goal_ratio_2s": 0.17014972865581512,
"err_fail_med": 185.13986206054688,
"err_success_med": 0.3768002390861511,
"dls_share": 0.63671875,
"time_budget": "teacher×2(≥3 s)",
"speed_ratio_p50": 1.0000016689300537,
"speed_ratio_p95": 1.0000101327896118,
"speed_ratio_max": 1.0000101327896118,
"over_vmax_rate": 0.0,
"accel_ratio_p95": 1.0000016689300537,
"accel_ratio_max": 1.0000101327896118,
"reverse_p50": 0.23239436745643616,
"reverse_mean": 0.23485617339611053,
"reverse_moving_p50": 0.28134557604789734,
"moving_share_p50": 0.9583333134651184,
"brake_rate_mean": 0.10174278169870377,
"brake_rate_p50": 0.0051282052882015705,
"brake_rate_p90": 0.35384616255760193,
"stuck_share": 0.24609375,
"n_plans_mean": 195.0,
"success_reachable": 0.5761317014694214,
"by_cat": {
"A": [
128,
96
],
"B": [
74,
22
],
"C": [
32,
14
],
"D": [
13,
0
],
"Dr": [
9,
8
]
}
},
"simulation_wall_s": 332.8420308999921
}
+24
View File
@@ -113,6 +113,30 @@
- **对 `backoff` 的预期与判据**:全拒意味着"连第 1 步的端点或中点已经穿进障碍",缩步能不能救取决于**穿得有多深**(穿 0.1 mm 救得回,穿 3 mm 救不回)。这个数转储里没记(只记被选中那条),所以直接由 `backoff_mean`/`reject_all_mean` 来量:
`reject_all_mean ≈ 原全拒次数`(=backoff_mean+brakes_mean,与轮次 33 cap 的 19.55 可比),`backoff_mean/(backoff_mean+brakes_mean)` 就是"缩步能救回的比例"。这是补跑(#22)要读的第一个数。
## 轮次 49:#31 门控地平线成立——终端段盖到 20 mm 时,时限收益与精度代价被解耦(预注册判据由该臂满足)
- **假设(由轮次 48 的四点曲线给出,不是拍脑袋)**:时限收益来自"打分地平线 = 执行地平线",精度代价来自"近终段没有终端代价"。两件事若真能分开,就应该存在一个终端段长度,使得短前瞻的时限收益基本不损、而末态误差回到控制水平。
- **做法**:`select=pre --pre_near <mm>`——当前误差 ≤ 阈值时打分改用**整条地平线**末端,远端仍用提交窗口点。多一次 `goal_err(B×K 点)` 只在门控口径下发生。
- **四列对照(全部 seed=0、同配方同批;控制=`round45_tie0`,pre=`round46_pre256`)**:
| 读数 | 控制 h=16 | `pre` h=2 | 门控 5 mm | 门控 20 mm |
|---|---|---|---|---|
| 到达 | 0.5234 | 0.5430 | **0.5469** | 0.5352 |
| 时限内(≤1.3×老师) | 0.2656 | **0.3320** | **0.3320** | 0.3281 |
| 2 s 误差比 | 0.2792 | 0.1702 | 0.1702 | 0.1702 |
| 到达题末态误差中位 | 0.2175 | 0.4151 | 0.3768 | **0.2248** |
| 行程比中位 | 2.6158 | 2.4449 | **2.4218** | 2.5146 |
| 刹停/题 | 19.55 | 19.84 | 19.84 | 19.64 |
| 执行碰撞 / 超 VMAX | 0 / 0 | 0 / 0 | **0 / 0** | **0 / 0** |
| `n_plans_mean` | 195.0 | 195.0 | 195.0 | 195.0 |
- **逐题配对(vs 控制)**:到达 门控5 赢 16 丢 10(净 +6,p=0.327)、门控20 赢 13 丢 10(净 +3,p=0.678)、`pre` 净 +5(p=0.424)⇒ **到达率在这条轴上任何一点都没跨过显著**。到达题组内的末态误差符号检验才是分界:`pre` 82 差/42 好 **p=4.2e−4**、门控 5 mm 79/45 **p=0.0029**(仍显著变差)、门控 20 mm 67/57 **p=0.42 ⇒ 与控制不可分**。
- **预注册判据的落点**(规则在看到数据前写在 `ml/runs/_r49_gate.sh`):成立 = `err_success_med` 回到接近控制(≈0.22 mm) 且 `time_ok ≥ 0.31`。**门控 20 mm 两条都满足**(0.2248、0.3281)⇒ 假设成立。门控 5 mm 只满足时限一半都不到(0.3768 仍显著差)⇒ 不成立。
- **5→20 mm 的分级响应是机理证据,不是调参**:终端段太窄(5 mm ≈ 最后一两步)只回收 20% 的精度差,20 mm(≈ 最后 3–5 步)才回收全部。⇒ 病名的正确写法是**"终端代价的作用区间不够长"**,而不是"缺终端代价"。这也说明 `pre` 的精度损失不是"打分变笨"的随机副作用,而是近终段路径选择被 2 步口径主导的直接后果。
- **两条臂各自的代价(不许只报好的那半)**:门控 20 mm 把 A 类到达打到 **94/128**(控制 96、门控5 也是 96),换来精度归零;门控 5 mm 到达最高 0.5469 且行程比最好(2.4218),但末态误差仍显著变差。⇒ **不存在同时占优的阈值**,本轮只证明"可解耦",不证明"已找到最优点"。
- **口径纪律**:不改为默认。§9.2 的"时限内"最好读数现在是 **0.3320(pre h=2 / 门控5)**,"到达"最好读数是 **0.5469(门控5)**——两者都还没显著超过控制,所以验收栏仍写控制的 0.5234/0.2656,另注可选口径。
- **下一步(唯一还没做的关键检验)**:门控 20 mm 在 seed=1 复现(控制臂 `round47_ep_s1` 已在盘 ⇒ 只需一条臂)。若 p=0.42 那个"与控制不可分"变成"显著变差",本轮结论降级为"阈值恰好躲过一次复现"。
## 轮次 48:#30 打分地平线四点曲线——进度收益是剂量-反应关系,而精度代价只集中在 h≤4;h=8 是个坏点
- **设计**:`select=pre` 加 `--pre_h`(0=commit_n)。同 seed=0、同配方(`K=8/commit_n=2/fb=2.2/inc_cap=1/cert_batch=1`),只改打分取 `fut` 的第几步。h=2 与 h=16 两点已在盘(轮次 46 / 45,且控制臂已证跨窗口逐位复现),本轮补 **h=4、h=8**。