擴散模型原理 B07 · NCSN
The Principles of Diffusion Models · 第 3 章 §3.4–3.6

NCSN:一個網路學一整排雜訊等級,再從粗到細地退火取樣

B06 留下一個兩難:雜訊小,分佈貼近資料,但 score 難學、Langevin 跨不過峰之間的低密度區;雜訊大,好學也好混合,但細節全被抹平。Noise Conditional Score Network(NCSN)的答案是全都要:用一個以雜訊等級為條件的網路,同時學一整排從小到大的雜訊等級;取樣時從最大的雜訊開始跑 Langevin,再把結果交給下一個較小的雜訊等級,一路退火到最小。這一頁也會看到 NCSN 的 score 和 DDPM 的雜訊預測其實是同一個東西,以及兩者共同的弱點:取樣需要非常多步。

書的範圍:第 3 章 §3.4(含 §3.4.1–3.4.3)、§3.5、§3.6 閱讀時間:約 40 分鐘

讀完這頁你應該能夠

  1. 說明只在單一雜訊等級訓練 score 有哪些限制,以及多個雜訊等級怎麼解決。
  2. 寫出 NCSN 的訓練目標,說明它的最佳解是每個雜訊等級的真正 score。
  3. 用 Tweedie 公式證明 NCSN 的 score 和 DDPM 的雜訊預測只差一個已知的比例 \(-1/\sigma\)。
  4. 寫出 annealed Langevin dynamics 的演算法,說明步長為什麼常取 \(\eta_\ell\propto\sigma_\ell^2\),以及為什麼 NCSN 的取樣需要 \(\mathcal O(LK)\) 次循序的網路計算。
  5. 比較 NCSN 和 DDPM 的前向過程、先驗、損失和取樣,說出兩者共同的瓶頸。

前置知識

  • B06:DSM 損失、它學到的是 \(p_\sigma=p_{\text{data}}*\mathcal N(\mathbf 0,\sigma^2\mathbf I)\) 的 score、Tweedie 公式、\(\sigma\) 小與大各自的問題(B06 的 Demo B)。
  • B05:Langevin dynamics、mixing 慢、步長乘曲率要小於 2。
  • B04:DDPM 的前向過程、\(\boldsymbol\epsilon\)-prediction 與 \(\mathcal L_{\text{simple}}\)、取樣慢的原因。

「書 §」標出原文位置。灰框「轉述者補充」是書裡沒有的內容;藍框「推導」展開書中省略的步驟。本頁的雜訊等級照書的寫法,\(\sigma_1\) 最小、\(\sigma_L\) 最大,取樣時從 \(\ell=L\) 往 \(\ell=1\) 走。

01動機:單一雜訊等級不夠書 §3.4.1

對資料分佈加上單一固定變異數的高斯雜訊,可以把它平滑到某個程度,但只在一個雜訊等級訓練 score-based model 會帶來幾個關鍵的限制:

  • 雜訊小:在多峰分佈裡,低密度區的梯度幾乎消失,Langevin dynamics 很難在峰之間移動。
  • 雜訊大:取樣變容易,但模型只抓得到粗略的結構,生成的樣本模糊、缺乏細節。
  • 高維時 Langevin 收斂慢、甚至失敗:它依靠 log 密度的梯度引導,初始化不好時,特別是落在平坦區(plateau)或鞍點附近,探索會受阻,或被困在單一的峰裡。
書中的圖:score matching 在低密度區不準
書中的圖(§3.4.1):score matching 的不準確(回顧 B05 第 6 節的圖)。同樣的兩團資料與兩組箭頭(黑色是真正的 score,藍色是網路的 score)。兩團各被一條紅色虛線圈起來;圈外整片淡紅色的區域是低密度區,那裡的樣本覆蓋不足,score 的估計可能不準:可以看到藍黑箭頭在角落和兩團之間偏差明顯。圈內的高密度區,兩者幾乎重合。圖片出處:Lai et al. (2026),作者自繪。

為了解決這些問題,Song & Ermon (2019) 提議對資料分佈注入多個等級的高斯雜訊,並聯合訓練一個 noise-conditional score network(NCSN),估計一整排雜訊尺度上的 score function。生成時,以退火(annealed)的方式套用 Langevin dynamics:從高雜訊等級開始做粗略的探索,再逐漸精修到低雜訊等級,恢復細節。

書中的圖:NCSN 的示意圖
書中的圖(§3.4.1):NCSN。最左邊是乾淨資料 \(\mathbf x\),右邊依序是 \(\mathbf x_1,\mathbf x_2,\dots,\mathbf x_{L-1},\mathbf x_L\)。上方的實線箭頭從 \(\mathbf x\) 直接分支到每一個 \(\mathbf x_i\),標成 \(p_{\sigma_i}(\mathbf x_{\sigma_i}\mid\mathbf x)\):前向過程是對資料各自加上不同等級的高斯雜訊,不是一條鏈。下方的虛線箭頭由右往左(\(\mathbf x_L\to\mathbf x_{L-1}\to\dots\to\mathbf x\))是生成:每一層底下的虛線圈表示在該雜訊等級跑 Langevin,跑完的結果「Initialize」下一個較小的雜訊等級。圖片出處:Lai et al. (2026),作者自繪。
和 B06 的 Demo B 對照

