Flow 與 Diffusion Model:把「生成」寫成數學
這一講沒有訓練,只回答兩件事:「生成一張圖」在數學上是什麼意思?如果有人給你一個訓練好的 flow model 或 diffusion model,要怎麼用它生成?答案是:從高斯雜訊出發,模擬一條微分方程。
讀完這頁你應該能夠
- 說明「生成」為什麼可以寫成「從 \(p_{\text{data}}\) 取樣」,以及為什麼我們不知道 \(p_{\text{data}}\) 也能做這件事。
- 分清楚軌跡、向量場、ODE、flow,並能驗算一個函數是不是某個 ODE 的解。
- 用手算 Euler 法,說明步長和誤差、計算量的取捨。
- 寫出 flow model 的三部分:神經網路向量場、隨機起點、目標 \(X_1\sim p_{\text{data}}\),並說明網路參數化的是向量場,不是 flow。
- 寫出布朗運動的定義,解釋為什麼每步的雜訊要乘 \(\sqrt h\)、為什麼路徑不可微。
- 說明 \(\mathrm dX_t = u_t(X_t)\,\mathrm dt + \sigma_t\,\mathrm dW_t\) 真正的意思,並用 Euler–Maruyama 手算兩步。
- 推出 OU 過程的變異數會趨近 \(\sigma^2/(2\theta)\)。
- 寫出 diffusion model 的取樣演算法,說明它和 flow model 只差哪一行。
前置知識檢查
講義建議先對機率有一點熟悉。下面每一項都附上可以補的地方;不熟也可以先往下讀,正文遇到時會再講一次。
- 導數的定義:\(\frac{\mathrm d}{\mathrm dt}f(t) = \lim_{h\to0}\frac{f(t+h)-f(t)}{h}\)。第 10、14 節整個建立在這個定義上。
- 什麼是微分方程:未知的是一個函數。沒學過請先讀補充課 B 的開頭。
- 機率密度:機率是面積,密度本身可以大於 1。見補充課 C。
- 期望值:\(\mathbb E[X]\) 就是 \(X\) 的平均。第 14 節會用到。
- 高斯分佈與變異數:\(\mathcal N(\mu,\sigma^2)\)、獨立變數的變異數相加、\(\mathrm{Var}(aX)=a^2\mathrm{Var}(X)\)。見補充課 A。
這一頁怎麼讀、記號
這一講有六成以上的時間在寫黑板,所以這一頁同時放了投影片和板書截圖。圖都可以點開放大;「投影片 N」的連結也一樣。灰色時間標籤可以直接跳到影片那一段。「課堂問答」的內容都對照過逐字稿和影片,其他補充的背景會寫明。
逐字稿是 YouTube 自動字幕,人名和公式常聽錯,例如 sponsor Tommi Jaakkola 被寫成 Tommy。有疑問時以黑板和投影片為準。部分學生的提問麥克風沒收到,那些問答的標題是從老師的回答和重述推測的。
| 東西 | 這門課 | CS236 第 14、16 講的 Score SDE |
|---|---|---|
| 時間方向 | \(t=0\) 是雜訊,\(t=1\) 是資料 | \(t=0\) 是資料,\(t=T\) 是雜訊 |
| 資料 | \(z\) | \(\mathbf x\) |
| 漂移(速度) | \(u_t(x)\),也叫向量場 | \(f(\mathbf x,t)\) |
| 雜訊強度 | \(\sigma_t\):diffusion coefficient | \(g(t)\)。CS236 的 \(\sigma_t\) 常指雜訊的標準差,是另一個東西 |
| 「diffusion model」 | 任何用神經網路當 \(u_t^\theta\) 的 SDE | 通常特指 DDPM 或 score-based model |
01這門課要做什麼(投影片 1–6)
開場 01:09 先舉例:藝術圖片、Sora 和 Veo 的影片、ChatGPT。這些系統的共同點是會「創造」,也就是會生成新的東西。這門課教的就是生成物件的演算法,重點放在 flow model 和 diffusion model。圖片、影片、蛋白質的頂尖模型(Stable Diffusion、Sora、Meta MovieGen、AlphaFold 3、Boltz)用的都是這類方法。
老師說這門課和其他課的差別是相當嚴謹,會真的推導演算法,不只是把它端出來 02:10。課程路線(投影片 6):
| 講 | 內容 | 回答的問題 |
|---|---|---|
| 1(本講) | 生成即取樣;建立 flow 和 diffusion model | 模型長什麼樣、訓練好後怎麼用? |
| 2 | Flow matching | 怎麼訓練? |
| 3 | Score matching、guidance | SDE 需要的東西怎麼學?怎麼依照 prompt 生成? |
| 4 | 網路架構、latent space | 怎麼做出真的影像生成器? |
| 5 | 離散 diffusion、distillation | 進階主題(實際上第 5 講只講離散 diffusion) |
02所有東西都是向量(投影片 7–8)
為什麼要先講這個?數學和電腦都不懂「一張狗的照片」,只懂數字。所以第一步是把要生成的東西寫成數字。 04:41
\(\mathbb R^d\) 的意思是「\(d\) 個實數排成一串」,\(\mathbb R^{H\times W\times3}\) 則是排成 \(H\times W\times3\) 的多維陣列。這些東西本來是多維陣列(矩陣),但「攤平」就只是把數字依序排成一列,沒有丟掉任何資訊:
- \(64\times64\) 的彩色圖:\(d = 64\times64\times3 = 12{,}288\)。
- \(1024\times1024\) 的彩色圖:\(d = 3{,}145{,}728\),超過三百萬維。
- 1,000 個原子的蛋白質:\(d = 1000\times3 = 3{,}000\)。
所以老師說「生成一個東西」時,意思永遠是生成一個向量。之後所有公式都寫 \(z\in\mathbb R^d\),不管它是圖還是蛋白質。文字是例外:語言模型通常把文字當成離散的東西,講義另外在第 5 講的範圍處理。
出處:講義 §1.3;老師用「row」描述分子矩陣,投影片也是 \(N\times3\)(每列一個原子);講義寫成 \(\mathbb R^{3\times N}\),只是把列和行對調。
03生成就是取樣(投影片 9–11)
問題:什麼叫「生成成功」?老師拿提示詞「A picture of a dog」和四張圖說明 05:42:
「好不好」是主觀的,數學不能直接處理。關鍵的一步是換個問題:在網路上用這個說明文字搜尋,有多可能找到這張圖?純雜訊幾乎不可能,貓不太可能,狗非常可能。於是
這裡的「\(\approx\)」是老師自己強調的:這是一個近似,把主觀陳述翻譯成可以推理的機率語言 06:44。
機率密度
「有多可能」用機率密度表示。資料分佈 \(p_{\text{data}}\) 是一個函數:吃一個向量,吐一個非負的數。
$$p_{\text{data}}:\mathbb R^d\to\mathbb R_{\ge0},\qquad z\mapsto p_{\text{data}}(z)$$這行記號第一次看可能陌生,分開讀:\(\mathbb R^d\to\mathbb R_{\ge0}\) 說輸入是 \(d\) 維向量、輸出是不小於 0 的實數;\(z\mapsto p_{\text{data}}(z)\) 說輸入 \(z\) 對應到輸出 \(p_{\text{data}}(z)\)。之後的軌跡、向量場都用這種寫法。
取樣的意思是依照這個分佈隨機抽一個,寫成 \(z\sim p_{\text{data}}\)。密度高的地方容易被抽到。如果模型學得好,抽出來的大多是狗的圖。
04資料集與條件生成(投影片 12–13)
資料集就是從 \(p_{\text{data}}\) 抽出來的有限多個樣本:
$$z_1,\dots,z_N\sim p_{\text{data}}$$影像可以用網路上公開的圖,影片可以用 YouTube,蛋白質可以用 Protein Data Bank。老師的說法很直白:訓練時說「從分佈取樣」,實際上就是從資料集拿一筆資料,這只是用機率的語言來表達 08:14。
條件生成
前面其實一直偷偷固定了提示詞「dog」。實際上我們希望同一個模型能接受各種提示詞。給定條件 \(y\),改成從條件分佈取樣:
$$z\sim p_{\text{data}}(\cdot\mid y)$$記號裡的點「\(\cdot\)」代表「變數放這裡」。\(y\) 固定時,它就是 \(z\) 的一個分佈。講義把這叫 guided generation,課堂和投影片叫 conditional generation,是同一件事。
老師在這裡先打預防針:條件生成是第三講的主題,前兩講都只處理固定的分佈。因為無條件的部分才是困難的地方,那一關過了,加條件就不太難 09:46。
05生成模型的工作(投影片 14–15)
現在可以定義生成模型要做什麼了。我們需要一個自己能取樣的簡單分佈當起點,稱為初始分佈 \(p_{\text{init}}\),幾乎都選標準高斯 \(\mathcal N(0,I_d)\)。
\(\mathcal N(0,I_d)\) 的意思是:\(d\) 個數字各自獨立地從平均 0、變異數 1 的高斯抽出來(\(I_d\) 是 \(d\times d\) 的單位矩陣)。如果把這個向量排回影像,看起來就是一片雜訊。電腦要生成它只要一行程式。
投影片 15 是第一部分的條列總結,內容就是第 2–5 節。
06軌跡、向量場、ODE(投影片 16–17)
這門課的答案是:讓雜訊沿著一條微分方程慢慢流到資料。所以要先把微分方程講清楚。老師全部寫在黑板上 13:21。

