CS236 第 17 講 · 加速取樣、引導與離散潛在變數
Stanford CS236 · Fall 2023 · Lecture 17

Diffusion 下半場:加速取樣、條件生成,以及離散潛在變數

影片名為「Discrete Latent Variable Models」,但老師一開場就說要先把上一講的 diffusion 投影片講完,結果整堂都在講:同一個 score 可以用 SDE 或 ODE 取樣;ODE 讓我們動用幾十年的數值方法(DDIM、平行求解),還能蒸餾到只剩幾步;latent diffusion 把擴散搬到 autoencoder 的潛在空間(Stable Diffusion);條件生成只需要在 score 上加一項 Bayes 法則的梯度,classifier-free guidance 更用兩個 diffusion model 的差取代分類器。本頁第二部分整理官方第 17 講的投影片(離散潛在變數:REINFORCE、control variates、Gumbel-softmax),它們沒有在任何一堂影片中講授。

讀完這頁你應該能夠

  1. 說明同一個 score 為什麼能用 SDE 或 ODE 取樣,以及兩者在速度和誤差累積上的取捨。
  2. 寫出 DDIM 的更新式(預測的 \(\mathbf x_0\) + 指向 \(\mathbf x_t\) 的方向 + 雜訊),說明 \(\eta\) 如何在 DDIM 與 DDPM 之間內插,以及為什麼它能用 10–50 倍少的步數。
  3. 說明 progressive distillation、consistency model 的想法,以及 latent diffusion 為什麼更快、能處理離散資料。
  4. 用 Bayes 法則推出 classifier guidance,從它推出 classifier-free guidance 的公式 \((1+w)\boldsymbol\epsilon(\mathbf x,\mathbf y) - w\boldsymbol\epsilon(\mathbf x)\),說明 \(w\) 的品質–多樣性取捨。
  5. (第二部分)推導 log-derivative trick(REINFORCE),說明為什麼要 control variate、最佳係數是多少。
  6. 寫出 Gumbel-max 和 Gumbel-softmax,說明溫度 \(\tau\) 的偏差–變異取捨,以及 straight-through 估計。

這一講的特殊安排

  • 影片內容:第 16 講投影片 22–47。前 30 分鐘(SDE、反向 SDE、predictor–corrector、ODE、likelihood)是第 14 講和第 16 講的複習,本頁只整理新的說法和課堂問答;後 40 分鐘(投影片 32–47)是新內容,本頁詳細整理。
  • 官方第 17 講投影片(離散潛在變數,27 頁)沒有在影片中講授,下一講(第 18 講)是 discrete diffusion。本頁第二部分(§6–8)依投影片整理,並補上推導,沒有課堂錄音可對照。
  • 前置:第 6 講的 reparameterization trick、ELBO;第 7–8 講的 normalizing flow;第 14、16 講的 score SDE 與 DDPM。

投影片轉成圖片後逐頁看過。標「出處」的補充來自 DDIM(Song, Meng & Ermon 2021,arXiv 2010.02502)、Classifier-Free Guidance(Ho & Salimans 2022,arXiv 2207.12598)、Progressive Distillation(Salimans & Ho 2022,arXiv 2202.00512)、Latent Diffusion(Rombach et al. 2022,arXiv 2112.10752)的 TeX 原文。

第一部分 · 影片內容:diffusion model(續)

01回顧:SDE 與它的離散化(投影片 22–28)

這段是上一講的重述,但多了幾個說法值得記下來:00:36

  • Drift 是速度場:前向的玩具 SDE \(d\mathbf x = \sigma(t)d\mathbf w\) 沒有 drift,像一個隨機漫步,沒有偏好的方向。但倒轉時間時,從高斯走到「有兩個峰」的資料分佈,不能只靠隨機,必須有一個速度場把粒子推向高機率區,這就是反向 SDE 的 drift:score。10:38
  • 在密度層次是摺積:加獨立高斯雜訊,密度就和高斯核摺積,所以每個時間切片的密度都是前一個的平滑版。12:42
  • 離散化 = Taylor 展開:電腦無法處理真正連續的過程,只能把時間軸離散化,用一步一步的近似去逼近那條紅色的真實軌跡;DDPM 的 1,000 個解碼器就是這樣的離散化,每一步都有數值誤差,會累積。score-based model 的 Langevin(corrector)可以修正它。只用 corrector 是 score-based model,只用 predictor 是 DDPM,兩者都用更貴但更準。24:30
課堂問答 · 18:34能不能也估計對時間 \(t\) 的 score?可以,也能用 score-matching 類的 loss 估計,老師的組有論文。在 diffusion 的設定下不需要:由 Fokker–Planck 方程,\(\partial_tp_t\) 完全由空間方向的 score 決定。但如果做的事情不是 diffusion(例如在兩個資料集之間內插),就需要它。18:34
課堂問答 · 27:35離散時間的 ELBO 什麼時候是緊的?解碼器被強制為高斯,但真正的反向去雜訊分佈不一定是高斯;不論高斯的平均和變異數選得多聰明,ELBO 都可能有落差。只有在連續時間的極限(步數無限多)下,前向是高斯、反向也是高斯,ELBO 才可能是緊的。(第 16 講 Demo B 定量地顯示了這件事。)27:35

延伸 補充課 E §3 Euler–Maruyama;補充課 F §6 反向 SDE 與 probability flow ODE 的推導

02ODE:同樣的邊際、確定的路徑(投影片 29–32)