B06 的 Demo B 正好把這三點量出來了:\(\sigma=0.1\) 時峰與峰之間的 score 學得很差,Langevin 的三團比例幾乎等於粒子一開始的分佈(沒有 mixing);\(\sigma=1\) 時 score 學得很好、比例也接近 \(p_\sigma\),但 \(p_\sigma\) 已經是抹平的一團。NCSN 的想法就是讓大 \(\sigma\) 先決定「每團該有多少粒子」,再讓小 \(\sigma\) 把每團的形狀修細。本頁的 Demo A 直接比較這兩種做法。

02NCSN 的訓練書 §3.4.2

為了克服只在單一雜訊等級訓練的限制,Song & Ermon (2019) 對資料分佈加上多個等級的高斯雜訊。具體來說,選一串 \(L\) 個雜訊等級 \(\{\sigma_i\}_{i=1}^L\),滿足

$$0\lt\sigma_1\lt\sigma_2\lt\cdots\lt\sigma_L,$$

\(\sigma_1\) 小到能保留資料大部分的細節,\(\sigma_L\) 大到能充分平滑分佈,讓訓練變容易。

每個帶雜訊的樣本都由一個乾淨資料點 \(\mathbf x\sim p_{\text{data}}\) 擾動而來:\(\mathbf x_\sigma=\mathbf x+\sigma\boldsymbol\epsilon\),\(\boldsymbol\epsilon\sim\mathcal N(\mathbf 0,\mathbf I)\)。這定義了

擾動核:\(p_\sigma(\mathbf x_\sigma\mid\mathbf x):=\mathcal N(\mathbf x_\sigma;\mathbf x,\sigma^2\mathbf I)\),

並在每個雜訊等級 \(\sigma\) 誘導出邊際分佈:

$$p_\sigma(\mathbf x_\sigma)=\int p_\sigma(\mathbf x_\sigma\mid\mathbf x)\,p_{\text{data}}(\mathbf x)\,d\mathbf x,$$

也就是被高斯平滑過的資料分佈。

NCSN 的訓練目標

目標是訓練一個以雜訊為條件的 score 網路 \(\mathbf s_{\bm\phi}(\mathbf x,\sigma)\),對所有 \(\sigma\in\{\sigma_i\}_{i=1}^L\) 估計 score \(\nabla_{\mathbf x}\log p_\sigma(\mathbf x)\)。做法是在所有雜訊等級上最小化 DSM 目標:

$$\mathcal L_{\text{NCSN}}(\bm\phi):=\sum_{i=1}^L\lambda(\sigma_i)\,\mathcal L_{\text{DSM}}(\bm\phi;\sigma_i),\qquad\mathcal L_{\text{DSM}}(\bm\phi;\sigma)=\frac12\,\mathbb E_{\mathbf x\sim p_{\text{data}},\,\tilde{\mathbf x}\sim p_\sigma(\tilde{\mathbf x}\mid\mathbf x)}\Big[\Big\Vert\mathbf s_{\bm\phi}(\tilde{\mathbf x},\sigma)-\frac{\mathbf x-\tilde{\mathbf x}}{\sigma^2}\Big\Vert_2^2\Big],$$

\(\lambda(\sigma_i)>0\) 是每個尺度的權重函數。最小化這個目標,得到的 score 模型 \(\mathbf s^*(\mathbf x,\sigma)\) 在每個雜訊等級都還原真正的 score:

$$\mathbf s^*(\cdot,\sigma)=\nabla_{\mathbf x}\log p_\sigma(\cdot),\qquad\text{對所有 }\sigma\in\{\sigma_i\}_{i=1}^L,$$

因為它本質上就是 DSM 的最小化(B06 第 2 節的定理)。

為什麼一個網路就夠、權重怎麼選

網路把 \(\sigma\) 當成輸入,所以對不同的 \(\sigma_i\) 可以給出不同的函數;加權和裡每一項的最佳解各自就是 \(\nabla\log p_{\sigma_i}\),只要每個 \(\lambda(\sigma_i)>0\),加權不改變最佳解(和 B04 的 \(\mathcal L_{\text{simple}}\) 拿掉權重是同一個道理)。好處是不同雜訊等級可以共用特徵,相鄰的 \(\sigma\) 之間也會自然地平滑內插。

權重只決定網路容量不夠時的取捨。Song & Ermon (2019) 選 \(\lambda(\sigma)=\sigma^2\):因為目標 \((\mathbf x-\tilde{\mathbf x})/\sigma^2=-\boldsymbol\epsilon/\sigma\) 的大小約是 \(1/\sigma\),乘上 \(\sigma^2\) 之後每一項都變成 \(\tfrac12\mathbb E\Vert\sigma\mathbf s_{\bm\phi}+\boldsymbol\epsilon\Vert^2\),大小和 \(\sigma\) 無關,不會被小 \(\sigma\) 的項主導。Demo B 就是這樣訓練的。

