docs+exp: 第二次纠正换向分组——按与rollout同窗口重算后两组差不多(0.247全体/到达0.265/未到达0.233),换向是全局现象而非失败特征;给出backoff对照臂的可证伪预测0.247

This commit is contained in:
cbb
2026-10-20 22:33:29 +08:00
parent a34a3c0bb5
commit a159723e5b
2 changed files with 28 additions and 2 deletions
@@ -0,0 +1,16 @@
[
{
"file": "round33_cap.pt",
"reverse_p50": 0.2474,
"reverse_p50_arrived": 0.265,
"reverse_p50_failed": 0.2329,
"nact_p50": 168.0
},
{
"file": "round33_base.pt",
"reverse_p50": 0.257,
"reverse_p50_arrived": 0.2753,
"reverse_p50_failed": 0.2402,
"nact_p50": 152.0
}
]
+12 -2
View File
@@ -80,8 +80,18 @@
- 口径先对齐:只在"有老师参考且到达"的题上算,自测 **2.425** 与 eval 报的 2.445 同量级(差别在我按 `t_done/DT` 取窗端,eval 逐步累加),后面的数都在这个口径上。
- **超出主要是同一根轴来回抖,不是绕远路**:净位移/总行程中位 **0.445**(完美单调应为 1.0)、各轴最大 excursion/行程 0.507、旧口径换向中位 23.5%(p25 15.7%、p75 30.3%)。
- **撤回一句我自己的假象**:上面原来写"到达组抖得更厉害(26.1% vs 未到达 14.7%)",**错在口径**。旧定义 `(dd[t+1]·dd[t] < 0).mean()` 要求相邻两步都非零,遇到"前进→停住→后退"就漏计;而未到达题恰恰大量站住,于是被系统性地少计。用与定义无关的量重算(同一转储,净位移/总行程):**到达组 0.478、未到达组 0.352**,即**未到达组白费比例更高**(走完 738° 只前进 255°,到达组是 569°/267°)。线上 `reverse_rate` 新口径(记方向状态、站住不重置)也是 24.0% vs 14.4%,两条一致 ⇒ 结论方向反过来。
- **口径敏感要常驻**:换向率的绝对值只能在同一定义内比较;跨臂一律读 eval 的 `reverse_p50`(定义=换向的(步,轴)对/活动的(步,轴)对,站住计入分母但不重置方向)。旧口径的 23.5% 保留在这里,但不再作为分组依据。
- **撤回一句我自己的假象(并且这条也要再撤回一次,见下一条)**:上面原来写"到达组抖得更厉害(26.1% vs 未到达 14.7%)",**错在口径**。旧定义 `(dd[t+1]·dd[t] < 0).mean()` 要求相邻两步都非零,遇到"前进→停住→后退"就漏计;而未到达题恰恰大量站住,于是被系统性地少计。
- **用与定义无关的量重算(净位移/总行程,同一转储、同一窗口)**:**到达组 0.478、未到达组 0.352** ⇒ 未到达组白费比例更高(走完 738° 只前进 255°;到达组是 569°/267°)。这条稳。
- **但换向率的组间比较我第二次算错,现纠正**:上一次我用"未到达 24.0% vs 到达 14.4%"来说组间差异,那个算法把**到达题到达之后的冻结步**也算进了分母(`act` 只按 `tn<=limit`,没排除已到达),把到达组稀释了。按与 `rollout` 完全同语义的窗口(到达题截到 `t_done`)重算,得到的是**两组差不多**:
| 转储(口径) | reverse_p50 全体 | 到达组 | 未到达组 |
|---|---|---|---|
| `round33_cap`(=轮次33 cap,限幅) | **0.2474** | 0.265 | 0.233 |
| `round33_base`(不限幅) | 0.257 | 0.275 | 0.240 |
(`docs/experiment_round39_reverse_offline.json`)⇒ **换向是全局现象(约 1/4 的(步,轴)对在反向),不是失败题的特征**;失败题的特征是"白费行程比例高 + 大量站住"。这两件事先前被我混成一句,现在分开。
- **可证伪预测(等 backoff 对照臂回来对表)**:同一配方下 in-eval 的 `reverse_p50` 应当 ≈ **0.247**。差得多就说明线上实现与离线同语义重算不一致,得先查仪表再谈算法。
- **口径敏感要常驻**:分组/比较类断言之前,先换一种定义把同一份数据再算一遍;两种定义都给同方向才写进日志。分母必须与指标定义一致(`act_ = 未 done 且 在时限内`),否则"到达题窗短"会系统性稀释任何按步数归一的指标。
- **对得上训练侧的事实**:预训练本来就有 `w_smooth=0.05` 的二阶差分正则,但闭环仍大量换向 ⇒ 训练期的平滑项没管住执行期的抖动。
- **第一条 A/B 读数(`len_w=0.1`,256 题、`--inc_cap 1`)**:到达 0.5117(对照 0.5234,−1.2 pp)、时限内 0.2695(+0.4 pp)、**行程比 2.6216 几乎没动**(对照 2.6158)、成功题末态误差 0.2438(对照 0.2175,变差)。
原因是量级不匹配,不是方向错:`0.1 × 累计归一行程`(16 步满速在 3 条轴上约 48)只当量 ~5 mm,而早段末态误差是几百 mm ⇒ 罚不动。等 `len_w=0.3/1.0` 两臂看行程比是否真的开始下降;若仍压不住,惩罚对象应从"总行程"换成**换向/二阶差分**(直接打这个 23.5%)。