MCSDF 全景分析 — 22 个实验 · 两轴分类 · T/H/W 噪声分布 · PatchForcing · 处方

2026-07-31 · 由 10 个独立 agent 完成、每路配对抗校验 · 纯调度数学 + 代码审计,无模型前向
配套的噪声分布深挖见 noisedist.html;本页是完整版
三句话总结
找到一个真 bug。tau_mintrain_step 的关键字参数(默认 0.45),调用处从未传入,也没有对应的命令行 flag。 于是全部 warp_cond 系(expC/expE/expE_scratch/expE_sync/expF_plucker/expF_sync/expK)都在 τ_min=0.45 训练、却用 τ_min=0.85 采样; 训练上限有 52.2% 的质量落在采样器初始状态从不访问的区间。代码里那句 // 匹配采样器 的注释对这些 run 全部为假。
但"失配有害"这个论断被两条独立证据推翻了。PatchForcing 训练的极端异质性比我们更强(同口径 0.064 vs 我们 0.090–0.289 的另一侧), 它的采样器几乎完全平坦(DualLoop 全程最大异质度只有 0.015),train/infer 几何失配比我们差 2 倍到无穷倍 —— 而它 work, 且它 FID 增益的 58–71% 来自训练日历本身、用完全平坦的采样器就能拿到。同时我们自己的 expE_rand(训练日历里零 knownness、推理却用 knownness τ 场,全 fleet 最大接口失配)拿了 19 个臂里最好的 mLPIPS结论:噪声日历的 train/infer 匹配度不预测生成质量 —— 训练异质性更像是一种有益的正则化/增广。
而且现在的尺子量不出这些。项目自己的代码写明:一张纯平均色的图能拿 11.8 dB seen-PSNR,而整个 fleet 跨度是 10.82–13.20 dB, 评测只有 4 个 clip、无置信区间。所有基于 seen-PSNR 的排序都必须重做,否则下面每一条处方都无法验证。

§1 实验分类学 —— WARP 轴 × NOISE 轴

两个正交设计轴:WARP 轴=观测内容以什么方式到达模型;NOISE 轴=knownness k 坐落在扩散日历的哪个位置。 22 个已训练 run 只占了 64 个格子中的 19 个(29.7%),而且形状是一个细十字而非网格
图 1 · WARP×NOISE 占用图。只有 17ch/23ch 两行真正扫过了 noise 轴;rate 日历整列只能从平行半区布局到达; 灰色虚线格=从未尝试的组合(=未来工作);"ghost"=sbatch 存在但磁盘上没有权重(dl3dv_fwd18)。

1.1 WARP 轴 —— 内容怎么进来

机制实现(函数 / 拼接什么)使用的实验camera control 的成分
I2V y-concat(无持久通道)build_i2v_cond → 20ch 首帧条件,只在输入层expA, expB, warp_baseline无(只有首帧锚)
+ memory-slot 交叉注意力attach_mem,几何键控 cross-attn,420.5M 参数dl3dv_i2v14b, dl3dv_asyncpatch(+c2), expC隐式(几何键)
17ch 持久 warp 通道extend_patch_embedding(+17)[z_mem(16) ‖ up2(k)(1)] 每个去噪步拼进输入(零初始化) expC, expE_geo/rand/scratch/sync, expJ_narrow, expK隐式:splat 沿目标轨迹重渲染,pose 烧进内容的空间位置
23ch = 17ch + 6ch Plücker同上再拼 plucker(dir+moment,相对帧 0,span 归一化)expF_plucker, expF_sync, expJ_ray隐式 + 显式逐 token 射线
VACE 原生分支vace_context[96ch] 走预训练控制分支,非自建通道expG_vace, expG0_plain隐式(VACE 内部)
序列内干净 ctx 帧seq_ctx:前 5 个 latent 帧钉在 t=0.02,留在同一序列;无通道expL_uni, expL_nk无显式;靠 ctx 运动外推
平行干净 token 半区mcsdf_forward_par:[target 21 帧 ‖ source 5 帧],source RoPE 帧对齐 0-4,head 只读 targetexpM_nopl无显式(仅 k 足迹)
平行半区 + 6ch Plücker同上,两个半区各自的 Plücker 走 +6ch 扩展 pembexpM_par显式双半区射线