和 DDPM 損失的關係

令 \(\mathbf x_\sigma=\mathbf x+\sigma\boldsymbol\epsilon\),\(\boldsymbol\epsilon\sim\mathcal N(\mathbf 0,\mathbf I)\),\(p_\sigma\) 是它的邊際分佈。由 Tweedie 公式,

$$\nabla_{\mathbf x_\sigma}\log p_\sigma(\mathbf x_\sigma)=-\frac1\sigma\,\mathbb E\big[\boldsymbol\epsilon\,\big|\,\mathbf x_\sigma\big].$$
從 Tweedie 公式推出來

B06 的 Tweedie(\(\alpha=1\)):\(\mathbb E[\mathbf x\mid\mathbf x_\sigma]=\mathbf x_\sigma+\sigma^2\nabla\log p_\sigma(\mathbf x_\sigma)\)。另一方面 \(\mathbf x=\mathbf x_\sigma-\sigma\boldsymbol\epsilon\),兩邊對 \(\mathbf x_\sigma\) 取條件期望:\(\mathbb E[\mathbf x\mid\mathbf x_\sigma]=\mathbf x_\sigma-\sigma\,\mathbb E[\boldsymbol\epsilon\mid\mathbf x_\sigma]\)。比較兩式,\(\sigma^2\nabla\log p_\sigma=-\sigma\,\mathbb E[\boldsymbol\epsilon\mid\mathbf x_\sigma]\)。

所以 NCSN 的最佳解是真正的 score \(\mathbf s^*(\mathbf x_\sigma,\sigma)=\nabla_{\mathbf x_\sigma}\log p_\sigma(\mathbf x_\sigma)\),而 DDPM 損失 \(\mathcal L_{\text{simple}}\)(B04)下的 Bayes 最佳雜訊預測是 \(\boldsymbol\epsilon^*(\mathbf x_\sigma,\sigma)=\mathbb E[\boldsymbol\epsilon\mid\mathbf x_\sigma]\)。兩者透過下式完全等價:

$$\mathbf s^*(\mathbf x_\sigma,\sigma)=-\frac1\sigma\,\boldsymbol\epsilon^*(\mathbf x_\sigma,\sigma),\qquad\boldsymbol\epsilon^*(\mathbf x_\sigma,\sigma)=-\sigma\,\mathbf s^*(\mathbf x_\sigma,\sigma).$$

在 DDPM 的設定裡,第 \(i\) 步的帶雜訊樣本可以寫成

$$\sigma_i:=\sqrt{1-\bar\alpha_i^2},\qquad\mathbf x_i=\bar\alpha_i\mathbf x_0+\sigma_i\boldsymbol\epsilon,\qquad\boldsymbol\epsilon\sim\mathcal N(\mathbf 0,\mathbf I).$$

因此 score 和最佳的雜訊預測包含同樣的資訊:

$$\mathbf s^*(\mathbf x_i,i)=-\frac1{\sigma_i}\,\mathbb E[\boldsymbol\epsilon\mid\mathbf x_i].$$

換句話說,DDPM 預測雜訊,等價於(差一個已知的比例 \(1/\sigma_i\))預測第 \(i\) 個雜訊等級的 score。書說第 6 章會有系統地比較並總結這種參數化之間的等價(B15–B16)。

DDPM 的情況多了 \(\bar\alpha_i\),為什麼結果一樣

用 B06 含 \(\alpha\) 的 Tweedie:\(\bar\alpha_i\,\mathbb E[\mathbf x_0\mid\mathbf x_i]=\mathbf x_i+\sigma_i^2\nabla\log p_i(\mathbf x_i)\)。又 \(\bar\alpha_i\mathbf x_0=\mathbf x_i-\sigma_i\boldsymbol\epsilon\),取條件期望:\(\bar\alpha_i\,\mathbb E[\mathbf x_0\mid\mathbf x_i]=\mathbf x_i-\sigma_i\,\mathbb E[\boldsymbol\epsilon\mid\mathbf x_i]\)。比較得 \(\nabla\log p_i=-\mathbb E[\boldsymbol\epsilon\mid\mathbf x_i]/\sigma_i\)。訊號的縮放 \(\bar\alpha_i\) 在兩式裡一起出現、互相抵消。

03取樣:annealed Langevin dynamics書 §3.4.3

有了在多個雜訊等級訓練好的 score 網路

$$\mathbf s_{\bm\phi^\times}(\cdot,\sigma_1),\quad\mathbf s_{\bm\phi^\times}(\cdot,\sigma_2),\quad\cdots,\quad\mathbf s_{\bm\phi^\times}(\cdot,\sigma_{L-1}),\quad\mathbf s_{\bm\phi^\times}(\cdot,\sigma_L),$$

叫做 annealed Langevin dynamics(Song & Ermon 2019)的取樣程序,從高雜訊等級 \(\sigma_L\) 逐步去雜訊到低雜訊等級 \(\sigma_1\approx0\),生成資料。

