CS236 第 14 講 · 多尺度雜訊與 Score SDE
Stanford CS236 · Fall 2023 · Lecture 14

多尺度雜訊與 Score SDE:從雜訊一路走回資料

上一講的 score-based model 直接做會失敗:資料在流形上、低密度區 score 不準、Langevin 在 mode 之間混合太慢。解法出奇簡單:加高斯雜訊。雜訊大,score 估得準但分佈被破壞;雜訊小則相反。所以同時學很多個雜訊尺度(NCSN),取樣時從大雜訊逐步降到小雜訊(annealed Langevin dynamics)。讓尺度數趨於無限,加雜訊就成了一個隨機微分方程(SDE),而它的反向過程只需要 score;再換成同邊際分佈的 ODE,就得到一個連續時間的 normalizing flow,能精確算 likelihood。

讀完這頁你應該能夠

  1. 說明加高斯雜訊怎麼同時解決流形、低密度區、混合太慢三個陷阱,以及它帶來的取捨。
  2. 寫出 annealed Langevin dynamics 的演算法,說明每一層的步長為什麼是 \(\epsilon\sigma_i^2/\sigma_L^2\)。
  3. 寫出 NCSN 的訓練目標,說明如何選最大/最小雜訊、幾何級數、權重 \(\lambda(\sigma) = \sigma^2\),以及它和「預測雜訊 \(\boldsymbol\epsilon\)」的關係。
  4. 用 SDE 描述「連續地加雜訊」,寫出反向 SDE,說明它只需要 \(\nabla_{\mathbf x}\log p_t\)。
  5. 說明 predictor–corrector 取樣把 SDE 數值解法和 Langevin 結合。
  6. 寫出 probability flow ODE,說明為什麼它是一個連續時間的 normalizing flow、能算 likelihood。

前置知識檢查

  • 第 13 講:score-based model、denoising score matching、sliced score matching、Langevin、三個陷阱(必讀)。
  • 第 7–8 講:normalizing flow 與變數變換公式;第 8 講補充的 Neural ODE。
  • 常微分方程的 Euler 法 \(\mathbf x\leftarrow\mathbf x + \mathbf v(\mathbf x,t)\Delta t\);布朗運動在時間 \(\Delta t\) 內的增量是 \(\mathcal N(0,\Delta t\,I)\)。

投影片只有 pptx,用 ONLYOFFICE 轉成 PDF 後看圖;GIF 動畫只看得到第一格,描述以逐字稿為準。標「出處」的補充來自 Yang Song〈Generative Modeling by Estimating Gradients of the Data Distribution〉(2021)、Lai et al. (2026)(arXiv 2510.21890v3)§3.4、第 4 章、Song & Ermon (2019, 2020)、Song et al. (2021)。

01回顧與三個陷阱(投影片 2–8)

  • Score-based model:神經網路 \(\mathbf s_\theta(\mathbf x)\) 表示 score,是一個隨權重改變的向量場;用 score matching 擬合,但原始版本要算 Jacobian 的 trace,高維時不可行。00:35
  • Denoising score matching:\(\frac12\mathbb E_{\mathbf x,\mathbf z}\big[\Vert\mathbf s_\theta(\mathbf x+\sigma\mathbf z) + \mathbf z/\sigma\Vert_2^2\big]\),可擴展,等於去雜訊;缺點是估計的是 \(\nabla\log q_\sigma\ne\nabla\log p_{\text{data}}\)。02:11
  • Sliced score matching:沿隨機方向投影,可擴展、估計的是乾淨資料的 score,但比 DSM 慢。05:31
  • 三個陷阱(投影片 7):流形假設使資料 score 沒有定義;score matching 在低密度區失敗;Langevin dynamics 收斂非常慢(兩個 mode 的權重反映不出來)。07:42

02加雜訊:所有陷阱的解法,以及它的取捨(投影片 8–12)

「THE SOLUTION TO ALL PITFALLS: GAUSSIAN PERTURBATION!」
  • 流形 + 雜訊:一旦加了雜訊,資料就離開流形,分佈支撐整個空間,任何像素組合都有正機率,score 有定義。09:17
  • 低密度區:雜訊夠大時,加了雜訊的訓練樣本散佈到整個空間,到處都有訓練訊號,score 到處都估得準。11:29

投影片 8 的圖:莫比烏斯帶上的資料點,外面多了一層半透明的殼(流形 + 雜訊)。下方兩張 SSM loss 曲線:左邊 CIFAR-10(乾淨資料)在 0 到 −3e9 之間劇烈跳動;右邊 Noisy CIFAR-10(只加了 \(\mathcal N(0,0.0001)\) 的雜訊)平滑地下降收斂。09:49

投影片 10 的圖:加了大量雜訊後的「Perturbed density」(左下和右上兩團被模糊成一大片橘色)、「Perturbed scores」與「Estimated scores」兩張向量場,整片都是淡綠色的「Accurate」。兩個標註:✓「High noise provides useful directional information for Langevin dynamics」;✗「But perturbed density no longer approximates the true data density」。下方一隻小狗的照片變成一張加了雜點的照片。

取捨:雜訊越大,score 估得越準,但我們估計的是「被嚴重破壞的分佈」的 score,沿著它走只會產生雜訊圖;雜訊越小,越接近真正的資料,但又回到原本估不準的問題。19:15

投影片 12 的圖(「Trading off Data Quality and Estimation Accuracy」,紅色表示誤差):好幾排疊在一起的三格圖,從後到前雜訊越來越大。每排是:被擾動的密度、被擾動的 score、估計的 score。最前排(雜訊最大)估計的 score 幾乎沒有紅色,但密度已經是一大團;最後排(乾淨資料)密度正確,但估計 score 大片紅色。左下標「Worse data quality!」,右下標「Better score estimation!」。