軌跡
軌跡是一個時間的函數:每個時間 \(t\in[0,1]\),給一個位置 \(X_t\in\mathbb R^d\)。
$$X:[0,1]\to\mathbb R^d,\qquad t\mapsto X_t$$想像一隻螞蟻在紙上爬(\(d=2\)):\(X_{0.3}\) 就是牠在 \(t=0.3\) 時的座標。時間只走 0 到 1,這是這門課的慣例。
向量場
向量場對每個地點和每個時間,都給一個向量,代表速度:
$$\begin{gathered}u:\mathbb R^d\times[0,1]\to\mathbb R^d\\(x,t)\mapsto u_t(x)\end{gathered}$$寫 \(u_t(x)\) 時,下標是時間,括號裡是地點。老師的例子 15:27 是天氣圖上的風:地球上每個地點都有一個風向和風速,而且會隨時間變。學生提的重力場也是向量場。
代入:\(u_{0.5}\big((3,4)\big)=(0.5,\ -4)\)。也就是「往右每單位時間 0.5,往下每單位時間 4」。
ODE
常微分方程(ordinary differential equation,ODE)有兩部分,是對軌跡的要求:
第二行左邊是軌跡的速度,右邊是向量場在「時間 \(t\)、目前位置 \(X_t\)」的值。整句話是:不管走到哪,都照腳下的箭頭走。老師說的畫面是羽毛被風吹:羽毛的路徑就是這個 ODE 的軌跡 17:03。
- 初始條件:\(X_0=1+0=1\),對。
- 左邊:\(\frac{\mathrm d}{\mathrm dt}(1+t^2)=2t\)。
- 右邊:\(u_t(X_t)=2t\),這個向量場剛好不依賴位置。
延伸:更多例子和斜率場的畫法,見補充課 B 的斜率場和向量場與相圖。
07Flow(投影片 18)
上一節的軌跡只有一個起點。但生成時會有很多起點(每個高斯樣本都是一個),所以我們要一個函數同時回答所有起點的問題:從 \(x_0\) 出發,到時間 \(t\) 時在哪裡?這個函數就是 flow,記作 \(\psi\) 19:42。
固定起點,\(t\mapsto\psi_t(x_0)\) 就是那條軌跡,所以 \(X_t=\psi_t(X_0)\)。固定時間,\(\psi_t\) 則是一張把整個空間搬動的地圖。
| 名字 | 輸入 | 輸出 | 回答的問題 |
|---|---|---|---|
| 向量場 \(u_t(x)\) | 地點、時間 | 速度 | 在這裡該往哪走? |
| 軌跡 \(X_t\) | 時間 | 位置 | 這一個粒子現在在哪? |
| Flow \(\psi_t(x_0)\) | 起點、時間 | 位置 | 從任一起點出發,現在在哪? |
老師說 flow 會「warp」空間,數學上它是 diffeomorphism(微分同胚):可微、有反函數、反函數也可微 22:14。白話地說,這張橡皮地圖可以拉伸、扭轉,但不會撕破,也不會把兩個點壓到同一處。
Demo Aflow 扭曲空間
- 收縮:\(u=-x\)。全部往原點縮,\(t=1\) 時面積倍率是 \(e^{-2}\approx0.135\)。
- 旋轉:\(u=\pi(-x^{(2)},x^{(1)})\)。整張圖轉半圈,面積不變,\(\psi_1(1,0)=(-1,0)\)。
- 時變旋渦:\(u_t\) 前半段往一個方向轉、後半段反過來,中心轉得多、外圍轉得少。拖到 \(t=0.5\) 方格扭得最厲害,這時箭頭剛好全部消失,因為旋轉正要反向;\(t=1\) 又回到原本的方格。向量場隨時間改變,所以一定要寫下標 \(t\)。
三個向量場都有解析解,讀數同時列出,可以對照數值結果(這裡的數值解用 Heun 法,\(h=1/200\))。時變旋渦是 \(u_t(x)=3\cos(\pi t)\,e^{-\Vert x\Vert^2/2}\,(-x^{(2)},x^{(1)})\),面積倍率實測在 0.985–1.015 之間,理論上剛好是 1,差別來自用四邊形近似彎曲的格子。
08解存在嗎?唯一嗎?(投影片 19)
物理課寫下一條 ODE,通常預設世界只有一種演化方式。老師問:這一定對嗎 22:44?他舉了反例,並說這只是「數學八卦」,看不懂也可以略過。不過這個例子很好懂,也會讓定理的條件變得有道理。