具體地說:從一個簡單的初始化 \(\mathbf x\sim p_{\text{init}}\) 開始,先在最大的雜訊等級 \(\sigma_L\) 跑 Langevin dynamics,它的 score \(\mathbf s_{\bm\phi^\times}(\cdot,\sigma_L)\) 把樣本導向對應的平滑分佈 \(p_{\sigma_L}\)。得到的樣本再拿來初始化下一個較小雜訊等級的 Langevin dynamics。重複這個程序,逐步精修樣本,直到最小的雜訊等級 \(\sigma_1\)。在每個雜訊等級 \(\sigma_\ell\),Langevin dynamics 做下面的更新:

$$\tilde{\mathbf x}_{n+1}=\tilde{\mathbf x}_n+\eta_\ell\,\mathbf s_{\bm\phi^\times}(\tilde{\mathbf x}_n,\sigma_\ell)+\sqrt{2\eta_\ell}\,\boldsymbol\epsilon_n,\qquad\boldsymbol\epsilon_n\sim\mathcal N(\mathbf 0,\mathbf I),$$

上一個雜訊等級的輸出提供初始值 \(\tilde{\mathbf x}_0\)。常見的選擇是讓步長隨雜訊等級縮放:

$$\eta_\ell=\delta\,\frac{\sigma_\ell^2}{\sigma_1^2},\qquad\delta>0.$$

演算法在每一個雜訊等級(包括 \(\sigma_1\))都做 Langevin 更新,所以最後的樣本是在最小的雜訊等級精修過的。書把整個程序整理成下面的演算法:

演算法:Annealed Langevin Dynamics
需要:訓練好的 score s(·, σ_ℓ)、每個雜訊等級 ℓ = L, …, 1 的
      步長 η_ℓ 與 Langevin 迭代次數 N_ℓ;初始分佈 p_init
1  x ~ p_init                  ▷ 從最大雜訊等級的無結構雜訊開始
2  for ℓ = L, L−1, …, 1:
3      x̃₀ ← x                  ▷ 用上一個等級的輸出初始化這一級
4      for n = 0 … N_ℓ − 1:
5          ε_n ~ N(0, I)
6          x̃_{n+1} ← x̃_n + η_ℓ s(x̃_n, σ_ℓ) + √(2η_ℓ) ε_n
7      x ← x̃_{N_ℓ}              ▷ 把最後的狀態交給下一個較小的雜訊等級
8  輸出 x

初始分佈 \(p_{\text{init}}\) 只是提供 Markov 鏈的起點。在最大的雜訊等級,Langevin dynamics 把這個初始分佈推向 \(p_{\sigma_L}\);之後每個雜訊等級逐步把樣本導向平滑程度越來越低的資料分佈。

為什麼步長要和 \(\sigma_\ell^2\) 成正比

從 B05 知道,Langevin 的步長乘上 score 的斜率(曲率)要小於 2 才穩定。當 \(\sigma_\ell\) 遠大於資料本身的尺度時,\(p_{\sigma_\ell}\) 近似變異數 \(\sigma_\ell^2\) 的高斯,score 的斜率約 \(1/\sigma_\ell^2\)。取 \(\eta_\ell\propto\sigma_\ell^2\),\(\eta_\ell\times\text{斜率}\approx\delta/\sigma_1^2\) 在這些層都差不多,所以只要調一個 \(\delta\)。這個近似只在 \(\sigma_\ell\) 夠大時成立:\(p_{\sigma_\ell}\) 的曲率最多是 \(1/(\sigma_\ell^2+s^2)\)(\(s\) 是資料峰本身的寬度),\(\sigma_\ell\) 小到和 \(s\) 相當時,實際的比值會小得多。

Demo A 裡 \(\sigma_1=0.03\)、\(\delta=0.002\) 時 \(\delta/\sigma_1^2\approx2.2\)。轉述者逐層算了 \(\eta_\ell\) 乘上 \(p_{\sigma_\ell}\) 的最大曲率:\(\sigma_\ell\approx0.39\)、0.65、1.08 這三級是 2.08–2.17,超過 2;最小的幾級因為峰本身寬 0.1,只有 0.2–0.9;最大的兩級因為三個峰散開的範圍讓 \(p_{\sigma_\ell}\) 比 \(\sigma_\ell^2\) 寬,約 1.9。所以不是每一層都不穩定,但中間這三級正是決定粒子分到哪個峰的地方,一出問題,比例就偏了。

Song & Ermon (2019) 給的理由是另一個角度:每一步的漂移量 \(\eta_\ell\Vert\mathbf s\Vert\approx\eta_\ell/\sigma_\ell\),雜訊量 \(\sqrt{2\eta_\ell}\),兩者的比值 \(\propto\sqrt{\eta_\ell}/\sigma_\ell\);取 \(\eta_\ell\propto\sigma_\ell^2\) 讓這個「訊號雜訊比」在每一層都固定。

NCSN 取樣很慢

