U3.5 13 分鐘閱讀 2026年9月

U3.5 共用技巧:guidance、高階 solver、時間加權

本篇重用M2.4在 30 秒的中點多看一眼:高階方法·M5.1用錯的機率表下注一年會多輸多少:KL Divergence 與 Cross-Entropy

為什麼可以一次理解三個技巧

這一篇的三個技巧在 diffusion 與 FM 的論文裡各有各的寫法,看起來像三套東西。但 U2.4 已經說過:在 Gaussian 路徑上兩邊是同一個物件的兩套座標。所以這些技巧也只需要理解一次,然後在兩套座標之間換來換去。

U3.2 又給了我們一個共同的度量:曲率積分。有了它,「這個技巧在做什麼」就有了統一的答案。

這三個技巧在三份不同的論文裡、用三套不同的語言寫,
有沒有一個說法可以一次講完?

Classifier-free guidance

條件生成的做法是學 ut(xc)u_t(x\mid c)(或 st(xc)s_t(x\mid c)),訓練時以一定機率把條件 cc 換成空條件 \varnothing,讓同一個網路同時學到條件與無條件兩個版本。取樣時把兩者外推:

s~t(xc)=st(x)+w(st(xc)st(x)),u~t(xc)=ut(x)+w(ut(xc)ut(x)).\tilde s_t(x\mid c)=s_t(x\mid\varnothing)+w\big(s_t(x\mid c)-s_t(x\mid\varnothing)\big),\qquad \tilde u_t(x\mid c)=u_t(x\mid\varnothing)+w\big(u_t(x\mid c)-u_t(x\mid\varnothing)\big).

這兩式在 Gaussian 路徑下是同一件事U2.4uuxxss 的線性組合、係數只依賴 tt,而線性組合和線性外推可以交換順序。w=1w=1 是普通的條件生成,w>1w \gt 1 才叫 guidance。

麻煩的是 w>1w \gt 1 時它生成的不是 pt(c)p_t(\cdot\mid c)s~t\tilde s_t 對應的是

pt(xc)wpt(x)1w\propto p_t(x\mid c)^{w}\,p_t(x\mid\varnothing)^{1-w}

正規化之後的分布——把條件分布銳化。這不是任何一條合法的邊際路徑,u~t\tilde u_t 也不生成任何從 p0p_0 出發的 ptp_t

w=1w=1 已經是正確答案了。w>1w \gt 1 是刻意把分布改掉,換一個「更像那一類」的樣子。

互動 demo:guidance 買到什麼、付了什麼。ww 從 0 推到 8,四個數字會一起說同一件事。「終點分布與該類資料的距離」在 w=1w=1 時最小(0.01~0.03),w=4w=4 約 0.4、w=8w=8 約 0.8;同時終點的散布 σ\sigma 從約 1.1 縮到 0.57——多樣性是被換掉的。曲率積分在 w>2w \gt 2 之後大致隨 ww 線性成長(約 3.5 → 5.8 → 10.5),把步數切到 8 就會看到分布誤差跟著上去(w=1w=1 的 0.011 → w=4w=4 的 0.018)。

用曲率看 guidance。 差向量 u(c)u()u(\cdot\mid c)-u(\cdot\mid\varnothing) 在低密度區和中段的 tt 變化最劇烈,乘上 ww 之後 tu~+(u~)u~\partial_t\tilde u+(\tilde u\cdot\nabla)\tilde u 大約也放大 ww 倍。U3.2 的積分變大,同樣步數的誤差就變大。這解釋了實務上兩個常見現象:guidance 越強需要越多步,以及少步數搭配高 guidance 特別容易出現過飽和與結構崩壞

補充常見的補救做法在做什麼

文獻上的補救幾乎都是在壓那個積分:只在中段的 tt 開 guidance、讓 wwtt 變化(前後小、中間大)、或對 guidance 的輸出做 rescale。

有一件事要小心:如果 w(t)w(t) 是突然開關的,那兩個切換點本身會製造巨大的 x¨\|\ddot x\|,積分反而更大。這也是為什麼實務上用的是平滑的窗,而不是硬切。

高階 solver

Euler 用 ut(xt)u_t(x_t) 一個值走完一步,誤差 hx¨\propto h\int\|\ddot x\|。二階方法改用兩次評估去估這一步裡的平均速度。Heun:

