关于 Knot Forcing 推理复现的三个技术问题

#1
by Zaithe - opened

@mengdechao 及 Tongyi 团队,您好 —
首先恭喜 Knot Forcing 论文发表。由于 HumanAIGC/knot_forcing 仓库暂未开放,我正在依据 arXiv 公开文本重建推理流程。mengdechao/knot_forcing 的 checkpoint 可干净加载至以下结构:Self-Forcing 骨架 + {LoRA r=128 作用于 q/k/v、ref_patch_embedding Conv3d(36→1536)、10 个音频融合块(Wan-Animate FaceBlock 风格)、KFAudioEncoder、KFMSEncoder},0 missing / 0 unexpected keys,总参数量 1.68B。前向路径已对照 Self-Forcing 完成验证:AdaLN 调制、RoPE 3D 分割(head_dim 128 → t=44, h=42, w=42)、n=9 处的 ref-RoPE 置换(28% 的相对输出范数变化确认其生效),以及时间步调度(与 FlowMatchScheduler.set_timesteps(1000) 在 [0, 250, 500, 750] 处索引的结果误差在 0.2% 以内)。VAE 往返验证达 43.95 dB PSNR。
目前还剩三个实现层面的问题。我已对每个问题测试了各种常见假设,以下说明具体尝试过的内容:

  1. Mask 调度(patch_embedding 输入的 32:36 通道)。 §4.1 提到在 Self-Forcing 蒸馏之前加入了"mask inpainting 模块"。我已测试:

全程常数 0 → 均匀棕色块输出
全程常数 1 → 纯红色(严重 OOD)
Wan-Animate I2V 惯例(含 ref 的第一个 chunk 帧处 mask=1,其余为 0)→ 棕色块
极性反转(保留区域 mask=0,生成区域 mask=1)→ 棕色块叠加 64px 格状纹
ref 帧 + 最后一帧置 1(对"temporal-knot k=1 先验"的一种理解)→ 棕色纹理
有/无 ref_patch_embedding 前置的各种组合

请问推理时的 mask 调度是什么?是常数、随时间变化,还是完全不同的模式?
2. 推理时的 CFG。 我已严格按照 Self-Forcing 的 causal_diffusion_inference.py 测试双路 classifier-free guidance:

guidance_scale ∈ {3.0, 5.0, 7.5}
两种无条件策略:仅丢弃文本(保留音频+ref);丢弃文本+音频(仅保留 ref)

结果:CFG 对输出有可量化影响(rgb_std 从基线 0.13 上升至 scale=7.5 丢弃文本+音频时的 0.44;FFT 格状峰值从 8px 移至 16–256px),确认模型对 CFG 有响应——但任何 scale × 无条件策略组合均无法生成可辨识的人脸。请问 CFG 是否属于推理流程的一部分?若是,scale 取多少?无条件 pass 中哪些字段需要丢弃?
3. retalk_context.pth。 形状 (7, 4096),bf16。各 token L2 范数为 [4.20, 4.93, 2.19, 5.09, 0.68, 3.65, 1.30],std ≈ 0.055,幅值约为典型 UMT5-XXL 新鲜输出的 1/10。×1 比例送入与 ×0 的输出几乎相同;×7 比例下 FFT 格状特征发生显著变化。请问这是默认说话人肖像 prompt 的正向嵌入、用于 CFG 的负向/无条件嵌入,还是经过某种 LayerNorm 预处理的结果?
所有配置下持续存在的伪影是周期为 8 个 RGB 像素的水平条纹(对应 VAE 8× 上采样后的 1 个 latent 像素周期)。该伪影对以下因素均不敏感:音频路径开/关、mask 调度、ref 位置、motion strength、输出参数化方式(flow / x₀ / v / eps / neg_flow)。单像素周期的 latent 条纹通常指向以下两种原因之一:(a) 模型无条件期望的某个逐空间位置条件输入缺失;(b) 输入通道布局存在细微偏差,而常数填充无法修正。
仅需对第 (1) 和第 (2) 点各给出一行答复,即可解除复现的瓶颈。如您有意,我很乐意将可用的架构作为参考推理仓库提交——一切以您们的发布计划为准。
再次感谢出色的工作——temporal knot 与 running-ahead RoPE 的设计都非常精妙。

更新:自原帖发布以来,已定位到通道排列错误是 mask 调度伪影的根本原因。修正后的布局 [noisy(0:16), mask(16:20), conditioning(20:36)] 让重建工作进展到 ArcFace 中帧 cos-sim +0.477(多 chunk 推理 + audio_adapter ×0.5 + face-fill 参考图)。剩余的差距是嘴部区域无运动 — FaceBlock 接收到 12.3× 信号比,但下游不转化为像素运动。会另开一个详细帖子,附带新的问题。原帖的问题 1(mask 调度)和问题 3(retalk_context)现已部分自答,问题 2(CFG)经实验确认推理时 CFG 不需要应用。再次感谢。

Sign up or log in to comment