第 4 课 · Lesson 0004

CFG 训练/推理流水线 + Algorithm 1

Mission: 为组会分享而学 — 把"有/无条件速度场 + γ 外推 + Euler 采样"默画出来

第 1–3 课搭好了:HCM 造源 $Y_0$,KGC 定义条件如何进入 $v_\theta$。这一课补第三件套:Classifier-Free Guidance (CFG)——训练时随机丢条件,推理时在有/无条件速度之间线性外推。读完后你应能默写 Eq.15–17,并逐步复述 Appendix B.1 Algorithm 1。

CFG 在三件套里的位置

模块回答的问题改什么
HCM从哪出发?源 $Y_0$
KGC条件 如何 进入网络?条件通路结构 → $\tilde Y_s$
CFG条件 多用力速度场外推 $\hat v$
前提:CFG 假设同一网络已经会两条模式——$v_\theta(\cdot,c)$ 与 $v_\theta(\cdot,\varnothing)$。KGC 负责把 $c$ 写进前向;若条件通路脏了,加大 $\gamma$ 等于放大脏信号。所以 KGC 是 CFG 的前提,不是可选项。

条件对象是什么

论文把条件定义为外生集合:

$$c=\{X_{\text{exo}},\,Y_{\text{exo}}\}.$$

空条件 $\varnothing$(Algorithm 1 里记 $c_\varnothing\leftarrow 0$)表示不提供外生——走协变量无关模式 $q_\theta(Y_{\text{endo}}\mid X_{\text{endo}})$。注意:HCM 仍用 $X_{\text{endo}}$ 造 $Y_0$;CFG 丢的是外生,不是历史内生。

与图像 CFG 的同构 / 差异:形式同 Ho & Salimans(2022)——联合训练有/无条件,推理线性外推。语义从"类别/文本遵循"换成"外生驱动强度"。丢弃对象是协变量集合 $c$,不是类标。

训练:随机掩码条件

$$\tilde c=\begin{cases} \varnothing & \text{with probability }p_{\text{con}}\\ c & \text{with probability }1-p_{\text{con}} \end{cases}\qquad\text{(Eq.15)}$$

路径与目标速度仍由 HCM 源构造(训练时 $Y_{\text{endo}}$ 可见):

$$Y_s=s\,Y_{\text{endo}}+(1-s)\,Y_0,\qquad \hat v=Y_{\text{endo}}-Y_0.$$

Flow Matching 损失:

$$\boxed{L_{\text{FM}}=\big|v_\theta(Y_s,s,\tilde c)-(Y_{\text{endo}}-Y_0)\big|}\qquad\text{(Eq.16)}$$

每个 batch 以 $p_{\text{con}}$ 把外生换成空条件,于是同一套参数同时逼近:

总训练信号还叠加 HCM 的 $L_{CC}$(校准 $\sigma$)。CFG 本身不引入新的结构模块,只改变条件输入是否出现

训练一步 X_endo ──► HCM ──► Y0 = μ + σ·δ Y_endo, Y0 ──► Y_s = s·Y_endo + (1-s)·Y0 target v̂ = Y_endo − Y0 c = {X_exo, Y_exo} │ ▼ Bernoulli(p_con) c̃ ∈ {c, ∅} │ ▼ v_θ(Y_s, s, c̃) ← 若 c̃=c,KGC 注入外生;若 c̃=∅,无外生 │ ▼ L_FM = |v_θ − (Y_endo − Y0)| (+ L_CC 管 σ)

推理:线性外推 + Euler ODE

推理时 $Y_{\text{endo}}$ 未知,不能再构造训练式 $Y_s$。流程是:

  1. HCM 用 $X_{\text{endo}}$ 采样 $Y_0$
  2. 从 $Y_0$ 出发,沿学到的速度场积到 $s=1$
  3. 每一步同时算有条件与无条件速度,外推后再积分

引导速度场:

$$\boxed{\hat v_s(Y_s,c)=(1+\gamma)\,v_\theta(Y_s,s,c)-\gamma\,v_\theta(Y_s,s,\varnothing)}\qquad\text{(Eq.17)}$$

改写一下更直观:

$$\hat v_s=v_\theta(c)+\gamma\big(v_\theta(c)-v_\theta(\varnothing)\big).$$

经验最优 $\gamma\in\{1.2,1.4\}$:外生依赖强,但 $\gamma$ 过大伤分布校准(CRPS 变差)。

Algorithm 1 逐步走读

Appendix B.1 的推理伪代码(Euler 离散化):