x~=xt+hut(xt),xt+h=xt+h2(ut(xt)+ut+h(x~)).\tilde x=x_t+h\,u_t(x_t),\qquad x_{t+h}=x_t+\frac h2\big(u_t(x_t)+u_{t+h}(\tilde x)\big).

全域誤差變成 Ch2x...tdt\lesssim C h^2\int\|\dddot x_t\|\,dt。讀法是:階數換成二、代價是被積函數升成三階導數。 U2.5 那張 log-log 圖量到的 2-2 就是這件事。

但每一步要兩次網路評估。取樣成本一般用 NFE(number of function evaluations,網路被叫幾次)來算,所以在相同 NFE 下比較,Heun 的步長是 Euler 的兩倍。軌跡夠光滑的時候還是划算;軌跡彎得不規律(x...\dddot x 大,例如高 guidance)的時候好處就縮水。

展開細節DPM-Solver 為什麼比通用的高階方法更有效

DPM-Solver [3] 用的是 U2.4 的線性結構。既然

ut=α˙tαtx+(σ˙tα˙tαtσt)ϵθ(x,t),u_t=\frac{\dot\alpha_t}{\alpha_t}\,x+\Big(\dot\sigma_t-\frac{\dot\alpha_t}{\alpha_t}\sigma_t\Big)\epsilon_\theta(x,t),

那第一項是線性的,可以精確積分(換成 log\log-SNR 當自變數之後更乾脆);只有 ϵθ\epsilon_\theta 那一項需要數值近似。

等於說:先把已經知道的彎曲扣掉,剩下要近似的部分本來就更直。 通用的 Heun 對這個線性部分一樣要用近似,白花了精度。

值得注意這和這個單元的兩種拉直是同一個目標的三種做法:

  • U3.3:改配對,讓真正的軌跡變直。
  • U3.4:也是改配對,但在訓練當下改。
  • DPM-Solver:不改軌跡,改用什麼座標去看它——在那個座標裡它比較直。

時間取樣與加權

這一軸本課已經碰過兩次,先把它們並排:

出處那裡的權重
U1.2 推出來的目標w(t)=αˉt1βt2(1αˉt)(1αˉt1)w(t)=\dfrac{\bar\alpha_{t-1}\beta_t}{2(1-\bar\alpha_t)(1-\bar\alpha_{t-1})},換到 ϵ\epsilon 座標是 βt2αt(1αˉt1)\dfrac{\beta_t}{2\alpha_t(1-\bar\alpha_{t-1})}
DDPM 實際在跑的 Lsimple\mathcal L_{\text{simple}}均勻——那是把上面整個 w(t)w(t) 刻意丟掉的結果
U2.3 的線性 FM、均勻抽 tt換到 ϵ\epsilon 座標是 1/t21/t^2

所以「加權」從來不是一個新旋鈕,它一直都在,只是常常沒被寫出來:訓練時 tt 的分布,和目標的 parametrization 一起決定了每個 noise level 的有效權重。

那哪一段 tt 最值得花訓練預算?兩端都太容易。 t0t\approx0xtx_t 幾乎就是噪聲,速度幾乎是常數 E[x1]x0\mathbb E[x_1]-x_0t1t\approx1xtx_t 幾乎就是 x1x_1,去噪幾乎是恆等映射。困難全部在中段——那裡 ptp_t 的結構正在形成、條件直線交叉最密、速度場最彎。

要注意這是一個訓練難度的論證,不是誤差分布的論證:U3.2 給的是整段的積分 01x¨tdt\int_0^1\|\ddot x_t\|\,\mathrm dt,本課沒有量過它沿 tt 怎麼分配。(U2.4 甚至給過一個相反方向的描述:粒子一開始朝資料的平均位置衝、之後再分岔,那會把彎曲放在 tt 小的那一端。)所以「把預算放中段」是一個實務上有效、但本課沒有證的選擇。

實務做法:

  • SD3 [5] 對線性 FM 用 logit-normal 的 tt(中段密度高)。
  • EDM [2] 對 logσ\log\sigma 用一個正態分布。
  • Kingma & Gao [4] 證明許多常見加權其實都等價於「對 logSNR\log\mathrm{SNR} 加一個權重函數」,不同論文的差別只在那個函數的形狀。上面那張表的三列,就是這個函數的三種形狀(U1.2 已經做過同一個換算,用的也是這一篇)。