可以定義一個完全確定性的過程,每個時刻的邊際分佈和 SDE 一模一樣:隨機性只在初始條件(prior),之後的動態完全確定。這就是把 VAE 變成 flow。29:38

  • Neural ODE:ODE 的解唯一,軌跡不能交叉也不能分岔,所以從雜訊到資料的映射可逆;動態由神經網路(score)定義,是一個 neural ODE、一個連續時間的 normalizing flow。33:54
  • 像 reparameterization:第 6 講用「固定雜訊 + 確定性變換」取代隨機取樣;這裡把「每一步都加隨機性」的計算圖,換成「所有隨機性都在初始條件」的等價計算圖。35:30
  • Likelihood:把 ODE 倒著解到潛在空間、在 prior 下算機率、再沿軌跡積分 Jacobian 的 trace(不是 determinant),就得到精確 likelihood。CIFAR-10 上 2.83 bits/dim,和 autoregressive model 相當(投影片 32)。37:37
  • 為什麼不直接用 maximum likelihood 訓練?原則上可以,但要對 ODE solver 求導,數值上很棘手、非常昂貴。仍用 score matching 訓練,likelihood 卻很好;這不太意外,因為 score matching 有 ELBO 的解釋。46:26
ODE 還是 SDE?(43:53)
  • 只有一個 score:ODE 和 SDE 的邊際相同,所以 score 相同,訓練完全一樣,只有推論時的用法不同。49:05
  • ODE:五十多年的數值方法(自動選步長、降低誤差)都能用,取樣快。39:11
  • SDE 有時樣本更好:score 不完美時,ODE 軌跡中段的影像不再真的像「資料 + 雜訊」,餵給去雜訊器的輸入偏離了訓練時看過的分佈,誤差會累積。SDE 每一步都加雜訊,讓輸入更像訓練資料,有修正作用。缺點是 SDE 很難有效率地解。44:23

延伸 補充課 B §6 軌跡不交叉;補充課 C §7 沿著軌跡積分散度算 likelihood

Demo A取樣器實驗室:步數、時間間隔、score 誤差

資料是圓上 8 個高斯(標準差 0.08),用 VP schedule(\(\beta(s)\) 從 0.1 到 20)。因為是高斯混合,每個時刻的 \(\boldsymbol\epsilon^*(\mathbf x_t,t)\) 都能精確算,所以這裡比較的是取樣器本身的誤差。可以對 score 加一個人為的誤差(把 \(\boldsymbol\epsilon\) 旋轉一個角度,模擬一個不完美、甚至不是保守場的網路),看 ODE 和 SDE 的反應。指標:樣本到最近中心的 RMS 距離 ÷ 真實標準差(1.00 最好;大於 1 是太散、小於 1 是太集中),以及 8 團的平衡度(最少一團 ÷ 最多一團)。

點:1,500 個樣本(200 步以上用 800 個);線:30 條軌跡
DDIMDDPMEuler ODEEuler–Maruyama

瀏覽器實測(固定種子,1,500 個樣本):

  • 步數:二次間隔、精確 score 時,DDIM 5 步 1.53、10 步 1.25、20 步 1.10、50 步 1.04;Euler–Maruyama 5 步 2.71、10 步 1.56。ODE 取樣器少步數就能用,naive 的 SDE 解法需要多得多的步數(呼應「SDE 很難有效率地解」)。DDPM ancestral 是比較聰明的 SDE 離散化,在這個玩具上 10 步就有 1.04,不比 DDIM 差。
  • 時間間隔:均勻間隔時 DDIM 10 步是 2.13,改成二次(把步數集中在雜訊小的尾段)變 1.25。DDIM 論文在 CIFAR-10 上也用二次間隔。
  • score 誤差:把 ε 旋轉 17° 時,DDIM 即使用 500 步也只到 1.26(樣本偏離資料),DDPM 仍是 1.08。這就是 §2 說的:ODE 會累積 score 的誤差,SDE 每步加的雜訊有修正作用。(步數多時一次要算幾秒。)
  • DDIM 是確定性的:同一個起始雜訊永遠得到同一個樣本,軌跡平滑;DDPM 的軌跡彎彎曲曲。精確 score 時,DDIM 的 8 團平衡度不論步數都是 0.70(200 步以上改用 800 個樣本,是 0.66):它是一個固定的映射,各團分到多少樣本幾乎只取決於起始雜訊。

說明:DDIM 論文中 DDIM 在少步數時遠勝 DDPM(下表),在這個 2 維、精確 score 的玩具上看不出那麼大的差距;高維、學出來的模型的行為不一定能在 2 維重現。

03加速取樣:DDIM、平行求解、蒸餾(投影片 33–36)

DDIM:粗略地離散化時間軸,走大步

DDPM 要 1,000 步。DDIM 只看例如 30 個時間點,每一步跳一大段。數值誤差會變大,但快得多;實務上大家就是這樣用。ODE 有一部分是線性的,可以閉式解掉,所以能做得比單純的 Euler 更好。步數成為一個旋鈕:想花多少推論計算,就用多少步。47:59

DDIM 的一步(記號:\(\bar\alpha_t\),DDIM 論文寫成 \(\alpha_t\)) $$\mathbf x_{t-1} = \sqrt{\bar\alpha_{t-1}}\underbrace{\Big(\frac{\mathbf x_t - \sqrt{1-\bar\alpha_t}\,\boldsymbol\epsilon_\theta(\mathbf x_t)}{\sqrt{\bar\alpha_t}}\Big)}_{\text{預測的 }\mathbf x_0} + \underbrace{\sqrt{1-\bar\alpha_{t-1}-\sigma_t^2}\,\boldsymbol\epsilon_\theta(\mathbf x_t)}_{\text{指向 }\mathbf x_t\text{ 的方向}} + \underbrace{\sigma_t\boldsymbol\epsilon}_{\text{隨機雜訊}}$$ \(\sigma_t = \eta\sqrt{\frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t}}\sqrt{1-\frac{\bar\alpha_t}{\bar\alpha_{t-1}}}\):\(\eta = 1\) 是 DDPM,\(\eta = 0\) 是確定性的 DDIM。「\(t-1\)」可以是任何更早的時間點,所以能跳步。
為什麼同一個網路可以用不同的取樣器?DDIM 為什麼是一個「好的」ODE 解法?