1.2 NOISE 轴 —— knownness 坐在日历哪里

日历公式实验要教什么 / 已知病理
全局标量 t(knownness OFF)t = s ~ U(0,1),全场同值expL_uni;所有方法的 10% rehearsal 支纯生成先验;无 knownness 信息
uniform 均值匹配(L0 基线)τ₀ ← mean(τ₀),去掉空间变化warp_baseline_r128隔离"噪声图"这一变量。被 LoRA rank 与步数三重混杂
AsyncPatch patch 场base t̄ + 有界 per-patch 扰动,完全绕过 τ₀expA, expE_rand, dl3dv_asyncpatch结构化覆盖。日历里零 knownness,却用 knownness τ 场采样
τ₀=1−.95k,legacy min(τ₀,s)t = min(τ₀, s),τ₀ = clamp(1−.95k, .45, 1)expB, expC, expE_scratch, expF_plucker, dl3dv_i2v14b knownness 定起点s < min τ₀ 时整场坍缩为常数(闭式 57.8%);τ_min 与采样器不匹配(见 §2)
+35% ceiling liftτ₀ ← 1−(1−τ₀)·γ²,γ~U(0,1)expE_scratch 起的全部 expE/F/G/J/K覆盖高噪边缘
SYNC 切片(sync_sched)t = clamp(τ₀−c, .02, 1),c~U(0,1)expE_sync, expF_sync, expJ_*, expK与 SYNC 采样器同族;坍缩率降到 2%
窄带 λ=0.2τ₀ = 1−.2k ∈ [.8, 1]expJ_narrow, expJ_ray, expL_nk起点几乎都接近纯噪声,内容改走 warp 通道。意外免疫了 τ_min bug
patch 场 branch2t = u_patch · τ₀(连续 3D 块)expE_scratch 起的全部结构化空间覆盖。唯一产生"孤立干净 token"配置的来源
rate 日历t = clamp(1−c/T),T = 1−.5k,起点恒为 1expM_par, expM_noplknownness 只定速率;训练场按构造即推理日历
prefix curriculum轨迹前缀课程— 从未被任何 run 使用已实现、烟测过、然后被遗忘

1.3 单变量映射 —— 以及被误当作单变量的对子

对子项目声称的单变量实际差异
expE_scratch ↔ expE_sync--sync_sched✓ 真单变量
expF_plucker ↔ expF_sync--sync_sched✓ 真单变量
expE_sync ↔ expJ_narrowλ 0.95→0.2✓ 真单变量
expJ_narrow ↔ expJ_ray+6ch Plücker✓ 真单变量
expM_par ↔ expM_nopl+6ch Plücker✓ 真单变量
expL_uni ↔ expL_nk日历✗ 差 3 项:日历 + z_mem anchor 分支被硬关 + 推理初始化(uni 纯噪声 / nk 从 z_mem SDEdit)
expM_par ↔ expL_unitoken 布局✗ 差 3 项:布局 + 日历 + rehearsal(expL 的 seq_ctx 分支在 rehearsal 判断之前就返回了)
expG_vace ↔ expE_scratchbackbone/条件通路✗ 还差 lr(1e-5 vs 5e-5)
expG_vace ↔ expG0_plain--plain✗ expG0 还少了 --train_modulation(186.1M 可训练参数之差)
warp_baseline ↔ expB_noisemap--uniform_noise✗ 还差 LoRA rank(128 vs 64)与步数(3000 vs 10000)

§2 数据完整性 —— 审计发现的问题

