擴散模型原理 B34 · 密度怎麼演化
The Principles of Diffusion Models · 附錄 B

密度怎麼演化:從變數變換到 Fokker–Planck

連續方程和 Fokker–Planck 方程聽起來嚇人,其實只是微積分裡變數變換公式的連續時間版本。這一頁沿著一道階梯往上走:一個雙射怎麼改變密度、很多個雙射接起來會怎樣、步長縮到 0 得到連續方程、再加上布朗雜訊得到 Fokker–Planck 方程。接著從物理的角度(一個小盒子裡的質量守恆)再推一次連續方程。最後一節是選讀:把同一套語言用在訓練上,訓練就是讓模型分佈的粒子沿著 Wasserstein gradient flow 移向資料分佈。

書的範圍:附錄 B 全部(§B.1 變數變換公式、§B.2 連續方程的直覺、§B.3 Wasserstein gradient flow) 閱讀時間:約 55 分鐘

讀完這頁你應該能夠

  1. 把變數變換公式連到 ODE 的連續方程,以及 SDE 的 Fokker–Planck 方程。
  2. 把連續方程理解成機率質量守恆,並分清楚「粒子怎麼動」和「密度怎麼變」。
  3. 分辨運輸的 Lagrange 觀點和 Euler 觀點,並說明為什麼只給一條密度路徑,不能唯一決定速度場。
  4. 說明為什麼一個 SDE 和它的 probability flow ODE 有相同的邊際密度,樣本路徑卻不同。

書在本附錄開頭的提示:關鍵原則是,變數變換公式描述「移動樣本」怎麼改變它們的機率分佈。本附錄把這個想法從確定性映射一路發展到連續方程和 Fokker–Planck 方程,最後選讀的 Wasserstein gradient flow 把它延伸到分佈層級的訓練。

前置知識

  • B33(附錄 A):ODE 的解與存在唯一性、SDE 與 Euler–Maruyama。
  • 多變數微積分:Jacobian、行列式、散度 \(\nabla\cdot\mathbf f=\sum_i\partial_i f_i\)、Laplacian \(\Delta p=\nabla\cdot\nabla p\)、散度定理。複習可以看 補充課 A(數學工具箱)。
  • 同一個主題的入門版:補充課 C(連續方程)、補充課 F(Fokker–Planck 與 Langevin)。這一頁照書的順序,並附上用到這些工具的正文頁面。

「書 §」標出原文位置。灰框「轉述者補充」是書裡沒有的內容;藍框「推導」展開書中省略的步驟。本附錄 B.1.2 結尾有一段被註解掉的舊版推導,沒有收。

01為什麼要看密度怎麼動書 附錄 B 開頭

不論在機率論還是生成模型裡,理解「機率密度在變換下怎麼演化」都是基本功。特別是 diffusion model:它要建構一個生成過程,讓這個過程產生的密度路徑恰好把一個預先定義的前向過程倒過來走。支配這個演化的,在確定性的情形是連續方程(continuity equation),有隨機性時是 Fokker–Planck 方程。

名字也許陌生,但它們其實是基本微積分裡變數變換公式的連續時間類比。第 2–8 節(書 §B.1)用一串變數變換公式把它們建起來:從確定性的雙射出發,一路到隨機微分方程,自然地把離散的映射和連續時間的 flow 動態接起來。第 9–10 節(書 §B.2)給連續方程一個物理的、直觀的解釋,強調它和動態系統裡密度守恆的關係。下圖是整個統一架構的概觀。

① 單一雙射
變換
\(\mathbf x_0\xrightarrow{\ \bm\Phi\ }\mathbf x_1\)
密度
\(p_0(\mathbf x_0)=p_1(\mathbf x_1)\left|\det\frac{\partial\bm\Phi(\mathbf x_0)}{\partial\mathbf x_0}\right|\)
↓ 多個雙射
② 複合的雙射
變換
\(\mathbf x_0\xrightarrow{\bm\Phi_1}\mathbf x_1\xrightarrow{\bm\Phi_2}\cdots\xrightarrow{\bm\Phi_L}\mathbf x_L\)
密度
\(\log p_0(\mathbf x_0)=\log p_L(\mathbf x_L)+\sum_{k=0}^{L-1}\log\left|\det\frac{\partial\bm\Phi_{k+1}(\mathbf x_k)}{\partial\mathbf x_k}\right|\)
↓ 連續時間極限
③ ODE:確定性的連續 flow
變換
\(\frac{d\mathbf x(t)}{dt}=\mathbf f(\mathbf x(t),t)\),定義 flow map \(\bm\Phi_{0\to t}\)
密度
\(\partial_tp_t(\mathbf x)=-\nabla\cdot\big(\mathbf f(\mathbf x,t)\,p_t(\mathbf x)\big)\)
↓ 加上高斯雜訊
④ SDE:隨機的連續 flow
變換
\(d\mathbf x(t)=\mathbf f(\mathbf x(t),t)\,dt+g(t)\,d\mathbf w(t)\)
密度
\(\partial_tp_t(\mathbf x)=-\nabla\cdot\big(\mathbf f(\mathbf x,t)\,p_t(\mathbf x)\big)+\frac12g^2(t)\,\Delta p_t(\mathbf x)\)
依書中的圖重繪:統一的變數變換公式。由上到下:(1) 單一雙射;(2) 多個雙射的複合;(3) 由 ODE 支配的連續時間確定性 flow,以及對應的連續方程;(4) 用 SDE 建模的隨機 flow,以及對應的 Fokker–Planck 方程。(原圖:書的作者繪製的左右兩欄方框;這裡改成上下排列以適合手機。圖裡的映射記作 \(\bm\Phi\),正文用 \(\bm\Psi\),是同一個東西。)

02單一映射的變數變換書 §B.1.1

本節的想法是:用一個確定性的映射移動粒子,看它們的分佈(密度)怎麼變。關鍵原則是機率質量守恆,背後是微積分和機率論的一個基本結果,也就是變數變換公式:它描述積分(因此也包括機率密度)在光滑雙射下怎麼轉換。先看單一步更新,再推廣到一連串的變換。

單一更新

把一個向量場(類比成一個力)\(\bm\Psi:\mathbb R^D\to\mathbb R^D\) 作用一個單位時間,當成一條更新規則。從初始狀態 \(\mathbf x_0\) 出發,下一個狀態是

$$\mathbf x_1=\bm\Psi(\mathbf x_0).$$

底下的分佈怎麼移動

如果初始狀態服從某個由密度 \(p_0\) 描述的「規律」(\(\mathbf x_0\sim p_0\)),套用 \(\bm\Psi\) 之後,\(\mathbf x_1\) 就有一個新的密度 \(p_1\)(\(\mathbf x_1\sim p_1\))。假設 \(\bm\Psi\) 是光滑的雙射,\(p_1\) 可以用標準的變數變換公式從 \(p_0\) 得到:

$$p_1(\mathbf x_1)=p_0\big(\bm\Psi^{-1}(\mathbf x_1)\big)\cdot\left|\det\left(\frac{\partial\bm\Psi^{-1}}{\partial\mathbf x_1}\right)\right|.$$

這裡 \(\frac{\partial\bm\Psi}{\partial\mathbf x}\) 是 \(\bm\Psi\) 的 Jacobian 矩陣,記作 \(\partial_{\mathbf x}\bm\Psi\)。等價地,用原本的座標寫:

$$p_0(\mathbf x_0)=p_1\big(\bm\Psi(\mathbf x_0)\big)\,\big|\det\partial_{\mathbf x}\bm\Psi(\mathbf x_0)\big|.$$

白話地說,\(\bm\Psi\) 把密度 \(p_0\) 重新塑形成 \(p_1\)。因子 \(|\det\partial_{\mathbf x}\bm\Psi|\) 代表局部體積的變化;機率質量守恆,所以密度要乘上它的倒數來補償:體積放大幾倍,密度就降成幾分之一。

兩種寫法為什麼等價

反函數定理:在 \(\mathbf x_1=\bm\Psi(\mathbf x_0)\) 處,\(\partial_{\mathbf x_1}\bm\Psi^{-1}(\mathbf x_1)=\big(\partial_{\mathbf x}\bm\Psi(\mathbf x_0)\big)^{-1}\)。行列式對矩陣乘法可乘,所以 \(\det(\mathbf A^{-1})=1/\det\mathbf A\)。代進第一式:

$$p_1(\mathbf x_1)=\frac{p_0(\mathbf x_0)}{|\det\partial_{\mathbf x}\bm\Psi(\mathbf x_0)|}\quad\Longleftrightarrow\quad p_0(\mathbf x_0)=p_1\big(\bm\Psi(\mathbf x_0)\big)\,|\det\partial_{\mathbf x}\bm\Psi(\mathbf x_0)|.$$

最簡單的例子:如果 \(\bm\Psi\) 是可逆矩陣 \(\mathbf A\) 的線性映射(\(\mathbf x_1=\mathbf A\mathbf x_0\)),那麼

$$p_1(\mathbf x_1)=p_0(\mathbf A^{-1}\mathbf x_1)\,\big|\det\mathbf A^{-1}\big|.$$

示意地,可以這樣讀:

樣本\(\mathbf x_0\)\(\xrightarrow{\ \bm\Psi\ }\)\(\mathbf x_1\)
密度\(p_{\mathbf x_0}(\mathbf x_0)\)\(\xrightarrow{\ \bm\Psi\ }\)\(p_{\mathbf x_1}(\mathbf x_1)\)
帶數字的小例子

\(D=2\),\(\mathbf A=\mathrm{diag}(2,\,0.5)\):橫向拉成兩倍、縱向壓成一半,面積不變,\(|\det\mathbf A|=1\),所以 \(p_1(\mathbf x_1)=p_0(\mathbf A^{-1}\mathbf x_1)\),密度的數值沒有被整體放大或縮小,只是形狀被拉扁。換成 \(\mathbf A=\mathrm{diag}(2,\,2)\):面積變成 4 倍,\(|\det\mathbf A^{-1}|=1/4\),同樣的機率攤在四倍大的面積上,密度降成四分之一。

03為什麼這就是變數變換公式書 §B.1.1

它直接來自微積分裡熟悉的規則。

單變數

設 \(y=\Psi(x)\) 光滑可逆。把對 \(y\) 的積分改寫成對 \(x\) 的積分:

$$\int g(y)\,dy=\int g\big(\Psi(x)\big)\cdot|\Psi'(x)|\,dx,$$