同一個網路:DDPM 的訓練目標只依賴邊際 \(q(\mathbf x_t\mid\mathbf x_0)\),不依賴「前向過程是不是 Markov」。DDIM 構造了一族非 Markov 的前向過程,邊際 \(q(\mathbf x_t\mid\mathbf x_0)\) 都和 DDPM 一樣,所以訓練目標一樣、同一個 \(\boldsymbol\epsilon_\theta\) 可以直接拿來用,不用重新訓練。\(\eta\) 選的就是這族過程中的哪一個。

好的 ODE 解法:令 \(\bar{\mathbf x} = \mathbf x/\sqrt{\bar\alpha}\)、\(\bar\sigma = \sqrt{1-\bar\alpha}/\sqrt{\bar\alpha}\),\(\eta = 0\) 的 DDIM 正好是 ODE \(d\bar{\mathbf x} = \boldsymbol\epsilon_\theta\,d\bar\sigma\) 的 Euler 法。它和直接對 probability flow ODE 做 Euler(對 \(dt\) 走步)在步長很小時等價,但少步數時不同:DDIM 對 \(d\bar\sigma\) 走步,較不受「時間」怎麼縮放的影響。後來的 DPM-Solver、DEIS 把它推廣成半線性 ODE 的指數積分器:線性部分閉式解掉,只對非線性的 \(\boldsymbol\epsilon_\theta\) 部分做近似(投影片 33 的「exponential integrator (semi-linear ODE)」)。

出處:Song, Meng & Ermon (2021) §3.1(非 Markov 前向過程)、§4.3 式 (14)「Relevance to neural ODEs」;Lu et al. (2022, DPM-Solver);Zhang & Chen (2022, DEIS)。

CIFAR-10 FID ↓(步數 S)1020501001000
DDIM(η = 0)13.366.844.674.164.04
η = 0.516.668.355.254.464.29
DDPM(η = 1)41.0718.368.015.784.73
DDPM(\(\hat\sigma\),Ho et al. 的設定)367.43133.3732.729.993.17

出處:Song, Meng & Ermon (2021) Table 1。論文的結論:DDIM 用 20–100 步就能達到 1,000 步模型的品質,快 10–50 倍(投影片 33 的「10x–50x speedups」)。

  • 更聰明的 ODE 解法:例如 Heun 法(走半步再修正),能用很少的計算得到很準的解。50:09
  • 平行求解(投影片 34,老師組的 ParaDiGMS):不是一步一步往前,而是用多顆 GPU 同時猜整段軌跡,再反覆修正(類似 Picard 迭代)。用更多平行計算換取更少的牆鐘時間,得到和逐步求解相同的結果。50:41

投影片 34 的圖:上排是「Parallel Sampling (ParaDDPM)」,一條藍色曲線顯示整個 batch window 一起前進;下排是「Sequential Sampling (DDPM)」,一個褐色的點慢慢往右移。下方三個小圖說明演算法:(a) 對大小 p = 4 的視窗平行計算 drift;(b) 用累積的 drift 更新視窗內的點;(c) 依誤差決定視窗往前滑多少。

蒸餾(投影片 35–36)

  • Progressive distillation(Salimans & Ho 2022):把 DDIM 當老師,訓練一個學生(另一個 score model),用一步做到老師兩步的結果;再把學生當新老師,重複下去,每輪步數減半,最後只剩很少的步數。論文從 8,192 步開始蒸餾,在 CIFAR-10 上 4 步就達到 FID 3.0,而整個蒸餾的計算量不超過訓練原模型。52:13
  • Guided diffusion 的蒸餾(投影片 36,Meng et al. 2023):在 Stable Diffusion 上,從 1,000 步蒸餾到 2、4、8 步,影像品質仍不錯。54:19
  • Consistency models(Song et al. 2023,OpenAI):直接學一個網路,一步輸出 ODE 的解(從軌跡上任一點直接跳到終點),不用逐輪蒸餾。54:50
  • 老師提到 Stability AI「昨天」剛發表一個能即時生成的 text-to-image 模型,是 score distillation 加上 GAN 的組合。依上課時間(2023 年 11 月底)推斷,應是 SDXL Turbo(Adversarial Diffusion Distillation,Sauer et al. 2023)。55:22

投影片 35 的圖:同一張 ODE 軌跡熱圖,上方有三層弧形箭頭:最下層每個「student」跨過老師的兩小步,往上每層再跨兩倍。

延伸 補充課 B §9 Heun、RK4 與 NFE;補充課 B §10–11 stiffness 與指數積分器:DDIM 為什麼能用很少的步數

04Latent diffusion 與 Stable Diffusion(投影片 37–38)

從階層式 VAE 的角度:DDPM 的編碼器固定、而且潛在變數和資料同維度。Latent diffusion 在堆疊的最外層再加一對編碼器/解碼器,把資料壓到低維空間,在那裡訓練 diffusion model。55:55

投影片 37 的圖:左邊是一個 VAE,影像 \(\mathbf x\) 經 Encoder 得到 \(q(\mathbf z_0\mid\mathbf x)\),再經 Decoder 重建 \(p(\mathbf x\mid\mathbf z_0)\);中間的 \(\text{KL}(q(\mathbf z_0\mid\mathbf x)\Vert p(\mathbf z_0))\) 連到右邊:在潛在空間上的 diffusion,上方「Latent Space Forward Diffusion」從 \(p(\mathbf z_0)\) 到 \(p(\mathbf z_1)\),下方「Latent Space Generative Denoising」反過來。

  1. 更快:在低維表示上訓練 diffusion model,記憶體和計算都省得多。57:36
  2. 任何資料型態:離散輸入(例如文字)先編碼到連續的潛在空間,diffusion 的數學就成立;前提是編碼器/解碼器的重建夠好。58:09