課堂問答 · 12:59上一講不是說 score matching 就是去雜訊嗎,這裡加雜訊有什麼不同?沒有不同:用 DSM 估計 \(q_\sigma\) 的 score 正是要做的事。問題在取樣:如果只用一個 σ,沿著學到的 score 跑 Langevin,產生的是 \(q_\sigma\) 的樣本,也就是雜訊圖。12:59
課堂問答 · 16:06「資料落在低維流形上」到底是什麼意思?PCA 保留夠多主成分就幾乎能完美重建,代表像素之間不是獨立的:知道一部分就能推出其他。不是所有像素組合都合法,資料落在高維空間中的一個「面」上。離開那個面,機率就是 0,score 會爆掉。加雜訊後,任何像素組合都有可能,那個限制被打破了。16:06

Demo A不同雜訊尺度下的密度與 score

資料是兩個高斯(右上 \((4,4)\) 權重 0.8、左下 \((-4,-4)\) 權重 0.2,標準差 1)。加上標準差 σ 的高斯雜訊後,\(q_\sigma\) 仍是兩個高斯的混合,只是變異數變成 \(1+\sigma^2\),score 可以精確算出。拖動 σ 看密度(橘色)和 score(箭頭)怎麼變。

沿對角線 (−8,−8) → (8,8) 的 q_σ(橘)與 score 在對角線方向的分量(藍)
  • σ 小:兩團分得很開,中間的密度只有峰值的 \(10^{-7}\) 左右,訓練時幾乎看不到那裡的樣本;score 在中間急轉方向。
  • σ 大(例如 8,約等於兩團的距離 11.3 的量級):兩團融成一團,中間不再是空洞,從任何地方出發 score 都指向一個合理的方向,而且整體偏向權重大的右上(讀數裡「score 為 0 的點」的位置會往右上移)。這就是投影片 19 選最大雜訊的直覺:大約是資料點之間的最大距離。

03多尺度雜訊與 annealed Langevin dynamics(投影片 11–16)

加多少雜訊?全都要:用一系列的雜訊尺度 \(\sigma_1>\sigma_2>\cdots>\sigma_{L-1}>\sigma_L\),學每一個尺度下的 score。23:29

投影片 13 的圖(「Using multiple noise scales」):一條黑色的波浪曲線代表資料所在之處(「High data density region」)。左半:離曲線遠的地方,箭頭方向亂指、旁邊畫著「?」;右半:曲線上下各有幾條彩色虛線(\(\sigma_1\)、\(\sigma_2\)、\(\sigma_3\) 的等高線),離曲線越遠用越大的 σ,箭頭就都指回曲線了。

ANNEALED LANGEVIN DYNAMICS(投影片 15)
Require: {σ_i}_{i=1}^L, ε, T
1: 初始化 x̃_0
2: for i ← 1 to L do
3:     α_i ← ε · σ_i² / σ_L²          ▷ α_i 是步長
4:     for t ← 1 to T do
5:         抽 z_t ~ N(0, I)
6:         x̃_t ← x̃_{t−1} + (α_i/2) s_θ(x̃_{t−1}, σ_i) + √α_i z_t
7:     end for
8:     x̃_0 ← x̃_T                      ▷ 這一層的結果是下一層的起點
9: end for
return x̃_T
依序用 \(\sigma_1,\sigma_2,\dots,\sigma_L\) 的 score 跑 Langevin,逐步降低雜訊;每一層的樣本當作下一層的初始值。24:34
  • 一開始樣本沒有結構,就跟隨「資料 + 大量雜訊」的 score,它到處都估得準。25:06
  • 越來越接近高密度區,結構越來越多,就能改用小雜訊的 score。小雜訊的 score 只在資料附近準,但到那時我們已經在資料附近了。29:28
  • 兩全其美:最後的樣本來自「資料 + 極小雜訊」,而過程中 Langevin 從不迷路,因為一直有準確的方向資訊。26:11

投影片 14 的圖:三格 \(\sigma_1,\sigma_2,\sigma_3\)。\(\sigma_1\):一大片模糊的橘色,藍色粒子散在整個方框;\(\sigma_2\):密度收緊成兩團,粒子開始聚集;\(\sigma_3\):兩團很清晰,粒子大多在右上那團,左下一小群。投影片 16 對比「Langevin dynamics」(粒子在兩團間平均分佈,甚至很多散在中間)和「Annealed Langevin dynamics」(大多在右上,比例正確)。27:48

為什麼步長是 \(\alpha_i = \epsilon\sigma_i^2/\sigma_L^2\)?

在第 \(i\) 層,目標分佈 \(q_{\sigma_i}\) 的「寬度」約是 \(\sigma_i\),score 的大小約是 \(1/\sigma_i\)。Langevin 一步的移動是 \(\frac{\alpha_i}{2}\mathbf s\) 加上標準差 \(\sqrt{\alpha_i}\) 的雜訊。令 \(\alpha_i\propto\sigma_i^2\),則梯度那一步的大小約 \(\alpha_i/\sigma_i\propto\sigma_i\),雜訊那一步約 \(\sigma_i\),兩者都和分佈的尺度成正比:每一層都「走相同比例的距離」。Song & Ermon (2019) 的說法是:這讓「訊雜比」\(\frac{\alpha_i\mathbf s_\theta}{2\sqrt{\alpha_i}\mathbf z}\) 的大小和 \(\sigma_i\) 無關。

出處:Song & Ermon (2019) §4.3(Algorithm 1 與步長的說明)。