- \(X_t=0\):左邊導數是 0;右邊 \(2\sqrt0=0\)。相等。
- \(X_t=t^2\):左邊導數是 \(2t\);右邊 \(2\sqrt{t^2}=2t\)(\(t\ge0\))。相等。代數字:\(t=0.5\) 時位置 0.25,右邊 \(2\sqrt{0.25}=1\),左邊 \(2\times0.5=1\)。
壞在哪裡?看 \(u(x)=2\sqrt x\) 在 0 附近的斜率:\(u'(x)=1/\sqrt x\),\(x\to0\) 時趨近無限大。粒子在 0 時速度是 0,可以永遠不動;但只要往右偏一點點,速度就急遽變大。向量場太陡,才讓「停在原地」和「離開」都說得通。定理要排除的正是這種情況:
幾個詞的意思:
- 連續可微:導數存在而且連續。
- 導數有界:斜率不能無限大。多維時指 Jacobian(所有偏導數排成的矩陣,見補充課 A)有界。
- Lipschitz:存在常數 \(L\),使得 \(\Vert u_t(x)-u_t(y)\Vert\le L\Vert x-y\Vert\)。兩個地點的速度差,不超過距離的 \(L\) 倍。導數有界就保證了這一點;ReLU 這類有尖角的函數不可微,但仍然是 Lipschitz。
老師強調這個條件在機器學習裡通常都成立,所以這張投影片的核心訊息是:可以直接假設解存在,然後繼續往前走 25:19。講義的理由是神經網路的導數總是有界。解唯一還有一個好處:兩條不同的軌跡永遠不會交叉,否則交叉點就會有兩個未來。這正是 Demo A 看到方格線不交叉的原因。
延伸:補充課 B 的存在唯一與不交叉。
09線性向量場(投影片 20)
現在看一個真的能寫出解的例子 26:54。向量場是
$$u_t(x)=-\theta x\qquad(\theta\gt0)$$\(x\) 是正的,速度就是負的,把它往下推;\(x\) 是負的,就往上推。不管在哪,都被推向 0,而且離 0 越遠推得越快。老師宣稱 flow 是
驗算(投影片 20 的兩步證明):
- 初始條件:\(\psi_0(x_0)=e^{0}x_0=x_0\)。
- ODE:用連鎖律,\(e^{-\theta t}\) 對 \(t\) 微分會掉下 \(-\theta\),而 \(x_0\) 只是常數: $$\begin{aligned}\frac{\mathrm d}{\mathrm dt}\psi_t(x_0)&=\frac{\mathrm d}{\mathrm dt}\big(e^{-\theta t}x_0\big)\\&=-\theta\,e^{-\theta t}x_0\\&=-\theta\,\psi_t(x_0)\\&=u_t\big(\psi_t(x_0)\big)\end{aligned}$$
- 位置:\(3e^{-1}\approx1.1036\)。
- 軌跡的速度:\(-2\cdot3e^{-1}\approx-2.2073\)。
- 向量場在該處的值:\(-2\times1.1036=-2.2073\)。兩者相等。
老師說,這基本上是這門課唯一一次能寫出解析解 27:54。實際的向量場是神經網路,不可能寫得出解析解,所以只能模擬。
延伸:這個解是怎麼算出來的(不只是驗算),見補充課 B 的分離變數。
10Euler 法(投影片 21–22)
只給你向量場和起點,要怎麼畫出軌跡?這個過程叫模擬 28:24。想法直接來自導數的定義。當 \(h\) 很小,
$$\frac{X_{t+h}-X_t}{h}\approx\frac{\mathrm d}{\mathrm dt}X_t=u_t(X_t)$$兩邊乘 \(h\),再把 \(X_t\) 移到右邊:
意思是:看腳下的箭頭,直直走 \(h\) 這麼久,再看新的箭頭。步長是 \(h=1/n\),\(n\) 是步數,走 \(n\) 步剛好從 \(t=0\) 到 \(t=1\)。
- \(t=0\):\(X_{0.5}=1+0.5\times(-1)=0.5\)。
- \(t=0.5\):\(X_1=0.5+0.5\times(-0.5)=0.25\)。
| \(n\) | Euler 的 \(X_1\) | 誤差 |
|---|---|---|
| 2 | 0.2500 | 0.1179 |
| 4 | 0.3164 | 0.0515 |
| 10 | 0.3487 | 0.0192 |
| 100 | 0.3660 | 0.0018 |
老師點出實務上的根本取捨 29:55:步長小,模擬準,但要花更多計算,也就是更多錢;步長大,便宜,但誤差大。生成一張圖要呼叫網路 \(n\) 次,所以這個取捨會直接變成生成速度。
Heun 法(講義有,課堂沒講)
講義另外介紹一個更準的方法,作為「還有更複雜的方法」的例子。先試走一步,再用起點和試走點的速度平均,重新走一次:
$$\begin{aligned}X'_{t+h}&=X_t+h\,u_t(X_t)\\X_{t+h}&=X_t+\tfrac h2\big(u_t(X_t)\\&\qquad\qquad+u_{t+h}(X'_{t+h})\big)\end{aligned}$$延伸:補充課 B 的 Euler 與誤差階數、Heun 與 RK4。
Demo B步數與誤差
- 把步數從 8 慢慢調高,看橘色線怎麼貼上藍線。
- 比較倍率:步數加倍時,Euler 的誤差變一半(\(n\ge64\) 的讀數是 2.0–2.1 倍),Heun 變四分之一(4.0 倍)。同樣花 32 次查詢,Euler(\(n=32\))的誤差是 0.1762,Heun(\(n=16\))是 0.0263。\(n=2\) 時兩者都差很遠(4.6057、3.2184):步長太大時,方法再好也救不了。
11Flow model(投影片 23–26)
到這裡都只是數學,還沒有機器學習。現在把它們接起來 30:25。目標:用一條 ODE 把 \(p_{\text{init}}\) 變成 \(p_{\text{data}}\)。