BUG(已由我独立核实):训练上限的地板从未接到采样器上。
scripts/train.py:72train_step(..., tau_min=0.45, ...) 是关键字参数; train.py:418-422 的调用处没有传它grep -c '"--tau_min"' = 0(没有 flag)。 所以全部 warp_cond 系都在 τ₀ 地板 0.45 下训练,采样器却用 cluster_tau(τ_min=0.85) 建 τ 场。
量化:W₁(训练上限, 推理 τ) = 0.188(expF)vs 0.027(expJ,6.9 倍之差);训练上限有 52.2% 的质量低于推理 τ 的最小值 0.850; 训练 τ₀ = 0.737±0.250 vs 推理 0.900±0.068。修好后逐帧 W₁ 从 0.0404 → 0.0176
train.py:190 那句注释 // per-token ceiling (matches sampler) 对这些 run 全部为假。 expJ 是意外免疫:λ=0.2 把地板顶到 0.80,0.45 这个 clamp 变成了空操作。
问题证据影响
expC 的榜单成绩是残废模型跑出来的 所有 eval 路径建 pipe 时都不调 attach_mem,420.5M 的 memory-slot 权重在加载时被丢弃;cluster_tau_probe.py 自己的日志就写着 "expC (slot-free load)" 12.15 dB 是缺了 914M 中 420.5M 参数(46%)的模型的分
expE_* 热启动时静默丢弃那 420.5M expE_geo/warmstart.pt 有 mem_mods 键,ckpt_last.pt 没有;无 --mem_slot 故 pipe._mem_mods is None 训练好的组件永久丢失,之后再没保存过
步数不可比 expC 4500 = 继承 1500 + 自训 3000;expE_geo/rand 6500 = 继承 3500 + 自训 3000;反之 dl3dv_asyncpatch_c2 报 3000 实为 6000 累计 任何"同步数对比"都要先换算
三个最早的 run 无法从自己的 sbatch 复现 它们带 mem_mods 但 sbatch 没传 --mem_slot;HEAD 版 train.py 对 i2v14b 无条件 attach_mem 复现需要 checkout 旧版代码
4 个 flag 被静默忽略 expL 的 --lam 0.95(seq_ctx 硬编码 1−0.2k)、expL 的 --unknown_w、expM 的 --lam;expM 的 --rehearsal 落在调 fwd 而非 fwd_par 的分支(该步删掉 source 半区 —— 这是有意设计,但与 flag 名字的直觉不符) 配方文件不能当作真实配置读
榜单指标本身是坏的 rerank_perceptual.py 文件头:纯平均色图 = 11.8 dB 平均、2501f488 上 12.07 dB;fleet 跨度 10.82–13.20 dB;4 clip、n=4、无不确定度 所有 seen-PSNR 排序都不可靠,须改用 mLPIPS/gPSNR/sharp% 并扩大评测集
dl3dv_fwd18 是幽灵只有 sbatch,磁盘上无 run 目录、无 .pt、日志无引用清单里减一

§3 T/H/W 三轴噪声分布

图 2 · 三轴逐位置边缘分布。行=轴(时间 f / 竖直 h / 水平 w),列=方法。灰底=训练密度,实线=推理中位,虚白=平均 knownness k。 下方小图=逐位置 W₁ 与其自身的 split-half 噪声底。三个轴的平均 W₁ 几乎完全相同(expF 0.0420/0.0421/0.0420), 差别只在失配沿各轴的调制形状 —— 而那是 k 剖面的镜像。
expFexpJexpM读法
逐位置 W₁ 均值 T / H / W .0420/.0421/.0420.0404 ×3.0074/.0075/.0072 没有哪个轴承载更多失配(方法内差异 <0.5%)
corr(W₁ 剖面, 平均 k 剖面) +.996/+.998/+1.000+.972/+.998/+.994+.971/+.892/+.926 失配是 knownness 的 1:1 像
split-half 噪声底 / 信噪比 .0053–.0059 / 7.1–8.0×.0086–.0090 / 4.5–4.7×.0066–.0069 / 1.08–1.10× expM 的失配在估计量噪声底之内,不能报为非零测量
帧内空间方差比 train/infer
(整卷口径 = 一次前向的单位)
6.95×3.93×1.22× 失配在振幅:expF 训练场携带的空间方差是推理的 7 倍
相关长度 & 谱斜率一致度三方法 train/infer 均一致到 15%0.24 以内 形状(layout)是对的 —— 错的只是幅度
各向异性比 (corrW/corrH)train/(…)infer b2 1.29× / b1 1.04×b2 1.33× / b1 1.00×b2 1.14× / b1 1.00× branch2 的 patch 场过度沿 W 拉长;branch1 精确复现
(h,w) 失配地图 vs k / vs |∇k| +.997 / +.116+.994 / +.093+.824 / −.041 不集中在覆盖前沿,是覆盖度本身的单调像
被推翻的先验(我提的):"相机横摇 → W 轴结构最强"。实测 12 个 clip 的中位数:per-position 平均 k 剖面的标准差 T 0.163 > H 0.119 > W 0.101,只有 3/12 个 clip 是 W 比 H 更结构化。横向前沿确实每个 clip 都在扫(k 质心沿 W 中位移动 13.9 token = 宽度的 27%), 但各 clip 扫的方向不同,池化后互相抵消。时间轴才是 k 结构最强的轴。

