U3.1 11 分鐘閱讀 2026年9月

U3.1 取樣器不只一個,是一整族

本篇重用M3.1水流加亂流:SDE 是加了噪聲的 ODE·M3.2一千片葉子在亂流裡:Fokker–Planck 方程式·M3.3山谷裡隨機走的人群:Langevin Dynamics 與 Stationary Distribution

手上有兩樣東西,可以怎麼組

U3.0 訓練完之後,我們手上有兩個東西:速度 btb_t,還有 score st:=logpts_t:=\nabla\log p_t

U2 只用了前者——解 ODE x˙=bt(x)\dot x=b_t(x)U1.4 的 reverse SDE 兩個都用了。那中間呢?

如果把 score 摻進去一點,
會不會走到別的地方?

一整族,中間全部合法

對任意非負函數 εt\varepsilon_t(只跟時間有關,不跟位置有關),考慮

  dXt=[bt(Xt)+εtst(Xt)]dt+2εtdWt,X0p0,  t:01.  \boxed{\;dX_t=\big[b_t(X_t)+\varepsilon_t\,s_t(X_t)\big]dt+\sqrt{2\varepsilon_t}\,dW_t,\qquad X_0\sim p_0,\ \ t:0\to1 .\;}

答案是:不會走到別的地方。對每一個 εt0\varepsilon_t\ge0,這個 SDE 在時刻 tt 的邊際都是同一個 ptp_t

證明只有兩行。SDE 的邊際 ρt\rho_t 滿足 Fokker–Planck:

tρ=((b+εs)ρ)+εΔρ.\partial_t\rho=-\nabla\cdot\big((b+\varepsilon s)\rho\big)+\varepsilon\,\Delta\rho .

ρ=pt\rho=p_t 代進去。關鍵是 spt=logptpt=pts\,p_t=\nabla\log p_t\cdot p_t=\nabla p_t,所以那兩個多出來的項

(εpt)+εΔpt=0-\nabla\cdot(\varepsilon\,\nabla p_t)+\varepsilon\,\Delta p_t=0

互相抵消,剩下的正是 btb_t 生成 ptp_t 的 continuity equation。\square

ε0\varepsilon\equiv0 就是 U2 的 ODE;εt\varepsilon_t 取某個特定的 schedule 會還原 U1.4 的 reverse SDE;中間任何取法都合法。U1.4 說「PF-ODE 的 score 係數剛好是 reverse SDE 的一半」,講的就是這一族裡兩個特定的點。

多出來的那一組是什麼?把它單獨看:

εtstdt+2εtdWtLangevin 項\underbrace{\varepsilon_t\,s_t\,dt+\sqrt{2\varepsilon_t}\,dW_t}_{\text{Langevin 項}}

加一點噪聲,再用 score 把樣本往高密度處拉回來。

這兩件事對邊際的淨效果剛好是零——這正是上面那個抵消的意思。所以它不改變分布,只改變走法

補充這一族在 diffusion 那一側長什麼樣

εt\varepsilon_t 換成 U1.4 的語言,它就是 DDIM 那個 η\eta 家族:η=0\eta=0 對應 ε=0\varepsilon=0η=1\eta=1 對應完整的 reverse SDE。差別只是那裡用離散步的係數寫、這裡用連續時間的 SDE 寫。

實務上 εt\varepsilon_t 不會取成常數。由 U1.3 的 Tweedie 公式,logpt=E[ϵxt]/σt\nabla\log p_t=-\mathbb E[\epsilon\mid x_t]/\sigma_t,而分子是 O(1)O(1),所以 score 的量級是 O(1/σt)O(1/\sigma_t)(這裡沿用 U2σt\sigma_t 表示噪聲那一端的係數,也就是 U3.0 對照表裡的 αt\alpha_t——談 score 的量級時這個寫法比較好讀)。常見做法是讓 εtσt2\varepsilon_t\propto\sigma_t^2,這樣 εtst=O(σt)\varepsilon_t s_t=O(\sigma_t) 不只有界,還會在資料那一端自己收掉——下面的 demo 就是這樣做的(εt=cσt2\varepsilon_t=c\,\sigma_t^2cc 是那個滑桿)。

互動 demo:同一組邊際,一整族走法。cc 從 0 拉到 6,軌跡從光滑變抖動,但終點分布與資料的 energy distance(兩堆樣本之間的一種距離,和 U3.2 用的 W2W_2 是兩把不同的尺,數值不要互相比較)一直停在 0.01 上下——這就是上面那個抵消。接著按「把所有樣本推歪」,人為在 t=0.15t=0.15 把每一顆樣本平移將近一個單位:c=0c=0 時那個偏移一路帶到終點(energy distance 約 0.7),cc 越大救得越回來,c=4c=4 以後幾乎回到沒推的水準。

加了噪聲之後,錯還救得回來嗎?

課堂提問Q1

U3.0 在訓練時加了 γtz\gamma_t z,所以每一個 xtx_t 都帶了額外的噪聲。

這樣訓出來的 flow matching,是不是就有 U1.4 說的那種自我修正能力了?

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

沒有——而這個問題會把兩個很容易混在一起的旋鈕分開。