第一件:神經網路向量場
和前面唯一的差別是向量場多了參數:\(u_t^\theta:\mathbb R^d\times[0,1]\to\mathbb R^d\),\(\theta\in\mathbb R^k\) 是網路的權重。每選一組 \(\theta\),就得到一個向量場。老師說,就這門課的理論而言,神經網路就只是一個帶參數的向量場,不用要求更多;實際架構留到之後講 32:38。
第二件:隨機起點
有個問題:ODE 是決定性的,同樣的起點永遠走同樣的路,那隨機性從哪裡來?但生成必須是隨機的,不然每次都生成同一張圖。解法很簡單:把起點改成隨機的 33:08。
第三件:目標
我們希望 \(t=1\) 時的終點剛好服從資料分佈,也就是 \(\psi_1^\theta(X_0)\sim p_{\text{data}}\)(\(\psi_t^\theta\) 是 \(u_t^\theta\) 產生的 flow)。合起來就是:
取樣演算法
寫成步驟(迴圈次數照講義修正):
- 輸入訓練好的 \(u_t^\theta\) 和步數 \(n\);設 \(t=0\)、\(h=1/n\)。
- 抽 \(X_0\sim p_{\text{init}}\)。
- 重複 \(n\) 次:\(X_{t+h}=X_t+h\,u_t^\theta(X_t)\);\(t\leftarrow t+h\)。
- 回傳 \(X_1\)。
每一步的 \(u_t^\theta(X_t)\) 就是問一次網路:「我現在在 \(X_t\)、時間 \(t\),該往哪走?」 37:09
老師的結語:取樣其實相當簡單,給你模型,你已經知道怎麼生成了 38:11。
延伸:CS236 第 7–8 講的 normalizing flow 用網路直接表示一個可逆變換,所以每一層都要設計成好算反函數。這裡改參數化速度,任何網路都能用,代價是取樣要跑多步。對照書 B11。
12隨機過程(投影片 27)
接下來把 ODE 擴充成隨機微分方程(SDE)。老師開頭先給定心丸 39:11:SDE 在數學上難得多,也形式得多,但核心一直是 flow 的部分;如果你覺得 diffusion 太複雜,可以先跳過,把注意力放在 flow 上,只靠它就已經能達到頂尖結果。