延伸 補充課 F §5 annealed Langevin:實測一般 Langevin 停在 49%、annealed 學到 80%

04Noise conditional score network(投影片 17–23)

需要同時估計 \(L\) 個 score(實務上常用 \(L = 1000\))。可以訓練 1,000 個網路,但更有效率的做法是一個網路多吃一個輸入 \(\sigma\):noise conditional score network(NCSN)\(\mathbf s_\theta(\mathbf x,\sigma)\)。輸入大的 σ,它就估計「資料 + 大雜訊」的向量場;輸入小的 σ,就估計「資料 + 小雜訊」的。比 1,000 個獨立網路差一點,但便宜得多。30:58

投影片 17 的圖:上排三格是 \(\sigma_1,\sigma_2,\sigma_3\) 的加雜訊密度和樣本,下排是對應的 score 場;右邊一個網路,輸入是 \(x_1,x_2\) 和一個額外的 \(\sigma\),輸出 \(s_{\theta,1},s_{\theta,2}\)。

課堂問答 · 32:09這樣學到的向量場是保守場嗎?不一定,除非把網路參數化成某個能量函數的梯度。那樣做性能不會差太多,但也沒幫助,所以實務上直接用「影像進、影像出」的自由網路。代價是可能有怪事,例如沿一個迴圈走一圈,「機率」會上升或下降。實務上沒問題。32:09

訓練:加權的 denoising score matching(投影片 18)

用哪種 score matching?目標本來就是加雜訊後分佈的 score,DSM 最自然:34:19

$$\frac1L\sum_{i=1}^L\lambda(\sigma_i)\,\mathbb E_{q_{\sigma_i}(\mathbf x)}\big[\Vert\nabla_{\mathbf x}\log q_{\sigma_i}(\mathbf x) - \mathbf s_\theta(\mathbf x,\sigma_i)\Vert_2^2\big] = \frac1L\sum_{i=1}^L\lambda(\sigma_i)\,\mathbb E_{\mathbf x\sim p_{\text{data}},\,\mathbf z\sim\mathcal N(0,I)}\Big[\Big\Vert\mathbf s_\theta(\mathbf x+\sigma_i\mathbf z,\sigma_i) + \frac{\mathbf z}{\sigma_i}\Big\Vert_2^2\Big] + \text{const.}$$

從去雜訊的角度:我們在學一整族去雜訊器,每個處理不同程度的雜訊。35:55

課堂問答 · 36:27雜訊很大時,去雜訊不是很難嗎?雜訊無限大時,\(\tilde{\mathbf x}\) 裡沒有任何 \(\mathbf x\) 的資訊,L2 最佳的輸出就是「平均影像」。光靠它產生不了好的圖;但因為也會用較小雜訊去雜訊,annealed Langevin 最後能得到乾淨的圖。36:27
課堂問答 · 38:01不同雜訊尺度的 score 不就只差一個縮放嗎?它們確實相關,知道一個尺度的 score 理論上能推出所有尺度的,但不只是縮放:它們由 Fokker–Planck 方程(一個偏微分方程)聯繫。有些論文試著強制這個關係,實務上幫助不大;現在的做法把每個尺度當成獨立的任務。38:33

怎麼選雜訊尺度(投影片 19–20)

  • 最大雜訊 \(\sigma_1\approx\) 資料點之間的最大距離。讓兩個資料點加上雜訊後,有合理的機率從一個變成另一個;這樣大雜訊時 Langevin 能在整個空間裡混合。40:14
  • 最小雜訊 \(\sigma_L\):要夠小,最後樣本裡的雜訊才可忽略(加了雜訊的圖要和乾淨的圖難以分辨)。41:19
  • 中間:相鄰的雜訊尺度要有足夠的重疊,上一層的樣本才能當下一層的好起點。用幾何級數:\(\frac{\sigma_1}{\sigma_2} = \frac{\sigma_2}{\sigma_3} = \cdots = \frac{\sigma_{L-1}}{\sigma_L}\),而且長度要夠。41:56

投影片 19–20 的圖:(19) 兩個資料點 \(\mathbf x_1,\mathbf x_2\) 相距 \(d\),各畫一個半徑 \(\sigma_1\) 的大圓,兩圓有一大塊重疊。(20) 一個切開的同心球:最外面綠色是 \(\sigma_1\)、中間藍色 \(\sigma_2\)、裡面橘色 \(\sigma_3\) 的「殼」,一條紅色箭頭從裡面穿到外面。高維高斯的質量集中在半徑約 \(\sigma\sqrt d\) 的殼上,相鄰的殼要有重疊。

為什麼是「殼」,以及重疊的條件

在 \(d\) 維空間,\(\Vert\sigma\mathbf z\Vert\) 集中在 \(\sigma\sqrt d\) 附近,相對寬度約 \(1/\sqrt{2d}\),所以加了雜訊的樣本都落在一個薄殼上,而不是一個實心球。相鄰兩層 \(\sigma_{i-1}\sqrt d\) 和 \(\sigma_i\sqrt d\) 的殼要重疊,比例 \(\gamma = \sigma_{i-1}/\sigma_i\) 就不能太大,而且維度越高、殼越薄,\(\gamma\) 越要接近 1,也就是要更多層。Song & Ermon (2020)(NCSNv2)把這個直覺寫成具體的建議:\(\sigma_1\) 取訓練資料兩兩距離的最大值、相鄰層的比例讓殼大致重疊、網路的輸出直接除以 σ 來做雜訊條件化、Langevin 的步數與步長要配合選擇,並用指數移動平均(EMA)穩定訓練。(\(\lambda(\sigma) = \sigma^2\) 則是沿用原本的 NCSN。)