NCSN 在雜訊尺度 \(\{\sigma_i\}_{i=1}^L\) 上用退火的 MCMC(通常是 Langevin dynamics)生成樣本。對每個尺度 \(\sigma_i\),它做 \(K\) 次「用 score \(\mathbf s_{\bm\phi^\times}(\tilde{\mathbf x}_n,\sigma_i)\) 加上一個小的隨機擾動來更新 \(\tilde{\mathbf x}_n\)」,每次都要算一次 score 網路。有兩個因素讓 \(L\times K\) 必須很大:

  1. 局部的準確性與穩定性:學到的 score 只在小擾動下可靠,所以每個雜訊等級需要小步長、多次迭代,才能避免偏差或不穩定。
  2. 高維時 mixing 慢:局部的 MCMC 移動在多峰、高維的目標上探索效率很差,需要很多次迭代才能走到典型的資料區域。

因為更新是嚴格循序的(每次迭代都依賴上一次),每次又要一次昂貴的網路計算,總成本是 \(\mathcal O(LK)\) 次循序的網路計算,取樣因此很慢。

Demo A退火 vs. 只用最小的雜訊等級轉述者補充

一維資料和 B04、B06 相同:三個窄峰(\(-1.5\)、\(0.3\)、\(1.8\),權重 0.35、0.40、0.25,標準差 0.1)。這個 demo 用精確的 score(\(p_\sigma\) 是三個高斯的混合,可以直接算),所以看到的是取樣演算法本身的行為,不受網路誤差影響。雜訊等級取 \(\sigma_1=0.03\) 到 \(\sigma_L\) 的等比數列。2,000 個粒子從 \(\mathcal N(0,\sigma_L^2)\) 出發。

樣本\(p_{\sigma_1}\)(幾乎就是資料分佈)
40 個粒子的軌跡:橫軸是累計的網路計算次數(左邊開始),灰色直線分隔各個雜訊等級

瀏覽器實測(固定種子;三團比例的真值是 35 / 40 / 25%,2,000 個樣本的抽樣誤差約 ±1 個百分點;「寬度」是樣本到最近一峰的均方根距離,\(p_{\sigma_1}\) 的值是 \(\sqrt{0.1^2+0.03^2}=0.104\)):

設定(未列出的用預設:Annealed、\(L=10\)、\(K=20\)、\(\delta=0.0005\)、\(\sigma_L=3\))網路計算次數三團比例寬度
預設20035.4 / 39.9 / 24.8%0.108
只用 \(\sigma_1\)20041.4 / 21.8 / 36.8%0.107
只用 \(\sigma_1\),\(K=100\)1,00041.4 / 21.8 / 36.8%0.106
\(K=5\)5035.5 / 38.1 / 26.3%0.119
\(K=100\)1,00033.0 / 41.3 / 25.7%0.106
\(L=3\),\(K=100\)30037.3 / 37.7 / 25.0%0.107
\(L=2\),\(K=100\)20044.0 / 17.2 / 38.8%0.109
\(\delta=0.001\)20034.8 / 38.5 / 26.7%0.107
\(\delta=0.002\)20027.8 / 46.6 / 25.7%0.110
\(\sigma_L=1\)20033.9 / 40.1 / 26.1%0.108
\(\sigma_L=0.5\)20033.4 / 40.3 / 26.4%0.107
  • 退火才分配得對:預設的退火只用 200 次網路計算,三團比例就和真值相差不到 1 個百分點。只用 \(\sigma_1\) 時,200 次和 1,000 次的結果完全一樣(41.4 / 21.8 / 36.8%):粒子在前幾步就滑進離起點最近的峰,之後再也出不來,比例只反映起始分佈 \(\mathcal N(0,3^2)\) 落在三個盆地的比例。多跑十倍也沒用。
  • 中間的等級不能省:\(L=2\) 時直接從 \(\sigma=3\) 跳到 \(\sigma_1=0.03\),第二段等於「只用 \(\sigma_1\)」,比例又錯了(44.0 / 17.2 / 38.8%)。\(L=3\) 多了一個中間等級(\(\sigma=0.3\)),就幾乎正確。軌跡圖可以看到峰的歸屬是在中間幾個等級決定的。
  • 每級步數太少:\(K=5\) 時比例還對,但寬度 0.119 比真值 0.104 寬,最後一級還沒收斂到 \(p_{\sigma_1}\) 的形狀。
  • 步長太大不會報錯,只會取錯:\(\delta=0.002\) 時 \(\delta/\sigma_1^2\approx2.2\),中間三級(\(\sigma_\ell\approx0.39\)–1.08)的步長乘曲率是 2.08–2.17,超過 2。粒子沒有發散,但三團比例偏成 27.8 / 46.6 / 25.7%(和 B05 Demo A 的 \(\eta=0.25\) 一樣)。\(\delta=0.001\)(各級最多 1.1)仍然正常。
  • \(\sigma_L\) 要多大:在這個一維、峰間距離不到 2 的例子裡,\(\sigma_L=0.5\) 就夠了:在 \(\sigma=0.5\) 時三個峰之間的低密度區還不算太低,Langevin 能在幾十步內重新分配粒子。資料範圍越大、維度越高,\(\sigma_L\) 就要越大,才能讓最大的那一級真的「抹平」整個分佈。

Demo B訓練一個 NCSN,用 ε-prediction 的形式轉述者補充