隨機過程就是隨機的軌跡:對每個 \(t\),\(X_t\) 都是一個隨機變數。每抽一次,就得到一整條不同的路徑。老師提醒:一個隨機過程可以產生很多條軌跡,它是分佈,不是一條固定的路 41:16。
除了向量場,還要一個新東西:diffusion coefficient \(\sigma_t\ge0\),代表時間 \(t\) 要加多少雜訊 42:23。現在可以先看 SDE 的樣子,下面幾節再解釋每一項:
$$\mathrm dX_t=\underbrace{u_t(X_t)\,\mathrm dt}_{\text{ODE 的部分}}+\underbrace{\sigma_t\,\mathrm dW_t}_{\text{隨機的部分}}$$起點一樣是 \(X_0=x_0\)。
老師先把 ODE 也改寫成這種寫法,並強調這只是記號,沒有數學上的改變:把 \(\frac{\mathrm d}{\mathrm dt}X_t=u_t(X_t)\) 的 \(\mathrm dt\) 移到右邊,寫成 \(\mathrm dX_t=u_t(X_t)\,\mathrm dt\) 43:59。如果 \(\sigma_t=0\),第二項就消失,SDE 回到 ODE。
\(W_t\) 是布朗運動,下一節定義它。
13布朗運動(投影片 28–29)
直覺:布朗運動是連續時間的隨機漫步 46:32。普通的隨機漫步每步以各 1/2 的機率往前或往後;布朗運動是它在連續時間、連續空間的版本。名字裡的 \(W\) 來自 Wiener,所以也叫 Wiener process。

- \(W_0=0\):從 0 出發,只是慣例。
- 高斯增量:\(t\gt s\) 時,\(W_t-W_s\sim\mathcal N\big(0,(t-s)I_d\big)\)。變異數和經過的時間成正比。
- 獨立增量:不重疊的時間段上,增量互相獨立。下一段往哪走,和之前怎麼走無關。
講義的定義還明確列出路徑連續(\(t\mapsto W_t\) 是連續函數);課堂上沒有列成一條,但老師之後也說了路徑連續。
為什麼一定是變異數和時間成正比
回答「布朗運動真的存在嗎」(下面的問答)時,老師順帶說這些條件不是隨便定的,而且很特別:例如把 \((t-s)\) 平方(標準差和時間成正比),就不存在這樣的過程 50:36。下面補上理由,就用獨立變數變異數相加這一條:
怎麼模擬
老師說前面是一大堆形式語言,但模擬很簡單:每一步加一點高斯雜訊,乘上步長的平方根 51:08。
字幕在 51:10 寫成「square root of epsilon」,但板書和講義都是 \(\sqrt h\,\epsilon\)。
- \(W_{0.25}=0+0.5\times1.2=0.6\)
- \(W_{0.5}=0.6+0.5\times(-0.6)=0.3\)
- \(W_{0.75}=0.3+0.5\times0.4=0.5\)
- \(W_1=0.5+0.5\times(-1.0)=0\)
三個奇特的性質
老師把這些稱為「數學家的八卦」 53:46,但第三個是下一節的關鍵:
- 連續:畫它的路徑不用離開紙面。
- 無限長:但筆永遠停不下來。計算如下(轉述者補充):一步的長度 \(|\sqrt h\,\epsilon|\),平均是 \(\sqrt h\sqrt{2/\pi}\),\(n\) 步共 \(n\sqrt{1/n}\sqrt{2/\pi}=\sqrt{2n/\pi}\)。\(n=100\) 時約 7.98,\(n=10000\) 時約 79.8,切越細越長,沒有上限。
- 處處不可微:看導數定義的那個比值,\(\frac{W_{t+h}-W_t}{h}\) 的標準差是 \(\frac{\sqrt h}{h}=\frac1{\sqrt h}\)。\(h=0.01\) 時是 10,\(h=0.0001\) 時是 100,\(h\to0\) 時爆掉,所以極限不存在。
第三點對我們是個壞消息:既然不能微分,SDE 就不能寫成「導數 = 什麼」。 54:16
延伸:補充課 E 從隨機漫步到布朗運動、為什麼 \((\mathrm dW)^2=\mathrm dt\)。
Demo C布朗運動
- 把 \(n\) 從 4 調到 1024:路徑越來越細碎,但 \(\mathrm{Var}(W_1)\) 都在 1 附近(預設讀數 0.980、0.985、0.943、1.038、1.039,2,000 條路徑的抽樣誤差約 ±3%)。路徑長從 1.59 變成 25.52,符合 \(\sqrt{2n/\pi}\);最陡的 \(|\Delta W|/h\) 從 2.9 升到 104.4,這就是導數不存在的樣子。
- 切到「每步乘 \(h\)」:同樣的步數,\(\mathrm{Var}(W_1)\) 依序是 0.245、0.062、0.015、0.004、0.001,步數越多,路徑越接近一條水平線;路徑長則都在 0.80 左右。
14SDE 與 dX 記號到底是什麼意思
這一節是這堂課最抽象的部分。問題是:\(W_t\) 不可微,那 \(\mathrm dX_t=u_t(X_t)\mathrm dt+\sigma_t\mathrm dW_t\) 這行到底在說什麼?老師的做法 55:49:先把 ODE 改寫成完全不用導數的形式,然後在那個形式上加雜訊。