出處:Song & Ermon (2020), "Improved Techniques for Training Score-Based Generative Models", arXiv 2006.09011(Techniques 1–5)。

權重 \(\lambda(\sigma)\)(投影片 21)

目標是讓總和裡各項大致平衡。好用的選擇是 \(\lambda(\sigma) = \sigma^2\):44:39

$$\frac1L\sum_{i=1}^L\sigma_i^2\,\mathbb E\Big[\Big\Vert\mathbf s_\theta(\mathbf x+\sigma_i\mathbf z,\sigma_i) + \frac{\mathbf z}{\sigma_i}\Big\Vert_2^2\Big] = \frac1L\sum_{i=1}^L\mathbb E\big[\Vert\sigma_i\mathbf s_\theta(\mathbf x+\sigma_i\mathbf z,\sigma_i) + \mathbf z\Vert_2^2\big] = \frac1L\sum_{i=1}^L\mathbb E\big[\Vert\boldsymbol\epsilon_\theta(\mathbf x+\sigma_i\mathbf z,\sigma_i) - \mathbf z\Vert_2^2\big]$$

最後一步定義 \(\boldsymbol\epsilon_\theta(\cdot,\sigma_i) := -\sigma_i\mathbf s_\theta(\cdot,\sigma_i)\)(投影片寫 \(\sigma_i\mathbf s_\theta\),差一個負號,等價):網路直接預測加上去的雜訊。每一項的目標 \(\mathbf z\) 都是標準高斯,各尺度大小相同,自然就平衡了。這也是 diffusion model(DDPM)常見的寫法。46:11

課堂問答 · 45:10乘上 \(\sigma^2\) 不會讓模型忽略小雜訊的尺度嗎?不會,因為各項本身的大小也隨 σ 縮放(score 約 \(1/\sigma\)),乘上 \(\sigma^2\) 之後反而大致一樣重要。45:10

訓練演算法(投影片 22)

  1. 抽一個 mini-batch 的資料 \(\{\mathbf x_1,\dots,\mathbf x_n\}\sim p_{\text{data}}\)。
  2. 抽一個 mini-batch 的雜訊尺度索引 \(\{i_1,\dots,i_n\}\sim\mathcal U\{1,2,\dots,L\}\)。
  3. 抽一個 mini-batch 的高斯雜訊 \(\{\mathbf z_1,\dots,\mathbf z_n\}\sim\mathcal N(0,I)\)。
  4. 估計加權的 score matching loss:\(\frac1n\sum_{k=1}^n\big[\Vert\sigma_{i_k}\mathbf s_\theta(\mathbf x_k + \sigma_{i_k}\mathbf z_k,\sigma_{i_k}) + \mathbf z_k\Vert_2^2\big]\)。
  5. 隨機梯度下降。
  6. 和訓練單一個(非條件)score model 一樣有效率。46:43

投影片 23 的圖(「Using multiple noise levels」):左邊「Data」,右邊依序是 \(p_{\sigma_1}(\mathbf x) < p_{\sigma_2}(\mathbf x) < p_{\sigma_3}(\mathbf x)\) 的加雜訊密度(從清晰到模糊),中間一排小狗照片從清晰變成滿是雜點。下方是一個 NCSN \(\mathbf s_\theta(\mathbf x,\sigma)\) 同時輸出三個尺度的 score \(\mathbf s_\theta(\mathbf x,\sigma_1),\mathbf s_\theta(\mathbf x,\sigma_2),\mathbf s_\theta(\mathbf x,\sigma_3)\),標「Positive weighting function」、「Score matching loss」,最後接到「Annealed Langevin dynamics」。48:18

Demo B訓練一個 NCSN,比較一般與 annealed Langevin

同 Demo A 的資料。NCSN 是 3→64→64→2 的網路,輸入 \((\mathbf x/8,\ \log\sigma/\log\sigma_1)\),輸出除以 σ 當作 score(等價於讓網路預測 \(-\boldsymbol\epsilon\))。10 個雜訊尺度從 \(\sigma_1 = 10\)(約等於兩團的距離)到 \(\sigma_L = 0.1\) 的幾何級數,用 \(\lambda(\sigma) = \sigma^2\) 的 DSM 訓練 2,500 步。取樣:500 個粒子從均勻分佈出發,annealed 版本每層 100 步(\(\epsilon = 0.002\)),一般 Langevin 只用 \(\sigma_L\) 跑同樣總步數 1,000 步。

瀏覽器中實測(固定亂數種子,訓練約 8 秒):annealed Langevin 用真正的 score 得到右上 79%、落在 mode 附近 94%;用學到的 NCSN 得到右上 85%、mode 附近 93%,接近正確的 80%。一般 Langevin(只用 \(\sigma_L\),同樣 1,000 步)只有右上 52%(真 score)和 42%(NCSN),而且三到四成的粒子還散在 mode 之外:低密度區走不動、兩團的權重也反映不出來,正是第 13 講的陷阱。下排五格是 annealed 過程中第 1、3、5、8、10 層結束時的粒子,對照投影片 14。

05實驗結果(投影片 24–26)

投影片 24–25 的圖:(24) MNIST、CelebA、CIFAR-10 三格 annealed Langevin 的取樣動畫(轉檔只剩第一格的雜訊);逐字稿說可以看到從純雜訊、跟著梯度,慢慢變成資料。(25) CIFAR-10 無條件生成的表格:PixelCNN(Inception 4.60、FID 65.93)、PixelIQN(5.29、49.46)、EBM(6.02、40.58)、WGAN-GP(7.86、36.4)、MoLM(7.90、18.9)、SNGAN(8.22、21.7)、ProgressiveGAN(8.80、−),以及 NCSN(Ours)8.87、25.32。54:52