同樣的資料、同樣的 \(L=10\) 個雜訊等級(\(\sigma_1=0.03\) 到 \(\sigma_{10}=3\))。網路照第 2 節的等價關係寫成 \(\mathbf s_{\bm\phi}(\mathbf x,\sigma)=-\boldsymbol\epsilon_{\bm\phi}(\mathbf x,\sigma)/\sigma\),用 \(\lambda(\sigma)=\sigma^2\) 的權重訓練,也就是最小化 \(\tfrac12\mathbb E\Vert\boldsymbol\epsilon_{\bm\phi}(\mathbf x+\sigma\boldsymbol\epsilon,\sigma)-\boldsymbol\epsilon\Vert^2\):形式上就是 DDPM 的 \(\mathcal L_{\text{simple}}\)。網路是兩層、每層 48 個神經元的 MLP,輸入是縮放過的 \(x\)、\(\log\sigma\) 的幾個特徵和 \(x\) 的 Fourier 特徵;訓練時 \(\sigma\) 從 \([\sigma_1,\sigma_L]\) 的對數均勻分佈抽,2,500 步、batch 128。訓練完用 \(L=10\)、\(K=20\)、\(\delta=0.0005\) 做 annealed Langevin。

真正的 \(\nabla\log p_{\sigma_\ell}\)學到的 \(-\boldsymbol\epsilon_{\bm\phi}/\sigma_\ell\)\(p_{\sigma_\ell}\)(示意高度)
各雜訊等級的 ε 預測誤差(均方根,對 pσ 的樣本取平均);橫軸是 log σ
用學到的 NCSN 退火取樣用精確 score 退火取樣(同設定)\(p_{\sigma_1}\)

瀏覽器實測(固定種子,訓練加兩次取樣約 5 秒):

  • \(\boldsymbol\epsilon\) 誤差:10 個雜訊等級的均方根誤差在 0.08–0.20 之間,最大的是 \(\sigma_{10}=3\)(0.199)。把下拉選單切到不同等級,可以看到學到的 \(-\boldsymbol\epsilon_{\bm\phi}/\sigma_\ell\) 在資料附近貼著真正的 score;在資料範圍外(例如 \(\sigma_5\) 時 \(x\approx3\) 附近)會出現真 score 沒有的起伏,那裡幾乎沒有訓練樣本,又是「低密度區的 score 不準」。
  • 取樣:用學到的 NCSN 退火取樣,三團是 33.3 / 40.8 / 25.9%、寬度 0.109;用精確 score、同樣的設定是 35.4 / 39.9 / 24.8%、0.108。學到的網路只差約 2 個百分點。
  • 但結果對網路誤差很敏感:在 Node 原型裡試過的其他幾組訓練設定(例如 \(\sigma\) 只取 10 個離散值、batch 64),\(\boldsymbol\epsilon\) 誤差和這裡差不多(0.04–0.23),右峰的比例卻有五組只有 17.5%–18.9%,另一組(每層 64 個神經元、6,000 步)反而偏到 31.8%(真值 25%)。這一頁用的設定剛好偏差最小。峰的比例在中間的雜訊等級決定,那裡 score 的一點點偏差,乘上幾十步 Langevin,就累積成比例的偏差。這正是第 3 節說的第一個原因:學到的 score 只在局部可靠,取樣器必須小心地用它。

04總結:NCSN 與 DDPM 的對照書 §3.5

先比較 NCSN 的圖(第 1 節)和 DDPM 的圖(B04 第 1 節),主要的異同整理在下表。

NCSNDDPM
\(\mathbf x_{i+1}\mid\mathbf x_i\)推導得到:\(\mathbf x_{i+1}=\mathbf x_i+\sqrt{\sigma_{i+1}^2-\sigma_i^2}\,\boldsymbol\epsilon\)定義為:\(\mathbf x_{i+1}=\sqrt{1-\beta_i}\,\mathbf x_i+\sqrt{\beta_i}\,\boldsymbol\epsilon\)(見下方提醒)
\(\mathbf x_i\mid\mathbf x\)定義為:\(\mathbf x_i=\mathbf x+\sigma_i\boldsymbol\epsilon\)推導得到:\(\mathbf x_i=\bar\alpha_i\mathbf x+\sqrt{1-\bar\alpha_i^2}\,\boldsymbol\epsilon\)
\(p_{\text{prior}}\)\(\mathcal N(\mathbf 0,\sigma_L^2\mathbf I)\)\(\mathcal N(\mathbf 0,\mathbf I)\)
損失\(\mathbb E_i\mathbb E_{p_{\text{data}}(\mathbf x)}\mathbb E_{\boldsymbol\epsilon}\Big[\big\Vert\mathbf s_{\bm\phi}(\mathbf x_i,\sigma_i)+\frac{\boldsymbol\epsilon}{\sigma_i}\big\Vert_2^2\Big]\)\(\mathbb E_i\mathbb E_{p_{\text{data}}(\mathbf x)}\mathbb E_{\boldsymbol\epsilon}\Big[\big\Vert\boldsymbol\epsilon_{\bm\phi}(\mathbf x_i,i)-\boldsymbol\epsilon\big\Vert_2^2\Big]\)
取樣每一層跑 Langevin;用輸出初始化下一層用 \(p_{\bm\phi^\times}(\mathbf x_{i-1}\mid\mathbf x_i)\) 走完 Markov 鏈