訓練時的 γt\gamma_t 決定 ptp_t 長什麼樣,以及你學得到哪些量γ>0\gamma \gt 0 讓你除了 btb_t 之外還能學 ηt\eta_t,於是手上多了一個 score。

取樣時的 εt\varepsilon_t 決定你怎麼走ε=0\varepsilon=0 沒有 Langevin 項:一旦偏離 ptp_t,就沿著偏離之後的軌跡繼續走,誤差一路帶到終點。ε>0\varepsilon \gt 0 才有拉回。

所以四種組合裡只有一種有修正能力:

用 ODE 取樣(ε=0\varepsilon=0用 SDE 取樣(ε>0\varepsilon \gt 0
訓練時 γ=0\gamma=0、獨立配對沒有修正有修正(score 由 Gaussian 起點給出)
訓練時 γ>0\gamma \gt 0沒有修正有修正

γ\gamma 給的是選擇權:沒有 score 就根本寫不出 SDE 取樣器,有了才輪到你選 ε\varepsilon

順便把 U1.4 的後半補完:DDPM 與 DDIM 之所以能共用同一個網路,是因為 diffusion 的 x0x_0 本身就是 Gaussian、天然有 score;兩者的差別純粹ε\varepsilon 取 0 還是不取 0,不是兩個模型。

至於拉回是怎麼發生的:sts_t 指向 ptp_t 密度上升的方向,所以偏到低密度區的樣本會被 εst\varepsilon s_t 推回高密度區;同時注入的 2εdW\sqrt{2\varepsilon}\,dW 保證它不會全部塌到峰頂上。兩者平衡的時候樣本的分布就是 ptp_t——這就是 Langevin dynamics 的平穩分布。

不過 demo 也顯示了一件不能省略的事:修正既不免費也不瞬間。 它需要足夠大的 ε\varepsilon,也需要足夠的剩餘時間;把「推歪」的時刻往後移,同樣的 cc 就救不回來了。

有修正,不代表更好

ε>0\varepsilon \gt 0 每一步會多注入 2εh\sqrt{2\varepsilon h} 量級的噪聲,而這件事本身就是一個誤差來源:Euler–Maruyama 的弱收斂只有一階、強收斂只有半階,比 ODE 的一階(還可以用 Heun 升到二階)差(這兩個「收斂」分別在說什麼,U3.2 會講)。ODE 沒有這筆成本,代價是誤差會一路累積。

εt\varepsilon_t 不影響邊際,只影響誤差怎麼累積。

所以「該取多少」不是正確性問題,而是取捨問題:ε\varepsilon 大,前面的偏差有機會被拉回,但每一步自己多帶一份噪聲誤差。這正是 U1.4 那個判準在連續版本上的樣子:ε\varepsilon 要不要開、開多大,看的是模型誤差有沒有大到值得花這筆噪聲成本。 模型幾乎沒有誤差時(乾淨的 toy),沒有東西可修,ε\varepsilon 只是多帶一份噪聲誤差;模型誤差大時(真實模型),修正才划算。U3.6 會把兩邊都量出來。εt\varepsilon_t 該怎麼取到最好目前沒有定論,常見做法是在中段的 tt 給比較大的值、兩端收小。

展開細節為什麼「兩端收小、中間放大」是合理的

兩端各有理由。tt 接近 1 時 σt0\sigma_t\to0,而 score 是 O(1/σt)O(1/\sigma_t)ε\varepsilon 不收小的話 εs\varepsilon s 會炸掉——這是純粹的數值理由。tt 接近 0 時樣本還在起點分布上,本來就沒有偏離要修,加噪聲只是多花預算。

中段則是 ptp_t 從一團 Gaussian 開始分裂成多個 mode 的地方,直覺上也是最需要修正的一段。不過要說清楚:本課沒有量過「誤差沿 tt 怎麼分布」——U3.2 給的是整段積分,不是逐 tt 的曲線。所以這一段是啟發式,不是推導。Karras 等人 [3] 的 stochasticity schedule 是這個形狀,那是實驗調出來的。

消化一下

想一想

「一族 SDE 邊際相同」的證明,關鍵那一步是什麼?

想一想

訓練時取 γt>0\gamma_t \gt 0,取樣時用 Euler 解 ODE(ε=0\varepsilon=0)。這個取樣器:

想一想

在一個速度場精確算出來(沒有網路誤差)的 toy 上,把 ε\varepsilon 從 0 調大,終點品質會怎麼變?

想一想

為什麼 εt\varepsilon_t 在實務上通常取成兩端小、中間大?

參考文獻

  1. Albergo, M. S., Boffi, N. M., Vanden-Eijnden, E. Stochastic Interpolants: A Unifying Framework for Flows and Diffusions. 2023. (這一族 SDE 與 Fokker–Planck 的兩行證明。)
  2. Song, Y., Sohl-Dickstein, J., Kingma, D. P., Kumar, A., Ermon, S., Poole, B. Score-Based Generative Modeling through Stochastic Differential Equations. ICLR 2021. (reverse SDE 與 PF-ODE 是這一族裡的兩個點。)
  3. Karras, T., Aittala, M., Aila, T., Laine, S. Elucidating the Design Space of Diffusion-Based Generative Models. NeurIPS 2022. (εt\varepsilon_t 該怎麼排的實務討論,也就是他們說的 stochasticity。)