這是第一個在樣本品質上能和 GAN 競爭的模型(以當時的指標而言,Inception score 最高),引發了大量後續把這類模型放大的工作。投影片 26:放大後能生成合理的人臉、臥室、建築物(高解析度影像)。59:08

課堂問答 · 55:24每一層要跑幾步 Langevin?越多越好,但每步都要評估一次完整的神經網路,很貴。實務上一層可能只跑 1、2 步或 10 步,是一個超參數。55:24
課堂問答 · 57:02diffusion 比 GAN 好在理論上有依據嗎?沒有理論上的論證。一個關鍵的直覺:推論時可以用非常深的計算圖(評估網路上千次),但訓練時從不需要把它展開,因為每次只學「把樣本改善一點點」。這是一種在推論時花大量計算、訓練時卻很便宜的方式。而且只有 score matching,沒有 minimax,訓練穩定得多。57:02

06無限多個雜訊尺度:隨機微分方程(投影片 27–33)

推論時用的雜訊尺度一定要和訓練時一樣嗎?很自然地會想:如果有無限多個雜訊尺度呢?60:50

投影片 27 的圖:上面是乾淨資料的一維密度(兩個峰)和三個逐漸變寬的加雜訊版本;下面把無限多個中間尺度排成一張熱圖:橫軸是時間 \(t\in[0,T]\),縱軸是 \(x\),每個垂直切片是 \(p_t(x)\)。左端 \(p_0 = p_{\text{data}}\) 是兩條亮黃色的帶,往右逐漸擴散、融合,右端 \(p_T(\mathbf x)\approx\pi(\mathbf x)\) 是一條寬的高斯。62:02

  • 每個時間 \(t\) 有一個隨機變數 \(\mathbf x_t\),密度 \(p_t\):這一族 \(\{\mathbf x_t\}_{t\in[0,T]}\) 就是一個隨機過程。從左到右,資料逐漸加雜訊變成純雜訊。65:52
  • 描述它的是一個隨機微分方程(SDE):\(d\mathbf x_t = \mathbf f(\mathbf x_t,t)\,dt + g(t)\,d\mathbf w_t\),前一項是確定性的漂移,後一項是無窮小的雜訊。和 ODE 很像,只是每一步都加一點雜訊。66:24
  • 課堂上用的最簡單例子(投影片 28 的「WLOG: Toy SDE」):\(d\mathbf x_t = \sigma(t)\,d\mathbf w_t\)。沒有漂移,只是不斷加雜訊,就像一個隨機漫步;跑得夠久就變成純雜訊。67:31

反向 SDE:只需要 score(投影片 29)

要生成就要倒轉時間,從 \(T\) 走回 0,從雜訊到資料。驚人的是,反向過程也是一個簡單的 SDE,而它唯一需要的是各時刻加雜訊分佈的 score:68:32

前向 SDE(t:0 → T)$$d\mathbf x_t = \sigma(t)\,d\mathbf w_t$$
反向 SDE(t:T → 0)$$d\mathbf x_t = -\sigma(t)^2\,\underbrace{\nabla_{\mathbf x}\log p_t(\mathbf x_t)}_{\text{score function!}}\,dt + \sigma(t)\,d\bar{\mathbf w}_t$$

\(d\bar{\mathbf w}_t\) 是「反向時間方向的無窮小雜訊」;\(dt\) 在這裡是負的(時間往回走),所以 \(-\sigma^2\nabla\log p_t\,dt\) 其實是沿著 score 往高密度走。

一般形式(Anderson 1982)

前向 SDE \(d\mathbf x = \mathbf f(\mathbf x,t)dt + g(t)d\mathbf w\) 的時間反轉過程是

$$d\mathbf x = \big[\mathbf f(\mathbf x,t) - g(t)^2\nabla_{\mathbf x}\log p_t(\mathbf x)\big]dt + g(t)\,d\bar{\mathbf w}$$

單一條隨機軌跡不能倒轉(雜訊每一步都把它推往許多可能的方向),但軌跡的分佈可以:反向過程的每個時刻都和前向過程有相同的邊際 \(p_t\)。課堂的玩具例子是 \(\mathbf f = 0\)、\(g = \sigma(t)\)。常見的兩種實例:VE SDE(\(\mathbf f = 0\),變異數爆炸,對應 NCSN)和 VP SDE(\(\mathbf f = -\frac12\beta(t)\mathbf x\),變異數保持,對應 DDPM)。

出處:Lai et al. (2026) §4.1.2–4.1.3(forward / reverse-time SDE)、§4.4(VE、VP SDE);Song et al. (2021) §2–3。

訓練與取樣(投影片 30)

  • 時間條件的 score model:\(\mathbf s_\theta(\mathbf x,t)\approx\nabla_{\mathbf x}\log p_t(\mathbf x)\)。
  • 訓練:連續版的加權 DSM,把對 1,000 個尺度的總和換成對 \(t\) 的積分(期望): $$\mathbb E_{t\sim\mathcal U(0,T)}\big[\lambda(t)\,\mathbb E_{p_t(\mathbf x)}\big[\Vert\nabla_{\mathbf x}\log p_t(\mathbf x) - \mathbf s_\theta(\mathbf x,t)\Vert_2^2\big]\big]$$70:41
  • 取樣:把反向 SDE 裡的真 score 換成 \(\mathbf s_\theta\):\(d\mathbf x = -\sigma^2(t)\mathbf s_\theta(\mathbf x,t)dt + \sigma(t)d\bar{\mathbf w}\),然後用數值方法解。最簡單的是 Euler–Maruyama(ODE 的 Euler 法的類比): $$\mathbf x\leftarrow\mathbf x - \sigma(t)^2\mathbf s_\theta(\mathbf x,t)\Delta t + \sigma(t)\mathbf z\quad(\mathbf z\sim\mathcal N(0,|\Delta t|I)),\qquad t\leftarrow t+\Delta t$$ \(\Delta t\) 是負的。這和 Langevin 一樣是「沿梯度走、加一點雜訊」。72:22

