docs(训练方案): 新增 §5A 后训练循环——逐条验算、错题分类、老师重标/DAgger、针对性微调、门禁回滚
This commit is contained in:
+105
-1
@@ -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. 需要用户确认
|
||||
|
||||
Reference in New Issue
Block a user