第一步:ODE 不用導數怎麼寫
導數的定義是:\(\frac{X_{t+h}-X_t}{h}\) 在 \(h\to0\) 時趨近 \(u_t(X_t)\)。「趨近」表示兩者只差一點點。把這個差明確寫出來,令
$$R_t(h)=X_{t+h}-X_t-h\,u_t(X_t)$$於是
這兩行和 ODE 完全等價。\(R_t(h)\) 是誤差項,而 \(R_t(h)/h\to0\) 表示它比 \(h\) 還小得多。把第一行除以 \(h\) 再取極限,就回到導數。
第二步:為什麼誤差要除以 \(h\)
補上一句為什麼這樣夠:如果只要求 \(R_t(h)\to0\),那 \(h\,u_t(X_t)\) 自己也趨近 0,就分不出哪個是主項、哪個是誤差了。累積的角度也一樣:走到 \(t=1\) 共 \(1/h\) 步,每步的誤差必須比 \(h\) 小,加起來才會消失。
第三步:加上雜訊
現在定義 SDE 就很自然了:在同一個式子裡加一項布朗運動的增量。
誤差現在是隨機的,一個隨機變數不好說「趨近 0」,所以老師改說:它的平方平均要比 \(h\) 小 58:54。整句話翻成白話:下一個位置 = 目前位置,加上沿向量場走一點,再加上 \(\sigma_t\) 倍的布朗增量,其他都小到可以忽略。
因為 \(W_{t+h}-W_t\sim\mathcal N(0,hI_d)\),所以它就是 \(\sqrt h\,\epsilon\)。這就是板書角落寫的那個註記。
大小的比較:雜訊比漂移大得多
這也解釋了為什麼雜訊項不能當成 \(R_t(h)\) 丟掉:把它代入條件,\(\mathbb E[\Vert\sigma_t\sqrt h\,\epsilon\Vert^2]/h=\sigma_t^2d\),不趨近 0(\(d\) 是維度,\(\mathbb E\Vert\epsilon\Vert^2=d\))。它夠大,必須留下來;剛好又沒有大到會爆炸。
板書和講義寫的誤差條件不一樣嗎?
兩者的形式不同。講義把誤差寫成 \(h\,R_t(h)\),要求 \(\mathbb E[\Vert R_t(h)\Vert^2]^{1/2}\to0\);黑板寫成 \(R_t(h)\),要求 \(\mathbb E[\Vert R_t(h)\Vert^2]/h\to0\)。用同一個誤差 \(e\) 比較:講義要求均方根 \(\sqrt{\mathbb E\Vert e\Vert^2}\) 比 \(h\) 小,黑板要求 \(\mathbb E\Vert e\Vert^2\) 比 \(h\) 小,也就是均方根比 \(\sqrt h\) 小。兩者都表達「誤差比保留的項小」,講義的要求比較強。這門課不會用到這個差別,往後只要記得「誤差可以忽略」。
舉例看誤差實際有多小(轉述者補充,算大小而不追求嚴格):取 \(u_t(x)=-\theta x\)、\(\sigma\) 是常數。一步內,\(X_s\) 和 \(X_t\) 的差主要來自雜訊,大小約 \(\sigma\sqrt{s-t}\)。誤差等於把這個差乘上 \(\theta\) 再累積過 \(h\) 的時間,大小約 \(\theta\sigma h^{3/2}\),所以 \(\mathbb E[R^2]\) 約是 \(h^3\) 的量級。\(h=0.01\) 時它是 \(10^{-6}\) 的量級,遠小於 \(h\),上面兩種條件都滿足。
延伸:補充課 E 的 SDE 與 Euler–Maruyama。
15SDE 的解(投影片 30)
和 ODE 同一個結論:實際上可以假設解存在 63:40。差別有兩處:
- SDE 沒有 flow。\(X_t\) 不再由 \(X_0\) 決定,因為演化本身就是隨機的,所以不存在一個函數 \(\psi_t(x_0)\)。
- 「唯一」的意思變成「分佈唯一」。
16Euler–Maruyama(投影片 31)
模擬 SDE 就是把第 14 節的定義直接變成程式:丟掉誤差項 \(R_t(h)\),增量換成 \(\sqrt h\,\epsilon\) 65:41。
- $$\begin{aligned}X_{0.25}&=1+0.25\times(-1)\\&\quad+1\times0.5\times0.4\\&=1-0.25+0.2=0.95\end{aligned}$$
- $$\begin{aligned}X_{0.5}&=0.95+0.25\times(-0.95)\\&\quad+1\times0.5\times(-1.0)\\&=0.95-0.2375-0.5\\&=0.2125\end{aligned}$$
老師的感想是:我們談了一大堆很炫的數學,結果得到一個很直覺的程序 66:11。