§4 PatchForcing —— 它为什么 work,分布长什么样

约定警告:PatchForcing 用 t=1 表示干净xt = t·x1 + (1−t)·x0,x1=数据);MCSDF 用 t=1 表示纯噪声。 下面全部换算为 MCSDF 约定:τ = 1 − t_PF。校验通过了完整的方向审计,未发现倒置。

4.1 LTG 到底是什么

读代码得到的解析结论:std = min(t̄/2, 0.6) 中的 min 永远取 t̄/2(因为 t̄=sigmoid(0.7+z)<1<1.2), 于是 t_i = t̄ · w_i,w 独立同分布(|z|<2 时 w=1−|z|/2,否则 w~U(0,1))。 也就是说 LTG 是一个乘性、尺度无关的场:一个共享上限 × 一族 iid 乘子
它买到的东西是一个噪声地板:τ_floor = 1 − t̄ = sigmoid(−0.7−z),中位 0.332,低于 0.1 的概率只有 6.7%。 论文说"控制最大信息量",在我们的约定里就是保证最干净的那个 patch 也不会太干净
但它是空间白噪声:16×16 网格上 lag-1 自相关 −0.0045(iid),而 MCSDF branch2 的帧内场是 +0.762(块状)。 LTG 只控制幅度包络,从不控制空间布局。

4.2 正面对比(同口径:一次前向所条件化的完整场)

统计量PatchForcingexpFexpJexpM谁更好
P(场内 min<0.1 ∧ max>0.7) 训练 0.064 (场尺寸不变)0.2890.2310.090 PF 更"干净";MCSDF 反而多 1.4–4.5 倍
同上,推理时≈0(采样器近乎平坦)000双方都是 0 —— 这个"失配"是共有的
W₁(训练边缘, 推理占据)0.097 / 0.103 / 0.1300.0410.0480.0089MCSDF 好 2–15 倍
严格未覆盖推理质量0.020 / 0.035 / 0.0780.0000.0000.000MCSDF 全胜
帧内空间方差比 train/infer∞ / 1377× / 8.6×6.95×3.93×1.22×MCSDF 好得多
推理时场内最大异质度0.0 / 0.015 / 0.280.1500.2000.496PF 的采样器几乎完全平坦
结果FID 33.0 → 27.9
(其中 58–71% 靠训练日历,用平坦采样器就能拿到)
seen-PSNR 无法分辨(见 §2)
被推翻的中心假说(我提的)。我原本的猜想是:"PF 训练的异质性正是它自适应采样器真正产生的异质性,而我们的采样器是近乎平行的薄片下降 —— 所以我们的 branch2 patch 场在为一个我们从不使用的推理模式做训练。"
数据否决了它。读代码发现:DualLoop 的内循环里,不确定 patch 走 n_inner 个 dt/4 小步、确定 patch 走 1 个 dt 大步, 每个外层步的总推进量对两者都是 dt —— 逐 patch 的时钟在每个外层步边界重新同步。 所以 DualLoop 全程向 DiT 展示的最大异质度只有 (1−1/4)·dt = 0.015。LookAhead 更甚:状态本身是平坦的, 异质性只存在于一次辅助的 context 前向里。EulerPF 则是精确平坦。
也就是说:PatchForcing 同样是"训练异质、推理平坦",而且比我们更极端 —— 它照样 work。 再加上我们自己的 expE_rand(训练日历零 knownness、推理用 knownness τ 场,全 fleet 最大接口失配)拿了 19 个臂里最好的 mLPIPS —— 两条独立证据指向同一结论:噪声日历的 train/infer 匹配度不预测生成质量。 训练用的异质噪声场更像是一种有益的正则化/数据增广,它的价值在于"教了什么",而不在于"长得像不像推理"。

4.3 什么可迁移、什么不可