Stable Diffusion 的做法(投影片 38):不是端到端訓練(雖然可以,因為整體就是一個 VAE)。先預訓練 autoencoder,只在乎重建,對潛在分佈接近高斯只加很弱的正則化;第二階段固定 autoencoder,在它的潛在空間上訓練 diffusion model。大規模、開源,被廣泛採用。58:39

課堂問答 · 61:16那 autoencoder 的 prior 呢?可以想成有兩個 prior。預訓練 autoencoder 時的 prior 幾乎不在乎,因為不會從它取樣;真正的 prior 是潛在空間上的 diffusion model,它非常強大,能擬合編碼器輸出的任何分佈,所以不需要把潛在分佈正則化成高斯。diffusion model 自己的 prior 則是一般的高斯。61:16
壓縮多少?LDM 論文的取捨

LDM 的編碼器把 \(H\times W\) 影像縮小 \(f\) 倍(\(f = 2^m\)),自編碼器用感知 loss 加 patch 對抗 loss 訓練,避免只用 L2 的模糊;正則化有兩種:輕微的 KL 懲罰(KL-reg)或向量量化(VQ-reg)。實驗:\(f = 1, 2\) 訓練很慢(感知壓縮的工作大多留給 diffusion),\(f\) 太大則資訊損失、品質停滯;\(f = 4\)–16 取得平衡,ImageNet 上 LDM-8 比 pixel 空間(LDM-1)在 200 萬步後的 FID 好 38。文字等條件用 cross-attention 注入 U-Net。

出處:Rombach et al. (2022) §3.1 "Perceptual Image Compression"、§4.1 "On Perceptual Compression Tradeoffs"、§3.3 "Conditioning Mechanisms"。

05條件生成與 guidance(投影片 39–47)

直接訓練條件模型(投影片 39–40)

資料是 (影像 \(\mathbf x\), 描述 \(\mathbf y\)) 對。要學的是 \(p(\mathbf x\mid\mathbf y)\),也就是條件 score:去雜訊器多吃一個輸入 \(\mathbf y\):61:49

$$\mathbb E_{(\mathbf x,\mathbf y)\sim p_{\text{data}}}\,\mathbb E_{\boldsymbol\epsilon\sim\mathcal N(0,I)}\,\mathbb E_{t\sim\mathcal U[0,T]}\big\Vert\boldsymbol\epsilon_\theta(\mathbf x_t,t;\mathbf y) - \boldsymbol\epsilon\big\Vert_2^2$$

知道描述,去雜訊其實變簡單了。架構上要把 \(\mathbf y\) 送進 U-Net:例如用預訓練的語言模型把文字變成向量,再用 cross-attention 等方式注入。63:52

不重新訓練,控制生成:Bayes 法則(投影片 41–44)

已經有一個無條件模型 \(p(\mathbf x)\)(例如貓和狗),又有一個分類器 \(p(\mathbf y\mid\mathbf x)\)。想只生成狗:要從後驗 \(p(\mathbf x\mid\mathbf y) = p(\mathbf x)p(\mathbf y\mid\mathbf x)/p(\mathbf y)\) 取樣。理論上一切都確定了,但分母 \(p(\mathbf y)\) 要對 \(\mathbf x\) 積分,和 EBM 的配分函數一樣算不出來。64:58

$$\nabla_{\mathbf x}\log p(\mathbf x\mid\mathbf y) = \nabla_{\mathbf x}\log p(\mathbf x) + \nabla_{\mathbf x}\log p(\mathbf y\mid\mathbf x) - \underbrace{\nabla_{\mathbf x}\log p(\mathbf y)}_{=\,0}$$

在 score 的層次,分母的梯度是 0。所以只要在 SDE 或 ODE 裡,把 prior 的 score 換成「prior 的 score + 分類器對輸入的梯度」,就是在從後驗取樣。直覺:一邊讓影像在 prior 下更可能,一邊確保分類器會判斷它是狗,也就是改變 drift,把樣本推向會被分類成狗的方向。68:10

  • 細節:實際上需要的是對雜訊影像 \(\mathbf x_t\) 的分類器 \(p_t(\mathbf y\mid\mathbf x_t)\)。70:16 老師提到的做法:用去雜訊器先把 \(\mathbf x_t\) 變乾淨,再用一般的分類器近似;某些情況可以閉式算出;或者用下面的 classifier-free guidance。72:21(另一個常見做法是直接訓練一個吃雜訊影像的分類器,見 Dhariwal & Nichol 2021。)
  • 同一個 score model 接不同的前向模型:筆畫轉照片(SDEdit,前向模型可以自己指定)、用影像描述網路當前向模型做文字引導、MRI 等醫學影像逆問題(前向模型由機器的物理決定,\(\mathbf y\) 是量測值)。70:47

投影片 41–44 的圖:(41) 左邊 \(p(\mathbf x)\) 有好幾個峰(狗和貓的照片),經過「Forward model \(p(\mathbf y\mid\mathbf x)\)、Control signal \(\mathbf y\) = "dog"」得到只剩狗的「Inverse distribution \(p(\mathbf x\mid\mathbf y)\)」;右邊的 Bayes 法則中 \(p(\mathbf y)\) 被打叉,score 版本中 \(\nabla\log p(\mathbf y)\) 標 0,綠色框寫「Plug in different forward models for the same score model」。(42) 左欄是兩張色塊組成的筆畫畫(河邊的房子、臥室),右邊兩欄是各自生成的兩張照片;右邊虛線框寫「Forward model \(p(\mathbf y\mid\mathbf x)\) can be specified」。(43) 提示「Treehouse in the style of Studio Ghibli animation」生成的四張吉卜力風格樹屋。(44)「An abstract painting of computer science」與「A painting of the starry night by van Gogh」。

Classifier-free guidance(投影片 45–47)

不想另外訓練分類器?把分類器表示成兩個 diffusion model 的差:71:50

