From c51f8f9d1f95a3b87eb380865f8b606c81fe9c2e Mon Sep 17 00:00:00 2001 From: Hark Date: Sat, 17 Oct 2026 12:26:42 +0000 Subject: [PATCH] =?UTF-8?q?docs(=E8=AE=AD=E7=BB=83=E6=96=B9=E6=A1=88):=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=C2=A75A=20=E5=90=8E=E8=AE=AD=E7=BB=83?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E2=80=94=E2=80=94=E9=80=90=E6=9D=A1=E9=AA=8C?= =?UTF-8?q?=E7=AE=97=E3=80=81=E9=94=99=E9=A2=98=E5=88=86=E7=B1=BB=E3=80=81?= =?UTF-8?q?=E8=80=81=E5=B8=88=E9=87=8D=E6=A0=87/DAgger=E3=80=81=E9=92=88?= =?UTF-8?q?=E5=AF=B9=E6=80=A7=E5=BE=AE=E8=B0=83=E3=80=81=E9=97=A8=E7=A6=81?= =?UTF-8?q?=E5=9B=9E=E6=BB=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Transformer轨迹拟合训练方案.md | 106 +++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 1 deletion(-) diff --git a/docs/Transformer轨迹拟合训练方案.md b/docs/Transformer轨迹拟合训练方案.md index 0ce3ab7..99f7c8d 100644 --- a/docs/Transformer轨迹拟合训练方案.md +++ b/docs/Transformer轨迹拟合训练方案.md @@ -1,7 +1,7 @@ # Transformer 拟合避障轨迹规划:训练方案(审查稿) > 2026-10-17 起草,基于 `main@3c7c814`(贴立柱修复后的规划器)。本文只是方案,代码尚未编写。 -> 审查时重点看:§0 定位、§2 数据分布、§3 表示方式、§5 训练配置、§7 验收标准。 +> 审查时重点看:§0 定位、§2 数据分布、§3 表示方式、§5 训练配置、§5A 后训练循环、§7 验收标准。 --- @@ -222,6 +222,109 @@ tensorboard --logdir runs --- +## 5A. 第四步半:后训练——验算、挑错、针对性再训练(循环) + +> 2026-10-17 用户补充:一轮监督训练不够,要"模型结果逐条验算 → 挑出错的 → 针对性训练 → 周而复始"。 +> 下面把它做成固定流程,每一轮都可复现、可回滚。 + +### 5A.1 为什么光和老师数据对比不够 + +监督训练只在**老师走过的状态**上学习。模型上线后会走到老师没走过的状态(自己的路径稍微偏一点,下一帧的起点就偏了), +误差会累积——这是模仿学习的"分布偏移"。所以后训练要同时做两件事: + +1. **困难样本挖掘**:在新任务上让模型出结果,逐条验算,错的交给老师重新标注。 +2. **DAgger(数据聚合)**:在**模型自己走到的状态**上请老师给答案,再加回训练集。拖拽场景尤其需要这一条。 + +### 5A.2 一轮的完整流程(第 r 轮) + +``` + ┌──────────────────────────────────────────────┐ + 模型 M_r ──▶ ①出题 ──▶ ②模型作答 ──▶ ③逐条验算 ──▶ ④错题分类 + │ + M_{r+1} ◀── ⑦门禁 ◀── ⑥针对性微调 ◀── ⑤老师重标 + 邻域扩增 ◀┘ +``` + +**① 出题(挖掘池,每轮新抽)** +- 每轮用新种子生成 5 万条任务,分布同 §2.3,但把 B/C 类(直线被挡、贴立柱)提到 60%。 +- 另跑 2000 段"模型在环"拖拽仿真(同 rt_drag_bench 口径,但每帧由模型规划、走模型给的路径),记录模型实际经过的状态,作为 DAgger 状态池。 +- **挖掘池与测试集严格分开**:§2.3 的留出测试集和三个基准永远不进挖掘池,否则门禁失效。 + +**② 模型作答** +- 每个任务采样 B = 8 条(与部署一致:贪心 + 不同温度)。GPU 批量推理,5 万任务约几分钟。 + +**③ 逐条验算**(新增 `ml/eval/verify_batch.py`,GPU 批量版碰撞检查器) +- 每条候选:1° 细验 + 半格复验无干涉;终点 TCP 误差 < 1 mm(pose 另需姿态 < 0.5°);关节不越限位。 +- 同一任务调用老师(已有标签或现算)得到老师行程 `L*`。 +- 验算口径必须与 JS 完全一致:`verify_batch.py` 先与 JS `collideFree` 对拍 10 万个位形,0 误差才允许用于挖掘。 +- 为什么要 GPU 版:5 万任务 × 8 条 × 约 100 个采样位形 = 4000 万次位形检查,JS 单核约 20 小时,GPU 批量约几分钟。 + +**④ 错题分类**(写入 `ml/mining/round_r/errors.parquet`) + +| 类别 | 判定 | 典型原因 | +|---|---|---| +| E1 全错 | 8 条全部不合法 | 没学会这一类绕行 | +| E2 部分错 | 有合法的,但贪心那条不合法 | 置信度校准差 | +| E3 绕远 | 最优合法候选行程 > 1.2 × `L*` | 选错同伦类(该左绕却右绕) | +| E4 终点偏 | 路径合法但终点误差超限 | 离散化/精修不足 | +| E5 拒判错 | 可达却判 REJECT,或不可达却给路径 | OK 头没学好 | +| E6 拖拽失稳 | 模型在环仿真中出现碰撞帧或 3 s 内未到达 | 分布偏移 | +| G 比老师好 | 合法且行程 < 0.9 × `L*` | 老师没找到更短的路 | + +同时记录每个错题撞的是哪对部件(`collideDetail`),便于看是不是集中在立柱上段等特定区域。 + +**⑤ 老师重标 + 邻域扩增** +- E1–E5:用 `solveDyn` 重新求解(已有标签直接复用),得到正确标签。 +- E6(DAgger):取模型路径**撞前最后一个安全状态**、以及拖拽中途的若干状态作为新起点 q0,请老师从这里规划到目标。 +- 邻域扩增:每个错题再造 10 个邻居(目标 ±5 mm、q0 各轴 ±3°),老师标注,过滤后加入——一个错题往往代表一片区域没学会。 +- G 类:模型的更短路径通过验算后**直接作为新标签**(替换老师标签),模型可以反过来超过老师。 +- 老师耗时:每轮错题约 2000–5000 条 × 11(含邻居)× 0.7 s,8 核机器约 1–2 小时。 + +**⑥ 针对性微调** +- 从 M_r 的权重继续训练,**不从头训**。 +- 训练集 = 新错题样本 50% + 历史数据回放 50%(防止学了新的忘了旧的)。 +- 错题按类别加权:E1、E6 权重 2.0,E3 权重 1.5,其余 1.0。 +- 学习率 1e-4,预热 500 步,余弦退火,3–5 epoch。 + +**⑦ 门禁(不通过就回滚)** + +| 检查 | 要求 | +|---|---| +| 留出测试集模型命中率 | 比 M_r 高(≥ +0.3 个百分点) | +| 留出测试集合法率、行程比 | 不得比 M_r 差 | +| route_bench / near_column_bench / rt_drag_bench | 「模型+验证+回落」任何一项不得退化 | +| 上一轮已修好的错题(回归集) | 至少 95% 仍然正确 | + +不通过:丢弃 M_{r+1},检查错题标签质量后调整权重/回放比例重做本轮。 + +### 5A.3 停止条件 + +- 连续 2 轮命中率提升 < 0.5 个百分点,或 +- 达到 6 轮,或 +- 达到 §7.2 全部验收标准。 + +### 5A.4 进阶选项(循环稳定后再考虑) + +1. **验算过的自我采样微调**(expert iteration / 拒绝采样):对每个任务采样 32 条,只保留验算通过且最短的一条作为标签,不需要老师参与,适合 G 类多的时候。 +2. **偏好训练**(DPO 类):同一任务的"合法路径"和"撞了的路径"组成一对,让模型提高前者概率、降低后者,直接针对"别撞"优化。 +3. **碰撞惩罚项**:在损失里加可微的胶囊最小距离惩罚(从 `collide.json` 的胶囊参数计算),距离 < 安全余量时罚。 + +### 5A.5 新增文件 + +``` +ml/mining/ + mine_round.py ①–④ 出题、作答、验算、分类 + relabel.cjs ⑤ 调老师重标 + 邻域扩增(Node) + finetune.py ⑥ 回放混合 + 加权微调 + gate.py ⑦ 门禁与回滚 + loop.sh 一条命令跑 N 轮:bash ml/mining/loop.sh --rounds 6 + round_r/ 每轮的错题、新标签、指标、checkpoint(不入库) +ml/eval/verify_batch.py GPU 批量碰撞验算(与 JS 对拍) +``` + +每轮输出 `round_r/report.md`:错题分布、门禁结果、命中率曲线,方便逐轮审查。 + +--- + ## 6. 第五步:推理与集成 ### 6.1 导出 @@ -308,6 +411,7 @@ tests/learned_bench.cjs | M3 | 全量 20 万条数据 | Parquet | 沙箱(约 20 h)或用户机器 | | M4 | 训练工程 + 小数据过拟合测试(1000 条能背下来) | `train.py` 等 | 沙箱 CPU 验证代码可跑 | | M5 | 正式训练 | checkpoint、TensorBoard | **用户 GPU** | +| M5A | 后训练循环:GPU 批量验算器 + 挖掘/重标/微调/门禁,跑 3–6 轮 | 每轮 report.md | 用户 GPU(老师重标可分到沙箱) | | M6 | 导出 ONNX + 前端集成 + learned_bench | 对比表 | 沙箱 + 浏览器 | ## 11. 需要用户确认