好處是:取樣變成了一個被研究得很透徹的問題「解 SDE」,可以用各種進階的數值方法,也可以自由選步數。73:59

Predictor–corrector 取樣(投影片 31–33)

  • Predictor:數值 SDE 解法,沿時間往前跳一步(白色箭頭)。
  • Corrector:基於 score 的 MCMC(Langevin),在同一個時間切片上修正樣本,讓它更符合 \(p_t\)(紅色向上箭頭)。75:03

只用 corrector、每個切片跑幾步 Langevin,就是前面的 annealed Langevin;只用 predictor 就是純粹解 SDE;兩者可以組合。75:35

投影片 31–33 的圖:(31) 熱圖上一條紅色的真實軌跡從右(prior)走到左(data);白色箭頭是 predictor 的跳躍,紅色叉叉是每步之後的位置,旁邊的紅色向上箭頭是 corrector 把它拉回。(32) CIFAR-10 的表格:條件生成 BigGAN FID 14.73、StyleGAN2-ADA 2.42;無條件 StyleGAN2-ADA 2.92、NCSN 25.32、NCSNv2 10.87、DDPM 3.17;綠底的是這篇論文的各種變體,最好的 NCSN++ cont. (deep, VE) FID 2.20、IS 9.89。(33) 兩張 1024×1024 的人臉。76:13

課堂問答 · 78:20怎麼確定生成的圖不是訓練集裡的?看 loss:score matching loss 在訓練集和驗證集上很接近,沒有 overfit;也做過大量最近鄰搜尋。但記憶確實會發生:有人能設計出特定的文字提示,讓 text-to-image diffusion model 產生和訓練集一模一樣的圖。只是它不是只會複製,也能以新的方式組合東西。78:20

延伸 補充課 E 布朗運動與 SDE:√dt、Euler–Maruyama、VE 與 VP;補充課 F §6 反向 SDE:從 Fokker–Planck 推出 drift f − g²∇log p

07把 SDE 換成 ODE:連續時間的 normalizing flow(投影片 34)

還有一個完全確定性的過程,在每個時刻和 SDE 有一模一樣的邊際分佈 \(p_t\):82:14

SDE$$d\mathbf x_t = \sigma(t)\,d\mathbf w_t$$
ODE(PROBABILITY FLOW ODE)$$\frac{d\mathbf x_t}{dt} = -\frac12\sigma(t)^2\,\underbrace{\nabla_{\mathbf x}\log p_t(\mathbf x_t)}_{\approx\,\mathbf s_\theta(\mathbf x,t)}$$
  • ODE 也只依賴 score,所以估計好 score 就能用解 ODE 的方式從雜訊走到資料。
  • 從初始條件到終止條件的映射是可逆的:同一個 ODE 不同初始條件的解(投影片上的白色軌跡)不會交叉。所以它就是一個 normalizing flow:潛在變數是純雜訊、和資料同維度,映射由解 ODE 給出。83:20
  • 它不是用 maximum likelihood 訓練,而是用 score matching;可以看成一個無限深的 flow,因此也能算 likelihood。84:26

投影片 34 的圖:同一張熱圖上,紅色的 SDE 軌跡彎彎曲曲、來回抖動;白色的 ODE 軌跡平滑,從左邊的兩個峰各自展開到右邊的寬高斯,彼此從不交叉。

ODE 的係數為什麼是 ½?用 Fokker–Planck 方程看

前向 SDE \(d\mathbf x = \sigma(t)d\mathbf w\) 的邊際密度滿足 Fokker–Planck(擴散)方程:

$$\partial_tp_t = \frac12\sigma(t)^2\Delta p_t$$

把右邊改寫:\(\frac12\sigma^2\Delta p = \nabla\cdot\big(\frac12\sigma^2\nabla p\big) = \nabla\cdot\big(\frac12\sigma^2 p\nabla\log p\big)\)。於是

$$\partial_tp_t = -\nabla\cdot\big(p_t\,\mathbf v_t\big),\qquad\mathbf v_t(\mathbf x) = -\frac12\sigma(t)^2\nabla_{\mathbf x}\log p_t(\mathbf x)$$

這是連續方程:密度像一團不可壓縮的「流體」被速度場 \(\mathbf v_t\) 搬運。粒子沿 \(d\mathbf x/dt = \mathbf v_t(\mathbf x)\) 走,就保有一樣的邊際 \(p_t\)。所以 ½ 不是隨便拿掉雜訊項,而是從擴散項換算過來的。課堂上一個學生問的「不同尺度的 score 由 Fokker–Planck 方程聯繫」,就是這個方程。

出處:Lai et al. (2026) §4.1.4 "Deterministic Process (Probability Flow ODE)" 與 §4.2.1 "Fokker–Planck Equation to Ensure Alignment of Marginal Densities"。

延伸 補充課 C §8 擴散等價於一個速度場:係數為什麼是 ½;補充課 F §6 probability flow ODE;補充課 B §6 軌跡不交叉,所以可逆

Demo C一維的前向 SDE、反向 SDE 與 probability flow ODE