$$\nabla_{\mathbf x}\log p(\mathbf y\mid\mathbf x) = \underbrace{\nabla_{\mathbf x}\log p(\mathbf x\mid\mathbf y)}_{\text{條件 score}} - \underbrace{\nabla_{\mathbf x}\log p(\mathbf x)}_{\text{無條件 score}}$$

訓練時以某個機率把描述丟掉(換成空的 token),同一個網路就同時學會條件和無條件的 score。取樣時把分類器項放大 \(1+w\) 倍:

投影片 46 $$(1+w)\nabla_{\mathbf x_t}\log p(\mathbf y\mid\mathbf x_t) + \nabla_{\mathbf x_t}\log p(\mathbf x_t) = (1+w)\nabla_{\mathbf x_t}\log p(\mathbf x_t\mid\mathbf y) - w\nabla_{\mathbf x_t}\log p(\mathbf x_t)$$ 換成雜訊預測:\(\tilde{\boldsymbol\epsilon} = (1+w)\boldsymbol\epsilon_\theta(\mathbf x_t,\mathbf y) - w\boldsymbol\epsilon_\theta(\mathbf x_t)\)。取樣時把樣本推向與描述一致的影像,並遠離prior 下的典型影像。72:52

投影片 47 的圖(「Effect of classifier guidance」):三組哈士奇的 8×8 樣本網格,箭頭標「Increased classifier guidance strength (w)」。最左邊有各種背景、姿勢、甚至別的品種;越往右,越像典型的哈士奇正面照,彼此也越相似。

\(w\) 是品質與多樣性的旋鈕;它其實不是在精確取樣
  • 取捨:Ho & Salimans 在 ImageNet 上發現,小量的 guidance(\(w = 0.1\) 或 0.3)FID 最好,強 guidance(\(w\ge4\))Inception Score 最好,兩者之間 FID 隨 \(w\) 變差(數值上升)、IS 單調上升(論文的 ImageNet 64×64 表格),類似 GAN 的 truncation 或 Glow 的低溫取樣。單純把 score 放大、或減少反向過程的雜訊,在 diffusion model 上反而得到模糊的樣本,所以需要 guidance 這種做法。
  • 丟棄機率:\(p_{\text{uncond}}\) 取 0.1 或 0.2 效果都不錯。
  • 不是任何分類器的梯度:若 score 是精確的,\(\tilde{\boldsymbol\epsilon}\) 等於用隱含分類器 \(p^i(\mathbf y\mid\mathbf x)\propto p(\mathbf x\mid\mathbf y)/p(\mathbf x)\) 做 classifier guidance;但網路是不受限的函數,\(\boldsymbol\epsilon_\theta(\mathbf x,\mathbf y) - \boldsymbol\epsilon_\theta(\mathbf x)\) 一般不是任何分類器的梯度。
  • 不精確:即使 score 精確,在每個 \(t\) 都用 \(p_t(\mathbf x)p_t(\mathbf y\mid\mathbf x)^{1+w}\) 的 score,最後得到的分佈一般也不等於 \(p(\mathbf x)p(\mathbf y\mid\mathbf x)^{1+w}\)(因為「加雜訊」和「取 \(1+w\) 次方」不能交換)。它是一個有用的啟發式方法。

出處:Ho & Salimans (2022) §3.2(式 (6)、隱含分類器的討論)、§4.1–4.2(\(w\) 與 \(p_{\text{uncond}}\) 的實驗);Dhariwal & Nichol (2021)(classifier guidance)。

Demo BClassifier-free guidance:拉高 w 會發生什麼

圓上 6 個高斯(標準差 0.25,彼此有重疊),上半圈 3 個是類別 A,下半圈 3 個是類別 B。條件 score \(\nabla\log p_t(\mathbf x\mid A)\) 和無條件 score \(\nabla\log p_t(\mathbf x)\) 都能精確算,代入 \(\tilde{\boldsymbol\epsilon} = (1+w)\boldsymbol\epsilon(\mathbf x_t,A) - w\boldsymbol\epsilon(\mathbf x_t)\),用 DDPM ancestral(100 步、二次間隔)取 1,500 個樣本。背景是 \(p(\mathbf x\mid A)\)。

樣本落在各團的比例(左 3 根是 A,右 3 根是 B)
  • w = 0(純條件模型):A 的三團各約 1/3;因為團與團重疊,有約 2% 的樣本其實比較像 B,用真正的 Bayes 分類器算,平均 \(p(A\mid\mathbf x)\) 約 0.98。
  • w 增加:\(p(A\mid\mathbf x)\) 升到 0.999 以上(「更像 A」),但樣本湧向離 B 最遠的中間那團(w = 8 時約 65%),而且被推向圓的外側(平均半徑 1.02 → 1.13):多樣性下降、樣本變得「誇張地典型」,正是投影片 47 哈士奇網格的樣子。
第二部分 · 官方第 17 講投影片:離散潛在變數模型(未在影片中講授)

06離散:為什麼重要、為什麼難(投影片 2–7)

  • 離散無所不在:決策(要不要去上 CS236)、結構學習(剖析樹);很多資料天生是離散的:圖、文字、DNA 序列、程式碼、分子。
  • 共同的問題:最佳化 \(\max_\phi\mathbb E_{q_\phi(\mathbf z)}[f(\mathbf z)]\)。例如 VAE 的 ELBO \(\mathbb E_{q_\phi(\mathbf z\mid\mathbf x)}[\log p_\theta(\mathbf x,\mathbf z) - \log q_\phi(\mathbf z\mid\mathbf x)]\)。
  • 對 \(\theta\) 的梯度容易(期望的線性),對 \(\phi\) 的梯度才麻煩,因為取樣的分佈本身依賴 \(\phi\)。
  • Reparameterization(第 6 講):\(\mathbf z = g_\phi(\boldsymbol\epsilon)\),\(\boldsymbol\epsilon\sim p(\boldsymbol\epsilon)\),\(\nabla_\phi\mathbb E[f(\mathbf z)] = \mathbb E_{\boldsymbol\epsilon}[\nabla_{\mathbf z}f(\mathbf z)\nabla_\phi g_\phi(\boldsymbol\epsilon)]\)。需要兩個假設:\(f\) 可微、\(q_\phi\) 可重參數化。
  • 兩個假設會失敗:(1) \(f\) 不可微,例如強化學習中的黑盒子獎勵;(2) \(q_\phi\) 無法寫成固定分佈的可微變換,例如離散分佈(\(\mathbf z\) 是類別,對 \(\phi\) 的微小改變只會讓 \(\mathbf z\) 跳來跳去或不變)。

