PhysJEPA · 09-16 → 09-22 · 实验总账
七个模型训练完成:两个 Stage-1 臂、五个 Stage-2 臂。全部在同一封存测试集(PhyCo test_core,140 条)上用同一把尺子量过。结论一句话:改 Stage-1 没动针,改 Stage-2 的训练量动了。
横轴是 capture:0% = 不喂光流(地板),100% = 喂真值光流(天花板)。两组各自只变一个东西,其余全部固定。
A · 换 Stage-1 光流源 — Stage-2 固定为「真值条件训练 2000 步」
B · 换 Stage-2 — 光流源固定为 joint,条件逐条同种子
怎么读:A 组三个点跨度 9.1 点,而且它们的 Stage-1 自评排名和这里的顺序对不上(见下表);B 组只把 Stage-2 多训 2000 步就走了 7.3 点,几乎等于整个 A 组的跨度。B 组最后两行是同一件事的两种训法,落在同一个位置——混合条件的贡献恰好是零。
PhyCo 域,把光流锚点从 7 个加密到 14 个,看时间分辨率是否有用。两臂都是 2000 步。
| 臂 | 改了什么 | 训完时间 | 物体 EPE 改善 | 下游 capture |
|---|---|---|---|---|
| dense | 锚点 7 → 14 | 09-19 08:09 | 0.612 | 29.4% |
| fix+dense | 锚点 7 → 14,外加质心轨迹监督(位置/速度/加速度) | 09-19 06:34 | 0.610 | 34.7% |
| joint对照 | 7 锚点基线,更早训的 | — | 0.601 | 38.5% |
「物体 EPE 改善」越大越好(相对不动基线的改善比例)。注意这三行:dense 的 Stage-1 自评最好(0.612),下游却最差(29.4%);joint 自评最差,下游最好。Stage-1 自评和下游效果是脱钩的,这是半年来反复出现的现象,这两个臂又确认了一次。
dense(纯加密锚点)无效:对下游是负收益(29.4% vs 基线 38.5%)。Stage-2 只有 7 个条件槽位,14 个锚点必须抽掉一半才喂得进去——而且抽的是偶数位,加密出来的奇数位锚点Stage-2 一个都看不到。在真正交付的那 7 个锚点上,两个 dense 臂的物体 EPE 差别只有 −0.16%,是个洗。
轨迹监督(fix)确实救回了 5.3 点,但机制不是「物理更准」:实测加了质心监督之后,交付给 Stage-2 的光流幅值缩小了 37%(0.001988 → 0.001248),两臂条件的逐元素差达幅值的 58%。赢的是「少编造运动」,和本周 Stage-2 续训的取胜方式是同一条线索。
权重配置有三处实打实的问题(读代码查出来的):① 有效梯度阶梯是 权重÷beta = 0.2/0.02 : 0.05/0.05 : 0.01/0.1 = 10 : 50 : 250——权重数字最小的 acceleration 反而主导,我原本「acceleration 权重太小近乎无效」的判断是错的;② 损失里的 delta_time 硬编码 0.2,而 14 锚点的真实间距是 0.2857,导致 velocity/acceleration 的有效权重被虚高 1.43×/2.04×(PhyCo 侧更是 2.86×/8.16×);③ velocity 和 acceleration 两项从未被记录到日志,现在跑任何扫参,事后都无法判断哪一项真的起了作用。
而且监督信号本身是退化的:在 300 个真实质心 sidecar(11984 个质心步)上实测,64.8% 的逐步位移恰好为 0、87.4% 不足一个像素,逐锚平均位移从第 1 个锚点到第 14 个衰减 180 倍。所以 velocity/acceleration 主要在教模型「停下来」——这正好解释了幅值缩小 37%,也解释了为什么长时程锚点反而变差。这是结构性问题,标量权重扫不到它。
换方向——不动 Stage-1,改 Stage-2 的训练方式。原本的假设是:Stage-2 只见过完美真值光流,部署时却要吃幅值被压扁的预测流,这个错配才是瓶颈。
| 臂 | 改了什么 | 累计步数 | 训完时间 | capture | 状态 |
|---|---|---|---|---|---|
| 起点(重测) | 历史权重,只是在同一批条件上重新量一次 | 2000 | — | 38.5% | 已定案 |
| 混合条件 | 约 45% 真值流 / 45% 预测流 / 10% 零位移 | 4000 | 09-20 20:45 | 45.8% | 已定案 |
| 等算力对照 | 纯真值条件,其余与上一行完全相同 | 4000 | 09-21 04:39 | 45.8% | 已定案 |
| 再续训 | 纯真值条件,把 max_steps 从 2000 改到 4000 继续训 | 6000 | 09-21 16:58 | 43.3% | 已定案 |
| 连续调度重跑 | 纯真值条件,max_steps 全程恒定 4000(单条连续 cosine) | 6000 | high 09-22 15:14 | 待出 | low 在 yli8 并行 |
混合条件臂和等算力对照臂的配对差值是 +0.0001 加权 IoU,换算 +0.0 capture 点,t=0.00,逐样本胜率 54.3%,七个场景四正三负。两个臂在统计上完全无法区分。
我一度报告过「混合训练 +7.4 点」,那是错的——当时的对照组比混合臂少训了 2000 步,我把训练量的功劳记到了训练方式头上。补跑等算力对照才把两者拆开。
同样是纯真值条件,从 2000 步训到 4000 步,capture 从 38.5% → 45.8%,+7.3 点(t=2.33,逐样本胜 72/140)。
这个收益比整个项目里任何一次 Stage-1 改进都大。作为对照:六个 Stage-1 臂的 capture 全程只在 29–37% 之间摆动,跨度 8 点,而且和 Stage-1 自身精度排名毫无相关。半年来一直在 Stage-1 上做文章(objloss、轨迹监督、加密锚点、联合训练),而真正没被榨干的是 Stage-2 的训练量。
但继续训到累计 6000 步反而退回 43.3%——查下来是我自己造成的:延长训练时把 max_steps 从 2000 改成 4000,cosine 调度在续跑点把学习率从 5.4e-6 跳回 2.66e-5(涨 4.9 倍),等于一次热重启,把模型从好的解上震了出去。所以「训练量的上限在哪」目前仍未测出,正在用一条从头到尾恒定的连续调度重跑。
所以现在正在把它继续往下训(累计 6000 步),看收益在哪里饱和。每 2000 步只要约 2.3 GPU·小时——比调 Stage-1 便宜得多,回报也大得多。
模型:纯真值条件训到累计 4000 步(本周最好的一版,封存集整体 capture 45.8% / 加权 IoU 0.4183)。 下面每个场景取它表现最好的一条,三列并排:GT 真值 · 4000 步 · 2000 步(续训前的起点)。 两版吃的是同一批 Stage-1 预测流条件、同一组逐样本随机种子,唯一差别是多训的 2000 步。
为什么这里报加权 IoU 而不报 capture:capture 把加权 IoU 线性映射到「0% = 不喂光流、100% = 喂真值光流」,但它对新模型并不封顶——上面几条的加权 IoU 已经高过 oracle 的 0.6218,换算成 capture 会超过 100%,失去意义。整体分仍按 capture 报以便跨臂比较,单条一律报原值。
能比的:本页所有数字都是封存集 test_core 140 条、同一评测协议(29 帧 / 7fps)、同一 capture 刻度。A 组三行共用同一个 Stage-2;B 组四行共用同一批 joint 预测流条件和逐条相同的随机种子——所以 B 组的差异纯粹来自权重。
不能直接比的:更早的四个臂(joint 36.5% / phyco-only 36.0% / fix 34.9% / objloss 33.6%)是 n=137、另一批光流条件下测的,那批产物已随旧存储清空而不存在。本页 joint 一行的 38.5% 是这几天在同批条件下重测的值,与历史的 36.5% 不是同一个量。
封存集是 7 个场景 × 20 条。样本嵌套在场景里,推断的正确单位是场景(n=7)而不是样本(n=140)。按场景聚类算,这套设计能以 80% 把握检出的最小效应约 17 个 capture 点,而本周所有效应都在 2–7 点之间。
后果:+7.3 点这个本周最大的发现,样本级 t=2.33 看着显著,按场景聚类后 t=1.58(p≈0.17)就不显著了。在把封存集从 7 个场景扩到 15–20 个之前,任何这个量级的结论都只能算线索。加场景比加样本有效得多。
0% 和 100% 两个锚点(加权 IoU 0.2463 与 0.6218)是脚本里的硬编码常量,它们对应的原始评测产物已不存在,无法复核。另外混合臂在某个场景上算出 capture 116.9%(超过天花板),说明这把尺子对新臂并不封顶。对外更稳妥的说法是直接报加权 IoU:0.3567 / 0.3767 / 0.3907 / 0.4183 / 0.4184。