17OU 過程(投影片 32)
把第 9 節的線性向量場加上常數的雜訊,就是 Ornstein–Uhlenbeck(OU)過程 69:19:
字幕說「an example of an ODE」,但上下文和投影片都是 SDE,應該是口誤。
兩股力量在拉扯:向量場把 \(X_t\) 拉回 0,雜訊一直把它踢開。結果是:不會跑走,也不會停在 0,而是在 0 附近持續抖動。
推導:最後會抖多大
講義只給結論:\(t\to\infty\) 時,\(X_t\) 收斂到 \(\mathcal N\big(0,\frac{\sigma^2}{2\theta}\big)\)。這個結果可以只用變異數的兩條規則推出來。寫下 Euler–Maruyama:
$$X_{t+h}=(1-\theta h)X_t+\sigma\sqrt h\,\epsilon_t$$- 平均:\(\epsilon_t\) 的平均是 0,所以 \(m_{k+1}=(1-\theta h)m_k\)。每步縮一點,最後到 0。
- 變異數:\(X_t\) 和新的 \(\epsilon_t\) 獨立,兩項的變異數可以相加;常數乘進去要平方: $$v_{k+1}=(1-\theta h)^2v_k+\sigma^2h$$
- 穩定下來時:\(v_{k+1}=v_k=v\)。代入: $$v=(1-\theta h)^2v+\sigma^2h$$
- 解 \(v\):\(1-(1-\theta h)^2=2\theta h-\theta^2h^2\),所以 $$v=\frac{\sigma^2h}{2\theta h-\theta^2h^2}=\frac{\sigma^2}{2\theta-\theta^2h}$$
- 取 \(h\to0\):\(v\to\dfrac{\sigma^2}{2\theta}\)。
- \(v_1=0.81\times0+0.1=0.1\)
- \(v_2=0.81\times0.1+0.1=0.181\)
- 穩定值:\(\frac{1}{2-0.1}=0.5263\)。步長趨近 0 時是 \(\frac12\)。
分佈是高斯,因為每一步都是「高斯的線性組合加上新的高斯」,而高斯的線性組合還是高斯。
延伸:補充課 E 的 OU 過程解出任意時間的平均和變異數。CS236 的 VP SDE 就是時間相依的 OU 過程,見VE 與 VP。
Demo DOU 過程
- 預設 \(\theta=0.5\)、\(\sigma=1\)、\(T=10\):平均從 3 掉到 0.048(公式 0.020),變異數 1.003,接近 \(\sigma^2/(2\theta)=1\)。\(\sigma=2\)、\(T=20\):變異數 4.057,接近 4。\(\theta=2\)、\(\sigma=1\):變異數 0.260,接近 0.25(步長不為 0 時,第 17 節的式子給 \(1/3.92\approx0.255\))。
- \(\sigma=0\):回到第 9 節的平滑曲線,所有路徑疊在一起,變異數是 0。
- \(\theta=0\):沒有拉力,就是 \(\sigma\) 倍的布朗運動,變異數一直長。
18Diffusion model(投影片 33–34)
回到機器學習。把 flow model 的 ODE 換成 SDE,變化很小 70:24。

\(\sigma_t\) 不是網路,而是我們自己設定的參數 70:55。講義把 ODE 看成 SDE 的特例,所以之後說 SDE 時都包含 ODE。
取樣演算法
- 輸入 \(u_t^\theta\)、步數 \(n\)、\(\sigma_t\);設 \(t=0\)、\(h=1/n\)。
- 抽 \(X_0\sim p_{\text{init}}\)。
- 重複 \(n\) 次:抽 \(\epsilon\sim\mathcal N(0,I_d)\);\(X_{t+h}=X_t+h\,u_t^\theta(X_t)+\sigma_t\sqrt h\,\epsilon\);\(t\leftarrow t+h\)。
- 回傳 \(X_1\)。
| Flow model | Diffusion model | |
|---|---|---|
| 方程 | ODE | SDE |
| 網路學什麼 | \(u_t^\theta\) | \(u_t^\theta\)(\(\sigma_t\) 手動設定) |
| 隨機性來源 | 只有起點 | 起點 + 每一步 |
| 有 flow \(\psi_t\) 嗎 | 有 | 沒有 |
| 模擬 | Euler | Euler–Maruyama |
| 路徑 | 平滑 | 粗糙 |
Demo E雜訊變資料
這個 demo 把第 11、18 節的演算法真的跑一次。資料是二維、六群、比例不等的高斯混合(灰圈是每群的 \(2s\) 範圍,\(s=0.3\))。
- 預設 \(n=50\)、\(\sigma=0\):在 \(t=0\) 是一團高斯,隨著 \(t\) 分成六群,比例也接近目標。實測 98.9% 的粒子落在中心 \(3s\) 以內,和真實資料的 98.9% 相同;總變異距離(每群比例和目標的差取絕對值,加總再除以 2)0.017,光是 1,500 個樣本的抽樣誤差就有約 0.02。最後一行是「同一個 \(X_0\) 跑兩次」:\(\sigma=0\) 時相距 0.000,因為隨機性只來自起點;\(\sigma=0.5\) 時相距 2.555,同一個起點甚至可能去不同的群。
- 把 \(\sigma=0\) 的步數往下調:\(n=10\) 是 97.5%,\(n=5\) 是 94.4%,\(n=2\) 是 44.3%,\(n=1\) 是 0.0%。這就是生成速度和品質的取捨;也是 75:30 問答裡「一步到位」不容易的一個側面。
- 加大 \(\sigma\):路徑變得粗糙,但只要步數夠,終點的分佈還是對的(\(\sigma=1.5\)、\(n=100\) 時 98.9%)。步數不夠時 SDE 比較吃虧:\(\sigma=1.5\) 時,\(n=20\) 是 96.4%,\(n=10\) 掉到 79.4%;同樣 \(n=10\),\(\sigma=0\) 還有 97.5%。
19總結與下一講(投影片 35–36)