表中「定義」與「推導」的對比是這張表的重點:NCSN 直接定義每個雜訊等級相對於乾淨資料的擾動,相鄰兩級的關係是推出來的;DDPM 反過來,定義的是相鄰兩步的轉移,相對於乾淨資料的擾動核是推出來的(B04 第 2 節)。書的原表用顏色標出被「定義」的那一格。

記號提醒:表中 DDPM 那一格用的是 Ho et al. 的寫法。\(\sqrt{1-\beta_i}\,\mathbf x_i+\sqrt{\beta_i}\,\boldsymbol\epsilon\) 的 \(\beta_i\) 是變異數,這是 Ho et al. (2020) 和 CS236 的記號;這本書在 §2.2(B04)用的是 \(\beta\) 為標準差的寫法,同一件事寫成 \(\mathbf x_{i+1}=\alpha_{i+1}\mathbf x_i+\beta_{i+1}\boldsymbol\epsilon\),\(\alpha_{i+1}=\sqrt{1-\beta_{i+1}^2}\)。表的下一列 \(\sqrt{1-\bar\alpha_i^2}\) 又是書自己的記號。兩列的記號不一致,而且下標也差一(原表寫 \(\beta_i\),照書的定義應該是第 \(i+1\) 步的 \(\beta_{i+1}\)),對照時以 B04 的式子為準。
表裡兩個「推導得到」

NCSN 的相鄰轉移。要讓 \(\mathbf x_{i+1}\) 相對於 \(\mathbf x\) 的雜訊變異數是 \(\sigma_{i+1}^2\),而 \(\mathbf x_i\) 已經帶了變異數 \(\sigma_i^2\) 的雜訊,只要再加上一份獨立、變異數 \(\sigma_{i+1}^2-\sigma_i^2\) 的高斯雜訊:獨立高斯的變異數相加,\(\sigma_i^2+(\sigma_{i+1}^2-\sigma_i^2)=\sigma_{i+1}^2\)。這需要 \(\sigma_{i+1}\gt\sigma_i\)。

DDPM 的擾動核就是 B04 第 2 節的歸納推導。

先驗。NCSN 的 \(\mathbf x_L=\mathbf x+\sigma_L\boldsymbol\epsilon\):當 \(\sigma_L\) 遠大於資料本身的範圍,\(\mathbf x\) 相對可以忽略,\(\mathbf x_L\approx\sigma_L\boldsymbol\epsilon\sim\mathcal N(\mathbf 0,\sigma_L^2\mathbf I)\);這只是近似,資料的平均和範圍越小越準。DDPM 則是訊號被縮到 \(\bar\alpha_L\approx0\),所以先驗是 \(\mathcal N(\mathbf 0,\mathbf I)\)。第 4 章會把這兩種加雜訊方式叫做 variance exploding(VE)和 variance preserving(VP)。

共同的瓶頸

雖然寫法不同,NCSN 和 DDPM 都依賴密集的時間離散化。這導致一個關鍵的限制:取樣常常需要數百甚至數千次迭代,生成又慢又耗計算。

書中的問題怎麼加速 diffusion model 的取樣?

書會在三個地方回到這個挑戰:第 9 章發展更有效率的取樣器(B24–B27);第 10 章把需要數百步的預訓練 diffusion model 蒸餾成少步數的學生生成器(B28);第 11 章研究怎麼在 diffusion 啟發的原則下,從頭學出少步數的快速生成器(B29–B31)。

05本章結語書 §3.6

這一章描繪了通往 diffusion model 的第二條主要路徑:從植根於 energy-based model(EBM)的 score 觀點出發。

  • 先指出 EBM 的核心難題:算不出來的 partition function;再引入 score function \(\nabla_{\mathbf x}\log p(\mathbf x)\),一個完全繞過這個問題的有力工具(B05)。
  • 從古典的 score matching 走到更可擴展、更穩健的 Denoising Score Matching(DSM)。透過 DSM 看到:用雜訊擾動資料,能得到好處理的訓練目標,而且又一次是靠條件化策略產生簡單的回歸目標。接著透過 Tweedie 公式建立 score 估計和去雜訊之間的深刻連結:score 恰好提供了從帶雜訊觀測估計乾淨訊號所需的方向(B06)。
  • 再把這個原則從單一雜訊等級推廣到一整把梯子般的雜訊等級:NCSN 學一個以多個雜訊尺度為條件的 score 模型,並用 annealed Langevin dynamics 生成樣本(本頁)。下一章更進一步,從這把離散的梯子走到連續的雜訊等級:Score SDE 框架。

DDPM 和 NCSN 殊途同歸並非巧合,它暗示背後有一個更深、統一的數學結構。這些離散時間模型的限制,促成了對更一般框架的需求。下一章會跨出這關鍵的一步:

  1. 進入連續時間的觀點,說明 DDPM 和 NCSN 都可以優雅地統一成同一個強大過程的不同離散化,這個過程由一條隨機微分方程(SDE)描述。
  2. 這個 Score SDE 框架會正式連起變分觀點和 score 觀點,把生成問題重新表述成求解一條微分方程。