07Log-derivative trick 與 control variates(投影片 8–19)

多臂吃角子老虎機:動作 \(\mathbf z\in\mathcal A\) 有獎勵 \(f(\mathbf z)\),隨機策略 \(q_\phi(\mathbf z)\)(例如類別分佈),目標 \(\max_\phi\mathbb E_{q_\phi}[f(\mathbf z)]\)。

$$\frac{\partial}{\partial\phi_i}\mathbb E_{q_\phi}[f(\mathbf z)] = \sum_{\mathbf z}\frac{\partial q_\phi(\mathbf z)}{\partial\phi_i}f(\mathbf z) = \sum_{\mathbf z}q_\phi(\mathbf z)\frac{1}{q_\phi(\mathbf z)}\frac{\partial q_\phi(\mathbf z)}{\partial\phi_i}f(\mathbf z) = \mathbb E_{q_\phi}\Big[\frac{\partial\log q_\phi(\mathbf z)}{\partial\phi_i}f(\mathbf z)\Big]$$

於是 \(\nabla_\phi\mathbb E[f] \approx\frac1K\sum_kf(\mathbf z^k)\nabla_\phi\log q_\phi(\mathbf z^k)\),\(\mathbf z^k\sim q_\phi\)。只需要能取樣、能算 \(\log q_\phi\) 的梯度,不需要 \(f\) 可微,離散、連續都適用(又叫 REINFORCE、score function estimator)。直覺:抽到的 \(\mathbf z\) 獎勵越高,就越把機率往它推。

  • 用在 VAE(投影片 11):這時 \(f\) 本身也依賴 \(\phi\)(裡面有 \(-\log q_\phi\)),所以多一項:\(\nabla_\phi\mathbb E_{q_\phi}[f(\phi,\theta,\mathbf z,\mathbf x)] = \mathbb E_{q_\phi}[f\,\nabla_\phi\log q_\phi(\mathbf z\mid\mathbf x) + \nabla_\phi f]\)。
  • 變異數很大(投影片 12):估計是不偏的,但實務上幾乎不能直接用。

Control variates

減去任何常數 \(B\)(baseline)都不改變期望:\(\mathbb E_{q_\phi}[B\nabla_\phi\log q_\phi(\mathbf z)] = B\sum_{\mathbf z}\nabla_\phi q_\phi(\mathbf z) = B\nabla_\phi\sum_{\mathbf z}q_\phi(\mathbf z) = B\nabla_\phi1 = 0\)。所以 \(\mathbb E[(f(\mathbf z) - B)\nabla_\phi\log q_\phi(\mathbf z)]\) 有同樣的期望,但變異數可以小很多。

一般形式(投影片 14–17):找一個期望已知的 \(h\),令 \(\hat f_{\text{MC}} = f_{\text{MC}} + a(h_{\text{MC}} - \mathbb E[h])\)。

$$\mathrm{Var}(\hat f_{\text{MC}}) = \mathrm{Var}(f_{\text{MC}}) + a^2\mathrm{Var}(h_{\text{MC}}) + 2a\,\mathrm{Cov}(f_{\text{MC}},h_{\text{MC}}),\qquad a^* = -\frac{\mathrm{Cov}(f_{\text{MC}},h_{\text{MC}})}{\mathrm{Var}(h_{\text{MC}})}$$
$$\mathrm{Var}(\hat f_{\text{MC}})\big|_{a = a^*} = \big(1 - \rho(f_{\text{MC}},h_{\text{MC}})^2\big)\,\mathrm{Var}(f_{\text{MC}})$$

相關係數 \(|\rho|\) 越接近 1,降得越多。也可以在訓練中學 control variate。

NVIL(Mnih & Gregor 2014):離散潛在變數的模型常稱為 belief network。NVIL 用 log-derivative trick 加兩種 control variate:常數 baseline \(B\) 和依賴輸入的 baseline \(h_\psi(\mathbf x)\):

$$\nabla_\phi\mathcal L = \mathbb E_{q_\phi(\mathbf z\mid\mathbf x)}\big[(f - h_\psi(\mathbf x) - B)\nabla_\phi\log q_\phi(\mathbf z\mid\mathbf x) + \nabla_\phi f\big]$$

\(\psi\) 和 \(B\) 透過最小化 \(\mathbb E[(f - h_\psi(\mathbf x) - B)^2]\) 來學,讓 baseline 盡量貼近 \(f\)。

和強化學習的關係

這正是 policy gradient:\(q_\phi\) 是策略、\(f\) 是回報,baseline 通常是價值函數 \(V(\mathbf x)\),\(f - V\) 就是 advantage。最佳的常數 baseline 嚴格來說不是 \(\mathbb E[f]\),而是以 \(\Vert\nabla\log q\Vert^2\) 加權的平均,但 \(\mathbb E[f]\) 通常已經很接近。

08連續鬆弛:Gumbel-softmax(投影片 20–26)