可迁移不可迁移
① 噪声地板本身 —— 对最干净的 token 做硬下夹(τ_i ≥ 1−t̄)。这正好也是我们 §2 那个 bug 的正确修法方向。
② 尺度无关的展宽律 —— LTG 的场内 sd 正比于水平(sd = t̄/2·sd|z|),所以场在接近干净时自动收敛为平坦;我们的 patch 场没有这个性质。
③ 不确定度头作为架构模式 —— 一个额外输出通道(3,076 参数 = 130M 模型的 2.4e-5),stop-grad NLL,权重 0.01。
④ DualLoop 的重同步子步作为采样器旋钮:难 token 走 n 个小步、易 token 走 1 个大步,总推进相同。
⑤ LookAhead 的 context 技巧用在我们的 k 上:把高 k(易/已覆盖)token 在一次辅助前向里推进到更干净的未来时刻,用它作为难 token 的上下文。
① "噪声水平是唯一信息通道"这个前提 —— PF 的机制建立于此;我们有 warp/attention 内容通道,k 还是真实几何先验。
② 上限的内容无关性 —— LTG 的 t̄ 是与图像无关的全局标量;我们的 τ₀ 由 k 决定。
③ LTG 的空间白噪声异质性 —— lag-1 自相关 −0.005(iid)vs 我们 branch2 的 +0.76(块状)。直接照搬会毁掉空间结构。
④ "调度匹配预测质量"这个推断(双向都不成立) —— 见上方紫框。
⑤ 不确定度头不能替代 k —— uq 是去噪过程中算出的后验难度,k 是 VGGT 几何算出的先验;两者互补,不可替换。

§5 判决 —— 失配到底是不是问题?

类别内容证据
真实且可能有害
(只有一项,而且是接线 bug)
训练 τ_min=0.45 vs 采样 τ_min=0.85 W₁(上限) 0.188 vs expJ 的 0.027;52.2% 训练上限质量在采样器初始区间之外;修好后逐帧 W₁ 0.0404→0.0176
真实但很可能无害 ① 支撑覆盖完整:严格未覆盖质量恒为 0.000(rehearsal 铺满支撑)—— 模型从不被查询在从未训练过的噪声水平上
② 逐帧 W₁ 0.041/0.039 不是独立问题:它与 k 的相关是 +0.99、与 |∇k| 只有 +0.12,是上限差的 1:1 像,修好上限后自然消失
③ 三个轴没有哪个更差;(h,w) 失配不在覆盖前沿
见 §3 全部数值
是测量伪影 ① "薄覆盖质量"(bin 宽/梳状混叠,排序会翻转,已撤回)
② expM 的逐轴 W₁(信噪比 1.08–1.10,在估计量噪声底之内)
③ "训练空间方差过大 3.6–5.0 倍"这个区间是尺度依赖的,随口径变化到 6.95 倍
bin 扫描 32–512;split-half 噪声底
数据不支持的推论 ① 失配正在损害生成质量 —— 本研究没有任何结果测量
② 修好失配会提升 seen-PSNR —— 该指标分辨不了(纯色图 11.8 dB)
③ SYNC 训练已被证明更好 —— parade top-4 同时也全是干净血统,两个变量缠在一起
④ 58% 的 branch1 坍缩是"缺陷" —— 一个常数 t-场就是一个普通扩散步,所以 expF 实际得到的是 ~36% 的普通步而非 10%;这是 rehearsal 率的改变,不是坏事

