Score-Based Models:直接學 \(\nabla_{\mathbf x}\log p\),再沿著它走
不學密度、也不學能量,而是直接用神經網路 \(\mathbf s_\theta:\mathbb R^d\to\mathbb R^d\) 建模 score 這個向量場。訓練用 score matching,但原始版本要算 Jacobian 的 trace,需要 \(O(d)\) 次 backprop。這講介紹兩個能擴展到高維度的版本:denoising score matching(加雜訊,把問題變成「預測加了什麼雜訊」,配上 Tweedie 公式,score 就是最佳的去雜訊方向)和 sliced score matching(隨機投影,一次 backprop)。最後用 Langevin dynamics 從學到的 score 取樣,並看到這個直接的做法為什麼會失敗:流形假設、低密度區的 score 不準、mode 之間混合太慢。下一講的 diffusion model 正是為了修正這三點。
讀完這頁你應該能夠
- 說明 score-based model 和 EBM 的差別(向量場不一定是保守場),以及為什麼只用 score 不會遺失資訊。
- 說明原始 score matching 為什麼需要 \(O(d)\) 次 backprop。
- 推導 denoising score matching:把對 \(q_\sigma(\tilde{\mathbf x})\) 的 Fisher divergence 改寫成對條件分佈 \(q_\sigma(\tilde{\mathbf x}\mid\mathbf x)\) 的回歸,並寫出高斯雜訊時的 loss。
- 解釋 DSM 的取捨:σ 太大估計的是模糊後的分佈,σ 太小 loss 的變異數爆炸。
- 寫出 Tweedie 公式 \(\mathbb E[\mathbf x\mid\tilde{\mathbf x}] = \tilde{\mathbf x} + \sigma^2\nabla\log q_\sigma(\tilde{\mathbf x})\),並用它說明 score = 最佳去雜訊方向。
- 推導 sliced score matching 的目標,說明為什麼 \(\mathbf v^\top\nabla_{\mathbf x}\mathbf s_\theta\mathbf v\) 只需一次 backprop。
- 寫出 Langevin 取樣,說明直接的 score-based 生成模型的三個陷阱。
前置知識檢查
- 第 12 講:score function、Fisher divergence、score matching 的分部積分、Hutchinson trace 估計、Langevin MCMC。
- 高斯分佈的 log 密度和梯度:\(\nabla_{\mathbf x}\log\mathcal N(\mathbf x;\boldsymbol\mu,\sigma^2I) = -(\mathbf x-\boldsymbol\mu)/\sigma^2\)。
- Bayes 法則與條件期望;平方誤差的最佳估計量是條件期望。
- Jacobian 矩陣、Jacobian–vector product、反向傳播的成本。
這講的投影片只有 pptx。我用 ONLYOFFICE 的轉檔器轉成 PDF 再看圖;投影片中的 GIF 動畫(取樣過程)轉檔後只剩第一格,描述以逐字稿為準。標「出處」的補充來自 Yang Song〈Generative Modeling by Estimating Gradients of the Data Distribution〉(2021)、Lai et al. (2026)(arXiv 2510.21890v3)§3.2–3.3、Song & Ermon (2019)、Vincent (2011)、Efron (2011)。
01表示機率分佈的三種方式(投影片 2–12)
優點:maximum likelihood 訓練;可以用 likelihood 有原則地比較模型。
缺點:要處理 partition function,得用特殊架構或替代 loss。00:37
優點:樣本品質通常較好。
缺點:對抗訓練、不穩定、mode collapse;沒有原則的方法比較模型;沒有停止準則。02:40
第三種:score function \(\nabla_{\mathbf x}\log p(\mathbf x)\)。只適用於可微的密度,也就是連續變數。注意梯度是對輸入,不是對參數。03:11
投影片 8–9 的圖:(1) 左邊是二維平面上兩個高斯的混合(右上一個深色、左下一個淺色),上面疊著指向兩個中心的箭頭場;右邊是電位與電場的示意圖,紅色實線是等位線、綠色虛線是電場線:同一個物理系統的兩種描述。(2) 一維的例子:左圖 \(p(x)\) 是在 −5 附近一個矮峰、在 4 附近一個高峰;右圖是對應的 \(\nabla_x\log p(x)\):一條大致向下的斜線,在兩峰之間的低谷處有一個劇烈的跳躍。左邊的曲線必須積分為 1,右邊的完全沒有這種限制,形狀也簡單得多。06:19
EBM 的回顧(投影片 10–11):maximum likelihood 用 contrastive divergence,訓練時要反覆取樣;改用 Fisher divergence(score matching)就不用。關鍵是 \(\nabla_{\mathbf x}\log p_\theta(\mathbf x) = \nabla_{\mathbf x}f_\theta(\mathbf x) - \nabla_{\mathbf x}\log Z(\theta) = \nabla_{\mathbf x}f_\theta(\mathbf x)\):partition function 對每個 \(\mathbf x\) 都一樣,對 \(\mathbf x\) 微分就消失了。08:27
Score matching 只能用在 EBM 上嗎?(投影片 12)不是。只要能算 \(\nabla_{\mathbf x}\log p_\theta\),loss 就有定義:連續的 autoregressive model、normalizing flow 都可以。只是這些模型本來就能算 likelihood,用 MLE 訓練更自然。10:33
02Score-based model:直接建模向量場(投影片 13–16)
能用 score matching 訓練的最一般的模型是什麼?Autoregressive 和 flow 是 \(Z = 1\) 的特殊 EBM;EBM 又是更大的集合。再往外一層:不建模能量,直接建模 score。11:34
投影片 13 的圖:一個米色的大橢圓,裡面一個棕色橢圓標 EBMs,EBMs 裡有兩個重疊的圓:Autoregressive 和 flow,重疊處是 MAFs。最外層的米色區域標著「?」和 Score-based model,旁邊是一張箭頭場的小圖,寫著「Directly model the vector field of gradients!」和 \(\mathbb R^d\to\mathbb R^d\)。
投影片 14 的圖:三格,從左到右:一個二維密度 \(p_{\text{data}}(\mathbf x)\)(右上一個亮橘色的點、左下一個淡的點)→ 從它抽出的 iid 樣本(右上一團藍點、左下少數幾點)→「?」→ 一整片的 score 向量場 \(\mathbf s_\theta(\mathbf x)\approx\nabla_{\mathbf x}\log p_{\text{data}}(\mathbf x)\)。我們只有中間那張圖,要估計右邊那張。13:43
怎麼比較兩個向量場?把它們疊在一起,每一點看真實箭頭和估計箭頭的差,取歐氏距離的平方,再對整個空間(以資料密度)取平均:這就是 Fisher divergence。23:38
要求:(1) \(\mathbf s_\theta\) 要能有效率地計算;(2) 它需要是某個純量「能量」函數的梯度嗎?實務上不需要。25:12
03Score matching 不夠快(投影片 17)
用深度網路當 \(\mathbf s_\theta\):輸入 \(x_1,x_2,x_3\),輸出 \(s_{\theta,1},s_{\theta,2},s_{\theta,3}\)。26:43
- \(\Vert\mathbf s_\theta(\mathbf x)\Vert_2^2\):一次 forward 就有。
- \(\mathrm{tr}(\nabla_{\mathbf x}\mathbf s_\theta(\mathbf x)) = \sum_i\partial s_{\theta,i}/\partial x_i\):要對每個輸出 \(s_{\theta,i}\) 各做一次 backprop,才能取得對角元素 \(\partial s_{\theta,i}/\partial x_i\)。總共 \(O(d)\) 次 backprop。28:19
投影片 17 的圖:上面是一個 3 進 3 出的網路,旁邊寫著 \(\Vert\mathbf s_\theta(\mathbf x)\Vert_2^2\) 和被打叉的 \(\mathrm{tr}(\nabla_{\mathbf x}\mathbf s_\theta(\mathbf x))\),配一個哭臉,標「Score Matching is not Scalable!」。下面同一個網路被 backprop 了三次(紫色箭頭),分別得到 \(\partial s_{\theta,1}/\partial x_1\)、\(\partial s_{\theta,2}/\partial x_2\)、\(\partial s_{\theta,3}/\partial x_3\),旁邊的 3×3 Jacobian 矩陣只圈出對角線,標著「\(O(d)\) Backprops!」。
04Denoising score matching(投影片 18–25)
想法:不估計資料本身的 score,改估計加了雜訊的資料的 score。31:57
- 估計 \(\nabla_{\tilde{\mathbf x}}\log q_\sigma(\tilde{\mathbf x})\) 在計算上容易得多。
- 雜訊夠小時,\(q_\sigma(\tilde{\mathbf x})\approx p_{\text{data}}(\tilde{\mathbf x})\),是個好近似。32:59
- 從 \(q_\sigma\) 取樣很簡單:抽一張資料,加上高斯雜訊。35:42
投影片 18–19 的圖:(18) 一維的例子,藍色是 \(p(\mathbf x)\)(五根很窄的尖峰),黃色是 \(q_\sigma\)(同樣位置、稍微變寬變矮的峰),兩者幾乎重疊。(19) 左邊一隻約克夏的清晰照片 \(\mathbf x\sim p_{\text{data}}(\mathbf x)\),箭頭經過 \(q_\sigma(\tilde{\mathbf x}\mid\mathbf x)\) 變成一張滿是彩色雜點的同一張照片 \(\tilde{\mathbf x}\sim q_\sigma(\tilde{\mathbf x})\)。
推導(投影片 19–21,配色照投影片)
對 \(q_\sigma\) 的 Fisher divergence,展開平方:34:35
藍色和 \(\theta\) 無關;綠色很好算;麻煩的是紅色,因為 \(q_\sigma\) 的 score 未知。這次不用分部積分,而是把 \(q_\sigma\) 的定義展開:37:45
關鍵一步是梯度是線性運算,可以穿進對 \(\mathbf x\) 的積分,碰到的就不再是未知的 \(q_\sigma(\tilde{\mathbf x})\),而是已知的高斯 \(q_\sigma(\tilde{\mathbf x}\mid\mathbf x)\)。39:17 再把它配成平方(加減一個和 \(\theta\) 無關的棕色項):
配方的細節(投影片 21):綠色項加紅色項只缺一項就是完全平方,缺的是 \(+\frac12\Vert\nabla_{\tilde{\mathbf x}}\log q_\sigma(\tilde{\mathbf x}\mid\mathbf x)\Vert_2^2\)。所以先加上它湊成平方,再把它減掉,減掉的就是棕色項:39:17
$$\textcolor{#2a9a6a}{\frac12\mathbb E\big[\Vert\mathbf s_\theta(\tilde{\mathbf x})\Vert_2^2\big]}\textcolor{#b3261e}{\ -\ \mathbb E\big[\nabla_{\tilde{\mathbf x}}\log q_\sigma(\tilde{\mathbf x}\mid\mathbf x)^\top\mathbf s_\theta(\tilde{\mathbf x})\big]} = \frac12\mathbb E\big[\Vert\mathbf s_\theta(\tilde{\mathbf x}) - \nabla_{\tilde{\mathbf x}}\log q_\sigma(\tilde{\mathbf x}\mid\mathbf x)\Vert_2^2\big]\ \textcolor{#a0622d}{-\ \frac12\mathbb E\big[\Vert\nabla_{\tilde{\mathbf x}}\log q_\sigma(\tilde{\mathbf x}\mid\mathbf x)\Vert_2^2\big]}$$三個期望都是對 \(\mathbf x\sim p_{\text{data}}\)、\(\tilde{\mathbf x}\sim q_\sigma(\tilde{\mathbf x}\mid\mathbf x)\) 取(綠色項只看 \(\tilde{\mathbf x}\),對這個聯合分佈取期望和對 \(q_\sigma(\tilde{\mathbf x})\) 取是一樣的)。棕色項只牽涉資料和雜訊,和 \(\theta\) 無關,角色和藍色項一樣,是可以丟掉的常數。高斯雜訊時 \(\nabla_{\tilde{\mathbf x}}\log q_\sigma(\tilde{\mathbf x}\mid\mathbf x) = -\mathbf z/\sigma\),所以棕色項 \(= -\frac12\mathbb E\Vert\mathbf z\Vert_2^2/\sigma^2 = -\frac{d}{2\sigma^2}\):DSM loss 的數值比 Fisher divergence 多出一個隨 \(\sigma\to0\) 變得很大的常數,但最佳的 \(\theta\) 不變。
高斯雜訊時 \(\nabla_{\tilde{\mathbf x}}\log q_\sigma(\tilde{\mathbf x}\mid\mathbf x) = -\frac{\tilde{\mathbf x}-\mathbf x}{\sigma^2}\),代入就是 L2 回歸,完全沒有 trace。43:04
演算法(投影片 23)
- 抽一個 mini-batch 的資料 \(\{\mathbf x_1,\dots,\mathbf x_n\}\sim p_{\text{data}}\)。
- 抽對應的加雜訊資料 \(\tilde{\mathbf x}_i\sim q_\sigma(\tilde{\mathbf x}_i\mid\mathbf x_i)\),也就是 \(\tilde{\mathbf x}_i = \mathbf x_i + \sigma\mathbf z_i\)。
- 估計 loss:\(\frac{1}{2n}\sum_i\Vert\mathbf s_\theta(\tilde{\mathbf x}_i) - \nabla_{\tilde{\mathbf x}}\log q_\sigma(\tilde{\mathbf x}_i\mid\mathbf x_i)\Vert_2^2\);高斯時是 \(\frac{1}{2n}\sum_i\Big\Vert\mathbf s_\theta(\tilde{\mathbf x}_i) + \frac{\tilde{\mathbf x}_i - \mathbf x_i}{\sigma^2}\Big\Vert_2^2\)。
- 隨機梯度下降。
- σ 要選得很小。44:38
為什麼叫「去雜訊」(投影片 25)
看高斯版本的 loss:\(\mathbf s_\theta\) 只看到 \(\tilde{\mathbf x}\),卻要預測 \(-\frac{1}{\sigma^2}(\tilde{\mathbf x}-\mathbf x) = \frac{1}{\sigma^2}(\mathbf x - \tilde{\mathbf x})\),也就是當初加上去的雜訊(取負號、縮放)。要把 loss 壓低,它就得知道「從 \(\tilde{\mathbf x}\) 減掉什麼才能回到乾淨的圖」。45:09
投影片 25 的圖:左邊一張清晰的女性人像 \(\mathbf x\),右邊同一張加了雜點 \(\tilde{\mathbf x} = \mathbf x + \text{noise}\);公式下方的大括號圈住 \(\frac{1}{\sigma^2}(\mathbf x - \tilde{\mathbf x})\),註明「\(\mathbf s_\theta(\tilde{\mathbf x})\) tries to estimate the noise that was added to produce \(\tilde{\mathbf x}\)」。
陷阱:σ → 0 時變異數爆炸(投影片 24)
用 reparameterization \(\tilde{\mathbf x} = \mathbf x + \sigma\mathbf z\) 改寫:45:40
\(\mathrm{Var}(\mathbf z/\sigma)\to\infty\)、\(\mathrm{Var}(\Vert\mathbf z\Vert_2^2/\sigma^2)\to\infty\)。σ 要小才能近似乾淨資料,但太小就幾乎無法最佳化:要選一個仍然能最佳化的、盡量小的 σ。46:11
另一種看法:DSM 是用有限差分估計導數
老師在課堂上提到一個直覺:加高斯雜訊再比較,有點像用有限差分估計導數,「在資料點附近擾動一下,看 likelihood 往哪邊變」。Gutmann & Hyvärinen 的分析(第 12 講的補充)也說明,取一個小位移當雜訊時,NCE 會變成 sliced score matching;這三種方法都在用某種方式估計資料附近的局部斜率。46:44
實務上下一講會同時用很多個 σ(從很大到很小),而且把每個 σ 的 loss 乘上 \(\lambda(\sigma) = \sigma^2\):\(\sigma^2\Vert\mathbf s_\theta + \mathbf z/\sigma\Vert^2 = \Vert\sigma\mathbf s_\theta + \mathbf z\Vert^2\),目標 \(\mathbf z\) 的變異數就和 σ 無關了。這也是 diffusion model 常見的「預測雜訊 \(\boldsymbol\epsilon\)」寫法的由來。Demo A 會比較這兩種寫法。
出處:Lai et al. (2026) §3.3.2 "Training"(Vincent 的 conditioning trick 與加性高斯雜訊特例)與 §3.4.2(NCSN 的 \(\lambda(\sigma)\) 加權);Song & Ermon (2019) §4.2。
Demo Aσ → 0 時,DSM loss 的變異數
一維資料 \(x\sim\mathcal N(0,1)\),此時 \(q_\sigma = \mathcal N(0,1+\sigma^2)\),最佳的 score 是 \(s^*(\tilde x) = -\tilde x/(1+\sigma^2)\)。就算模型已經是最佳的,每個樣本的 DSM loss 仍然是隨機的。這裡用 20,000 個樣本估計「每樣本 loss」的標準差,以及一個 batch(128 個)平均後 loss 的標準差,σ 從 0.01 到 2。
紅線的斜率約是 −2:σ 每小 10 倍,標準差大約大 100 倍,因為 loss 裡有一項 \(z^2/\sigma^2\)。乘上 \(\sigma^2\) 之後(藍線),標準差在 σ 小的時候趨於常數。下一講的多尺度訓練就用這個加權。
05Tweedie 公式:score 就是最佳的去雜訊方向(投影片 26–27)
估計 \(\nabla_{\tilde{\mathbf x}}\log q_\sigma(\tilde{\mathbf x})\) 等價於去雜訊。55:08
投影片 26 的圖(改編自 Raphan & Simoncelli 2010):上面是 \(q_\sigma(\tilde x)\):三張人臉(三個資料點)各被模糊成一個峰,中間的最高;三個向上的箭頭標出峰頂。下面是 \(\nabla_{\tilde x}\log q_\sigma(\tilde x)\):在每個峰的位置穿過 0(從正到負),兩峰之間的低谷處反向。如果你在某個峰的左邊,score 為正,叫你往右走、往那個峰靠近;這就是去雜訊。55:39
Tweedie 公式的證明(三行)
兩邊除以 \(q_\sigma(\tilde{\mathbf x})\),右邊的 \(p(\mathbf x)q_\sigma(\tilde{\mathbf x}\mid\mathbf x)/q_\sigma(\tilde{\mathbf x})\) 正是後驗 \(p(\mathbf x\mid\tilde{\mathbf x})\):
用到的只有「高斯的梯度 = 高斯 × 線性函數」和梯度與積分可以交換。這和 DSM 推導的關鍵步驟一模一樣。另一方面,L2 誤差 \(\mathbb E\Vert D(\tilde{\mathbf x}) - \mathbf x\Vert^2\) 對每個 \(\tilde{\mathbf x}\) 分開最小化,最佳解就是條件期望 \(\mathbb E[\mathbf x\mid\tilde{\mathbf x}]\)。所以「最佳去雜訊器」和「score」是同一件事的兩種寫法。Lai 的書還用 SURE(只用雜訊資料就能無偏估計去雜訊器的 MSE)從另一個角度推出同樣的結論。
出處:Efron (2011), "Tweedie's Formula and Selection Bias", JASA;Lai et al. (2026) §3.3.4 "Why DSM is Denoising: Tweedie's Formula"、§3.3.5 SURE。
Demo B用 score 去雜訊(投影片 26 的一維版本)
「資料」只有三個點 \(\{-2.5,\,0.5,\,3\}\)(權重 0.25、0.5、0.25),就像投影片上的三張臉。\(q_\sigma\) 是三個高斯的混合。拖動觀察值 \(\tilde x\):上圖是 \(q_\sigma\) 和三個點的後驗機率,下圖是 score;紫色箭頭是 Tweedie 的一步 \(\tilde x\to\tilde x + \sigma^2\nabla\log q_\sigma(\tilde x)\)。
- σ 小時:每個資料點附近是一個窄峰,score 在峰附近很陡。Tweedie 的一步幾乎直接跳到最近的資料點,後驗幾乎全落在那一點上。
- σ 大時:三個峰糊成一團,Tweedie 的估計落在幾個資料點的加權平均,可能不在任何一個資料點上:這是「平方誤差最佳」的代價,它給的是後驗的平均,不是最可能的那一個。
- 讀數會同時列出「直接用後驗算的 \(\mathbb E[x\mid\tilde x]\)」和「Tweedie 公式算的」,兩者在每個位置都完全相同。
06Sliced score matching(投影片 28–32)
另一個擴展方法:隨機投影。一維問題應該比較容易。如果兩個向量場真的相同,那它們沿任何方向的投影也相同。59:46
投影片 28 的圖(Song et al. 2019):上排是 \(\nabla_{\mathbf x}\log p_{\text{data}}(\mathbf x)\) 的一小片箭頭,下排是 \(\mathbf s_\theta(\mathbf x)\) 的箭頭。左邊直接比;中間和右邊各畫一條虛線方向,把箭頭投影到那條線上再比:投影後就只是純量。
仍然有 Jacobian,但只以 Jacobian–vector product(方向導數)的形式出現:
做法:forward 算出 \(\mathbf s_\theta(\mathbf x)\),和 \(\mathbf v\) 內積得到一個純量;對這個純量做一次 backprop 得到它對所有輸入的梯度;再和 \(\mathbf v\) 內積。成本約等於一次 backprop,和維度無關。62:27
投影片 30 的圖:網路的輸出 \(s_{\theta,1},s_{\theta,2},s_{\theta,3}\) 分別乘上 \(v_1,v_2,v_3\) 合成一個純量 \(\mathbf v^\top\mathbf s_\theta(\mathbf x)\),紫色箭頭只反向傳一次就回到輸入,標「One Backprop! Sliced Score Matching is scalable. Slightly slower than denoising score matching」。
演算法(投影片 31)
- 抽一個 mini-batch 的資料 \(\{\mathbf x_1,\dots,\mathbf x_n\}\sim p_{\text{data}}\)。
- 抽一個 mini-batch 的投影方向 \(\{\mathbf v_1,\dots,\mathbf v_n\}\sim p_{\mathbf v}\),通常是高斯或 Rademacher。
- 估計 loss:\(\frac1n\sum_i\big[\mathbf v_i^\top\nabla_{\mathbf x}\mathbf s_\theta(\mathbf x_i)\mathbf v_i + \frac12(\mathbf v_i^\top\mathbf s_\theta(\mathbf x_i))^2\big]\)。
- 隨機梯度下降。
- 可以對每個資料點多取幾個投影來提升表現。63:29
投影片 32 的圖(Song et al. 2019):左圖「Efficiency」:每次迭代的秒數 vs 資料維度,原始 score matching(棕色虛線)隨維度直線上升,大約到 300–400 維就記憶體不足;sliced 版本(SSM、SSM-VR)幾乎是貼著底部的水平線。右圖「Performance on density estimation」(WhiteWine 資料集):sliced 版本的表現和原始 score matching 相當,比其他基線好。67:07
- sliced 版本估計的是乾淨資料的 score,沒有加雜訊,這是它相對於 DSM 的優點;代價是比 DSM 稍慢,而且投影帶來額外的變異數。66:33
- 多取幾個投影可以降低變異數;取 \(d\) 個座標軸方向,就退回原本的 score matching。實務上一個投影就夠了。66:02
沒有加雜訊、只有一堆資料點,sliced score matching 怎麼學?
只有有限個資料點時,經驗分佈是一堆尖峰,看起來「資料點旁邊沒有東西,就沒有梯度」。這裡要分清楚兩種梯度:
| 是什麼 | 只有資料點時 | |
|---|---|---|
| 資料的 score | \(\nabla_{\mathbf x}\log p_{\text{data}}(\mathbf x)\) | 不存在(尖峰沒有斜率) |
| loss 對參數的梯度 | \(\nabla_\theta\,\text{loss}\) | 存在 |
分部積分之後,loss 裡已經沒有資料的 score:
$$\mathbb E_{\mathbf v}\mathbb E_{\mathbf x\sim p_{\text{data}}}\Big[\mathbf v^\top\nabla_{\mathbf x}\mathbf s_\theta(\mathbf x)\mathbf v + \frac12\big(\mathbf v^\top\mathbf s_\theta(\mathbf x)\big)^2\Big]$$資料點只決定「在哪裡評估」,被評估的是模型 \(\mathbf s_\theta\)。\(\mathbf s_\theta\) 是處處平滑的神經網路,在資料點上算得出值也算得出導數,所以對 \(\theta\) 一定有梯度。
它在學什麼:一維時 \(\mathbb E[v^2] = 1\),每個資料點的 loss 是 \(s_\theta'(x_i) + \frac12 s_\theta(x_i)^2\)。\(\frac12 s^2\) 要 score 在資料點接近 0(坡度是平的);\(s'\) 要越負越好(score 在資料點附近由正轉負)。合起來就是讓每個資料點都變成一座山的山頂。
模型的形狀受限制時,這就學得對。模型限定是高斯,\(s_\theta(x) = -(x-\mu)/s^2\),令 \(a = 1/s^2\):
$$\frac1n\sum_i\Big[-a + \frac12a^2(x_i-\mu)^2\Big]\quad\Longrightarrow\quad\mu = \bar x,\qquad s^2 = \frac1n\sum_i(x_i-\bar x)^2$$沒有雜訊,只用一堆點,就學到樣本平均和樣本變異數,和 MLE 的答案一樣。投影片 32 的 WhiteWine 這種低維、真的有平滑密度的資料就屬於這種情況。
模型很自由時,就會出問題。如果模型能在每個資料點各長一根寬度 \(h\) 的尖峰,\(s'(x_i)\approx-1/h^2\),\(h\to0\) 時訓練 loss \(\to-\infty\):模型學到的正是「只有資料點有密度」的經驗分佈,沒有泛化。分部積分的前提是 \(p_{\text{data}}\) 在整個空間有平滑的密度;資料落在低維流形上時,這個前提也不成立,這就是 §8 陷阱 1 在 CIFAR-10 上 loss 跳到 \(-3\times10^9\) 的原因。下面的 demo 把兩種模型並排:
讀法:「訓練 loss」用那 12 個點算,「新資料 loss」用另外 4,000 個從 \(\mathcal N(0,1)\) 抽的點算;真實分佈本身的 loss 是 \(-0.5\)(第 12 講藍色項補充的高斯例子)。尖峰越窄,訓練 loss 越低,新資料 loss 卻爆炸:這就是沒有雜訊時 score matching 會過度擬合的樣子。加雜訊等於強迫模型看到資料點周圍一整團點,尖峰就長不出來了。
這就是第 12 講 Demo B 的 Hutchinson 估計量:\(\mathbb E_{\mathbf v}[\mathbf v^\top J\mathbf v] = \mathrm{tr}(J)\),所以 sliced score matching 是原本 loss 的不偏估計。
07從 score 到樣本:Langevin dynamics(投影片 33–36)
假設已經用某種 score matching 訓練好 \(\mathbf s_\theta\)。沒有 likelihood、也沒有 autoregressive 生成,怎麼產生樣本?score 告訴你「往哪個方向擾動,likelihood 增加得最快」。69:13
投影片 34 的圖:三格。(1)「Scores」:一片向量場 \(\mathbf s_\theta(\mathbf x)\)。(2)「Follow the scores」:\(\tilde{\mathbf x}_{t+1}\leftarrow\tilde{\mathbf x}_t + \frac\epsilon2\mathbf s_\theta(\tilde{\mathbf x}_t)\),所有粒子都聚到局部最大值(向量場的匯聚點)上。(3)「Follow noisy scores: Langevin MCMC」:\(\tilde{\mathbf x}_{t+1}\leftarrow\tilde{\mathbf x}_t + \frac\epsilon2\mathbf s_\theta(\tilde{\mathbf x}_t) + \sqrt\epsilon\,\mathbf z_t\),粒子散成兩團,比例反映密度。70:17
(這裡的寫法是 \(\frac\epsilon2\) 和 \(\sqrt\epsilon\);第 12 講用的是 \(\epsilon\) 和 \(\sqrt{2\epsilon}\)。令 \(\epsilon' = \epsilon/2\) 兩者就完全一樣:梯度係數和雜訊變異數的比例都是 1:2。)
完整的流程(投影片 36):資料樣本 →(score matching)→ score →(Langevin dynamics)→ 新樣本。沿著 score 走就是在去雜訊,Langevin 又加回一點雜訊。73:28
延伸 補充課 F §3 Langevin 的穩態就是 p:零通量的證明;補充課 F §4 ULA 的步長偏差:以及 MALA 怎麼修正
Demo C用 DSM 訓練 score 網路,再用 Langevin 取樣
資料是投影片 43 的設定:兩個高斯(標準差 1),右上 \((4,4)\) 的權重 0.8、左下 \((-4,-4)\) 的權重 0.2。\(\mathbf s_\theta\) 是 2→64→64→2 的網路,用 DSM(σ = 0.5,loss 乘上 σ²)訓練 2,000 步。因為資料是高斯混合,\(q_\sigma\) 的真正 score 有封閉形式,可以拿來比較。訓練完,用 Langevin(ε = 0.1,600 步)從均勻分佈出發取樣 500 個粒子。
- 誤差地圖:兩團資料附近(顏色淡)學得很準;誤差最大的是兩團之間的對角線一帶(顏色深),那裡幾乎沒有訓練樣本,而真正的 score 在那裡急轉方向(從指向一團變成指向另一團)。左上和右下兩個角落雖然也沒有樣本,但真正的 score 在那裡大致平滑地指向較近的 mode,網路外插得還算可以。這就是投影片 41 的「Accurate / Inaccurate」。這個頁面上實測:距離 mode 2 以內的平均相對誤差約 0.07,距離 4 以上約 0.34,差了約 5 倍。
- Langevin 的比例:右上 mode 應該有 80% 的粒子。但從均勻分佈出發,粒子先被各自附近的 mode 吸走,之後幾乎不再跨越,所以比例大致反映「一開始在哪一側」,約五五開。實測學到的 score 是 53%;切到「用真正的 score」也只有 46%:這不是估計誤差,而是投影片 42–43 的「score 不含 mode 權重、Langevin 混合太慢」。
08直接做為什麼會失敗:三個陷阱(投影片 37–44)
照上面的流程在 MNIST、CelebA、CIFAR-10 上訓練,不會成功:Langevin 從純雜訊出發,卡在某個地方,產生不了好的樣本。73:59
投影片 37–38 的圖:三個大格子(MNIST、CelebA、CIFAR-10),每格是很多小樣本。投影片 37 是「Final samples」,38 是「Langevin sampling process」的動畫;轉檔後只看得到第一格(灰色或彩色的雜訊方塊)。依逐字稿,最後的樣本也看不出數字或人臉:取樣失敗。
陷阱 1:流形假設(投影片 39–40)
- 真實資料往往落在高維空間中的低維流形上。資料若真的在流形上,score 沒有定義:想像一個集中在圓環上的密度,環越薄,梯度越大,最後變成未定義。74:29
- 證據:用 PCA 把 MNIST(784 維)投影到 595 維,CIFAR-10(3072 維)投影到 2165 維,幾乎看不出差別。連線性的流形都能保留幾乎所有資訊。74:59
- 在 CIFAR-10 上用 sliced score matching 訓練,loss 曲線劇烈跳動,訓練不起來。76:00
投影片 39–40 的圖:一條粉紅到紫色的莫比烏斯帶,上面幾個黑點標「Data points」;下方是一個橘色細圓環的密度,四周八個黑色箭頭從外面和裡面都指向環上,標著被打叉的 \(\nabla_{\mathbf x}\log p_{\text{data}}(\mathbf x)\)。投影片 40:上下兩排 CIFAR-10 圖片幾乎一模一樣(原圖 3072 維 vs. PCA 2165 維);下面是 SSM loss 對迭代次數的圖,曲線在 0 到 −3e9 之間劇烈上下跳動。
陷阱 2:低密度區的 score 不準(投影片 41)
loss 是對資料分佈的期望,用樣本平均近似。大部分樣本落在高密度區,兩團資料之間幾乎沒有樣本,所以網路在那裡很難估得準。76:32
投影片 41 的圖(Song & Ermon 2019):三格。左:資料密度(右上一個亮點、左下一個淡點,其他地方標著「?」),下方是 Fisher divergence 的公式,其中 \(p_{\text{data}}(\mathbf x)\) 用紅色強調。中:真正的 data scores;右:估計的 scores。兩張向量場上,右上和左下兩塊淡綠色方框標「Accurate」,其餘大片紅色區域標「Inaccurate」。底部紅字:Langevin MCMC will have trouble exploring low density regions。77:06
這對取樣是致命的:高維度時,隨機初始化的點幾乎一定落在低密度區,接著沿著錯誤的箭頭走,永遠到不了高密度區。78:12
陷阱 3:Langevin 在 mode 之間混合太慢(投影片 42–43)
極端情況:兩個支撐集不相交的分佈的混合,\(p_{\text{data}}(\mathbf x) = \pi p_1(\mathbf x) + (1-\pi)p_2(\mathbf x)\),\(\mathcal A\cap\mathcal B = \varnothing\):79:43
\(\pi\) 是常數,取梯度就消失了:score 完全不依賴 mode 的權重,所以光靠 score 的 Langevin 取樣無法反映 \(\pi\)。80:15
投影片 43 的圖:兩個散佈圖,x、y 都從 −8 到 8。左「i.i.d samples」:右上 (5,5) 附近一大團、左下 (−5,−5) 附近一小團(大約 4:1)。右「Langevin dynamics samples」:兩團的大小差不多。老師說真實的大約三分之二在上面,Langevin 則變成一半一半。80:46
這也解釋了第 12 講 Demo C 看到的現象:用 score matching 訓練時,兩個分得很開的 mode 的權重幾乎不受約束。訓練和取樣碰到的是同一個根本問題。
下一講(投影片 44)
修正這些陷阱之後(Song & Ermon 2019,NCSN)就能產生好的樣本。下一講的關鍵想法:加很多不同程度的雜訊。大雜訊讓分佈填滿整個空間(不再落在流形上、低密度區也有訓練樣本、兩個 mode 之間也連起來),小雜訊保留細節;取樣時從大雜訊逐步降到小雜訊。這就是 diffusion model。81:18
投影片 44 的圖:MNIST、CelebA、CIFAR-10 三格的取樣動畫(轉檔只剩第一格的雜訊),出處 Song & Ermon (2019)。
多尺度雜訊怎麼同時解決三個陷阱(下一講預覽)
- 流形:加了高斯雜訊的分佈 \(q_\sigma\) 在整個空間都有正的密度,score 處處有定義。
- 低密度區:雜訊大時,加了雜訊的樣本會散到原本的低密度區,那裡就有訓練訊號了。
- mode 權重:雜訊大到兩個 mode 連在一起時,\(q_\sigma\) 的 score 在兩者之間的區域會依權重偏向大的那邊,取樣時從大雜訊開始,粒子就能按正確比例分配,再在小雜訊時精修。
代價:一個網路要同時學很多個 σ 的 score,通常把 σ 也當成輸入,\(\mathbf s_\theta(\mathbf x,\sigma)\),稱為 noise conditional score network(NCSN)。
出處:Yang Song〈Generative Modeling by Estimating Gradients of the Data Distribution〉"Naive score-based generative modeling and its pitfalls" 與 "Score-based generative modeling with multiple noise perturbations";Lai et al. (2026) §3.4 "Multi-Noise Levels of Denoising Score Matching (NCSN)"。
延伸 補充課 D §8 多峰與溫度:為什麼局部的取樣跨不過低谷;補充課 F §5 annealed Langevin:怎麼把峰的權重學對
與其他講的關聯
- 第 7–8 講:flow 和 autoregressive 也能用 score matching 訓練,但它們本來就能算 likelihood。
- 第 11–12 講:score 不依賴 \(Z\)、Fisher divergence、分部積分、Hutchinson 估計、Langevin MCMC 都在這講被直接沿用;score-based model 是把 EBM 的保守場限制拿掉。
- 第 12 講 Demo C:score matching 學不到分開的 mode 的權重,和本講的陷阱 3 是同一件事。
- 第 14 講、第 16 講:多尺度雜訊(NCSN)、diffusion model、score SDE;Tweedie 公式把「預測雜訊」和「預測 score」連起來,是 DDPM 損失的基礎。
常見誤解
自我測驗
1. Score-based model 和 EBM 差在哪?為什麼說它「更一般」?
2. 只知道 score,為什麼能還原整個分佈?
3. 原始 score matching 的計算瓶頸在哪?為什麼 EBM 更糟?
4. DSM 推導中的關鍵一步是什麼?
5. 寫出高斯雜訊時的 DSM loss。模型在學什麼?
6. σ 太大和太小各有什麼問題?
7. 證明 Tweedie 公式。
8. 為什麼 \(\mathbf v^\top\nabla_{\mathbf x}\mathbf s_\theta(\mathbf x)\mathbf v\) 只需要一次 backprop?
9. Sliced score matching 和 DSM 各有什麼優缺點?
10. 只沿著 score 走(不加雜訊)會得到什麼?為什麼要加雜訊?
11. 流形假設為什麼會讓 score 出問題?
12. 證明兩個支撐集不相交的 mode 的 score 不依賴權重 π。這對取樣有什麼後果?
13. DSM 推導裡的棕色項是什麼?高斯雜訊時它等於多少?
14. 一維、不加雜訊時,score matching 的 loss 是 \(\frac1n\sum_i[s'(x_i) + \frac12s(x_i)^2]\)。為什麼模型限定是高斯時學得對,模型很自由時卻會失敗?
延伸閱讀
- Yang Song, Generative Modeling by Estimating Gradients of the Data Distribution(本頁參考):score、Langevin、陷阱、多尺度雜訊、SDE。
- Lai et al. (2026)(v3)(本頁參考)§3.2 從 EBM 到 score-based model、§3.3 denoising score matching(Tweedie、SURE)、§3.4 NCSN。
- Song & Ermon (2019), Generative Modeling by Estimating Gradients of the Data Distribution(投影片 41–44)。
- Song et al. (2019), Sliced Score Matching(投影片 28–32)。
- Vincent (2011), A Connection Between Score Matching and Denoising Autoencoders, Neural Computation 23(7)。
- Efron (2011), Tweedie's Formula and Selection Bias, JASA 106(496)。
- Raphan & Simoncelli (2011), Least Squares Estimation Without Priors or Supervision, Neural Computation(投影片 26 的圖)。