diff --git a/docs/experiment_round43_control_strat.json b/docs/experiment_round43_control_strat.json new file mode 100644 index 0000000..7f7ed35 --- /dev/null +++ b/docs/experiment_round43_control_strat.json @@ -0,0 +1,107 @@ +{ + "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": null, + "out": "docs/experiment_round43_control_strat.json", + "trace": null, + "select": "endpoint", + "replan": "empty", + "safety": 1, + "partial": 1, + "inc_cap": 1, + "gap_margin": 0.0, + "cert_batch": 0, + "steps": 1, + "z_scale": 1.0, + "len_w": 0.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.5234375, + "collision_free_success": 0.5234375, + "time_ok_1p3": 0.265625, + "collision_rate": 0.0, + "collision_steps_mean": 0.0, + "travel_ratio_median": 2.615795850753784, + "time_mean_s": 2.486567258834839, + "brakes_mean": 19.5546875, + "start_fail": 0.0, + "goal_ratio_2s": 0.27920001745224, + "err_fail_med": 204.71360778808594, + "err_success_med": 0.21751396358013153, + "dls_share": 0.61328125, + "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.24741201102733612, + "reverse_mean": 0.25991496443748474, + "reverse_moving_p50": 0.32581019401550293, + "moving_share_p50": 0.9587156176567078, + "brake_rate_mean": 0.10028044879436493, + "brake_rate_p50": 0.0051282052882015705, + "brake_rate_p90": 0.3153846263885498, + "stuck_share": 0.234375, + "n_plans_mean": 195.0, + "success_reachable": 0.5514403581619263, + "by_cat": { + "A": [ + 128, + 96 + ], + "B": [ + 74, + 20 + ], + "C": [ + 32, + 11 + ], + "D": [ + 13, + 0 + ], + "Dr": [ + 9, + 7 + ] + } + }, + "simulation_wall_s": 353.7248780000082 +} diff --git a/docs/探索日志.md b/docs/探索日志.md index 1056045..70d0524 100644 --- a/docs/探索日志.md +++ b/docs/探索日志.md @@ -108,6 +108,21 @@ - **对 `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)要读的第一个数。 +## 分层指标上线并被三重交叉验证(轮次 43) + +- 对照配方(轮次 33 cap:1 步、`--inc_cap 1`)重跑一次带分层指标的评估:**原有 22 个指标逐位不变**,新增键全部产出(`docs/experiment_round43_control_strat.json`): + + | 新读数 | 值 | 独立离线预测 | + |---|---|---| + | `success_reachable`(排除按定义不可达的 D 类) | **0.5514** | 0.5514(逐题 dump 手算)✓ | + | `by_cat` 到达 | A 96/128=75%、B 20/74=27%、C 11/32=34%、D 0/13、Dr 7/9 | 与离线一致 ✓ | + | `brake_rate` mean / p50 / **p90** | 10.03% / 0.51% / **31.54%** | 均值与手算 19.55/195 一致 ✓ | + | `stuck_share`(brake_rate>0.2 的题占比) | **23.4%** | 与"最卡前 20% 题占 72.4% 刹停事件"同量级 ✓ | + | `reverse_p50` / `reverse_moving_p50` / `moving_share_p50` | 0.2474 / 0.3258 / 0.9587 | 离线预测 0.247 ✓ | + +- 三处独立来源(逐题 dump 手算、轨迹转储离线重算、评估内建指标)在四个数上完全对齐 ⇒ 这批分层读数可以当判据用,不只是看板。 +- **为什么现在必须有 p90/stuck_share**:对照口径的均值刹停率 10.03% 看着"差 5 倍",但真相是 **p50 只有 0.51%、p90 高达 31.5%、23.4% 的题踩在卡住线上**。以前只有均值时,`backoff` 这类"专治尾巴症状"的改动能把判据刷好而行为不变(已实测:brake_rate −16%、到达 −0.8 pp)——**没有 p90/stuck_share 就看不出这种背离**,这就是 #25 存在的理由。 + ## `backoff` 四臂判掉:转化率能买到刹停率,买不到到达——而且它能**绕过 §9.2 的判据**(轮次 43) - 同一 256 题同 seed、`--inc_cap 1 --cert_batch 1`,只改缩步档数(`docs/experiment_round38_backoff{0,1,2,3}.json`):