§6 处方

  1. P0-A 先修尺子,再花任何 GPU 时间。把评测集从 4 个硬编码 parade clip 扩到 ≥20 个 held-out clip; 主指标改用 mLPIPS(seen-PSNR 降为辅助);每个数字带 bootstrap CI;同一 ckpt 用 5 个采样种子重跑以量化仪器自身的重复性。
    理由:下面每条实验都在追 0.1–0.5 dB 的效应,而纯平均色图就能拿 11.8 dB、fleet 只跨 2.4 dB。 可证伪测试:同一 ckpt 5 个种子的 95% CI 若宽于 0.23 dB,则 expH 的 +0.23 dB 结论本身就在噪声里。
  2. P0-B 把训练上限地板接到采样器上。scripts/train.py:在 argparse 里加 ap.add_argument("--tau_min", type=float, default=0.45),并在调用处传 tau_min=args.tau_min; 同时修正 train.py:190 那句失实注释。
    这是纯接线修复,本身不需要实验证明。但不要单独上线 —— 见 P0-C。
  3. P0-C 训一个"对齐包"臂 expN_aligned,作为整体而非拆开。配方 = expF_sync 的 sbatch + --tau_min 0.85 --ltg_b2, 其中 --ltg_b2 把 branch2 换成 LTG 式:先抽一个上限,再把所有 token 压在其下(而不是当前的 u_patch · τ₀)。
    理由:处方那一路实测了完整阶梯 —— 单独抬地板比现状更差;地板 + sync branch1 才转正;三者必须打包。 可证伪测试:expN_aligned vs expF_sync,同 10000 步,用 P0-A 的新仪器评分。 注意:PatchForcing 的证据说明"让训练更像推理"未必是收益来源 —— 所以这一臂真正在测的是 LTG 式地板这个成分,而不是"对齐"这个理念。
  4. P1 先做采样器那一侧,再谈重训。expH_sync_sampler.pysample_sync 里给下降加一个逐 token 抖动 t_i(e) = τ_i − e − a·ξ_i,扫 a ∈ {0, 0.1, 0.2, 0.35}。
    理由:这是零训练成本的对照,直接检验"该修哪一侧"。实测帧内 sd 推理 0.053 vs 训练 0.075(expF,比值 1.41)—— 采样器才是更平坦的那一侧。expJ 已经匹配(0.90),所以预测是 expF 上单调改善、expJ 上无效 —— 这个双臂预测本身就是强证伪测试。
  5. P2 把 legacy branch1 降为非默认。--sync_sched 成为默认,加 --legacy_b1 用于复现旧 run;不要删代码。
    证据:legacy 坍缩率 58.5% vs sync 1.8%。但请注意 §5 的第四条:坍缩=普通扩散步,未必是坏事 —— 所以这条的真正理由是"让 rehearsal 率变成显式可控的旋钮",而不是"修 bug"。已有的 expE_sync↔expE_scratch 与 expF_sync↔expF_plucker 就是干净的单变量对,用新仪器重打分即可。
  6. P2 · 拒绝 不要为这个失配去做不确定度头(expI)。失配全部是密度而非支撑(未覆盖质量恒为 0), 不确定度头不会新覆盖任何区域,反而引入第二个需要自洽的场。
    它值得做的理由是别的:k 是先验、uq 是后验,二者互补(见 §4.3)。要证伪这条拒绝,该做的是 k 质量测量(在推理时给 k_tok 加噪声看退化速度),而不是调度测量。
  7. P2 · 拒绝 不要去匹配训练场与 cluster_tau 的团块结构。实测把 cluster_tau 的 K=128 平均算子作用在训练上限上是近乎空操作: 空间方差只从 0.003907 降到 0.003761(1.039 倍),保留了 96%。也不要删掉 branch2 —— 它是唯一的空间频率多样性来源;要改的是它的幅度律(即 P0-C 的 LTG 化)。

§7 最新实验结果 —— expM 双臂 10k 同步数复评

clipexpM_par @10kexpM_nopl @10kexpL_uni @10kexpL_nk @9.5k
00534f58 (train)10.811.110.711.6
0003dc82 (train)10.410.99.813.1
111b656f (test)12.011.911.416.2
2501f488 (test)12.311.711.410.6
平均 seen-PSNR11.3811.4010.8312.88
① 平行拼接布局 > in-sequence(+0.55 dB):expM 对上信息预算对齐的 expL_uni(同样纯噪声起步、同样纯 attention 搬内容)。 但按 §1.3,这个对子实际差 3 个变量(布局 + 日历 + rehearsal),不能读作纯布局效应。
② Plücker 通道在 10k 仍然零分离(par 11.38 vs nopl 11.40,nopl 微弱领先)—— 输入层 6ch 零初始化通道做不出可测效果。 下一步要么升级为 CameraAnything 式 per-block AdaLN 注入,要么承认这条路不通。
③ 最重要的背景:11.38 和 11.40 都低于纯平均色图的 11.8 dB 基线。在 P0-A 修好仪器之前,这一整张表都不能当作排序依据。

诚实声明