另一條路:把離散的 \(\mathbf z\) 換成一個連續、可重參數化的近似。

  • Gumbel 分佈:用來建模極值,例如河流的最高水位、金融中的極端事件。CDF \(F(g;\mu,\beta) = \exp(-\exp(-\frac{g-\mu}\beta))\)。Gumbel(0,1) 可以用 \(g = -\log(-\log u)\),\(u\sim\mathcal U(0,1)\) 取樣。
  • Gumbel-max trick:類別分佈 \(\boldsymbol\pi = (\pi_1,\dots,\pi_k)\),\(\mathbf z\) 用 one-hot 表示: $$\mathbf z = \text{one\_hot}\Big(\arg\max_i\,(g_i + \log\pi_i)\Big),\quad g_i\overset{\text{iid}}{\sim}\text{Gumbel}(0,1)$$ 隨機性轉移到固定的 Gumbel(0,1) 上,所以是重參數化。問題:\(\arg\max\) 對 \(\boldsymbol\pi\) 不可微。
  • Gumbel-softmax(Jang et al. 2017;同時期的 Concrete distribution,Maddison et al. 2017):把 \(\arg\max\) 換成溫度 \(\tau\) 的 softmax: $$\hat{\mathbf z} = \text{softmax}\Big(\frac{\mathbf g + \log\boldsymbol\pi}{\tau}\Big)$$ 對 \(\boldsymbol\pi\) 可微。\(\hat{\mathbf z}\) 落在機率單形的內部,不是頂點。
為什麼 Gumbel-max 剛好得到 \(\text{Categorical}(\boldsymbol\pi)\)?

令 \(v_i = g_i + \log\pi_i\),它是位置參數 \(\log\pi_i\) 的 Gumbel,CDF 是 \(\exp(-\pi_ie^{-v})\),密度是 \(\pi_ie^{-v}\exp(-\pi_ie^{-v})\)。\(i\) 是最大值的機率:

$$P(\arg\max = i) = \int\pi_ie^{-v}e^{-\pi_ie^{-v}}\prod_{j\ne i}e^{-\pi_je^{-v}}\,dv = \int\pi_ie^{-v}e^{-e^{-v}\sum_j\pi_j}dv = \pi_i\int e^{-v}e^{-e^{-v}}dv = \pi_i$$

(用了 \(\sum_j\pi_j = 1\),最後的積分是 Gumbel(0,1) 的密度積分 = 1。)Demo C 的讀數用 20,000 次取樣驗證這件事。

溫度:偏差與變異的取捨(投影片 24–25)

  • \(\tau\to0\):樣本接近真正的 \(\text{Categorical}(\boldsymbol\pi)\),偏差小,但梯度變異數大(softmax 接近 argmax,梯度幾乎都是 0 或很大)。
  • \(\tau\to\infty\):樣本接近單形中心、接近均勻分佈 \(\text{Categorical}(\frac1k,\dots,\frac1k)\),梯度平滑,但偏差大。
  • 實務上通常退火:一開始 \(\tau\) 高(低變異),逐漸降低(收緊近似)。

投影片 24–25 的圖:(24) Jang et al. 的圖:上排是 Categorical 與 \(\tau\) = 0.1、0.5、1.0、10.0 時 \(\hat{\mathbf z}\) 的期望,下排是一個樣本;\(\tau\) 小時樣本幾乎是 one-hot,\(\tau = 10\) 時各類別差不多。(25) \(\boldsymbol\pi = [0.60, 0.25, 0.15]\) 的機率單形:類別分佈的質量全在三個頂點;三個三角形分別是 \(\tau\) = 0.5、1、2 的 Gumbel-softmax 密度(顏色越淺機率越高),\(\tau\) 越大質量越往中心擴散。

Straight-through(投影片 26):如果 \(f\) 一定要吃離散的 \(\mathbf z\),前向傳播用硬的 \(\mathbf z\sim\text{Categorical}\) 算目標,反向傳播用軟的 \(\hat{\mathbf z}\) 的梯度。

總結(投影片 27)
  • 發現離散的潛在結構(類別、排序、配對)有很多應用。
  • 對參數化的離散分佈做隨機最佳化很困難。
  • Log-derivative trick 是通用的方法,但變異大;control variates 能降低變異。
  • 連續鬆弛提供一個有偏但可重參數化的替代方案,變異低得多。

Demo C梯度估計量:REINFORCE、baseline 與 Gumbel-softmax

問題:\(\mathbf z\sim\text{Categorical}(\boldsymbol\pi)\),\(\boldsymbol\pi = \text{softmax}(\boldsymbol\phi) = [0.6, 0.25, 0.15]\)(投影片 25 的例子),獎勵 \(f = [2, 0, 1]\)(鬆弛版用 \(f(\hat{\mathbf z}) = \sum_kf_k\hat z_k\))。真正的梯度 \(\partial\mathbb E[f]/\partial\phi_j = \pi_j(f_j - \mathbb E[f]) = [0.390, -0.337, -0.052]\)。每種估計量各抽 20,000 個單樣本估計,看偏差(平均和真值的距離)與標準差。

2,000 個 Gumbel-softmax 樣本 ẑ(頂點 = one-hot)
GS 偏差GS 標準差REINFORCE 標準差+ baseline 標準差
  • REINFORCE:不偏,標準差 0.70。加上 baseline \(B = \mathbb E[f]\):仍然不偏,標準差降到 0.49。
  • Gumbel-softmax:\(\tau = 0.1\) 時偏差只有 0.011,但標準差 1.48,比 REINFORCE 還糟;\(\tau = 1\) 時偏差 0.16、標準差 0.20;\(\tau = 5\) 時標準差只剩 0.012,但偏差 0.42,而真正梯度的長度只有 0.52:估計值幾乎縮成 0。這就是投影片 24 的取捨,也是為什麼要退火。
  • 左圖:\(\tau\) 小時樣本貼在三個頂點(比例接近 0.6 / 0.25 / 0.15);\(\tau\) 大時擠向單形中心。

常見誤解

