diff --git a/docs/experiment_round36_steps8_cap1.json b/docs/experiment_round36_steps8_cap1.json new file mode 100644 index 0000000..68729f5 --- /dev/null +++ b/docs/experiment_round36_steps8_cap1.json @@ -0,0 +1,73 @@ +{ + "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/round36_steps8_cap1_rows.json", + "out": "docs/experiment_round36_steps8_cap1.json", + "trace": null, + "select": "endpoint", + "replan": "empty", + "safety": 1, + "partial": 1, + "inc_cap": 1, + "gap_margin": 0.0, + "cert_batch": 0, + "steps": 8, + "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.41015625, + "collision_free_success": 0.41015625, + "time_ok_1p3": 0.32421875, + "collision_rate": 0.0, + "collision_steps_mean": 0.0, + "travel_ratio_median": 1.8700296878814697, + "time_mean_s": 1.9293333292007446, + "brakes_mean": 79.69921875, + "start_fail": 0.0, + "goal_ratio_2s": 0.3575941324234009, + "err_fail_med": 330.5984191894531, + "err_success_med": 0.2526792883872986, + "dls_share": 0.46875, + "time_budget": "teacher×2(≥3 s)", + "speed_ratio_p50": 1.0000016689300537, + "speed_ratio_p95": 1.0000053644180298, + "speed_ratio_max": 1.0000101327896118, + "over_vmax_rate": 0.0, + "accel_ratio_p95": 0.9362331628799438, + "accel_ratio_max": 1.0000005960464478 + }, + "simulation_wall_s": 316.32940030000464 +} diff --git a/docs/探索日志.md b/docs/探索日志.md index 7df016b..53ada4d 100644 --- a/docs/探索日志.md +++ b/docs/探索日志.md @@ -16,16 +16,31 @@ ## 轮次统计 -- 连续无实质进展轮数:0(轮次 9–17 持续有实质进展)。 -- **历史最佳(部署口径,n=512)**:`ml/runs/base_dag2_dag1/best.pt` + `K=8, safety=True, replan='empty', fb_gain=1.8, safety_partial=1, commit_n=1` → **到达 42.2%、碰撞 2.9%、ratio2s 0.270、time_ok_1p3 29.1%、刹停 37.4/题、仿真墙钟 870 ms/题**;推理 12.58 ms/次(B=64,K=8,桌面 3090 均值,P99 未测)。 -- 保守版(碰撞优先):gain 1.5 → 40.8% / 2.1% / 0.309 / 25.0% / 25.3 / 852 ms。 -- 与基线对比:到达 **0→42.2%**、碰撞 **99.6→2.9%**、ratio2s **0.755→0.270**;代价:DAgger 微调使开环 ol_fk 5.98→15.7 mm。 -- 相对 §9.2:到达 42.2% vs ≥98%(差距大);碰撞 2.9% vs 0(接近策略单独 <3% 线);用时 ≤老师×1.3 为 29.1%;推理+认证 P99 未测(桌面均值 12.58 ms,预算 20 ms)。 -- 未进入大规模训练(需用户确认 §9.2 锚点)。 -- 训练方法探索(轮次 19–22):APG(管线修复、尺度失控)、反馈蒸馏(未内化)、DAgger-3(39.5%)、冻结编码器(41.8%)——均未超过 dag2 基线 43.8%。 +- 连续无实质进展轮数:0。 +- **当前最好(n=256 val,同 seed 同批)**:`ml/runs/base_dag2_dag1/best.pt` + `K=8, select=endpoint, replan=empty, commit_n=2, fb=2.2, fb_block_gain=0.5, dls_safety=1, safety=1` → **到达 57.4%、无碰撞到达 57.4%、时限内(≤1.3×老师) 39.1%、刹停 19.25/题、行程比 2.445、2 s 误差比 0.210**(轮次 33 base)。 + - **但这组数含超速**:`speed_ratio_p50=1.660`、`over_vmax_rate=1.000` ⇒ 每轴实际最大速度是 VMAX 的 1.66 倍(反馈叠在 ±1 限幅之后,轮次 30 定位)。按合法限速 `--inc_cap 1` 重测是 **到达 52.3% / 时限内 26.6%**(轮次 33 cap)。**验收要引用后者**,两者的差就是"以前的分数有一部分是超速换来的"。 + - n=512 复核在轮次 28–30 给过 50.8–52.1%;当前配方(含 `inc_cap`)尚未在 n=512 重跑。 +- **实时性(GPU,B=1、K=8、一步)**:整周期 P50 33.5 ms、P99 64.7 ms;批量认证把最坏情况从 80.2 → 37.1 ms(轮次 34)。仍未进 §9.2 的 P99 < 20 ms,瓶颈是几何查询不是推理(推理 7.2 ms)。 +- **安全层口径**:线上只做**端点 + 中点**点检(`gaps(...).min(-1) > 0`)。轮次 30 那条"认证通过仍碰撞"(−0.149 mm)已被连续段认证抓住(`certify_uniform` n≥8、二分 5 次查询),但它进不了实时预算(轮次 31–32)。 +- **失败结构(轮次 38,147 到达 / 109 未到)**:**63 题是走一半被冻住**(离目标 >100 mm 且刹车 >30 次)、23 题方向错、位置差 20~100 mm 15 题、差 5~20 mm 5 题、姿态没到位 3 题、起步失败 0;未到组活动窗内 37% 的步是零运动。 +- **与 §9.2 的差距**:到达 52.3% vs ≥98%;时限内 26.6% vs 100%;刹停远大于 2% 的推理周期;P99 未达标。碰撞口径已达标(执行 0)。 +- **已试过的训练法(轮次 19–22)都没超过 dag2 基线**:APG(管线修复但尺度失控)、反馈蒸馏(未内化)、DAgger-3(39.5%)、冻结编码器(41.8%)⇒ 再提到达率优先走"推理/选择/安全层"这条,而不是先重训。 +- **规矩**:大规模训练与扩数据都要用户放行;不许用放松碰撞/安全/精度/实时来换分数;负结论与本表一起留档(本文件就是报告系统,`ml/monitor.py` 的 `/api/explore` 直接渲染它)。 + +## 算法优化候选(按实测证据强度排序,2026-10-20) + +| 序 | 候选 | 支撑证据 | 状态 | +|---|---|---|---| +| 1 | **全拒时缩步顶上**(`--backoff`:首选候选按 1/2、1/4、1/8 并进同一次认证,只在原候选连第 1 步都不安全时启用) | 失败分类 63/109 是"被冻住"、未到组 37% 步为零运动;刹停 19.25/题 | 代码与单测已落(38 项),256 题 A/B 排队中 | +| 2 | **候选多样性 / K 与安全档位**(#15) | 全拒意味着 K=8 条候选没有一条能走;若候选彼此太像,加 K 也没用 | 待测(探针 `ml/runs/_cand_div.py` 已备) | +| 3 | **一步角点的标定**(E1 那条线:`mf_target='mid'` 把自举导数移到中点) | 解析高斯场判据:`sq` 只线性收敛(结构性少修一半)、`mid/lin` 二次收敛;实测部署角偏差 MF 3.851 → `mid` 2.364(0.61×);但**线上一步输出比自身两段采样离老师远 10 倍**(4.326 vs 0.434) | 开关已落、默认关;要付训练,等 #1/#2 出数再定 | +| 4 | **认证进 20 ms**(#16/#18) | GPU 周期 P50 33.5 ms,几何宽相位占大头;f32 认证需先抬 eps 到 2e−4 mm | 未解,是验收硬门槛 | +| 5 | 速度/余量口径(#11/#14) | `--inc_cap 1` 代价 −5.1 pp 到达、−12.5 pp 时限;`gap_margin 0.5 mm` 只付 3 题 | 已量化,投影式余量未移植 | +| 6 | 循环内共享 FK(#19)、FP16/BF16、流水线复用 | 实测分别只有 0.03 ms/次、负收益、−3.1 ms 且扰动特征 | **已判掉** | ## 轮次 38:把 `--steps` 打通之后,闭环反而变差——瓶颈从"动作质量"移到了"安全层拒绝率" + - **动机**:E1-b 实测同一个模型的一步输出比它自己的两段采样离老师远 **10 倍**(4.33 vs 0.43)。那就先别急着训练——直接把推理段数当自变量,量闭环。`ml/eval/eval_cl.py` 加 `--steps`(默认 1,发布口径不变),同一 256 题、同 seed、同配方只改段数: | 口径 | 到达 | 时限内(≤1.3×老师) | 刹车/题 | 到点耗时 | 行程比(中位) | 成功题末态误差 | DLS 接管份额 | @@ -35,9 +50,11 @@ | steps=1 cap=1(=轮次33 cap) | 0.5234 | 0.2656 | 19.55 | 2.49 s | 2.616 | 0.218 mm | 0.613 | | steps=2 cap=1 | 0.3945 | 0.2969 | 86.16 | 1.93 s | 1.844 | 0.293 mm | 0.445 | | steps=4 cap=1 | 0.4062 | 0.3047 | 79.65 | 1.91 s | 1.882 | **0.135 mm** | 0.461 | + | steps=8 cap=1 | 0.4102 | **0.3242** | 79.70 | 1.93 s | 1.870 | 0.253 mm | 0.469 | - (`docs/experiment_round36_steps2_cap{0,1}.json`、`docs/experiment_round36_steps4_cap1.json`;steps=8 同批续跑) - 段数再多并不是越差:steps=4 比 steps=2 到达与时限都略升,成功题末态误差 0.293 → **0.135 mm**(比一步口径的 0.218 还好)——但刹车仍近 80/题,到达率被同一道门卡住。 + (`docs/experiment_round36_steps{2,4,8}_cap1.json`、`docs/experiment_round36_steps2_cap0.json`) + **段数趋势(都在 `--inc_cap 1` 的合法限速口径)**:到达 0.523 → 0.395 → 0.406 → 0.410(一步之后就先掉再平),时限内 0.266 → 0.297 → 0.305 → **0.324**(单调变好),行程比 2.62 → 1.84 → 1.88 → 1.87(单调变好、贴近老师),刹车 19.6 → 86 → 80 → 80(一步之后翻 4 倍就不再降)。 + ⇒ 多段推理把"更快、更贴老师、更省行程"这三样都买到了,唯独买不到到达率——那道门的拒绝率把它顶住了。段数从 4 到 8 几乎不再变化,说明瓶颈不在采样精度。 - **失败分类**(不占卡:读轮次 33 base 的 256 题轨迹转储,CPU 重算末态位姿误差,`docs/experiment_round38_fail_taxonomy.json`)。147 到达 / 109 未到,未到题按"末态离目标多远 + 被拒多少次"分桶: | 桶 | 题数 |