最後這一條把散在 U1.2U2.3 和這裡的三處加權討論收成一句話:

tt 的分布,就是選 logSNR\log\mathrm{SNR} 上的權重。

回到 U2.5 作業 2 問的那個二選一(換 tt 的分布,動的是 log-log 線的斜率還是高度):答案是高度。斜率是取樣器的階數,換訓練時的 tt 分布動不了它;動的是同一個步數下的誤差水準。

課堂提問Q1

把這個單元的技巧排在一起,會發現它們動的是不同的旋鈕,但衝的是同一個量。

如果只能挑一個技巧來改善「10 步取樣的品質」,該挑哪一個?為什麼其他的不行?

先想一想,再展開看整理後的答案

先把它們攤開,各自動什麼、對誤差做什麼:

技巧動的旋鈕對誤差的影響
ODE → SDE(ε>0\varepsilon \gt 0取樣器加自我修正,代價是每一步都注入噪聲
Reflow配對x¨\int\|\ddot x\|,代價是重訓與失去多樣性
Minibatch OT配對x¨\int\|\ddot x\|,邊際精確
高階 solver取樣器hh 換成 h2h^2,但被積函數升階、每步兩倍 NFE
Guidance速度場放大 x¨\int\|\ddot x\|,需要更多步
時間加權訓練時的 tt 分布把模型容量放在曲率大的 tt

10 步是很少的步數,所以逐項刪:

  • SDE 不行。 U3.1 的 demo 量過:修正需要足夠大的 ε\varepsilon 和足夠的剩餘時間。10 步之下每一步注入的噪聲很大,修正根本來不及生效。
  • 高階 solver 幫助有限。 相同 NFE 下 Heun 的步長是兩倍,10 NFE 等於 5 步,而 x...\int\|\dddot x\| 在彎的軌跡上不小。它是加分項,不是主力。
  • Guidance 是反方向的。 如果任務需要高 guidance,那更該先把軌跡拉直。
  • 時間加權有幫助但間接。 它改善的是「網路在中段學得多好」,不是「軌跡有多直」。

剩下的就是改配對:minibatch OT 或 reflow。它們直接壓 U3.2 那條 log-log 線的高度,而在 10 步這種區間,高度就是一切。U3.3 的 demo 也給了數字:一輪 reflow 讓 1 步 Euler 的誤差從約 1.4 掉到 0.1。

不過要補一句誠實的話:這個排序是針對「少步數」這個目標的。 如果目標換成「不限步數的最佳品質」,答案會反過來——那時候多步的 SDE 取樣往往贏,而確定性配對失去 score 反而變成缺點。U3.6 會把這個交叉點實際量出來。

消化一下

想一想

CFG 在 score 座標與速度座標下等價,理由是什麼?

想一想

Heun 相對 Euler 的優勢在什麼情況下會消失?

想一想

訓練時把 tt 集中在中段的理由是什麼?

想一想

根據 demo 量到的數字,關於 guidance 下列哪一句不對

參考文獻

  1. Ho, J., Salimans, T. Classifier-Free Diffusion Guidance. 2022. (CFG 的原始形式。)
  2. Karras, T., Aittala, M., Aila, T., Laine, S. Elucidating the Design Space of Diffusion-Based Generative Models. NeurIPS 2022. (二階取樣器、logσ\log\sigma 上的時間分布、stochasticity schedule。)
  3. Lu, C., Zhou, Y., Bao, F., Chen, J., Li, C., Zhu, J. DPM-Solver: A Fast ODE Solver for Diffusion Probabilistic Model Sampling in Around 10 Steps. NeurIPS 2022. (把線性部分精確積分。)
  4. Kingma, D. P., Gao, R. Understanding Diffusion Objectives as the ELBO with Simple Data Augmentation. NeurIPS 2023. (各種加權都等價於 logSNR\log\mathrm{SNR} 上的一個權重函數。)
  5. Esser, P., et al. Scaling Rectified Flow Transformers for High-Resolution Image Synthesis. ICML 2024. (logit-normal 的時間取樣。)