誤解:「DDIM 要重新訓練一個模型」。DDIM 只改變取樣方式;它的前向過程和 DDPM 有相同的邊際,所以直接用 DDPM 訓練好的 \(\boldsymbol\epsilon_\theta\)。
誤解:「ODE 取樣一定比 SDE 好」。ODE 快、確定、可算 likelihood,但會累積 score 的誤差;SDE 每步加雜訊有修正作用,樣本有時更好(Demo A 的 score 誤差)。
誤解:「ODE 和 SDE 需要不同的 score」。邊際相同,score 相同,訓練完全一樣。
誤解:「Stable Diffusion 是在像素上做 diffusion」。它在預訓練 autoencoder 的潛在空間上做 diffusion,autoencoder 在第二階段固定。
誤解:「classifier-free guidance 從 \(p(\mathbf x\mid\mathbf y)\) 精確取樣」。\(w = 0\) 才是條件分佈;\(w>0\) 是刻意偏離,用多樣性換取「更像條件」的樣本,而且它也不精確等於 \(p(\mathbf x)p(\mathbf y\mid\mathbf x)^{1+w}\)。
誤解:「Gumbel-softmax 是不偏的」。只有 \(\tau\to0\) 時才接近不偏,但那時變異數爆炸;它是有偏、低變異的估計量。REINFORCE 才是不偏的。
誤解:「baseline 會讓 REINFORCE 有偏」。只要 baseline 不依賴被取樣的 \(\mathbf z\),\(\mathbb E[B\nabla\log q] = 0\),仍然不偏。

自我測驗

1. 為什麼 ODE 和 SDE 取樣可以用同一個 score model?
兩者每個時刻的邊際分佈相同,所以 score \(\nabla\log p_t\) 相同;訓練(score matching)只依賴邊際。
2. score 不完美時,為什麼 SDE 取樣可能比 ODE 好?
ODE 中段的 \(\mathbf x_t\) 會偏離真正的「資料 + 雜訊」分佈,去雜訊器看到沒見過的輸入,誤差累積;SDE 每步加雜訊,讓輸入更接近訓練分佈,有修正作用。
3. 寫出 DDIM 的更新式,說明三個部分。η = 0 和 η = 1 各是什麼?
\(\mathbf x_{t-1} = \sqrt{\bar\alpha_{t-1}}\hat{\mathbf x}_0 + \sqrt{1-\bar\alpha_{t-1}-\sigma_t^2}\boldsymbol\epsilon_\theta + \sigma_t\boldsymbol\epsilon\):預測的乾淨影像、指向 \(\mathbf x_t\) 的方向、隨機雜訊。η = 0 是確定性的 DDIM,η = 1 是 DDPM。
4. DDIM 在 CIFAR-10 上 10 步和 1,000 步的 FID 各是多少?DDPM(η = 1)10 步呢?
DDIM 13.36 / 4.04;DDPM 10 步 41.07。
5. 描述 progressive distillation。
以 N 步 DDIM 為老師,訓練學生一步做到老師兩步的結果(N/2 步);學生成為新老師,重複,每輪步數減半。CIFAR-10 上 4 步 FID 3.0。
6. Latent diffusion 的兩個好處是什麼?Stable Diffusion 怎麼訓練?
更快(低維)、可用於任何資料型態(離散資料先編碼到連續空間)。先預訓練只在乎重建的 autoencoder,再固定它,在潛在空間上訓練 diffusion model。
7. 用 Bayes 法則推出條件 score。為什麼分母 \(p(\mathbf y)\) 不是問題?
\(\nabla\log p(\mathbf x\mid\mathbf y) = \nabla\log p(\mathbf x) + \nabla\log p(\mathbf y\mid\mathbf x) - \nabla\log p(\mathbf y)\),最後一項與 \(\mathbf x\) 無關,梯度為 0。
8. 從 classifier guidance 推出 classifier-free guidance 的公式。
把 \(\nabla\log p(\mathbf y\mid\mathbf x) = \nabla\log p(\mathbf x\mid\mathbf y) - \nabla\log p(\mathbf x)\) 代入 \((1+w)\nabla\log p(\mathbf y\mid\mathbf x) + \nabla\log p(\mathbf x)\),得到 \((1+w)\nabla\log p(\mathbf x\mid\mathbf y) - w\nabla\log p(\mathbf x)\)。
9. 怎麼用一個網路同時得到條件和無條件的 score?
訓練時以機率 \(p_{\text{uncond}}\)(例如 0.1–0.2)把條件換成空 token。
10. 推導 log-derivative trick。它需要哪些假設?
\(\nabla_\phi\sum_zq_\phi f = \sum_zq_\phi\nabla_\phi\log q_\phi f = \mathbb E_q[f\nabla_\phi\log q_\phi]\)。只需要能從 \(q\) 取樣、能算 \(\nabla\log q\);\(f\) 不必可微,\(\mathbf z\) 可以是離散的。
11. 為什麼減掉常數 baseline 不改變期望?最佳的 control variate 係數是多少,能把變異降到多少?
\(\mathbb E[B\nabla\log q] = B\nabla\sum q = 0\)。\(a^* = -\mathrm{Cov}(f,h)/\mathrm{Var}(h)\),變異變成 \((1-\rho^2)\mathrm{Var}(f)\)。
12. 寫出 Gumbel-max 和 Gumbel-softmax。為什麼前者不能直接用來求梯度?
\(\mathbf z = \text{one\_hot}(\arg\max_i(g_i + \log\pi_i))\);\(\hat{\mathbf z} = \text{softmax}((\mathbf g + \log\boldsymbol\pi)/\tau)\)。argmax 對 \(\boldsymbol\pi\) 不可微(幾乎處處梯度為 0)。
13. 溫度 τ 太小、太大各有什麼問題?
太小:接近離散、偏差小,但梯度變異大。太大:接近單形中心的均勻分佈,變異小但偏差大。通常從高溫退火到低溫。

延伸閱讀