資料是一維的兩個高斯(位於 −2 和 2,權重 0.3 和 0.7,標準差 0.3)。前向 SDE \(dx = \sigma(t)dw\),加上去的總變異數是 \(\sigma_{\min}^2[(\sigma_{\max}/\sigma_{\min})^{2t} - 1]\),\(t\in[0,1]\)、\(\sigma_{\min} = 0.05\)、\(\sigma_{\max} = 6\)(VE SDE)。因為資料是高斯混合,每個 \(p_t\) 和它的 score 都能精確算出,所以這裡用的是真正的 score,專心看三種過程本身。背景是 \(p_t(x)\) 的熱圖,橫軸是時間。

用 ODE 精確算 likelihood(投影片 35 的想法)

  • 反向 SDE:40 條軌跡從右邊的 \(p_1\)(近似一個寬高斯)出發,抖動著往左走,最後分到兩個峰。讀數用 4,000 條軌跡統計落在右峰的比例,應接近 70%:不同於第 13 講的單一 σ Langevin,這裡一路從大雜訊開始,權重是對的。
  • ODE:軌跡平滑、互不交叉,同樣分到兩個峰,比例也接近 70%。同一個起點永遠走到同一個終點,這就是可逆映射。
  • 步數:步數太少時離散誤差變大。實測 251 步時,反向 SDE 和 ODE 落在右峰的比例是 70.7% 和 69.5%(正確 70%);只用 10 步時變成 65.9% 和 77.5%,兩者往相反方向偏。前向 SDE 也一樣:10 步時 \(t = 1\) 的標準差只有 4.96(理論 6.28),因為 Euler 法每段都用起點的 \(\sigma(t)\),而這裡的 \(\sigma(t)\) 隨時間指數成長,每段加的雜訊都偏少。
  • likelihood:對一個資料點 \(x_0\),沿 ODE 從 \(t = 0\) 積分到 1,同時累加速度場的散度 \(\int_0^1\partial_xv_t(x_t)dt\),就得到 \(\log p_0(x_0) = \log p_1(x_1) + \int_0^1\partial_xv_t\,dt\)(連續時間的變數變換公式)。讀數比較 ODE 算出來的和真正的 \(\log p_{\text{data}}(x_0)\):用真正的 \(p_1\) 時兩者到小數點後三、四位都一樣;改用實務上的高斯先驗 \(\pi\approx p_1\) 會差一點(\(p_1\) 其實是兩個寬高斯的混合,不完全是高斯),這是「\(p_T\approx\pi\)」近似的代價。

08沒講到的投影片(投影片 35–42)

影片在 SDE→ODE 的說明處結束(老師說「沒時間講了」)。剩下的投影片和 likelihood、DDIM 有關的部分在第 16 講會再談;以下先整理投影片內容。

用 ODE 算機率(投影片 35–36)

$$\log p_\theta(\mathbf x_0) = \log\pi(\mathbf x_T) - \frac12\int_0^T\sigma(t)^2\,\mathrm{trace}\big(\nabla_{\mathbf x}\mathbf s_\theta(\mathbf x,t)\big)\,dt$$

(式中的 \(\mathbf x\) 是 ODE 軌跡在時間 \(t\) 的位置;投影片寫的是從 \(\mathbf x_T\) 往回的方向,正負號依積分方向而定,和上面 Demo C 的寫法等價。)前一項用 ODE solver 把 \(\mathbf x_0\) 送到 \(\mathbf x_T\) 後計算;trace 項用 Hutchinson 估計量做不偏估計,計算時間是多項式的。投影片 36 的表:CIFAR-10 / ImageNet 32×32 的負 log-likelihood(bits/dim):PixelSNAIL 2.85 / 3.80、Delta-VAE 2.83 / 3.77、Sparse Transformer 2.80 / −,以及 score flow model 2.83 / 3.76(投影片文字中有這一列,轉檔的圖上被截掉了),「挑戰了 autoregressive model 和 VAE 多年的主導地位」。

加速取樣(投影片 37)

用數值方法和 ODE 形式加速取樣。DDIM(Song et al. 2021):把時間軸粗略地離散化、走大步;它對應於半線性 ODE 的指數積分器(Lu et al. 2022;Zhang & Chen 2022);速度快 10–50 倍,樣本品質相當。

控制生成過程(投影片 38–41)

$$p(\mathbf x\mid\mathbf y) = \frac{p(\mathbf x)p(\mathbf y\mid\mathbf x)}{p(\mathbf y)}\quad\Longrightarrow\quad\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}$$

Bayes 法則本身需要難算的 \(p(\mathbf y)\),但對 score 而言 \(p(\mathbf y)\) 和 \(\mathbf x\) 無關,梯度為 0。所以「條件分佈的 score = 無條件的 score + 前向模型 \(p(\mathbf y\mid\mathbf x)\) 的梯度」:同一個無條件的 score model,可以插上不同的前向模型做不同的控制。例子:\(\mathbf y\) = "dog" 的分類器、把筆畫畫轉成照片(SDEdit,Meng et al. ICLR 2022,前向模型可以自己指定)、用影像描述(captioning)網路當前向模型做文字引導生成(「Studio Ghibli 風格的樹屋」)、「抽象的計算機科學畫作」和「梵谷星夜風格」的例子。這就是第 16 講之後 classifier guidance 的基礎。

結論(投影片 42)

  • 分佈的梯度(score)容易估計:架構選擇有彈性(不需要歸一化或可逆)、訓練穩定(沒有 minimax)。
  • 樣本品質比 GAN 好或相當:CIFAR-10 等的最先進表現,可擴展到 1024×1024。
  • 精確的 likelihood 計算:CIFAR-10 上最先進的 likelihood;可以透過操作潛在編碼編輯樣本。

常見誤解