老師的總結 73:57:我們要把高斯雜訊變成資料。定義一個神經網路向量場;如果要模擬 SDE,再加 diffusion coefficient。隨機初始化,然後演化。今天只是建構了模型,定義了它們是什麼、想達成什麼。給你模型,你已經知道怎麼用。
下一講全部關於那個目標:怎麼訓練才能讓 \(X_1\sim p_{\text{data}}\)。真正讓這些模型成功的,是一個簡單又有效率的訓練演算法,也就是 flow matching 74:28。老師特別叮嚀:下一講只講 flow model,所以要先把本講 flow 的部分弄懂 77:01。
和 CS236 的關聯
- CS236 第 16 講的 SDE 與 ODE:同一套想法,但從「資料加雜訊變成高斯」的前向 SDE 出發,再倒過來。這門課直接把生成方向當成正向。
- CS236 第 8 講的背景補充提過 Neural ODE:把殘差更新取極限,就得到用網路當速度的 ODE,和本講的 flow model 是同一種形狀。這門課的訓練方式在下一講。
- 書 B33是同一批 ODE、SDE 知識的速成版,B24 講取樣就是數值積分。
常見誤解
- 「Flow model 的網路輸出 flow。」網路輸出的是向量場 \(u_t^\theta\),也就是速度。Flow 要靠模擬才得到。
- 「Diffusion model 就是加雜訊再去雜訊。」這門課的定義更一般:任何用神經網路當向量場的 SDE。去雜訊的說法在 score matching 那一講才會出現。
- 「\(\sigma_t\) 是學出來的。」它是固定、手動設定的;只有 \(u_t^\theta\) 是學的。
- 「\(p_{\text{data}}\) 是已知的公式。」我們不知道它,只有樣本。這就是為什麼訓練得靠資料集。
- 「雜訊應該乘 \(h\),因為時間是 \(h\)。」要乘 \(\sqrt h\),因為和時間成正比的是變異數。乘 \(h\) 會讓雜訊在步數變多時消失(Demo C)。
- 「\(\mathrm dW_t/\mathrm dt\) 是一個很大的數。」它根本不存在。\(\mathrm dX_t\) 寫法只是第 14 節那段話的簡寫。
- 「ODE 是決定性的,所以 flow model 只能生成一張圖。」每個起點對應一個終點,但起點是隨機的,所以生成結果也是隨機的。
- 「SDE 一定比 ODE 好。」老師明白地說,核心是 flow 的部分,只靠 flow model 就有頂尖結果。
自我測驗
1. 為什麼「生成一張好圖」可以寫成「從 \(p_{\text{data}}\) 取樣」?我們不知道 \(p_{\text{data}}\),怎麼辦?
2. 256×256 的 RGB 影像,\(d\) 是多少?
3. 驗算 \(X_t=x_0e^{2t}\) 是不是 \(u_t(x)=2x\) 的解。
4. 向量場、軌跡、flow 的輸入和輸出分別是什麼?
5. \(u(x)=2\sqrt x\) 為什麼不滿足定理的條件?會出什麼事?
6. 對 \(u(x)=-2x\)、\(x_0=1\),用 \(h=0.25\) 手算兩步 Euler,並和真解比較。
7. 投影片的演算法寫「for \(i=1,\dots,n-1\)」,有什麼問題?
8. Flow model 的隨機性從哪裡來?Diffusion model 呢?
9. 如果每步雜訊乘 \(h\),\(W_1\) 的變異數是多少?為什麼布朗運動要用 \(\sqrt h\)?
10. 為什麼 \(\mathrm dX_t=u_t(X_t)\mathrm dt+\sigma_t\mathrm dW_t\) 不能除以 \(\mathrm dt\) 當成導數?
11. \(u(x)=-x\)、\(\sigma=2\)、\(x_0=0\)、\(h=0.25\),抽到 \(\epsilon_0=1\)、\(\epsilon_1=-0.5\),算 \(X_{0.5}\)。
12. OU 過程 \(\theta=0.25\)、\(\sigma=1\),長時間後的變異數是多少?\(\sigma\) 變兩倍呢?
13. 為什麼不直接訓練一個一步到位的網路?
延伸閱讀
- Holderrieth & Erives,An Introduction to Flow Matching and Diffusion Models,§1 Generative Modeling as Sampling、§2 Flow and Diffusion Models。本頁的定義和演算法都對照過 TeX 原文。
- 課程網站的 Lab 1:Euler、Euler–Maruyama、布朗運動、OU、Langevin。
- 補充課 B 微分方程入門:第 6–10 節的背景。
- 補充課 E 布朗運動與 SDE:第 12–17 節的背景,還有 Itô 公式。
- CS236 第 16 講、書 B33:同樣的內容,不同的記號和方向。