\(|\Psi'(x)|\) 補償了區間被拉長或壓縮的量,確保面積不變。

多變數

對 \(\bm\Psi:\mathbb R^D\to\mathbb R^D\)、\(\mathbf y=\bm\Psi(\mathbf x)\):

$$\int g(\mathbf y)\,d\mathbf y=\int g\big(\bm\Psi(\mathbf x)\big)\,\big|\det(\partial_{\mathbf x}\bm\Psi)\big|\,d\mathbf x,$$

也就是無窮小的體積這樣轉換:

$$d\mathbf y=\big|\det(\partial_{\mathbf x}\bm\Psi)\big|\,d\mathbf x.$$

由此推出第 2 節的密度公式:

$$p_{\mathbf y}(\mathbf y)=\int_{\mathbb R^D}\delta\big(\mathbf y-\bm\Psi(\mathbf x)\big)\,p_{\mathbf x}(\mathbf x)\,d\mathbf x=p_{\mathbf x}\big(\bm\Psi^{-1}(\mathbf y)\big)\left|\det\left(\frac{\partial\bm\Psi^{-1}}{\partial\mathbf y}\right)\right|.$$
delta 函數那一步怎麼算

第一個等號是定義:\(\mathbf y\) 的密度,就是把所有會被送到 \(\mathbf y\) 的 \(\mathbf x\) 的機率加起來,\(\delta(\mathbf y-\bm\Psi(\mathbf x))\) 只在 \(\bm\Psi(\mathbf x)=\mathbf y\) 時有貢獻。

第二個等號:換變數 \(\mathbf u=\bm\Psi(\mathbf x)\),也就是 \(\mathbf x=\bm\Psi^{-1}(\mathbf u)\),用上面的體積規則(把 \(\bm\Psi^{-1}\) 當成變換)\(d\mathbf x=|\det\partial_{\mathbf u}\bm\Psi^{-1}(\mathbf u)|\,d\mathbf u\):

$$\int\delta(\mathbf y-\mathbf u)\,p_{\mathbf x}\big(\bm\Psi^{-1}(\mathbf u)\big)\,\big|\det\partial_{\mathbf u}\bm\Psi^{-1}(\mathbf u)\big|\,d\mathbf u=p_{\mathbf x}\big(\bm\Psi^{-1}(\mathbf y)\big)\,\big|\det\partial_{\mathbf y}\bm\Psi^{-1}(\mathbf y)\big|.$$

最後一步是 delta 函數的取值性質 \(\int\delta(\mathbf y-\mathbf u)h(\mathbf u)\,d\mathbf u=h(\mathbf y)\)。

一維時也可以用累積分佈函數推

若 \(\Psi\) 遞增,\(P(Y\le y)=P(\Psi(X)\le y)=P(X\le\Psi^{-1}(y))=F_X(\Psi^{-1}(y))\)。對 \(y\) 微分:\(p_Y(y)=p_X(\Psi^{-1}(y))\,(\Psi^{-1})'(y)\)。遞減時不等號反向,多一個負號,合起來就是絕對值。這個推法清楚地顯示:公式就是「同一塊機率,換一把尺量」。

04複合多個雙射書 §B.1.1

現在依序套用好幾次更新。令 \(\mathbf x_k=\bm\Psi_k(\mathbf x_{k-1})\),\(k=1,\dots,L\):

$$\mathbf x_0\xrightarrow{\ \bm\Psi_1\ }\mathbf x_1\xrightarrow{\ \bm\Psi_2\ }\cdots\xrightarrow{\ \bm\Psi_L\ }\mathbf x_L,$$

每個 \(\bm\Psi_k:\mathbb R^D\to\mathbb R^D\) 都是光滑雙射。初始狀態服從 \(p_0\) 時,這串更新產生 \(\mathbf x_1,\dots,\mathbf x_L\) 的密度 \(p_1,\dots,p_L\)。每一步機率質量都守恆,所以

$$p_k(\mathbf x_k)=p_{k-1}(\mathbf x_{k-1})\,\Big|\det\partial_{\mathbf x_{k-1}}\bm\Psi_k(\mathbf x_{k-1})\Big|^{-1},\qquad k=1,\dots,L.$$

遞迴下去,最後的密度是

$$p_{\mathbf x_L}(\mathbf x_L)=p_{\mathbf x_0}(\mathbf x_0)\cdot\prod_{k=1}^L\left|\det\left(\frac{\partial\bm\Psi_k}{\partial\mathbf x_{k-1}}\right)\right|^{-1}.$$

寫成 log 密度:

$$\log p_{\mathbf x_L}(\mathbf x_L)=\log p_{\mathbf x_0}(\mathbf x_0)-\sum_{k=1}^L\log\left|\det\left(\frac{\partial\bm\Psi_k}{\partial\mathbf x_{k-1}}\right)\right|.$$

這個式子反映每個變換 \(\bm\Psi_k\) 怎麼拉伸或壓縮體積(由 Jacobian 行列式記錄);沿著變換路徑把這些局部的體積變化累積起來,就決定了複合映射下的最後密度。這個式子是 normalizing flow 的核心原則(§5.1,B11)。

轉述者註:每一項 \(\det\) 都在粒子走到的那一點 \(\mathbf x_{k-1}\) 上計算,所以要知道 \(\mathbf x_L\) 處的密度,就得把粒子從 \(\mathbf x_0\) 一步步推過去,沿途記帳。這個「沿著粒子記帳」的讀法,就是第 7 節的 Lagrange 觀點。

05連續時間極限:flow map 與 pushforward書 §B.1.2

現在從離散的更新走到連續的描述。假設粒子的運動由一個隨時間變化的速度場 \(\mathbf f:\mathbb R^D\times[0,T]\to\mathbb R^D\) 驅動。想像把一個粒子 \(\mathbf x_0\sim p_0\) 經過無窮多次很小的雙射更新:每一步長 \(\Delta t>0\),更新是

$$\mathbf x_{t+\Delta t}=\bm\Psi(\mathbf x_t):=\mathbf x_t+\Delta t\,\mathbf f(\mathbf x_t,t).$$

\(\Delta t\to0\) 時,這些更新的複合收斂到一個由速度場支配的連續 flow:

$$\frac{d\mathbf x(t)}{dt}=\mathbf f(\mathbf x(t),t),\qquad\mathbf x(0)=\mathbf x_0\sim p_0.$$

在適當的光滑性假設下(附錄 A,B33 第 3 節),這個 ODE 對每個初始條件都有唯一解,因此定義了一個確定性的 flow map \(\bm\Psi_{0\to t}:\mathbb R^D\to\mathbb R^D\),把初始狀態送到 ODE 在時間 \(t\) 的解:

$$\bm\Psi_{0\to t}(\mathbf x_0)=\mathbf x_0+\int_0^t\mathbf f\big(\mathbf x(\tau),\tau\big)\,d\tau.$$

於是整個分佈也跟著動:初始密度 \(p_0\) 被運送成新的密度 \(p_t\),也就是 \(\mathbf x(t)\) 的分佈。形式上寫成 pushforward(推前):

$$p_t=\big(\bm\Psi_{0\to t}\big)_\#\,p_0.$$

\(\bm\Psi_{0\to t}\) 光滑可逆時,這就化成熟悉的變數變換規則:

$$p_t(\mathbf x)=p_0\big(\bm\Psi_{t\to0}(\mathbf x)\big)\,\big|\det\partial_{\mathbf x}\bm\Psi_{t\to0}(\mathbf x)\big|=\int\delta\big(\mathbf x-\bm\Psi_{0\to t}(\mathbf x_0)\big)\,p_0(\mathbf x_0)\,d\mathbf x_0.$$
pushforward 是什麼意思

\((\bm\Psi)_\#p_0\) 讀作「\(p_0\) 被 \(\bm\Psi\) 推過去的分佈」,定義是:對任何集合 \(A\),\(P(\mathbf x_t\in A)=P\big(\mathbf x_0\in\bm\Psi^{-1}(A)\big)\);等價地,對任何函數 \(g\),\(\mathbb E_{p_t}[g(\mathbf x)]=\mathbb E_{p_0}\big[g(\bm\Psi_{0\to t}(\mathbf x_0))\big]\)。白話:要算 \(p_t\) 下的期望,就把 \(p_0\) 的樣本推過去再平均。這個定義不需要 \(\bm\Psi\) 可逆;可逆而且光滑時,它才有上面那個帶行列式的密度公式。\(\bm\Psi_{t\to0}\) 是倒著解同一個 ODE 的 flow map,也就是 \(\bm\Psi_{0\to t}\) 的反函數。

06連續方程:密度怎麼隨時間移動書 §B.1.2

與其對每個時刻各寫一條密度公式,不如用一個關於空間 \(\mathbf x\) 和時間 \(t\) 的微分方程,描述密度怎麼連續地移動。想法很簡單:機率質量守恆,速度場 \(\mathbf f\) 只是在空間中重新分配它。這就是連續方程:

$$\frac{\partial}{\partial t}p_t(\mathbf x)+\nabla\cdot\big(p_t(\mathbf x)\,\mathbf f(\mathbf x,t)\big)=0.$$

散度項 \(\nabla\cdot(p_t\mathbf f)\) 量測 flow 在局部把密度攤開或擠壓的程度,確保總機率維持 1。這個偏微分方程(PDE)保證粒子被 flow 移動時機率質量守恆;事實上,它可以看成變數變換公式的連續時間類比。

用變數變換公式推導連續方程

概念上,連續方程也可以由第 4 節多層公式的連續時間極限得到(下面的 Demo A 就是數值上的這個極限)。書在這裡用第 2 節的單步公式做一個更直接的推導。

離散化並套用變數變換。考慮

$$\mathbf x_{t+\Delta t}:=\bm\Psi(\mathbf x_t)=\mathbf x_t+\Delta t\,\mathbf f(\mathbf x_t,t),$$

它其實就是 ODE 在一小段時間 \(\Delta t>0\) 上的前向 Euler 離散化。映射 \(\bm\Psi\) 對 \(\mathbf x_t\) 的 Jacobian 展開成

$$\frac{\partial\bm\Psi}{\partial\mathbf x_t}=\mathbf I+\Delta t\,\nabla_{\mathbf x}\mathbf f(\mathbf x_t,t)+\mathcal O(\Delta t^2),$$

所以它的行列式滿足

$$\det\left(\frac{\partial\bm\Psi}{\partial\mathbf x_t}\right)=1+\Delta t\,\nabla\cdot\mathbf f(\mathbf x_t,t)+\mathcal O(\Delta t^2).$$

這裡用了標準的展開 \(\det(\mathbf I+\Delta t\,\mathbf A)=1+\Delta t\,\mathrm{Tr}(\mathbf A)+\mathcal O(\Delta t^2)\)(\(\Delta t\to0\)),以及 \(\nabla\cdot\mathbf f=\mathrm{Tr}(\nabla_{\mathbf x}\mathbf f)\)。

\(\det(\mathbf I+\Delta t\,\mathbf A)\) 的一階展開

用特徵值:若 \(\mathbf A\) 的特徵值是 \(\lambda_1,\dots,\lambda_D\)(可以是複數),\(\mathbf I+\Delta t\mathbf A\) 的特徵值就是 \(1+\Delta t\lambda_i\),行列式是它們的乘積:

$$\prod_{i=1}^D(1+\Delta t\lambda_i)=1+\Delta t\sum_i\lambda_i+\mathcal O(\Delta t^2)=1+\Delta t\,\mathrm{Tr}(\mathbf A)+\mathcal O(\Delta t^2).$$

另外,\(\mathbf A=\nabla_{\mathbf x}\mathbf f\) 的對角元素是 \(\partial f_i/\partial x_i\),所以 \(\mathrm{Tr}(\nabla_{\mathbf x}\mathbf f)=\sum_i\partial_if_i=\nabla\cdot\mathbf f\)。

套用變數變換公式,log 密度這樣演化(\(\Delta t\) 夠小時行列式是正的,絕對值可以拿掉,再用 \(\log(1+u)=u+\mathcal O(u^2)\)):

$$\log p_{t+\Delta t}(\mathbf x_{t+\Delta t})=\log p_t(\mathbf x_t)-\Delta t\,\nabla\cdot\mathbf f(\mathbf x_t,t)+\mathcal O(\Delta t^2),$$

也就是

$$\log p_{t+\Delta t}(\mathbf x_{t+\Delta t})-\log p_t(\mathbf x_t)=-\Delta t\,\nabla\cdot\mathbf f(\mathbf x_t,t)+\mathcal O(\Delta t^2).\qquad(\ast)$$

用 Taylor 展開。把左邊用多變數 Taylor 展開(時間和空間兩個引數都動了):

$$\log p_{t+\Delta t}(\mathbf x_{t+\Delta t})-\log p_t(\mathbf x_t)=\Delta t\,\partial_t\log p_t(\mathbf x_t)+(\mathbf x_{t+\Delta t}-\mathbf x_t)^\top\nabla_{\mathbf x_t}\log p_t(\mathbf x_t)+\mathcal O(\Delta t^2).$$

代入 \(\mathbf x_{t+\Delta t}-\mathbf x_t=\mathbf f(\mathbf x_t,t)\,\Delta t\):

$$\log p_{t+\Delta t}(\mathbf x_{t+\Delta t})-\log p_t(\mathbf x_t)=\Delta t\,\partial_t\log p_t(\mathbf x_t)+\Delta t\,\mathbf f(\mathbf x_t,t)^\top\nabla_{\mathbf x_t}\log p_t(\mathbf x_t)+\mathcal O(\Delta t^2).$$

和 \((\ast)\) 比對、令 \(\Delta t\to0\),得到

$$\partial_t\log p_t(\mathbf x_t)=-\nabla_{\mathbf x_t}\cdot\mathbf f(\mathbf x_t,t)-\mathbf f(\mathbf x_t,t)^\top\nabla_{\mathbf x_t}\log p_t(\mathbf x_t).$$

取指數並用乘積法則,就得到連續方程。

「取指數並用乘積法則」那一步

上式兩邊乘上 \(p_t\),並用 \(p_t\,\partial_t\log p_t=\partial_tp_t\)、\(p_t\nabla\log p_t=\nabla p_t\):

$$\partial_tp_t=-p_t\,\nabla\cdot\mathbf f-\mathbf f^\top\nabla p_t.$$

右邊正是乘積法則 \(\nabla\cdot(p_t\mathbf f)=p_t\,\nabla\cdot\mathbf f+\mathbf f^\top\nabla p_t\) 的負號,所以 \(\partial_tp_t+\nabla\cdot(p_t\mathbf f)=0\)。注意這個式子對所有 \(\mathbf x\) 成立(每個 \(\mathbf x\) 都是某個粒子在時間 \(t\) 的位置),不只是某一條軌跡上。

\((\ast)\) 的另一個讀法:沿著粒子的 log 密度

\((\ast)\) 除以 \(\Delta t\) 取極限,就是 \(\frac{d}{dt}\log p_t(\mathbf x(t))=-\nabla\cdot\mathbf f(\mathbf x(t),t)\):沿著一個粒子,log 密度的變化率等於負的散度。這就是 neural ODE/continuous normalizing flow 算 likelihood 用的「瞬時變數變換」(§5.1.2,B11 第 4 節),也是第 10 節結尾「粒子層級的直覺」那條式子取 log 的版本。下面 Demo A 的「Lagrange 觀點」就是用這條式子沿粒子積分出精確密度的。

Demo A從複合映射到連續方程

一維、\(p_0=\mathcal N(0,1)\),速度場 \(f(x)=-x+1.5\tanh(3x)+0.3\):0 附近 \(f'>0\),粒子往兩邊散開,最後在 \(f=0\) 的兩個穩定點附近擠成兩團;常數 0.3 讓右邊那團比較大。用四種方法算時間 \(t\) 的密度:

  • 複合的映射(橙):\(L\) 個 Euler 映射 \(x\mapsto x+\Delta t\,f(x)\),\(\Delta t=t/L\),用第 4 節的乘積公式算這個離散複合映射的精確密度。每個映射都是雙射的條件是 \(1+\Delta t\,f'(x)>0\);這裡 \(f'\ge-1\),所以 \(\Delta t\lt1\) 就夠,選單從 \(L=2\) 開始。
  • Lagrange 觀點(黑):沿著每條 ODE 軌跡用 RK4 同時積分 \(x\) 和 \(\log p\)(\(\frac{d}{dt}\log p=-f'(x)\)),得到連續時間的精確密度。
  • Euler 觀點(紫點):在固定網格上直接解連續方程 \(\partial_tp+\partial_x(pf)=0\)(有限體積法、1,200 格、二階 MUSCL 通量),完全不追蹤粒子。
  • 粒子(藍色直方圖):10,000 個樣本用 RK4 推到 \(t\)。
p₀(虛線)Lagrange(精確)Euler 觀點(點)L 個映射的複合粒子直方圖

下圖:L¹ 距離。橙線是複合映射,紫色虛線是 Euler 觀點,藍色點線是粒子直方圖。

讀數(瀏覽器實測):

  • 複合映射收斂到連續方程。\(t=1.5\) 時,\(L=2,4,8,\dots,256\) 的 L¹ 距離依序是 0.928、0.421、0.202、0.099、0.049、0.024、0.012、0.006:\(L\) 加倍、誤差減半,是 Euler 法的一階收斂。\(L=2\) 時兩團還沒分好;\(L\) 大時橙線和黑線重合。這就是第 1 節階梯裡「② → ③」那一步。
  • 兩種觀點一致。只在固定網格上解 PDE 的 Euler 觀點,和沿粒子記帳的 Lagrange 觀點,L¹ 距離在 \(t=0.5,1,1.5\) 分別是 0.0002、0.0009、0.0027(剩下的是網格離散化誤差),網格上的總質量一直是 1.000000:連續方程確實守恆。
  • 粒子也對得上。10,000 個粒子的直方圖和精確密度的 L¹ 距離是 0.07–0.14,這是抽樣雜訊加上分箱寬度造成的,不會隨 \(L\) 改變。

07Lagrange 與 Euler 觀點:速度決定密度,反過來不行書 §B.1.2

同一個確定性的運輸有兩種互補的描述。Lagrange 觀點透過 flow map \(\bm\Psi_{0\to t}\) 跟著個別粒子走;Euler 觀點描述固定空間位置上的速度 \(\mathbf f(\mathbf x,t)\) 和密度 \(p_t(\mathbf x)\)。在適當的正則性下,兩種描述是一致的:給定的速度場產生一個粒子 flow,它推過去的密度滿足連續方程。

不過兩者之間有一個重要的不對稱。一旦固定了速度場和初始密度,flow 和密度的演化就完全決定;但只給一條密度路徑,一般不能唯一決定速度場或粒子 flow。

從速度到 flow 和密度

到這裡為止都假設速度場 \(\mathbf f\) 是給定的。粒子 ODE \(\frac{d\mathbf x(t)}{dt}=\mathbf f(\mathbf x(t),t)\) 描述每個粒子怎麼動;密度 PDE \(\partial_tp_t+\nabla\cdot(p_t\mathbf f_t)=0\) 描述整群粒子的分佈怎麼演化。兩者是連在一起的:照 ODE 移動粒子,自動產生一個滿足 PDE 的密度。這時粒子 flow \(\bm\Psi_{0\to t}\) 是唯一決定的:從 \(\mathbf x(0)\sim p_0\) 出發,每條軌跡 \(\mathbf x(t)\) 都固定了,得到的密度 \(p_t\) 遵循連續方程。粒子動態和密度動態完全一致。

從密度路徑到速度:不唯一

如果只從密度路徑 \(t\mapsto p_t\) 出發(例如 flow matching 裡先指定機率路徑的做法,§5.3,B13),速度場就不再唯一。例如,若向量場 \(\mathbf w_t\) 滿足

$$\nabla_{\mathbf x}\cdot\big(p_t(\mathbf x)\,\mathbf w_t(\mathbf x)\big)=0\qquad(\text{相對於 }p_t\text{ 沒有淨通量}),$$

那麼 \(\mathbf f_t\) 和 \(\mathbf f_t+\mathbf w_t\) 產生同樣的密度演化。所以一條密度路徑可以對應許多不同的 flow;選定某一個粒子 flow \(\bm\Psi_{0\to t}\),等於在這些可能性中挑一個特定的速度場。

為什麼加上 \(\mathbf w_t\) 不改變密度

散度是線性的:\(\nabla\cdot\big(p_t(\mathbf f_t+\mathbf w_t)\big)=\nabla\cdot(p_t\mathbf f_t)+\nabla\cdot(p_t\mathbf w_t)=\nabla\cdot(p_t\mathbf f_t)\)。所以同一條 \(p_t\) 對兩個速度場都滿足連續方程。再由「給定速度和初始密度,密度演化唯一」,兩個 flow 推出來的密度就是同一條 \(p_t\)。

怎麼造出這樣的 \(\mathbf w_t\):二維的例子

在二維,令 \(\mathbf J=\begin{pmatrix}0&-1\\1&0\end{pmatrix}\)(逆時針轉 90°)。任何純量函數 \(\psi\) 的「轉過的梯度」\(\mathbf J\nabla\psi=(-\partial_y\psi,\ \partial_x\psi)\) 散度都是 0:\(\partial_x(-\partial_y\psi)+\partial_y(\partial_x\psi)=0\)。所以取

$$\mathbf w_t=\frac{1}{p_t}\,\mathbf J\nabla\psi\quad\Longrightarrow\quad\nabla\cdot(p_t\mathbf w_t)=\nabla\cdot(\mathbf J\nabla\psi)=0.$$

特例 \(\psi=\omega\,p_t\):\(\mathbf w_t=\omega\,\mathbf J\nabla\log p_t\),方向垂直於密度梯度,也就是沿著密度的等高線流動。粒子在等高線上繞圈,不會跨到別的密度層,所以密度不變。對旋轉對稱的密度,這就是繞原點的旋轉。Demo B 用的就是這個 \(\mathbf w_t\)。三維以上也有很多選擇(三維時例如 \(\mathbf w_t=\frac{1}{p_t}\nabla\times\mathbf A\)),所以不唯一是常態,不是特例。

並不是任何給定的路徑 \(p_t\) 都真的能由粒子在某個速度場下運動產生。連續方程正是判斷一條密度路徑能不能「由 flow 產生」的一致性檢查。如果存在速度場 \(\mathbf f\),使得依 \(\frac{d\mathbf x(t)}{dt}=\mathbf f(\mathbf x(t),t)\) 運動的粒子透過 flow map \(\bm\Psi_{0\to t}\) 恰好產生密度 \(p_t\),就說 \(p_t\) 是可實現的(realizable,或說由 \(\mathbf f\) 產生)。也就是說,當 \(p_t\) 和 \(\mathbf f\) 一起滿足連續方程時,可實現性成立。

直觀上,可實現代表 \(p_t\) 隨時間的一張張快照,可以用「粒子在某個速度場下運動」來解釋,而不是一串任意的分佈。條件成立時,密度 \(p_t\) 就只是初始密度 \(p_0\) 沿 flow map \(\bm\Psi_{0\to t}\) 的 pushforward,熟悉的變數變換公式也適用:

$$p_t=\big(\bm\Psi_{0\to t}\big)_\#p_0=p_0\big(\bm\Psi_{t\to0}(\mathbf x)\big)\,\big|\det\partial_{\mathbf x}\bm\Psi_{t\to0}(\mathbf x)\big|=\int\delta\big(\mathbf x-\bm\Psi_{0\to t}(\mathbf x_0)\big)\,p_0(\mathbf x_0)\,d\mathbf x_0.$$
一個不可實現的例子

確定性的 flow 只會搬動質量,不會讓質量瞬間從一處消失、在遠處出現。例如一維路徑 \(p_t=(1-t)\,\mathcal N(-3,1)+t\,\mathcal N(3,1)\) 是可實現的(質量可以從左邊流到右邊,只是中間低密度區的速度會很大);但如果一條一維路徑在某一點 \(x=0\) 一直保持精確為零的密度,同時讓 0 左邊的總質量隨時間改變,就沒有任何有限的速度場能做到:在密度為 0 的地方,通量 \(p\,f\) 必然是 0,沒有質量能穿過那一點。連續方程把這類直覺寫成一個可檢查的條件。

(選讀)加上條件變數

如果引入額外的條件變數 \(\mathbf z\sim\pi(\mathbf z)\),同樣的推理對每個固定的 \(\mathbf z\) 都成立:

$$\frac{d\mathbf x(t)}{dt}=\mathbf v_t(\mathbf x(t)\mid\mathbf z),$$

它的 pushforward 是 \(p_t(\cdot\mid\mathbf z)=\big(\bm\Psi_{0\to t}(\cdot;\mathbf z)\big)_\#p_0\),連續方程是

$$\partial_tp_t(\mathbf x\mid\mathbf z)+\nabla\cdot\big(p_t(\mathbf x\mid\mathbf z)\,\mathbf v_t(\mathbf x\mid\mathbf z)\big)=0.$$

邊際密度就是

$$p_t(\mathbf x)=\int p_t(\mathbf x\mid\mathbf z)\,\pi(\mathbf z)\,d\mathbf z.$$
邊際密度遵循哪個速度場?

把條件連續方程對 \(\pi(\mathbf z)\) 積分,時間微分和散度都可以和 \(\mathbf z\) 的積分交換:

$$\partial_tp_t(\mathbf x)=-\nabla\cdot\int p_t(\mathbf x\mid\mathbf z)\,\mathbf v_t(\mathbf x\mid\mathbf z)\,\pi(\mathbf z)\,d\mathbf z=-\nabla\cdot\big(p_t(\mathbf x)\,\mathbf v_t(\mathbf x)\big),\quad\mathbf v_t(\mathbf x):=\frac{\int p_t(\mathbf x\mid\mathbf z)\mathbf v_t(\mathbf x\mid\mathbf z)\pi(\mathbf z)\,d\mathbf z}{p_t(\mathbf x)}.$$

也就是說,邊際速度是條件速度在「\(\mathbf x_t=\mathbf x\) 時 \(\mathbf z\) 的後驗」下的平均 \(\mathbb E[\mathbf v_t(\mathbf x\mid\mathbf z)\mid\mathbf x_t=\mathbf x]\)。這正是 flow matching 的 conditional trick(§6.1,B15 第 2 節)的連續方程版本。

Demo B同一條密度路徑,不同的 flow

二維、20,000 個粒子、\(t\in[0,1]\)。兩種密度路徑:擴張的高斯 \(p_t=\mathcal N(\mathbf 0,(0.25+t)\mathbf I)\),對應的基本速度 \(\mathbf f_t(\mathbf x)=\mathbf x/(2(0.25+t))\)(往外均勻擴張);靜止的雙峰,兩個高斯的混合,\(\mathbf f=\mathbf 0\)。再加上一個額外的場 \(\mathbf w_t\):

  • 沿等高線:\(\mathbf w_t=\omega\,\mathbf J\nabla\log p_t\),滿足 \(\nabla\cdot(p_t\mathbf w_t)=0\)(上一節的補充)。
  • 平移:\(\mathbf w_t=(\omega,0)\),不滿足這個條件,當作對照。

灰色底是目標密度 \(p_t\);橙點是用 \(\mathbf f+\mathbf w\) 推過去的粒子(畫出 2,500 個)。另外追蹤 8 個粒子:黑色虛線是只用 \(\mathbf f\) 的軌跡,橙線是用 \(\mathbf f+\mathbf w\) 的軌跡,兩者從同一點出發。

f + w 的粒子與軌跡只用 f 的軌跡(虛線)灰底:pt

讀數(瀏覽器實測,\(t=1\)):

設定直方圖 TV 距離同一粒子的平均距離\(\max|\nabla\cdot(p_t\mathbf w_t)|\)
擴張高斯,沿等高線 ω = 0.5/1/20.051/0.050/0.0531.09/2.01/2.79\(\sim10^{-10}\)
擴張高斯,平移 ω = 0.5/1/20.236/0.425/0.5700.69/1.38/2.760.07/0.15/0.30
靜止雙峰,沿等高線 ω = 0.5/1/20.041/0.037/0.0350.89/1.47/1.37\(\sim10^{-9}\)
靜止雙峰,平移 ω = 0.5/1/20.269/0.473/0.6080.50/1.00/2.000.11/0.22/0.45
  • 密度一樣,路徑不一樣。沿等高線的 \(\mathbf w\) 讓同一個粒子最後的位置平均差了 1–3 個單位(擴張高斯 ω = 1 時,粒子邊往外走邊繞原點轉),但兩團粒子的直方圖距離 0.05,和「直接從 \(p_t\) 重新抽一組樣本」的抽樣雜訊 0.049(雙峰 0.040)一樣大。散度條件的數值檢查只剩有限差分的捨入誤差。
  • 不滿足條件就不行。平移的 \(\mathbf w\) 讓整團粒子偏離 \(p_t\),TV 距離隨 ω 變大。
  • 靜止雙峰 ω = 2 的平均距離(1.37)比 ω = 1(1.47)小:這兩個強度下,峰附近的粒子分別繞了約 0.43 圈和 0.84 圈(角速度約 \(\omega/0.6^2\);另外用 Node 重算,沒有粒子超過一圈):前者快繞到對面,後者快繞回起點,所以 ω = 2 的位移反而比較小。路徑不同,但「最後在哪」的差別不一定隨 ω 單調增加。

08隨機過程:Fokker–Planck 方程書 §B.1.3

加上雜訊之後,動態遵循 SDE(§A.2.1,B33 第 8 節;正文的用法見 §4.1,B08 第 2 節):

$$d\mathbf x(t)=\mathbf f(\mathbf x(t),t)\,dt+g(t)\,d\mathbf w(t).$$

這時密度 \(p_t(\mathbf x)\) 滿足 Fokker–Planck 方程:

$$\begin{aligned}\frac{\partial p_t(\mathbf x)}{\partial t}&=-\nabla\cdot\big(\mathbf f(\mathbf x,t)\,p_t(\mathbf x)\big)+\frac12g^2(t)\,\Delta p_t(\mathbf x)\\&=-\nabla\cdot\Big(\Big(\mathbf f(\mathbf x,t)-\frac12g^2(t)\nabla_{\mathbf x}\log p_t(\mathbf x)\Big)p_t(\mathbf x)\Big).\end{aligned}$$

\(\Delta p_t=\nabla\cdot\nabla_{\mathbf x}p_t\) 是 Laplacian。第一個等號裡,第一項描述確定性漂移 \(\mathbf f\) 對機率質量的運輸;第二項描述隨機雜訊造成的密度擴散(攤開),強度和 \(\frac12g^2(t)\) 成正比。第二個等號把同一個密度演化改寫成連續方程,速度是

$$\mathbf f(\mathbf x,t)-\frac12g^2(t)\nabla_{\mathbf x}\log p_t(\mathbf x).$$

所以由這個速度驅動的確定性 ODE,在每個單一時刻的邊際密度 \(p_t\) 都和 SDE 完全相同。這就是全書一直用的 probability flow ODE(PF-ODE)。

第二個等號

關鍵是 \(p_t\nabla\log p_t=\nabla p_t\)。所以 \(\frac12g^2\Delta p_t=\nabla\cdot\big(\frac12g^2\nabla p_t\big)=\nabla\cdot\big(\frac12g^2p_t\nabla\log p_t\big)\)(\(g\) 不依賴 \(\mathbf x\),可以拿進散度裡)。代回第一行:

$$-\nabla\cdot(\mathbf fp_t)+\nabla\cdot\big(\tfrac12g^2p_t\nabla\log p_t\big)=-\nabla\cdot\Big(\big(\mathbf f-\tfrac12g^2\nabla\log p_t\big)p_t\Big).$$

擴散項被「藏進」一個額外的速度 \(-\frac12g^2\nabla\log p_t\):粒子從高密度往低密度流,效果和雜訊把質量攤開一樣。

REMARK

重點是:SDE 和 PF-ODE 在密度路徑上一致,但一般不在「不同時刻的樣本怎麼耦合」上一致。在任何固定時刻 \(t\),兩者產生同一個分佈 \(p_t\);等價地說,它們的粒子「快照」有相同的直方圖。

但跨時間看,它們的樣本路徑不同。對 PF-ODE,一旦狀態 \(\mathbf x_s\) 固定,之後的狀態就由 \(\bm\Psi_{s\to t}(\mathbf x_s)\) 決定。對 SDE,時間 \(s\) 之後會注入新的布朗雜訊,所以即使給定 \(\mathbf x_s\),之後的狀態仍然是隨機的。

因此,即使每個單一時刻的邊際密度都相同,兩個過程的轉移分佈、時間上的相關性、以及路徑上的事件都可能不同。PF-ODE 重現的是 SDE 的邊際密度演化,不是它完整的隨機路徑分佈(path law)。圖解見 §4.2 的圖(B09 第 1 節)。

Fokker–Planck 方程的推導比較複雜,書放在附錄 C 的 Itô 公式應用(§C.1.4,B35)。

一個啟發式的推導(一維)

取任何光滑、遠處為 0 的測試函數 \(\varphi\)。Euler–Maruyama 一步:\(\Delta x=f\,\Delta t+g\sqrt{\Delta t}\,\epsilon\),\(\epsilon\sim\mathcal N(0,1)\)。Taylor 展開到二階:

$$\varphi(x+\Delta x)=\varphi(x)+\varphi'(x)\Delta x+\tfrac12\varphi''(x)(\Delta x)^2+\cdots.$$

取期望:\(\mathbb E[\Delta x\mid x]=f\Delta t\),\(\mathbb E[(\Delta x)^2\mid x]=g^2\Delta t+\mathcal O(\Delta t^2)\)。雜訊項雖然平均是 0,平方卻是 \(\Delta t\) 的一階,所以二階項留了下來。除以 \(\Delta t\) 取極限:

$$\frac{d}{dt}\int\varphi\,p_t\,dx=\int\big(f\varphi'+\tfrac12g^2\varphi''\big)p_t\,dx=\int\varphi\Big(-\partial_x(fp_t)+\tfrac12g^2\partial_x^2p_t\Big)dx,$$

最後一步是分部積分(一階項一次、二階項兩次)。對所有 \(\varphi\) 成立,所以括號裡就是 \(\partial_tp_t\)。和連續方程相比,多出的 \(\frac12g^2\partial_x^2p\) 正來自 \((\Delta x)^2\sim\Delta t\),也就是 B33 第 8 節的 \(\sqrt{\Delta t}\)。嚴格的版本要用 Itô 公式,見附錄 C(B35)。

Demo CSDE 與 PF-ODE:邊際相同,路徑不同

一維 Ornstein–Uhlenbeck 前向過程 \(dx=-x\,dt+\sqrt2\,dw\)(\(f=-x\)、\(g=\sqrt2\)),起點 \(p_0=\frac12\mathcal N(-2,0.35^2)+\frac12\mathcal N(2,0.35^2)\)。這時 \(p_t\) 是兩個高斯的混合,平均 \(\pm2e^{-t}\)、變異數 \(0.35^2e^{-2t}+1-e^{-2t}\),score 有閉式解。比較三種動態,4,000 個粒子都從同樣的 \(x(0)\) 出發,步長 0.005:

  • SDE(藍):Euler–Maruyama。
  • PF-ODE(橙):\(\frac{dx}{dt}=-x-\nabla_x\log p_t(x)\)(\(\frac12g^2=1\)),Heun 法。
  • 拿掉 score 項的 ODE(紅色虛線):只有 \(\frac{dx}{dt}=-x\),當作反例。
SDE(直方圖、路徑)PF-ODE拿掉 score 項(虛線)精確的 pt

讀數(瀏覽器實測):

tKS 距離:SDE/PF-ODE/無 scoreSpearman(x(0), x(t)):SDE/PF-ODE換過正負號的比例:SDE/PF-ODE從 1.5 出發的 Var:SDE(精確)
0.10.012/0.013/0.0680.894/1.0000.0003/00.180(0.181)
0.50.012/0.013/0.1500.789/1.0000.129/00.629(0.632)
1.00.018/0.013/0.2010.601/1.0000.399/00.849(0.865)
2.00.012/0.013/0.3510.259/1.0000.767/00.949(0.982)
  • 邊際相同。SDE 和 PF-ODE 和精確 \(p_t\) 的 KS 距離都在 0.012–0.018,是 4,000 個樣本的抽樣雜訊量級(約 \(1.36/\sqrt{4000}\approx0.02\))。拿掉 score 項的 ODE 差了 0.07–0.35:它只把每個粒子往 0 拉,沒有把質量攤開,兩個峰一直很窄。少了 \(-\frac12g^2\nabla\log p_t\) 這一項,擴散的效果就不見了。
  • 耦合不同。PF-ODE 是一維的 flow,軌跡不相交(B33 第 4 節),粒子的排序永遠不變,所以 \(x(0)\) 和 \(x(t)\) 的等級相關恆為 1;SDE 的排序被雜訊打亂,相關隨時間下降到 0.26。
  • 路徑事件不同。這個 \(p_t\) 左右對稱,所以 PF-ODE 在 0 的速度是 0,粒子永遠不會越過 0;SDE 到 \(t=2\) 時有 77% 的粒子至少換過一次邊。
  • 給定現在,未來是否隨機。從同一個 \(x(0)=1.5\) 出發,PF-ODE 只有一條路徑;SDE 跑 4,000 次的變異數接近 OU 的精確值 \(1-e^{-2t}\)(剩下的差距是 4,000 個樣本的抽樣誤差加上離散化)。

09物理直覺:小盒子裡的守恆書 §B.2.1

這一節給連續方程一個物理解釋,強調它在動態系統裡扮演機率密度守恆律的角色。

考慮三維空間中一個固定的小控制體積:一個長方體盒子,一個角在 \(\mathbf x=(x,y,z)\),邊長 \(\Delta x\)、\(\Delta y\)、\(\Delta z\)。令 \(p(\mathbf x,t)\) 是某個守恆量(例如質量或機率)在位置 \(\mathbf x\)、時間 \(t\) 的密度。盒子夠小時,盒子裡的總量大約是

$$\text{盒子裡的總量}\approx p(\mathbf x,t)\,\Delta x\,\Delta y\,\Delta z.$$

總量怎麼改變

總量的改變只能來自穿過盒子邊界的通量。令 \(\mathbf j(\mathbf x,t)\) 是通量向量,代表單位時間內穿過單位面積的量。

p(x, t) 體積 Δx Δy Δz 流入 jₓ(x) ΔyΔz 流出 jₓ(x+Δx) ΔyΔz x x + Δx y、z 方向同理
示意圖(轉述者繪製):盒子在 \(x\) 方向的兩個面,各自的面積是 \(\Delta y\,\Delta z\)。

\(x\) 方向的通量

穿過左面(位於 \(x\))的流入量大約是 \(j_x(x,y,z,t)\,\Delta y\,\Delta z\),穿過右面(位於 \(x+\Delta x\))的流出量是 \(j_x(x+\Delta x,y,z,t)\,\Delta y\,\Delta z\)。所以 \(x\) 方向的淨流入是

$$\big[j_x(x,y,z,t)-j_x(x+\Delta x,y,z,t)\big]\,\Delta y\,\Delta z.$$

所有方向的淨通量

\(y\)、\(z\) 方向也有類似的項:

$$\big[j_y(x,y,z,t)-j_y(x,y+\Delta y,z,t)\big]\,\Delta x\,\Delta z,\qquad\big[j_z(x,y,z,t)-j_z(x,y,z+\Delta z,t)\big]\,\Delta x\,\Delta y.$$

全部加起來,盒子的總淨流入是

$$-\nabla\cdot\mathbf j(\mathbf x,t)\,\Delta x\,\Delta y\,\Delta z,$$

等價地,總淨流出是 \(\nabla\cdot\mathbf j(\mathbf x,t)\,\Delta x\,\Delta y\,\Delta z\)。

差分怎麼變成散度

對 \(x\) 做一階 Taylor 展開:\(j_x(x+\Delta x,\dots)=j_x(x,\dots)+\partial_xj_x\,\Delta x+\mathcal O(\Delta x^2)\)。所以 \(x\) 方向的淨流入是 \(-\partial_xj_x\,\Delta x\,\Delta y\,\Delta z\) 加上更高階的項。三個方向加起來是 \(-(\partial_xj_x+\partial_yj_y+\partial_zj_z)\,\Delta x\Delta y\Delta z=-\nabla\cdot\mathbf j\,\Delta x\Delta y\Delta z\)。

盒子裡的變化率與守恆原理

盒子裡總量的變化率是 \(\frac{\partial p}{\partial t}(\mathbf x,t)\,\Delta x\,\Delta y\,\Delta z\)。假設這個量守恆(例如總質量或總機率不隨時間改變),變化率就等於負的淨流出:

$$\frac{\partial p}{\partial t}(\mathbf x,t)\,\Delta x\,\Delta y\,\Delta z=-\nabla\cdot\mathbf j(\mathbf x,t)\,\Delta x\,\Delta y\,\Delta z.$$

消去共同的體積因子、取盒子趨近於 0 的極限,得到連續方程的局部形式:

$$\frac{\partial p}{\partial t}+\nabla\cdot\mathbf j=0.$$

它的解讀很簡單:若 \(\nabla\cdot\mathbf j(\mathbf x,t)\gt0\),從小盒子流出的比流進的多,裡面的密度下降;若 \(\nabla\cdot\mathbf j(\mathbf x,t)\lt0\),流進的比流出的多,密度上升。

10從守恆律推導連續方程書 §B.2.2

上面的小盒子論證給的是局部的直覺。現在把同一個守恆原理寫成不依賴座標的形式,用在任意形狀的控制體積上。

連續方程把一個物理量(例如質量或電荷)在動態系統中的守恆形式化。令 \(p(\mathbf x,t)\) 是守恆量在 \(\mathbf x\in\mathbb R^D\)、時間 \(t\in[0,T]\) 的密度,\(\mathbf v(\mathbf x,t)\) 是速度場。當這個量由以速度 \(\mathbf v(\mathbf x,t)\) 移動的粒子攜帶時,通量是

$$\mathbf j(\mathbf x,t)=p(\mathbf x,t)\,\mathbf v(\mathbf x,t).$$
  1. 控制體積裡的變化率。考慮任意控制體積 \(V\subset\mathbb R^D\),邊界是 \(\partial V\)。\(V\) 裡守恆量的總量是 \(\int_Vp(\mathbf x,t)\,dV\),它的時間微分 \(\frac{\partial}{\partial t}\int_Vp(\mathbf x,t)\,dV\) 就是累積的速率。
  2. 穿過邊界的淨通量。守恆量穿過 \(\partial V\) 離開 \(V\),外法向量是 \(\mathbf n\)。淨向外通量是 $$\int_{\partial V}p(\mathbf x,t)\,\mathbf v(\mathbf x,t)\cdot\mathbf n\,dS.$$
  3. 守恆原理。守恆代表 \(V\) 裡的累積速率等於負的淨向外通量: $$\frac{\partial}{\partial t}\int_Vp\,dV+\int_{\partial V}p\,\mathbf v\cdot\mathbf n\,dS=0.$$
  4. 散度定理。用散度定理把面積分換成體積分:\(\int_{\partial V}p\,\mathbf v\cdot\mathbf n\,dS=\int_V\nabla\cdot(p\mathbf v)\,dV\)。因此 $$\int_V\left(\frac{\partial p}{\partial t}+\nabla\cdot(p\mathbf v)\right)dV=0.$$

控制體積 \(V\) 是任意的,所以被積函數必須逐點為 0,這就得到連續方程

$$\frac{\partial p}{\partial t}+\nabla\cdot(p\mathbf v)=0,$$

用 \(\mathbf j=p\mathbf v\) 寫就是 \(\frac{\partial p}{\partial t}+\nabla\cdot\mathbf j=0\)。

「V 任意,所以被積函數為 0」為什麼成立

假設被積函數 \(h=\partial_tp+\nabla\cdot(p\mathbf v)\) 連續,而且在某點 \(\mathbf x^*\) 有 \(h(\mathbf x^*)\gt0\)。由連續性,\(h\) 在 \(\mathbf x^*\) 附近一個小球裡都是正的;取 \(V\) 為這個小球,\(\int_Vh\,dV\gt0\),矛盾。\(h\lt0\) 同理。所以 \(h\equiv0\)。這個論證需要被積函數連續,這是推導裡隱含的光滑性假設。

粒子層級的直覺

把散度項展開:

$$\frac{\partial p}{\partial t}+\mathbf v\cdot\nabla p+p\,\nabla\cdot\mathbf v=0.$$

前兩項正是沿著一個移動粒子的密度的全微分:

$$\frac{d}{dt}p(\mathbf x_t,t)=\frac{\partial p}{\partial t}(\mathbf x_t,t)+\mathbf v(\mathbf x_t,t)\cdot\nabla p(\mathbf x_t,t).$$

因此

$$\frac{d}{dt}p(\mathbf x_t,t)=-p(\mathbf x_t,t)\,\nabla\cdot\mathbf v(\mathbf x_t,t).$$

這提供另一個有用的解讀:附近的粒子彼此散開(\(\nabla\cdot\mathbf v\gt0\))時密度下降,彼此靠攏(\(\nabla\cdot\mathbf v\lt0\))時密度上升。所以速度場告訴我們個別粒子怎麼動,連續方程告訴我們整個密度怎麼演化。

轉述者註:兩邊除以 \(p\) 就是第 6 節 \((\ast)\) 的連續版 \(\frac{d}{dt}\log p(\mathbf x_t,t)=-\nabla\cdot\mathbf v\)。一條從「變數變換」出發、一條從「守恆律」出發,最後落在同一個式子上。

11(選讀)Wasserstein gradient flow:分佈層級的訓練書 §B.3

現在先離開 diffusion 專屬的動態,用分佈層級的觀點看更廣的深度生成模型。我們已經知道,連續方程描述粒子移動時機率分佈怎麼移動。同一套語言也可以用來理解深度生成模型的訓練:訓練演算法更新模型參數,更新後的生成器移動了它生成的粒子,而這些粒子的移動改變了模型分佈 \(p_{\bm\phi}\)。

從這個角度,不同的生成模型方法可以依「怎麼把模型分佈 \(p_{\bm\phi}\) 推向資料分佈 \(p_{\text{data}}\)」來整理。Wasserstein gradient flow 是描述這個移動的一種特別乾淨的方式:它把訓練看成分佈空間中一個理想化的機率質量流動,再用有限維的神經網路更新去近似它。

一個神經生成器 \(\mathbf G_{\bm\phi}\) 同時定義了一個函數和一個機率分佈。若

$$\mathbf z\sim p_{\text{prior}},\qquad\mathbf x=\mathbf G_{\bm\phi}(\mathbf z),$$

生成的分佈就是 pushforward \(p_{\bm\phi}:=(\mathbf G_{\bm\phi})_\#p_{\text{prior}}\)。從生成模型的角度,我們最終在意的是 \(p_{\bm\phi}\) 怎麼接近資料分佈 \(p_{\text{data}}\)。這引出一個分佈層級的問題:

QUESTION

能不能先描述「把模型分佈 \(p_{\bm\phi}\) 移向 \(p_{\text{data}}\)」的理想方式,再更新神經網路的參數,讓生成器近似地實現這個移動?

在這一節裡,\(\tau\) 代表訓練時間:離散訓練迭代次數的理想化連續時間版本。不要和 diffusion 的加噪時間搞混。\(\bm\phi_\tau\) 是訓練時間 \(\tau\) 的參數,\(p_{\bm\phi_\tau}\) 是對應的模型分佈。

移動粒子來移動模型分佈

先描述一個理想的分佈層級演化,暫時不考慮神經生成器的有限維參數化。假設目前模型分佈的粒子依一個訓練時間的速度場 \(\mathbf w_\tau\) 移動:

$$\frac{d\mathbf x_\tau}{d\tau}=\mathbf w_\tau(\mathbf x_\tau),\qquad\mathbf x_\tau\sim p_{\bm\phi_\tau}.$$

那麼模型分佈遵循連續方程

$$\partial_\tau p_{\bm\phi_\tau}(\mathbf x)+\nabla_{\mathbf x}\cdot\big(p_{\bm\phi_\tau}(\mathbf x)\,\mathbf w_\tau(\mathbf x)\big)=0.$$

\(\mathbf w_\tau\) 描述每個生成的粒子怎麼動,連續方程描述整個生成分佈怎麼動。(書的註腳:這個速度不要和 diffusion 時間的 PF-ODE 速度 \(\mathbf v^*(\mathbf x,t)\) 搞混;\(t\) 或 \(s\) 是加噪/去噪時間,\(\tau\) 是模型分佈在訓練中的演化時間。)

選速度:分佈空間裡的梯度下降

現在要選一個把 \(p_{\bm\phi_\tau}\) 推向 \(p_{\text{data}}\) 的速度場 \(\mathbf w_\tau\)。令 \(\mathcal D(p_{\bm\phi_\tau},p_{\text{data}})\) 是目前模型分佈和資料分佈之間的某種差異。Wasserstein gradient flow(Jordan, Kinderlehrer & Otto 1998;Ambrosio et al. 2005)選的是:在「移動機率質量」的幾何下,最直接降低這個差異的粒子速度。

要選速度場,先問:目前的分佈被無窮小地擾動時,差異怎麼改變?把 \(\mathcal D(p,p_{\text{data}})\) 想成分佈 \(p\) 的一個整體能量,它的一階變分給出一個逐點的能量位勢:告訴我們空間中哪些區域對目前的分佈是「昂貴」的、哪些是「有利」的。

具體地,對一個小擾動 \(p+\epsilon h\),其中 \(\epsilon\gt0\) 很小、\(\int h(\mathbf x)\,d\mathbf x=0\),一階變分的定義是

$$\mathcal D(p+\epsilon h,p_{\text{data}})=\mathcal D(p,p_{\text{data}})+\epsilon\int\frac{\delta\mathcal D}{\delta p}(p,p_{\text{data}})(\mathbf x)\,h(\mathbf x)\,d\mathbf x+o(\epsilon).$$

這裡 \(p\) 是一個虛擬的分佈變數;算完變分之後,在目前的模型分佈 \(p=p_{\bm\phi_\tau}\) 取值。由此定義逐點的能量位勢

$$E_\tau(\mathbf x):=\frac{\delta\mathcal D}{\delta p}(p_{\bm\phi_\tau},p_{\text{data}})(\mathbf x).$$

直觀上,\(E_\tau(\mathbf x)\) 大,代表在 \(\mathbf x\) 附近多放一些機率質量會讓差異增加;\(E_\tau(\mathbf x)\) 小,代表把質量往 \(\mathbf x\) 移是有利的。所以 Wasserstein gradient flow 的速度讓粒子沿這個位勢往下坡走:

$$\mathbf w_\tau(\mathbf x)=-\nabla_{\mathbf x}E_\tau(\mathbf x).$$

用這個選擇,

$$\frac{d}{d\tau}\mathcal D(p_{\bm\phi_\tau},p_{\text{data}})=-\int p_{\bm\phi_\tau}(\mathbf x)\,\big\|\nabla_{\mathbf x}E_\tau(\mathbf x)\big\|_2^2\,d\mathbf x\le0.$$
差異為什麼一定下降

把一階變分的定義用在 \(h=\partial_\tau p\)(它的積分是 0,因為總機率不變),再代入連續方程、做分部積分(假設遠處的邊界項為 0):

$$\frac{d\mathcal D}{d\tau}=\int E_\tau\,\partial_\tau p\,d\mathbf x=-\int E_\tau\,\nabla\cdot(p\,\mathbf w_\tau)\,d\mathbf x=\int p\,\nabla E_\tau\cdot\mathbf w_\tau\,d\mathbf x.$$

代入 \(\mathbf w_\tau=-\nabla E_\tau\) 就得到 \(-\int p\,\|\nabla E_\tau\|^2\le0\)。中間那個式子更一般:對任何速度場 \(\mathbf w\),差異的變化率是 \(\mathbb E_p[\nabla E_\tau\cdot\mathbf w]\),所以 \(-\nabla E_\tau\) 是讓它最負的方向(在 \(\mathbb E_p\|\mathbf w\|^2\) 固定的限制下,由 Cauchy–Schwarz)。「以 \(\mathbb E_p\|\mathbf w\|^2\) 衡量移動的代價」正是 2-Wasserstein 幾何。

因此 Wasserstein gradient flow 就是機率分佈的 2-Wasserstein 幾何中的梯度下降。(書的註腳:這個理想的分佈空間動態不要和神經參數 \(\bm\phi\) 的一般梯度下降混為一談;後者受限於有限維的生成器族,一般只能近似實現想要的粒子運動。)整體差異 \(\mathcal D\) 定義了整個分佈的能量,一階變分 \(E_\tau\) 定義了粒子看到的局部能量地形,\(-\nabla_{\mathbf x}E_\tau\) 給出降低差異的理想粒子速度。

用神經網路實現這個分佈層級的速度

上面的速度是分佈層級的東西:它說生成的粒子應該怎麼動。但神經生成器不能獨立地移動每個粒子,它只能透過一個共用的參數更新 \(\bm\phi\) 來移動粒子。

在訓練時間 \(\tau\),目前的生成器產生粒子

$$\mathbf x_i=\mathbf G_{\bm\phi_\tau}(\mathbf z_i),\qquad\mathbf z_i\sim p_{\text{prior}},\qquad i=1,\dots,N.$$

一小步 Wasserstein 步把這些粒子移到 \(\widetilde{\mathbf x}_i=\mathbf x_i+\eta\,\mathbf w_\tau(\mathbf x_i)\),\(\eta\gt0\) 是小步長。然後更新神經網路,讓它的新輸出對上這些移過的粒子:

$$\bm\phi_{\tau+\eta}\approx\arg\min_{\bm\phi}\frac1N\sum_{i=1}^N\Big\|\mathbf G_{\bm\phi}(\mathbf z_i)-\mathrm{sg}\big(\mathbf x_i+\eta\,\mathbf w_\tau(\mathbf x_i)\big)\Big\|_2^2.$$

\(\mathrm{sg}(\cdot)\) 是 stop-gradient,所以移過的粒子被當成固定的目標。對小的參數更新 \(\Delta\bm\phi\),有線性化

$$\mathbf G_{\bm\phi_\tau+\Delta\bm\phi}(\mathbf z_i)\approx\mathbf G_{\bm\phi_\tau}(\mathbf z_i)+\big(\partial_{\bm\phi}\mathbf G_{\bm\phi_\tau}(\mathbf z_i)\big)\Delta\bm\phi.$$

因此參數更新近似地解

$$\min_{\Delta\bm\phi}\frac1N\sum_{i=1}^N\Big\|\big(\partial_{\bm\phi}\mathbf G_{\bm\phi_\tau}(\mathbf z_i)\big)\Delta\bm\phi-\eta\,\mathbf w_\tau(\mathbf x_i)\Big\|_2^2.$$

白話地說,Wasserstein gradient flow 指定想要的分佈層級粒子運動,神經網路訓練則把這個運動投影到「改變有限維參數 \(\bm\phi\) 能實現的運動」所構成的集合上。

這個投影其實就是一種預條件的梯度下降

記 \(\mathbf J_i=\partial_{\bm\phi}\mathbf G_{\bm\phi_\tau}(\mathbf z_i)\)。上面的最小平方問題的解是

$$\Delta\bm\phi=\eta\Big(\frac1N\sum_i\mathbf J_i^\top\mathbf J_i\Big)^{-1}\frac1N\sum_i\mathbf J_i^\top\mathbf w_\tau(\mathbf x_i).$$

另一方面,參數變動 \(\delta\bm\phi\) 讓粒子移動 \(\mathbf J_i\,\delta\bm\phi\),由上一個推導框的一般式,\(\delta\mathcal D\approx\mathbb E\big[\nabla E_\tau\cdot\mathbf J\,\delta\bm\phi\big]\),所以

$$\nabla_{\bm\phi}\mathcal D=\mathbb E\big[\mathbf J^\top\nabla E_\tau\big]=-\mathbb E\big[\mathbf J^\top\mathbf w_\tau\big].$$

於是 \(\Delta\bm\phi\approx-\eta\,\big(\mathbb E[\mathbf J^\top\mathbf J]\big)^{-1}\nabla_{\bm\phi}\mathcal D\):用 \(\mathbb E[\mathbf J^\top\mathbf J]\)(類似 Gauss–Newton 的矩陣)預條件的梯度下降,對小 \(\eta\) 一定讓 \(\mathcal D\) 下降。Demo D 的生成器 \(x=b+az\)、\(z\sim\mathcal N(0,1)\) 有 \(\mathbf J=(1,z)\),\(\mathbb E[\mathbf J^\top\mathbf J]=\mathbf I\),投影就恰好等於對 \((b,a)\) 的普通梯度下降。

12Forward KL:資料端的 likelihood 學習書 §B.3

一個經典的分佈層級目標是資料端(forward)的 KL divergence:

$$\mathcal D_{\text{FKL}}(p_{\bm\phi},p_{\text{data}}):=\mathcal D_{\text{KL}}(p_{\text{data}}\,\|\,p_{\bm\phi})=\int p_{\text{data}}(\mathbf x)\log\frac{p_{\text{data}}(\mathbf x)}{p_{\bm\phi}(\mathbf x)}\,d\mathbf x.$$

\(p_{\text{data}}\) 固定,所以最小化它等價於最大概似(§1.1.1,B01 第 2 節):

$$\min_{\bm\phi}\mathcal D_{\text{KL}}(p_{\text{data}}\,\|\,p_{\bm\phi})\quad\Longleftrightarrow\quad\max_{\bm\phi}\mathbb E_{\mathbf x\sim p_{\text{data}}}\big[\log p_{\bm\phi}(\mathbf x)\big].$$

這是許多 likelihood-based 模型背後的分佈層級觀點:autoregressive 模型和 normalizing flow 最佳化精確的 likelihood;likelihood-based 的 VAE 最佳化變分下界;energy-based model 透過正相和負相最佳化 likelihood;diffusion model 則可以透過它的變分和去噪目標,連到 likelihood 或 score matching 的替代目標。

從 Wasserstein gradient flow 的角度,forward KL 的一階變分是

$$\frac{\delta}{\delta p}\mathcal D_{\text{KL}}(p_{\text{data}}\,\|\,p)=-\frac{p_{\text{data}}}{p}.$$
一階變分

\(\mathcal D_{\text{KL}}(p_{\text{data}}\|p)=\int p_{\text{data}}\log p_{\text{data}}-\int p_{\text{data}}\log p\),第一項和 \(p\) 無關。把 \(p\) 換成 \(p+\epsilon h\),用 \(\log(p+\epsilon h)=\log p+\epsilon h/p+o(\epsilon)\):

$$\mathcal D(p+\epsilon h)=\mathcal D(p)-\epsilon\int\frac{p_{\text{data}}}{p}\,h\,d\mathbf x+o(\epsilon),$$

和定義比對,\(h\) 前面的函數就是 \(-p_{\text{data}}/p\)。

在 \(p=p_{\bm\phi_\tau}\) 取值,得到速度

$$\mathbf w_\tau^{\text{FKL}}(\mathbf x)=\nabla_{\mathbf x}\left(\frac{p_{\text{data}}(\mathbf x)}{p_{\bm\phi_\tau}(\mathbf x)}\right).$$

這個式子牽涉到密度比 \(p_{\text{data}}/p_{\bm\phi_\tau}\),對隱式生成器(只能抽樣、不能算密度)通常很難估計。實務上,forward KL 或最大概似訓練在 likelihood、變分下界、或 likelihood 梯度的合適近似可用時最直接。Score matching 則提供另一條學分佈的路:它匹配 score 函數,而不是直接實現 forward KL 的 Wasserstein flow。

Forward KL 訓練的主要優點是:在有 likelihood 或變分替代目標可用時,它涵蓋資料(data-covering),統計基礎扎實。它的限制是常常需要可算的密度、變分下界、score matching 替代目標,或昂貴的負樣本抽樣,因此和任意的隱式生成器不那麼直接相容。

為什麼叫「涵蓋資料」:看速度場

\(\mathbf w^{\text{FKL}}=\frac{p_{\text{data}}}{p}\big(\nabla\log p_{\text{data}}-\nabla\log p\big)\)。在資料有質量、模型卻幾乎沒有的地方,比值 \(p_{\text{data}}/p\) 非常大,所以模型分佈邊緣的粒子會被強力地拉向沒被涵蓋的資料區域。漏掉一塊資料的代價是無界的(\(\log\) 比值趨近無窮),這就是 forward KL 偏好「寧可攤開也要蓋住」的原因(Demo D)。

13Reverse KL:模型端的 score 不匹配動態書 §B.3

模型端(reverse)的 KL divergence 是

$$\mathcal D_{\text{RKL}}(p_{\bm\phi},p_{\text{data}}):=\mathcal D_{\text{KL}}(p_{\bm\phi}\,\|\,p_{\text{data}})=\int p_{\bm\phi}(\mathbf x)\log\frac{p_{\bm\phi}(\mathbf x)}{p_{\text{data}}(\mathbf x)}\,d\mathbf x.$$

它的一階變分是

$$\frac{\delta}{\delta p}\mathcal D_{\text{KL}}(p\,\|\,p_{\text{data}})=\log p-\log p_{\text{data}}+1.$$
一階變分

被積函數是 \(p\log p-p\log p_{\text{data}}\)。對 \(p\) 逐點微分:\(\frac{d}{dp}(p\log p)=\log p+1\),\(\frac{d}{dp}(p\log p_{\text{data}})=\log p_{\text{data}}\)。所以 \(\mathcal D(p+\epsilon h)=\mathcal D(p)+\epsilon\int(\log p-\log p_{\text{data}}+1)h+o(\epsilon)\)。常數 1 和 \(h\) 的積分是 0(\(\int h=0\)),取梯度後也消失,所以不影響速度。

在 \(p=p_{\bm\phi_\tau}\) 取值,得到 Wasserstein 速度

$$\mathbf w_\tau^{\text{RKL}}(\mathbf x):=\nabla_{\mathbf x}\log p_{\text{data}}(\mathbf x)-\nabla_{\mathbf x}\log p_{\bm\phi_\tau}(\mathbf x).$$

因此 reverse KL 訓練產生一個 score 不匹配的力:目標 score 減模型 score。目標 score 把生成的粒子吸引到資料分佈的高密度區;模型 score 則把粒子從「目前模型分佈已經太集中」的區域推開。

理想的 reverse KL 梯度流就是 Langevin 動態的 Fokker–Planck 方程

把 \(\mathbf w^{\text{RKL}}\) 代進連續方程:

$$\partial_\tau p=-\nabla\cdot\big(p\,(\nabla\log p_{\text{data}}-\nabla\log p)\big)=-\nabla\cdot(p\,\nabla\log p_{\text{data}})+\Delta p.$$

這正是 Langevin 動態 \(d\mathbf x=\nabla\log p_{\text{data}}(\mathbf x)\,d\tau+\sqrt2\,d\mathbf w\) 的 Fokker–Planck 方程(第 8 節,\(\mathbf f=\nabla\log p_{\text{data}}\)、\(g=\sqrt2\)),也就是 Jordan–Kinderlehrer–Otto (1998) 的經典結果:Langevin 動態是 reverse KL 在 Wasserstein 幾何下的梯度流。\(-\nabla\log p\) 這一項是第 8 節「把擴散藏進速度」的同一招:確定性的推開,和雜訊的攤開,在密度層級上效果相同。Langevin 取樣見 §3.1.4(B05 第 5 節)。

在 diffusion distillation 和分佈匹配(§10.2,B28 第 4 節)裡,這個想法通常在某個雜訊等級 \(s\) 上使用。令 \(p_s\) 是老師的(或加噪資料的)分佈,\(p_{\bm\phi_\tau,s}\) 是目前生成器樣本加噪後的分佈。reverse KL 目標

$$\mathbb E_s\Big[w(s)\,\mathcal D_{\text{KL}}\big(p_{\bm\phi_\tau,s}\,\|\,p_s\big)\Big]$$

產生 score 不匹配的速度

$$\mathbf w_{\tau,s}^{\text{RKL}}(\mathbf x):=\nabla_{\mathbf x}\log p_s(\mathbf x)-\nabla_{\mathbf x}\log p_{\bm\phi_\tau,s}(\mathbf x).$$

在參數層級,對生成的加噪樣本 \(\hat{\mathbf x}_s\sim p_{\bm\phi_\tau,s}\),得到這種形式的梯度:

$$\nabla_{\bm\phi}\mathcal D_{\text{KL}}\big(p_{\bm\phi,s}\,\|\,p_s\big)\Big|_{\bm\phi=\bm\phi_\tau}=\mathbb E_{\hat{\mathbf x}_s\sim p_{\bm\phi_\tau,s}}\Big[\big(\nabla_{\mathbf x}\log p_{\bm\phi_\tau,s}(\hat{\mathbf x}_s)-\nabla_{\mathbf x}\log p_s(\hat{\mathbf x}_s)\big)^\top\partial_{\bm\phi}\hat{\mathbf x}_s\Big].$$
參數梯度從哪來

用重參數化把 \(\hat{\mathbf x}_s\) 寫成 \(\bm\phi\) 和與 \(\bm\phi\) 無關的雜訊的函數,\(\mathcal D=\mathbb E\big[\log p_{\bm\phi,s}(\hat{\mathbf x}_s)-\log p_s(\hat{\mathbf x}_s)\big]\)。對 \(\bm\phi\) 微分有兩個來源:

  • 透過樣本 \(\hat{\mathbf x}_s\) 的移動:\(\mathbb E\big[(\nabla_{\mathbf x}\log p_{\bm\phi,s}-\nabla_{\mathbf x}\log p_s)^\top\partial_{\bm\phi}\hat{\mathbf x}_s\big]\);
  • 透過 \(\log p_{\bm\phi,s}\) 本身的形狀(固定 \(\mathbf x\)):\(\mathbb E_{p_{\bm\phi,s}}\big[\partial_{\bm\phi}\log p_{\bm\phi,s}(\mathbf x)\big]=\int\partial_{\bm\phi}p_{\bm\phi,s}\,d\mathbf x=\partial_{\bm\phi}\int p_{\bm\phi,s}\,d\mathbf x=0\)。

第二項消失,剩下的就是上式。這和第 11 節補充框的一般式 \(\nabla_{\bm\phi}\mathcal D=-\mathbb E[\mathbf J^\top\mathbf w]\) 一致:這裡 \(\mathbf J=\partial_{\bm\phi}\hat{\mathbf x}_s\)、\(\mathbf w=\mathbf w^{\text{RKL}}_{\tau,s}\)。

因此,score 的差 \(\nabla_{\mathbf x}\log p_s(\hat{\mathbf x}_s)-\nabla_{\mathbf x}\log p_{\bm\phi_\tau,s}(\hat{\mathbf x}_s)\) 提供了驅動參數梯度的分佈層級下降方向。個別樣本的實際移動則經由共用的神經參數化來中介,如第 11 節所述。這個 score 差的梯度,是 DMD、VSD 等以 reverse KL 為基礎的方法背後的基本分佈層級機制:在生成的樣本上估計目標 score 和模型 score,用它們的差更新生成器。

Reverse KL 訓練的主要優點是:只要相關的 score 能估計,它天生就和隱式生成器相容。它也是 mode-seeking(追逐峰)的,可以改善一步或少步生成的視覺品質。它的限制是可能丟掉某些峰(mode dropping),強烈依賴 score 估計的品質,而且可能需要一個額外的模型 score 網路,或一個強的老師。

同樣的「吸引–排斥」解讀也出現在 drifting 類型的粒子更新裡(Weber et al. 2023;Deng et al. 2026)。用 Lai et al. (2026) 的術語,DMD/VSD/SiD 是這個 score 不匹配動態的參數化、以 score 為基礎的實例,而 drifting 類型的方法是非參數、以 kernel 為基礎的實例。

Demo D用一個生成器實現 Wasserstein gradient flow

資料 \(p_{\text{data}}=\frac12\mathcal N(-2,0.5^2)+\frac12\mathcal N(2,0.5^2)\)。生成器只有兩個參數:\(x=b+a\,z\)、\(z\sim\mathcal N(0,1)\),所以 \(p_{\bm\phi}=\mathcal N(b,a^2)\),一個高斯不可能同時蓋住兩個峰。每一步照第 11 節的做法:算出理想的粒子速度 \(\mathbf w\)(forward KL 用 \(\nabla(p_{\text{data}}/p_{\bm\phi})\),reverse KL 用 score 差),再用最小平方把它投影到生成器能做到的運動 \(\Delta b+\Delta a\,z\) 上(期望值用 6,001 點的數值積分算,沒有抽樣雜訊)。\(\eta=0.05\),400 步,起點 \(a=0.6\)。

  • 上圖:資料密度(黑)、起點(灰虛線)、第 \(k\) 步的 \(p_{\bm\phi}\)(藍)。
  • 中圖:第 \(k\) 步在 \(p_{\bm\phi}\) 主要範圍(\(b\pm2.5a\))內,理想的粒子速度 \(\mathbf w(x)\)(橙)和生成器實際能做到的運動(藍虛線,一條直線)。
  • 下圖:被最小化的 KL 隨訓練步數 \(k\) 的變化(兩軸都是對數軸,前幾步的快速下降和後面的慢尾巴都看得到)。
pdatapφ、生成器能做到的運動(虛線)理想的粒子速度 w

讀數(瀏覽器實測,400 步後):

差異起點 b₀終點 (b, a)KL(pdata‖pφ)KL(pφ‖pdata)
Forward KL任一(≈0, 2.062)0.7242.098
Reverse KL±0.7(±2.000, 0.500)15.280.693
Reverse KL0、0.3(≈0, 1.736)0.7571.871
  • Forward KL 涵蓋資料。不管從哪裡出發,都收斂到 \(b=0\)、\(a=\sqrt{2^2+0.5^2}\approx2.062\):一個罩住兩個峰的寬高斯。這正是「高斯族裡的最大概似 = 動差匹配」。起點的速度圖裡,橙線在 \(p_{\bm\phi}\) 的兩側邊緣很陡:比值 \(p_{\text{data}}/p_{\bm\phi}\) 在那裡很大,粒子被強力往外拉,所以 \(a\) 先快速變大。
  • Reverse KL 追逐峰。從 \(b_0=\pm0.7\) 出發,收斂到某一個峰,\((b,a)=(\pm2,0.5)\),reverse KL 恰好是 \(\log2\approx0.693\)(模型完全貼合一半的資料);它對另一個峰完全不在乎,所以 forward KL 高達 15.28,這就是 mode dropping。
  • Reverse KL 有多個局部最小值。從 0 或 0.3 出發,卻停在 \((0,1.736)\) 這個罩住中間的寬高斯,reverse KL 1.871,比 \(\log2\) 差。數值上沿 \(b\) 掃過去(每個 \(b\) 取最好的 \(a\)),reverse KL 從 \(b=0\) 的 1.871 先上升到 \(b=1\) 的 1.937,再降到峰上的 0.693:這是一個真的局部最小值,不只是對稱造成的鞍點。結局取決於初始化。
  • 投影的意思。橙線(理想的粒子速度)是彎的:不同位置的粒子想往不同方向走。生成器只能做「整體平移加上整體縮放」,所以只能取一條直線(藍虛線),也就是橙線在 \(p_{\bm\phi}\) 加權下的最小平方直線。在這兩個 KL 下,被最小化的 KL 都單調下降,和第 11 節「投影是預條件的梯度下降」一致。
  • 收斂時,理想速度不一定是 0。Forward KL 走到 400 步時,橙線仍然上下起伏(粒子還想往兩個峰集中),但它的最小平方直線已經幾乎是 0(起點 \(b_0=\pm0.7\) 時 \(\Delta b\) 只剩約 0.001):生成器族裡沒有任何「平移加縮放」能再降低差異。參數停下來,是因為理想運動在可行運動上的投影變成 0,不是因為分佈已經等於資料。這就是第 11 節書的註腳說的「一般只能近似實現想要的粒子運動」。

14結語書 §B.3

總結來說,連續方程提供了 diffusion 動態和分佈層級訓練背後共同的語言。在 diffusion model 裡,它描述中間分佈 \(p_t\) 怎麼沿著指定的加噪或 probability flow 動態演化。在 Wasserstein gradient flow 裡,同一個方程描述模型分佈 \(p_{\bm\phi_\tau}\) 在訓練中怎麼演化,生成的粒子怎麼移向資料分佈 \(p_{\text{data}}\)。

這個觀點因此把連續方程的角色擴展到 diffusion model 之外。它讓我們把生成建模理解成分佈動態的設計:不同的方法選擇不同的差異、不同的粒子速度、不同的參數更新,把 \(p_{\bm\phi}\) 推向 \(p_{\text{data}}\)。從這個角度,diffusion model、likelihood-based 模型、分佈匹配方法、以 score 不匹配為基礎的方法,都可以放進一個共同的分佈層級分類裡看。

與 CS236 的對照

本頁CS236 複習頁
變數變換、Jacobian 行列式、複合的 flow第 7 講(Normalizing Flows 1)
連續方程、沿軌跡的 \(d\log p/dt=-\nabla\cdot\mathbf v\)補充課 C
Fokker–Planck、Langevin 的穩態、PF-ODE補充課 F、第 14 講
Forward vs. reverse KL:一個高斯擬合兩個峰第 4 講(Demo:KL 方向)

常見誤解

誤解:「連續方程是一條獨立的物理定律,和變數變換無關」。它就是變數變換公式在無窮小步長下的版本;把 \(L\) 個 Euler 映射的乘積公式取 \(L\to\infty\) 就收斂到它(第 6 節、Demo A)。
誤解:「行列式在終點 \(\mathbf x_L\) 計算」。多層公式的每個 \(\det\) 都在粒子當時的位置 \(\mathbf x_{k-1}\) 計算,要沿著軌跡記帳(第 4 節)。
誤解:「知道每個時刻的密度,就知道粒子怎麼動」。任何滿足 \(\nabla\cdot(p_t\mathbf w_t)=0\) 的 \(\mathbf w_t\) 都可以加到速度上而不改變密度;密度路徑不能唯一決定 flow(第 7 節、Demo B)。
誤解:「PF-ODE 和 SDE 有相同的邊際,所以它們是同一個過程」。它們只在每個單一時刻的分佈相同;轉移分佈、時間相關、路徑事件都不同(第 8 節的 Remark、Demo C)。
誤解:「PF-ODE 的速度就是 SDE 的漂移 \(\mathbf f\)」。要再加上 \(-\frac12g^2\nabla\log p_t\);少了它,ODE 只會收縮、不會擴散,邊際就錯了(Demo C 的紅色虛線)。
誤解:「Wasserstein gradient flow 就是對參數做梯度下降」。它是分佈空間裡的理想粒子運動;有限維的生成器只能實現它在可行運動上的投影(第 11 節)。
誤解:「reverse KL 總會找到其中一個峰」。它有多個局部最小值,從對稱附近出發也可能停在一個罩住中間的寬分佈(Demo D)。
誤解:「訓練時間 \(\tau\) 和 diffusion 時間 \(t\) 是同一個東西」。\(\tau\) 描述模型分佈在訓練中的演化,\(t\)/\(s\) 是加噪/去噪時間(第 11 節)。

自我測驗

1. 寫出單一雙射的變數變換公式,並解釋 \(|\det|\) 的意義。
\(p_1(\mathbf x_1)=p_0(\bm\Psi^{-1}(\mathbf x_1))\,|\det\partial_{\mathbf x_1}\bm\Psi^{-1}|\),等價地 \(p_0(\mathbf x_0)=p_1(\bm\Psi(\mathbf x_0))\,|\det\partial_{\mathbf x}\bm\Psi(\mathbf x_0)|\)。\(|\det\partial\bm\Psi|\) 是局部體積的放大倍率;質量守恆,所以密度除以它。
2. 為什麼 \(\det(\mathbf I+\Delta t\,\nabla\mathbf f)\approx1+\Delta t\,\nabla\cdot\mathbf f\)?它在連續方程的推導裡扮演什麼角色?
特徵值是 \(1+\Delta t\lambda_i\),乘積的一階項是 \(\Delta t\sum\lambda_i=\Delta t\,\mathrm{Tr}(\nabla\mathbf f)=\Delta t\,\nabla\cdot\mathbf f\)。它給出一步 Euler 映射下 log 密度的變化 \(-\Delta t\,\nabla\cdot\mathbf f\),再和 Taylor 展開比對就得到連續方程。
3. 從 \(\partial_t\log p_t=-\nabla\cdot\mathbf f-\mathbf f^\top\nabla\log p_t\) 推出連續方程。
兩邊乘 \(p_t\):\(\partial_tp_t=-p_t\nabla\cdot\mathbf f-\mathbf f^\top\nabla p_t=-\nabla\cdot(p_t\mathbf f)\),最後一步是乘積法則。
4. 給一個二維、不改變密度路徑的額外速度場,並驗證它。
\(\mathbf w_t=\omega\,\mathbf J\nabla\log p_t\),\(\mathbf J\) 是轉 90°。\(p_t\mathbf w_t=\omega\,\mathbf J\nabla p_t=\omega(-\partial_yp_t,\partial_xp_t)\),散度 \(\omega(-\partial_x\partial_yp_t+\partial_y\partial_xp_t)=0\)。粒子沿等高線流動。
5. 什麼是「可實現的」密度路徑?
存在速度場 \(\mathbf f\),使粒子依 \(\dot{\mathbf x}=\mathbf f\) 運動恰好產生 \(p_t\);等價地,\(p_t\) 和 \(\mathbf f\) 一起滿足連續方程。這時 \(p_t=(\bm\Psi_{0\to t})_\#p_0\)。
6. 把 Fokker–Planck 方程改寫成連續方程,速度是什麼?
用 \(\Delta p=\nabla\cdot(p\nabla\log p)\):\(\partial_tp=-\nabla\cdot\big((\mathbf f-\frac12g^2\nabla\log p)p\big)\),速度 \(\mathbf f-\frac12g^2\nabla\log p_t\),就是 PF-ODE 的速度。
7. SDE 和它的 PF-ODE 有哪些相同、哪些不同?
相同:每個時刻的邊際 \(p_t\)。不同:給定 \(\mathbf x_s\) 後的轉移(ODE 確定、SDE 隨機)、時間相關(一維 ODE 保持排序)、路徑事件(例如是否越過某個點)。
8. 用小盒子論證說明 \(\nabla\cdot\mathbf j\gt0\) 時密度怎麼變。
\(x\) 方向淨流入 \([j_x(x)-j_x(x+\Delta x)]\Delta y\Delta z\approx-\partial_xj_x\Delta V\),三個方向加起來淨流入 \(-\nabla\cdot\mathbf j\,\Delta V\)。\(\nabla\cdot\mathbf j\gt0\) 時流出多於流入,密度下降。
9. 寫出沿著粒子的密度變化率,並解釋它。
\(\frac{d}{dt}p(\mathbf x_t,t)=-p\,\nabla\cdot\mathbf v\)。附近粒子散開(散度正)時密度降,靠攏時密度升。
10. Wasserstein gradient flow 怎麼選粒子速度?為什麼差異會下降?
\(\mathbf w_\tau=-\nabla E_\tau\),\(E_\tau=\frac{\delta\mathcal D}{\delta p}\) 在 \(p_{\bm\phi_\tau}\) 取值。\(\frac{d\mathcal D}{d\tau}=\int E\,\partial_\tau p=\int p\nabla E\cdot\mathbf w=-\int p\|\nabla E\|^2\le0\)。
11. 神經生成器怎麼「實現」這個速度?
把生成的粒子移到 \(\mathbf x_i+\eta\mathbf w(\mathbf x_i)\),用 stop-gradient 當目標做迴歸;線性化後就是最小平方 \(\min\frac1N\sum\|\mathbf J_i\Delta\bm\phi-\eta\mathbf w(\mathbf x_i)\|^2\),把理想運動投影到參數能做到的運動上。
12. 推導 forward 和 reverse KL 的一階變分與速度。
Forward:\(\delta/\delta p=-p_{\text{data}}/p\),速度 \(\nabla(p_{\text{data}}/p)\),需要密度比。Reverse:\(\delta/\delta p=\log p-\log p_{\text{data}}+1\),速度 \(\nabla\log p_{\text{data}}-\nabla\log p\),是 score 不匹配,DMD/VSD 用的就是它。