Algorithm 1 Inference with Classifier-Free Guidance ──────────────────────────────────────────────────── Input: X_endo, X_exo, Y_exo, initial state Y0 Hyper: steps N, guidance scale γ Output: Ŷ_endo c∅ ← 0 Y_curr ← Y0 Δs ← 1/N for i = 0 … N−1: s ← i/N v_cond ← v_θ(Y_curr, s, X_exo, Y_exo) # 有条件 v_uncond ← v_θ(Y_curr, s, c∅) # 无条件 v̂ ← (1+γ)·v_cond − γ·v_uncond # CFG 外推 Y_curr ← Y_curr + v̂ · Δs # Euler 步 end for Ŷ_endo ← Y_curr return Ŷ_endo

逐步语义

  1. $Y_0$ 从哪来:输入写 "Initial state $Y_0$"——它由 HCM 从 $X_{\text{endo}}$ 采样得到,不是高斯噪声。
  2. $s=i/N$:时间从 0 走到接近 1;共 $N$ 步,步长 $\Delta s=1/N$。
  3. 两次前向:同状态 $Y_{\text{curr}}$、同时刻 $s$,分别带 $c$ 与 $c_\varnothing$ 过 $v_\theta$——代价约 2× 单次前向。
  4. 外推:$\hat v=(1+\gamma)v_{\text{cond}}-\gamma v_{\text{uncond}}$。
  5. Euler:$Y\leftarrow Y+\hat v\Delta s$。这是最简单的 ODE 求解器;论文主设定用它。
  6. 终点:$Y_{\text{curr}}$ 即一次采样 $\hat Y_{\text{endo}}$。概率分布 $p_\theta$ 靠多次采样(不同 $Y_0$ 的 $\delta$ 噪声)来表征。
训练 vs 推理的关键差:训练里 $Y_s$ 由真实 $Y_{\text{endo}}$ 与 $Y_0$ 插值构造,回归目标速度;推理里没有 $Y_{\text{endo}}$,只能从 $Y_0$ 起用 $\hat v$ 积分。CFG 的两次前向只在推理(及训练时的随机掩码)出现;训练单步通常只算一个 $\tilde c$ 下的 $v_\theta$。

组会常被追问的三点

  1. $\gamma$ 太大为什么伤校准? 外推把条件差放大,轨迹更"贴外生",但可能偏离真实条件分布,点预测或尖峰变强、覆盖变差 → CRPS 变差。
  2. 无条件速度还要 HCM 吗? 要。$Y_0$ 仍由 $X_{\text{endo}}$ 造;无条件只是不喂 $X_{\text{exo}},Y_{\text{exo}}$。HCM 与 CFG 正交:一个改起点,一个改外生强度。
  3. 为什么必须 KGC + CFG? 消融显示三者齐用最优。CFG 放大的是 KGC 学到的条件差;HCM 缩小传输负担。缺任一环,上限都掉。
组会收口可以这样讲:"CFG 不改网络结构,只改训练时条件是否出现、推理时速度如何组合。训练以 p_con 随机把 c={X_exo,Y_exo} 换成空,让同一 v_θ 学会有外生与无外生两种速度。推理从 HCM 的 Y0 出发,每步算 v_cond 与 v_uncond,用 (1+γ)v_cond − γ v_uncond 外推后 Euler 积分 N 步。γ 是外生驱动强度旋钮:0 退回条件生成,经验上 1.2–1.4 最稳。KGC 决定条件差干净与否;CFG 只决定把这条差拧多紧。"

自测

Check 1
训练时以 $p_{\text{con}}$ 丢弃的是什么?
对。丢的是外生集合 $c$,不是 $X_{\text{endo}}$。HCM 仍然用内生历史造源;$X_{\text{endo}}$ 始终在。
Check 2
Algorithm 1 每一步为什么要两次 $v_\theta$ 前向?
对。同状态、同时刻下算有/无条件速度,再 $\hat v=(1+\gamma)v_{\text{cond}}-\gamma v_{\text{uncond}}$。代价约 2× 前向。
Check 3
$\gamma=0$ 时推理速度场等于什么?
对。$\hat v=(1+0)v(c)-0\cdot v(\varnothing)=v(c)$,CFG 关闭,退回条件生成。
易混点:Algorithm 1 的 $Y_{\text{curr}}\leftarrow Y_{\text{curr}}+\hat v\Delta s$ 是在推流状态,不是在更新 $Y_0$。$Y_0$ 只在循环外初始化一次;循环内改的是路径上的 $Y_s$ 近似。