與 CS236 的對照

本頁CS236 複習頁
多雜訊等級、NCSN、annealed Langevin、低密度區的 score 不準第 13 講
NCSN 與 DDPM 的關係、\(\boldsymbol\epsilon\)-prediction 與 score第 16 講
連續時間:VE/VP SDE(下一章)第 14 講
加速取樣(第 9–11 章)第 17 講
Langevin、mixing補充課 D、補充課 F

常見誤解

誤解:「NCSN 對每個雜訊等級訓練一個網路」。只有一個網路,雜訊等級 \(\sigma\) 是它的輸入(noise-conditional),所有等級共用參數(第 2 節)。
誤解:「NCSN 的前向過程是一條 Markov 鏈」。NCSN 直接對資料加不同等級的雜訊,\(\mathbf x_i=\mathbf x+\sigma_i\boldsymbol\epsilon\);相鄰兩級的關係是推出來的(第 4 節的表)。DDPM 才是先定義鏈。
誤解:「DDPM 學雜訊、NCSN 學 score,兩者學的東西不同」。\(\mathbf s^*=-\boldsymbol\epsilon^*/\sigma\),差一個已知的比例(第 2 節)。Demo B 的 NCSN 本身就是用 \(\boldsymbol\epsilon\)-prediction 的形式訓練的。
誤解:「退火只是讓取樣比較快」。它解決的是單一等級做不到的事:讓大雜訊等級先把粒子分配到各個峰。只用 \(\sigma_1\),就算跑十倍的步數,峰的比例仍然錯(Demo A)。
誤解:「步長越大,Langevin 收斂越快」。步長乘曲率超過 2 就不穩定;\(\eta_\ell\propto\sigma_\ell^2\) 讓雜訊遠大於資料峰寬的各層,這個比值都約等於 \(\delta/\sigma_1^2\),\(\delta\) 一旦太大,這些層會一起壞(Demo A 的 \(\delta=0.002\):中間三級超過 2,比例就偏了)。

自我測驗

1. 只用單一雜訊等級訓練,雜訊小和雜訊大各有什麼問題?
雜訊小:低密度區梯度消失、score 在那裡不準,Langevin 跨不過峰之間。雜訊大:好學、好取樣,但只抓到粗略結構,樣本模糊。
2. 寫出 \(\mathcal L_{\text{NCSN}}\)。它的最佳解是什麼?為什麼權重不改變最佳解?
\(\sum_i\lambda(\sigma_i)\mathcal L_{\text{DSM}}(\bm\phi;\sigma_i)\)。最佳解 \(\mathbf s^*(\cdot,\sigma_i)=\nabla\log p_{\sigma_i}\)。網路以 \(\sigma\) 為輸入,每一項可以各自最小化,只要 \(\lambda>0\),最佳解不變。
3. 證明 \(\nabla\log p_\sigma(\mathbf x_\sigma)=-\mathbb E[\boldsymbol\epsilon\mid\mathbf x_\sigma]/\sigma\)。
Tweedie:\(\mathbb E[\mathbf x\mid\mathbf x_\sigma]=\mathbf x_\sigma+\sigma^2\nabla\log p_\sigma\);又 \(\mathbb E[\mathbf x\mid\mathbf x_\sigma]=\mathbf x_\sigma-\sigma\mathbb E[\boldsymbol\epsilon\mid\mathbf x_\sigma]\)。比較即得。
4. 寫出 annealed Langevin dynamics 的步驟和常用步長。
\(\mathbf x\sim p_{\text{init}}\);對 \(\ell=L,\dots,1\):以上一級的輸出初始化,跑 \(N_\ell\) 步 \(\tilde{\mathbf x}\leftarrow\tilde{\mathbf x}+\eta_\ell\mathbf s(\tilde{\mathbf x},\sigma_\ell)+\sqrt{2\eta_\ell}\boldsymbol\epsilon\)。\(\eta_\ell=\delta\sigma_\ell^2/\sigma_1^2\)。
5. NCSN 取樣為什麼需要很大的 \(L\times K\)?
學到的 score 只在小擾動下可靠,需要小步長、多次迭代;高維多峰時局部 MCMC 混合慢。更新嚴格循序、每步一次網路計算,總共 \(\mathcal O(LK)\)。
6. NCSN 和 DDPM 各「定義」了什麼、「推導」了什麼?先驗為什麼不同?
NCSN 定義 \(\mathbf x_i\mid\mathbf x\)(\(\mathbf x+\sigma_i\boldsymbol\epsilon\)),推導相鄰轉移;DDPM 定義相鄰轉移,推導 \(\mathbf x_i\mid\mathbf x\)。NCSN 不縮小訊號,最大雜訊時近似 \(\mathcal N(\mathbf 0,\sigma_L^2\mathbf I)\);DDPM 把訊號縮到 0,先驗是 \(\mathcal N(\mathbf 0,\mathbf I)\)。