U3.5 共用技巧:guidance、高階 solver、時間加權
本篇重用M2.4在 30 秒的中點多看一眼:高階方法·M5.1用錯的機率表下注一年會多輸多少:KL Divergence 與 Cross-Entropy
為什麼可以一次理解三個技巧
這一篇的三個技巧在 diffusion 與 FM 的論文裡各有各的寫法,看起來像三套東西。但 U2.4 已經說過:在 Gaussian 路徑上兩邊是同一個物件的兩套座標。所以這些技巧也只需要理解一次,然後在兩套座標之間換來換去。
而 U3.2 又給了我們一個共同的度量:曲率積分。有了它,「這個技巧在做什麼」就有了統一的答案。
這三個技巧在三份不同的論文裡、用三套不同的語言寫,
有沒有一個說法可以一次講完?
Classifier-free guidance
條件生成的做法是學 (或 ),訓練時以一定機率把條件 換成空條件 ,讓同一個網路同時學到條件與無條件兩個版本。取樣時把兩者外推:
這兩式在 Gaussian 路徑下是同一件事:U2.4 說 是 與 的線性組合、係數只依賴 ,而線性組合和線性外推可以交換順序。 是普通的條件生成, 才叫 guidance。
麻煩的是 時它生成的不是 。 對應的是
正規化之後的分布——把條件分布銳化。這不是任何一條合法的邊際路徑, 也不生成任何從 出發的 。
已經是正確答案了。 是刻意把分布改掉,換一個「更像那一類」的樣子。
互動 demo:guidance 買到什麼、付了什麼。 把 從 0 推到 8,四個數字會一起說同一件事。「終點分布與該類資料的距離」在 時最小(0.01~0.03), 約 0.4、 約 0.8;同時終點的散布 從約 1.1 縮到 0.57——多樣性是被換掉的。曲率積分在 之後大致隨 線性成長(約 3.5 → 5.8 → 10.5),把步數切到 8 就會看到分布誤差跟著上去( 的 0.011 → 的 0.018)。
用曲率看 guidance。 差向量 在低密度區和中段的 變化最劇烈,乘上 之後 大約也放大 倍。U3.2 的積分變大,同樣步數的誤差就變大。這解釋了實務上兩個常見現象:guidance 越強需要越多步,以及少步數搭配高 guidance 特別容易出現過飽和與結構崩壞。
補充常見的補救做法在做什麼
文獻上的補救幾乎都是在壓那個積分:只在中段的 開 guidance、讓 隨 變化(前後小、中間大)、或對 guidance 的輸出做 rescale。
有一件事要小心:如果 是突然開關的,那兩個切換點本身會製造巨大的 ,積分反而更大。這也是為什麼實務上用的是平滑的窗,而不是硬切。
高階 solver
Euler 用 一個值走完一步,誤差 。二階方法改用兩次評估去估這一步裡的平均速度。Heun:
全域誤差變成 。讀法是:階數換成二、代價是被積函數升成三階導數。 U2.5 那張 log-log 圖量到的 就是這件事。
但每一步要兩次網路評估。取樣成本一般用 NFE(number of function evaluations,網路被叫幾次)來算,所以在相同 NFE 下比較,Heun 的步長是 Euler 的兩倍。軌跡夠光滑的時候還是划算;軌跡彎得不規律( 大,例如高 guidance)的時候好處就縮水。
展開細節DPM-Solver 為什麼比通用的高階方法更有效
時間取樣與加權
這一軸本課已經碰過兩次,先把它們並排:
| 出處 | 那裡的權重 |
|---|---|
| U1.2 推出來的目標 | ,換到 座標是 |
| DDPM 實際在跑的 | 均勻——那是把上面整個 刻意丟掉的結果 |
| U2.3 的線性 FM、均勻抽 | 換到 座標是 |
所以「加權」從來不是一個新旋鈕,它一直都在,只是常常沒被寫出來:訓練時 的分布,和目標的 parametrization 一起決定了每個 noise level 的有效權重。
那哪一段 最值得花訓練預算?兩端都太容易。 時 幾乎就是噪聲,速度幾乎是常數 ; 時 幾乎就是 ,去噪幾乎是恆等映射。困難全部在中段——那裡 的結構正在形成、條件直線交叉最密、速度場最彎。
要注意這是一個訓練難度的論證,不是誤差分布的論證:U3.2 給的是整段的積分 ,本課沒有量過它沿 怎麼分配。(U2.4 甚至給過一個相反方向的描述:粒子一開始朝資料的平均位置衝、之後再分岔,那會把彎曲放在 小的那一端。)所以「把預算放中段」是一個實務上有效、但本課沒有證的選擇。
實務做法:
- SD3 [5] 對線性 FM 用 logit-normal 的 (中段密度高)。
- EDM [2] 對 用一個正態分布。
- Kingma & Gao [4] 證明許多常見加權其實都等價於「對 加一個權重函數」,不同論文的差別只在那個函數的形狀。上面那張表的三列,就是這個函數的三種形狀(U1.2 已經做過同一個換算,用的也是這一篇)。
最後這一條把散在 U1.2、U2.3 和這裡的三處加權討論收成一句話:
選 的分布,就是選 上的權重。
回到 U2.5 作業 2 問的那個二選一(換 的分布,動的是 log-log 線的斜率還是高度):答案是高度。斜率是取樣器的階數,換訓練時的 分布動不了它;動的是同一個步數下的誤差水準。
課堂提問Q1
把這個單元的技巧排在一起,會發現它們動的是不同的旋鈕,但衝的是同一個量。
如果只能挑一個技巧來改善「10 步取樣的品質」,該挑哪一個?為什麼其他的不行?
先想一想,再展開看整理後的答案
先把它們攤開,各自動什麼、對誤差做什麼:
| 技巧 | 動的旋鈕 | 對誤差的影響 |
|---|---|---|
| ODE → SDE() | 取樣器 | 加自我修正,代價是每一步都注入噪聲 |
| Reflow | 配對 | 壓 ,代價是重訓與失去多樣性 |
| Minibatch OT | 配對 | 壓 ,邊際精確 |
| 高階 solver | 取樣器 | 換成 ,但被積函數升階、每步兩倍 NFE |
| Guidance | 速度場 | 放大 ,需要更多步 |
| 時間加權 | 訓練時的 分布 | 把模型容量放在曲率大的 |
10 步是很少的步數,所以逐項刪:
- SDE 不行。 U3.1 的 demo 量過:修正需要足夠大的 和足夠的剩餘時間。10 步之下每一步注入的噪聲很大,修正根本來不及生效。
- 高階 solver 幫助有限。 相同 NFE 下 Heun 的步長是兩倍,10 NFE 等於 5 步,而 在彎的軌跡上不小。它是加分項,不是主力。
- Guidance 是反方向的。 如果任務需要高 guidance,那更該先把軌跡拉直。
- 時間加權有幫助但間接。 它改善的是「網路在中段學得多好」,不是「軌跡有多直」。
剩下的就是改配對:minibatch OT 或 reflow。它們直接壓 U3.2 那條 log-log 線的高度,而在 10 步這種區間,高度就是一切。U3.3 的 demo 也給了數字:一輪 reflow 讓 1 步 Euler 的誤差從約 1.4 掉到 0.1。
不過要補一句誠實的話:這個排序是針對「少步數」這個目標的。 如果目標換成「不限步數的最佳品質」,答案會反過來——那時候多步的 SDE 取樣往往贏,而確定性配對失去 score 反而變成缺點。U3.6 會把這個交叉點實際量出來。
消化一下
參考文獻
- Ho, J., Salimans, T. Classifier-Free Diffusion Guidance. 2022. (CFG 的原始形式。)
- Karras, T., Aittala, M., Aila, T., Laine, S. Elucidating the Design Space of Diffusion-Based Generative Models. NeurIPS 2022. (二階取樣器、 上的時間分布、stochasticity schedule。)
- 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. (把線性部分精確積分。)
- Kingma, D. P., Gao, R. Understanding Diffusion Objectives as the ELBO with Simple Data Augmentation. NeurIPS 2023. (各種加權都等價於 上的一個權重函數。)
- Esser, P., et al. Scaling Rectified Flow Transformers for High-Resolution Image Synthesis. ICML 2024. (logit-normal 的時間取樣。)