誤解:「只要選一個剛剛好的 σ 就行」。單一 σ 無法同時兼顧「到處估得準」和「接近乾淨資料」;必須用多個尺度並在取樣時退火。
誤解:「NCSN 要訓練很多個網路」。一個網路把 σ(或 t)當輸入,同時估計所有尺度;訓練成本和單一個 score model 一樣。
誤解:「λ(σ) = σ² 會讓小雜訊不重要」。score 的大小約 \(1/\sigma\),乘上 σ² 後各項目標都是標準高斯 \(\mathbf z\),反而平衡。
誤解:「反向 SDE 就是把前向 SDE 的軌跡倒著走」。單一隨機軌跡不能倒轉;反向 SDE 重現的是軌跡的分佈,漂移項多了 \(-g^2\nabla\log p_t\)。
誤解:「probability flow ODE 就是把反向 SDE 的雜訊項拿掉」。拿掉雜訊的同時,score 的係數也要從 \(g^2\) 變成 \(\frac12g^2\),邊際分佈才會一樣。
誤解:「用 ODE 算出的 likelihood 是用 MLE 訓練得到的」。模型是用 score matching 訓練的;ODE 只是事後把它看成一個 flow 來計算 likelihood。

自我測驗

1. 加高斯雜訊怎麼解決流形和低密度區兩個問題?代價是什麼?
雜訊讓分佈支撐整個空間(score 有定義),而且加了雜訊的訓練樣本散佈到原本的低密度區(到處都有訊號)。代價是學到的是被破壞的分佈的 score,只用一個 σ 取樣會得到雜訊圖。
2. Annealed Langevin 的步驟是什麼?為什麼每層的樣本要當下一層的起點?
從 σ₁ 到 σ_L 依序跑 Langevin,每層 T 步、步長 \(\epsilon\sigma_i^2/\sigma_L^2\)。上一層的樣本已接近 \(q_{\sigma_{i-1}}\) 的高密度區,又和 \(q_{\sigma_i}\) 有重疊,所以是小雜訊 score 準確的區域。
3. 寫出 NCSN 的訓練目標(λ(σ) = σ²),並改寫成預測雜訊的形式。
\(\frac1L\sum_i\mathbb E\Vert\sigma_i\mathbf s_\theta(\mathbf x+\sigma_i\mathbf z,\sigma_i) + \mathbf z\Vert^2 = \frac1L\sum_i\mathbb E\Vert\boldsymbol\epsilon_\theta(\mathbf x+\sigma_i\mathbf z,\sigma_i) - \mathbf z\Vert^2\),其中 \(\boldsymbol\epsilon_\theta = -\sigma\mathbf s_\theta\)。
4. 最大雜訊、最小雜訊、中間的尺度各怎麼選?
最大:約資料點間的最大距離,讓大雜訊時能在整個空間混合。最小:小到雜訊在最後樣本中可忽略。中間:幾何級數,相鄰尺度要有足夠重疊。
5. 雜訊無限大時,最佳的去雜訊器輸出什麼?
\(\tilde{\mathbf x}\) 不含 \(\mathbf x\) 的資訊,L2 最佳輸出是資料的平均(平均影像)。
6. 寫出課堂的玩具前向 SDE 和它的反向 SDE。反向 SDE 需要什麼?
前向 \(d\mathbf x = \sigma(t)d\mathbf w\);反向 \(d\mathbf x = -\sigma(t)^2\nabla\log p_t(\mathbf x)dt + \sigma(t)d\bar{\mathbf w}\)。只需要每個時刻的 score。
7. 如何從反向 SDE 得到取樣演算法?
把真 score 換成 \(\mathbf s_\theta(\mathbf x,t)\),用 Euler–Maruyama:\(\mathbf x\leftarrow\mathbf x - \sigma(t)^2\mathbf s_\theta\Delta t + \sigma(t)\mathbf z\),\(\mathbf z\sim\mathcal N(0,|\Delta t|I)\),\(\Delta t<0\)。
8. Predictor–corrector 取樣中,predictor 和 corrector 各是什麼?
Predictor:數值 SDE 解法,沿時間跳一步。Corrector:在同一時間切片用 Langevin(score-based MCMC)修正。只用 corrector 就是 annealed Langevin。
9. 寫出 probability flow ODE。為什麼它是 normalizing flow?
\(d\mathbf x/dt = -\frac12\sigma(t)^2\nabla\log p_t(\mathbf x)\)。ODE 的解由初始條件唯一決定、軌跡不交叉,所以 \(\mathbf x_0\mapsto\mathbf x_T\) 可逆;潛在變數是和資料同維度的雜訊。
10. 用 Fokker–Planck 方程解釋 ODE 的 ½。
\(\partial_tp = \frac12\sigma^2\Delta p = -\nabla\cdot(p\cdot(-\frac12\sigma^2\nabla\log p))\),所以速度場 \(-\frac12\sigma^2\nabla\log p\) 的連續方程給出同樣的邊際。
11. 怎麼用 ODE 算一個資料點的 log-likelihood?
沿 ODE 把 \(\mathbf x_0\) 送到 \(\mathbf x_T\),\(\log p(\mathbf x_0) = \log\pi(\mathbf x_T) + \int_0^T\nabla\cdot\mathbf v_t\,dt\),散度 \(\nabla\cdot\mathbf v_t = -\frac12\sigma^2\mathrm{tr}(\nabla_{\mathbf x}\mathbf s_\theta)\),用 Hutchinson 估計。
12. 為什麼條件生成不需要算 \(p(\mathbf y)\)?
\(\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) - \nabla_{\mathbf x}\log p(\mathbf y)\),最後一項和 \(\mathbf x\) 無關,梯度為 0。

延伸閱讀