搜尋課程與筆記

搜尋筆記

輸入主題、關鍵字或單元編號,例如 Flow Matching、U4。

    按 Esc 關閉 · ⌘ / Ctrl K 開啟搜尋

    U1.3 18 分鐘閱讀 2026年10月

    U1.3 Tweedie 公式:Denoiser 和 Data Distribution 有什麼關係?

    本篇重用7 篇

    那個 simple MSE,到底在學什麼?

    上一篇不管是走逐步的 KL,還是走 DDPM 原文的 ELBO,我們得到的都是一個有理論依據的 weighted MSE。但真正拿來訓練的時候,DDPM 做了一件很重要的修改:它把不同 timestep 的加權拿掉了,直接用

    Lsimple(θ)=Et, x0, ϵ[∥ϵθ(xt,t)−ϵ∥2].\mathcal L_{\text{simple}}(\theta)=\mathbb E_{t,\,x_0,\,\epsilon}\big[\|\epsilon_\theta(x_t,t)-\epsilon\|^2\big].

    所以到這裡留下了一個問題:ELBO 解釋的是原本那個 weighted objective;那我們現在真的拿來 train 的 simple MSE,到底在學什麼?

    而且這個問題比它看起來更根本。我們從頭到尾都只是在看 (x0,xt)(x_0,x_t) 或 (ϵ,xt)(\epsilon,x_t) 這種一筆一筆的 training pair,從來沒有把 pdatap_{\text{data}} 寫出來過。

    一個看起來只是做 denoising regression 的 neural network,
    到底學到了多少關於 data distribution 的資訊?

    要回答這件事,我們先不看整條 reverse process,只固定一個 noise level tt,問最簡單的那個問題:這個 MSE 的最佳解是什麼?

    固定一個 tt,這個回歸的最佳解是什麼?

    把 Lsimple\mathcal L_{\text{simple}} 攤開來看:

    Lsimple(θ)=Et Ex0, ϵ[∥ϵθ(xt,t)−ϵ∥2]⏟每一個 t 自己的一項,xt=αˉt x0+σtϵ.\mathcal L_{\text{simple}}(\theta)=\mathbb E_{t}\ \underbrace{\mathbb E_{x_0,\,\epsilon}\Big[\big\|\epsilon_\theta(x_t,t)-\epsilon\big\|^2\Big]}_{\text{每一個 }t\text{ 自己的一項}}, \qquad x_t=\sqrt{\bar\alpha_t}\,x_0+\sigma_t\epsilon .

    它其實是一堆互不干擾的小問題疊起來:ϵθ(⋅,t)\epsilon_\theta(\cdot,t) 在不同的 tt 上可以各自輸出各自的值,所以固定一個 tt 之後,那一項要怎麼最小化和別的 tt 無關。

    加權那件事也因此可以先放下。 帶加權的版本只是在每一項前面乘一個與 ϵθ\epsilon_\theta 無關的常數 w(t)w(t)——常數不會改變一個最小化問題的解,只會改變訓練時把力氣花在哪些 tt。所以上面留下的問題可以縮小成一個很單純的樣子:

    固定一個 tt,min⁡ϵθE[∥ϵθ(xt,t)−ϵ∥2]\min_{\epsilon_\theta}\mathbb E\big[\|\epsilon_\theta(x_t,t)-\epsilon\|^2\big] 的最佳解是什麼?

    而這種 MSE 的 loss 有一個已知的最佳解公式。對任何一對隨機變數 (X,Y)(X,Y),

    arg⁡min⁡f E(X,Y)[∥f(X)−Y∥2]⏟對聯合分布取  =  E[Y∣X]⏟對給定 X 的條件分布取.\arg\min_f\ \underbrace{\mathbb E_{(X,Y)}\big[\|f(X)-Y\|^2\big]}_{\text{對聯合分布取}} \;=\;\underbrace{\mathbb E[Y\mid X]}_{\text{對給定 }X\text{ 的條件分布取}} .

    這個公式有一個很直覺的畫面。想像你要在一條街上開一家店,明天顧客會出現在哪裡你不知道,只知道他們大致的分布;而「不方便」的代價是顧客走到店裡的距離平方。最好的位置在哪?不是人最多的那一點,而是所有顧客位置的平均——平方的代價會讓遠處的人拉得特別用力,於是你被迫站到重心上。f(X)f(X) 就是你選的位置,YY 是顧客真正出現的地方;而情報 XX 換了(哪一區、什麼天氣),顧客的分布也跟著換,所以最好的位置不是一個點,是一個隨 XX 改變的函數。

    兩個期望值取的對象不一樣:左邊對 (X,Y)(X,Y) 的聯合分布取,得到一個數值;右邊對「給定 XX 之後 YY 的條件分布」取,得到一個隨給定的 XX 改變的函數 f(X)f(X)。這個公式的證明只要把 YY 拆成 E[Y∣X]+(Y−E[Y∣X])\mathbb E[Y\mid X]+\big(Y-\mathbb E[Y\mid X]\big) 就可以得到(詳見 M1.2)。

    套回 DDPM:XX 就是 xtx_t、YY 就是 ϵ\epsilon,而聯合分布來自「抽一張 x0x_0、抽一個 ϵ\epsilon、用那一行算出 xtx_t」這個程序。所以理想上,模型夠強、訓練到收斂的話,

    同一個 noisy input 可能對到很多個 noise,該回答哪一個?

    ϵθ(xt,t)⟶E[ϵ∣xt]. \reveal{1}{\epsilon_\theta(x_t,t)\longrightarrow} \reveal{4}{\mathbb E\big[\reveal{3}{\epsilon\mid}\reveal{2}{x_t}\big].}
    1. 固定 tt,模型看到 xtx_t 後,究竟該回答哪一個 noise?
    2. 先看所有可能產生這個 xtx_t 的加噪例子。
    3. 這些例子各自有不同的 ϵ\epsilon,它們都是相容的 noise labels。
    4. L2 會把這些 ϵ\epsilon 按 posterior 加權平均,而不是只記住其中一筆。

    也就是說,模型不是在記住「這個 xtx_t 是由哪一個 ϵ\epsilon 加出來的」。它學的是:看到這個 xtx_t 之後,所有可能的 ϵ\epsilon 按 posterior 加權之後的平均。

    x0x_0-prediction 也是同一件事,因為 xt=αˉtx0+σtϵx_t=\sqrt{\bar\alpha_t}x_0+\sigma_t\epsilon 對 x0x_0 與 ϵ\epsilon 是 affine 的,條件期望又是線性的:

    E[x0∣xt]=xt−σt E[ϵ∣xt]αˉt.\mathbb E[x_0\mid x_t]=\frac{x_t-\sigma_t\,\mathbb E[\epsilon\mid x_t]}{\sqrt{\bar\alpha_t}} .

    這就是上一篇「散布是 schedule 給的,中心由 E[x0∣xt]\mathbb E[x_0\mid x_t] 決定」那句話缺的證明——而且這次的理由只用到 MSE,完全沒有用到 Gaussian,所以它對拿掉加權的 Lsimple\mathcal L_{\text{simple}} 一樣成立。

    到這裡事情就開始有點不一樣了。因為這個 posterior p(x0∣xt)p(x_0\mid x_t) 已經不是只跟某一筆 training pair 有關,而是跟整個資料分布有關——要算出它,得把所有可能的 x0x_0 都考慮進去。

    補充順帶一提:這也解釋了 loss 為什麼停在一個非零值

    同一個分解還告訴我們 loss 會停在哪裡。把 E∥f(X)−Y∥2\mathbb E\|f(X)-Y\|^2 拆成「偏差」與「殘差」兩項,最佳解讓第一項歸零,剩下的是

    min⁡θ E[∥ϵθ(xt,t)−ϵ∥2]=Et, xt[tr⁡Var⁡(ϵ∣xt)].\min_\theta\ \mathbb E\big[\|\epsilon_\theta(x_t,t)-\epsilon\|^2\big] =\mathbb E_{t,\,x_t}\big[\operatorname{tr}\operatorname{Var}(\epsilon\mid x_t)\big].

    所以 loss 不會到 0,而且它停住的高度是有意義的——那是「看到 xtx_t 之後,ϵ\epsilon 還剩多少不確定性」。U1.5 會把這條線實際畫出來。

    另外,這一整段是 U1.2 那個 conditional trick 的 MSE 版本:那裡我們證的是 KL 版(把 x0x_0 放進條件裡,objective 只差一個與 θ\theta 無關的常數),這裡是同一件事在平方誤差下的樣子。

    這個 posterior mean 跟整個分布有什麼關係?

    我們猜測 posterior mean E[ϵ∣xt]\mathbb E[\epsilon\mid x_t] 可能跟整個資料分布有某種關係;又因為它是在 tt 的時候估計的,所以可能跟 xtx_t 的分布有關係。我們把 xtx_t 的分布用 ptp_t 來表示,且我們有

    pt(xt)=∫q(xt∣x0) pdata(x0) dx0,p_t(x_t)=\int q(x_t\mid x_0)\,p_{\text{data}}(x_0)\,\mathrm dx_0 ,

    這個分布也是 U1.2 裡第一次使用 Bayes 時分母的那個 pt(xt)p_t(x_t)。

    於是我們可以把猜測的問題問得更精確一點:

    E[ϵ∣xt]\mathbb E[\epsilon\mid x_t] 和 pt(xt)p_t(x_t) 有什麼關係嗎?

    Tweedie 公式:對 xtx_t 微分看看

    固定一個 tt,我們先試著透過已知的 q(xt∣x0)q(x_t\mid x_0) 來觀察 ptp_t:

    pt(xt)=∫N ⁣(xt; αˉt x0, σt2I) pdata(x0) dx0.p_t(x_t)=\int \mathcal N\!\big(x_t;\,\sqrt{\bar\alpha_t}\,x_0,\ \sigma_t^2 I\big)\,p_{\text{data}}(x_0)\,\mathrm dx_0 .

    我們試著對 xtx_t 微分看看(梯度可以穿到積分裡面是有條件的),其中積分裡只有代表 q(xt∣x0)q(x_t\mid x_0) 的 Gaussian 會被微分:

    ∇xtpt(xt)=∫∇xtN ⁣(xt; αˉt x0, σt2I) pdata(x0) dx0=∫−xt−αˉt x0σt2 N ⁣(xt; αˉt x0, σt2I) pdata(x0) dx0.\begin{aligned} \nabla_{x_t} p_t(x_t) &=\int \nabla_{x_t}\mathcal N\!\big(x_t;\,\sqrt{\bar\alpha_t}\,x_0,\ \sigma_t^2I\big)\,p_{\text{data}}(x_0)\,\mathrm dx_0\\ &=\int -\frac{x_t-\sqrt{\bar\alpha_t}\,x_0}{\sigma_t^2}\,\mathcal N\!\big(x_t;\,\sqrt{\bar\alpha_t}\,x_0,\ \sigma_t^2I\big)\,p_{\text{data}}(x_0)\,\mathrm dx_0 . \end{aligned}

    接著兩邊除以 pt(xt)p_t(x_t)。左邊是 ∇xtpt(xt)/pt(xt)=∇xtlog⁡pt(xt)\nabla_{x_t}p_t(x_t)\big/p_t(x_t)=\nabla_{x_t}\log p_t(x_t);而右邊出現的那一塊,按 Bayes 定理正好就是後驗 p(x0∣xt)p(x_0\mid x_t)(M1.3):

    N ⁣(xt; αˉt x0, σt2I) pdata(x0)pt(xt)=q(xt∣x0) pdata(x0)pt(xt)=p(x0∣xt).\frac{\mathcal N\!\big(x_t;\,\sqrt{\bar\alpha_t}\,x_0,\ \sigma_t^2I\big)\,p_{\text{data}}(x_0)}{p_t(x_t)} =\frac{q(x_t\mid x_0)\,p_{\text{data}}(x_0)}{p_t(x_t)} =p(x_0\mid x_t).

    因此我們得到:

    ∇xtlog⁡pt(xt)=∫−xt−αˉt x0σt2 p(x0∣xt) dx0.\nabla_{x_t}\log p_t(x_t) =\int -\frac{x_t-\sqrt{\bar\alpha_t}\,x_0}{\sigma_t^2}\,p(x_0\mid x_t)\,\mathrm dx_0 .

    被積函數裡那一塊看起來有點眼熟。把 forward 那一行 xt=αˉtx0+σtϵx_t=\sqrt{\bar\alpha_t}x_0+\sigma_t\epsilon 移項,會發現

    xt−αˉt x0σt=ϵ,\frac{x_t-\sqrt{\bar\alpha_t}\,x_0}{\sigma_t}=\epsilon ,

    也就是「造出這個 xtx_t 的那個噪聲」。所以被積函數就是 −ϵ/σt-\epsilon/\sigma_t,而對 p(x0∣xt)p(x_0\mid x_t) 取平均就是對 ϵ\epsilon 的後驗取平均:

    平均 noise,怎麼變成 density 的梯度?

    ∇xtlog⁡pt(xt)=−E[ϵ∣xt]σt \reveal{1}{\nabla_{x_t}\log p_t(x_t)=} \reveal{3}{-\frac{\reveal{2}{\mathbb E[\epsilon\mid x_t]}}{\sigma_t}}
    1. 左邊是對目前位置 xtx_t 的 log-density 取梯度。
    2. 右邊先是所有相容 noise 的 posterior mean,正是模型剛才學到的量。
    3. 負號反轉加噪方向,再除以 noise 尺度 σt\sigma_t,就得到這個梯度。

    右邊冒出來的,正是上一節那個 posterior mean。換成 x0x_0 的寫法就是

    E[x0∣xt]=xt+σt2 ∇log⁡pt(xt)αˉt,\mathbb E[x_0\mid x_t]=\frac{x_t+\sigma_t^2\,\nabla\log p_t(x_t)}{\sqrt{\bar\alpha_t}} ,

    兩式只差 E[x0∣xt]\mathbb E[x_0\mid x_t] 與 E[ϵ∣xt]\mathbb E[\epsilon\mid x_t] 之間那個 affine 換算。而既然訓好的網路收斂到 E[ϵ∣xt]\mathbb E[\epsilon\mid x_t],第一式就把它直接翻成那個梯度:

    sθ(xt,t):=−ϵθ(xt,t)σt  ≈  ∇log⁡pt(xt).s_\theta(x_t,t):=-\frac{\epsilon_\theta(x_t,t)}{\sigma_t}\;\approx\;\nabla\log p_t(x_t).

    這個量有一個名字。所以開頭那個問題有答案了——

    訓好的 denoiser 就是 ptp_t 的 score function ∇xtlog⁡pt(xt)\nabla_{x_t}\log p_t(x_t)。

    這個把 noisy observation 的 posterior mean 與 marginal score 連起來的關係,就是 Tweedie formula;這裡的寫法可以對照 Efron [1] 的整理。

    原來 denoiser 學到的是 ptp_t 的局部幾何

    把 Tweedie 乘開來讀:−E[ϵ∣xt]=σt∇log⁡pt(xt)-\mathbb E[\epsilon\mid x_t]=\sigma_t\nabla\log p_t(x_t)。再用上面那個 affine 換算換成 x0x_0 的語言:

    αˉt E[x0∣xt]−xt⏟denoising 的方向=σt2 ∇log⁡pt(xt).\underbrace{\sqrt{\bar\alpha_t}\,\mathbb E[x_0\mid x_t]-x_t}_{\text{denoising 的方向}}=\sigma_t^2\,\nabla\log p_t(x_t).

    兩邊同向,只差一個 σt2\sigma_t^2 倍。這支箭頭可以用一個散場的畫面來讀。

    想像演唱會結束,人群從會場往四面八方散開。tt 就是散場後過了多久;tt 越大,人群散得越遠,原本的出口與路線也越難辨認。

    現在你站在某個街口 xtx_t,想走回會場。只照一個路人的路線走並不可靠,因為走到這個街口的人可能來自不同出口,也可能繞過不同的路。比較合理的做法,是看看所有可能走到這裡的人從哪裡來,再取平均的回頭方向。這個 posterior average 就是 E[x0∣xt]\mathbb E[x_0\mid x_t];乘上 αˉt\sqrt{\bar\alpha_t},才和目前的 xtx_t 落在同一個尺度上。

    Tweedie formula 說,這個「平均回頭方向」正好就是附近人群變密最快的方向,也就是 score。Denoiser 看似只是在猜一筆資料被 noise 推開了多少,最後卻從所有可能走到這裡的例子中,學會了每個時間、每個街口應該往哪裡回頭。

    但這支箭頭還不是一條完整路線。它只回答當下該往哪個方向;一步走多遠、到了下一個街口如何更新、途中要不要加入隨機,是下一篇 reverse dynamics 才要回答的問題。

    散場後,所有可能走到同一個位置的人給出平均的回頭方向

    圖:灰線代表可能的來路,線寬是 posterior weight;靛色粗箭頭是平均的回頭方向 αˉtE[x0∣xt]−xt\sqrt{\bar\alpha_t}\mathbb E[x_0\mid x_t]-x_t,也就是 density 上升最快的方向。

    不過「知道哪裡是回頭方向」還只是一個開始。一步要跨多大?要不要帶一點隨機?反覆照這個方向走,最後真的會回到原本的分布嗎?

    為什麼學 score,而不是直接學 density?

    既然我們最後拿到的是 ∇log⁡pt(xt)\nabla\log p_t(x_t),就值得問一句:這是不是一種妥協?為什麼不乾脆把 ptp_t 本身學出來?

    課堂提問Q1

    最直接的做法看起來很清楚:訓一個網路去表示 ptp_t,然後對它微分。

    這條路會走到哪裡去?

    先想一想,再展開看整理後的答案

    會走回 U1.0 那面牆。

    要讓一個網路輸出的東西是機率密度,它就得積分為 1,也就是得除以一個 normalizing constant ZθZ_\theta。而訓練需要的是 ∇θlog⁡Zθ=Ex′∼pθ[∇θEθ(x′)]\nabla_\theta\log Z_\theta=\mathbb E_{x'\sim p_\theta}[\nabla_\theta E_\theta(x')]——要估它,得先從 pθp_\theta 抽樣。我們想做的事,變成做這件事的前提。

    而 score 完全不碰這面牆。把密度寫成 pθ(x)=p~θ(x)/Zθp_\theta(x)=\tilde p_\theta(x)/Z_\theta,取 log 再對 xx 微分:

    ∇xlog⁡pθ(x)=∇xlog⁡p~θ(x)−∇xlog⁡Zθ⏟= 0,\nabla_x\log p_\theta(x)=\nabla_x\log\tilde p_\theta(x)-\underbrace{\nabla_x\log Z_\theta}_{=\,0},

    因為 ZθZ_\theta 對 xx 是常數。score 對 normalizing constant 免疫。

    所以 Tweedie 公式真正的意義不只是「denoiser 和 score 相等」,而是:我們要的那個量,剛好是那面牆管不到的量,而且有一支五行的回歸程式可以拿到它。這個繞過 normalizing constant 的建模方向,從 Hyvärinen 的 score matching [2] 開始;Song 與 Ermon [3] 再把 score 作為生成模型的學習對象。

    注意「繞過」和「解決」不一樣

    不要把上面那件事讀成「ZZ 的問題被解決了」。我們從頭到尾沒有去表示 pθp_\theta 本身,只表示它的坡度——所以也就沒有辦法回頭問「這張圖的機率是多少」。我們沒有解出 density estimation,我們繞過了它。 代價是拿不到 density 與 likelihood,換到的是可以直接學到生成真正需要的那個局部幾何。U2 比較兩個框架時會再回到這個取捨。

    補充Density 估得接近,微分後的 score 也會接近嗎?

    還需要檢查導數。固定一個 noise level,這裡把真實 density 簡寫成 p(x)p(x)。在它上面加一個幅度很小、變化很快的擾動:

    p~(x)=p(x)e0.01sin⁡(1000x),p~(x)p(x)∈[e−0.01,e0.01].\tilde p(x)=p(x)e^{0.01\sin(1000x)}, \qquad \frac{\tilde p(x)}{p(x)}\in[e^{-0.01},e^{0.01}].

    p~\tilde p 還沒正規化;若令 Z=∫p~(x) dxZ=\int\tilde p(x)\,\mathrm dx、r(x)=p~(x)/Zr(x)=\tilde p(x)/Z,ZZ 不依賴 xx,因此

    ∇xlog⁡r(x)=∇xlog⁡p~(x)=∇xlog⁡p(x)+10cos⁡(1000x).\nabla_x\log r(x) =\nabla_x\log\tilde p(x) =\nabla_x\log p(x)+10\cos(1000x).
    左邊 p 與帶小幅高頻擾動的 tilde p 幾乎重疊,右邊它們的 log gradient 卻相差振幅為 10 的快速震盪。

    左圖比較函數值,右圖放大一小段 xx 後比較 log gradient。0.01sin⁡(1000x)0.01\sin(1000x) 對 log density 的影響很小,微分後卻變成 10cos⁡(1000x)10\cos(1000x);將橘線正規化也不會消除這項 score 誤差。

    Week 3 投影片 5 · 點圖查看原圖

    所以直接把學到的 density 再微分,還需要控制導數的誤差。前面的 denoising regression 則透過 Tweedie,直接把要估計的量連到 score。

    這個 score field 長什麼樣?

    示意圖:左邊在等高線地形上,從 x_t 畫出兩支重疊的箭頭,分別標 ∇log p_t 與 √ᾱ_t·E[x₀|x_t] − x_t,並註明「方向相同,長度差 σ_t²」;右邊三張 x̂₀ 縮圖對應 t=100、500、900,從清楚的貓逐漸變成模糊的平均臉。

    圖:同一個方向,但 tt 太大時 x^0\hat x_0 會退化。 左邊是 Tweedie 公式的畫面——兩支箭頭完全同向,只差 σt2\sigma_t^2 倍。右邊是它的另一面:tt 越大,x^0\hat x_0 從清楚的貓變成一張「平均臉」。公式沒有變壞,是 xtx_t 裡的資訊變少了。

    互動 demo:score field 與 denoising 方向。 箭頭是網格上每一點的 ∇log⁡pt\nabla\log p_t(用資料樣本當混合 Gaussian 精確算出來的)。切到「denoising 方向」會看到 αˉt E[x0∣xt]−xt\sqrt{\bar\alpha_t}\,\mathbb E[x_0\mid x_t]-x_t 的箭頭方向完全一樣,只差 σt2\sigma_t^2 倍——這就是 Tweedie 公式在畫面上的樣子。把 tt 拉大,箭頭會慢慢變成整片指向原點。

    消化一下

    想一想

    若 ϵθ\epsilon_\theta 訓到最佳,ϵθ(xt,t)\epsilon_\theta(x_t,t) 等於什麼?

    想一想

    U1.0 說直接學密度會卡在 normalizing constant。score-based 的方法為什麼不卡?

    想一想

    tt 很大時,∇log⁡pt(x)\nabla\log p_t(x) 大約長什麼樣子?

    參考文獻

    1. Efron, B. Tweedie’s Formula and Selection Bias. JASA 2011. (本篇主角公式的現代整理;歷史出處見 M1.4。)
    2. Hyvärinen, A. Estimation of Non-Normalized Statistical Models by Score Matching. JMLR 2005. (「不必知道 ZZ 也能學」的起點。)
    3. Song, Y., Ermon, S. Generative Modeling by Estimating Gradients of the Data Distribution. NeurIPS 2019. (把 score 當成生成模型的建模對象。)