MIT 6.S184 第 1 講 · Flow 與 Diffusion
MIT 6.S184 · 第 1 講 · 2026 年 1 月 20 日

Flow 與 Diffusion Model:把「生成」寫成數學

這一講沒有訓練,只回答兩件事:「生成一張圖」在數學上是什麼意思?如果有人給你一個訓練好的 flow model 或 diffusion model,要怎麼用它生成?答案是:從高斯雜訊出發,模擬一條微分方程。

讀完這頁你應該能夠

  1. 說明「生成」為什麼可以寫成「從 \(p_{\text{data}}\) 取樣」,以及為什麼我們不知道 \(p_{\text{data}}\) 也能做這件事。
  2. 分清楚軌跡、向量場、ODE、flow,並能驗算一個函數是不是某個 ODE 的解。
  3. 用手算 Euler 法,說明步長和誤差、計算量的取捨。
  4. 寫出 flow model 的三部分:神經網路向量場、隨機起點、目標 \(X_1\sim p_{\text{data}}\),並說明網路參數化的是向量場,不是 flow。
  5. 寫出布朗運動的定義,解釋為什麼每步的雜訊要乘 \(\sqrt h\)、為什麼路徑不可微。
  6. 說明 \(\mathrm dX_t = u_t(X_t)\,\mathrm dt + \sigma_t\,\mathrm dW_t\) 真正的意思,並用 Euler–Maruyama 手算兩步。
  7. 推出 OU 過程的變異數會趨近 \(\sigma^2/(2\theta)\)。
  8. 寫出 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 或 Lai 的書,先注意記號不同。
東西這門課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)用的都是這類方法。

投影片 5 的圖:紅框「Flow and Diffusion Models」分出兩支:Theory(ODE/SDE)和 Practice(實作與應用)。下方列出課程目標:從第一原理講起、只用最少但必要的數學、學會實作。

老師說這門課和其他課的差別是相當嚴謹,會真的推導演算法,不只是把它端出來 02:10。課程路線(投影片 6):

講內容回答的問題
1(本講)生成即取樣;建立 flow 和 diffusion model模型長什麼樣、訓練好後怎麼用?
2Flow matching怎麼訓練?
3Score matching、guidanceSDE 需要的東西怎麼學?怎麼依照 prompt 生成?
4網路架構、latent space怎麼做出真的影像生成器?
5離散 diffusion、distillation進階主題(實際上第 5 講只講離散 diffusion)
投影片筆誤:投影片 1 寫「MIT IAP 2026 | Jan 20, 2025」,年份應該是 2026(檔名是 20260120)。投影片 4 的「DALEE」是 DALL·E。投影片 8 的「RBG」是 RGB。

02所有東西都是向量(投影片 7–8)

為什麼要先講這個?數學和電腦都不懂「一張狗的照片」,只懂數字。所以第一步是把要生成的東西寫成數字。 04:41

投影片 8 的圖:三欄並列。影像 \(z\in\mathbb R^{H\times W\times3}\)(高、寬、RGB 三個色頻);影片 \(z\in\mathbb R^{T\times H\times W\times3}\)(\(T\) 張影格);分子 \(z\in\mathbb R^{N\times3}\)(\(N\) 個原子,每個有三個座標)。底部紅框:要生成的物件都表示成向量 \(z\in\mathbb R^d\)。

\(\mathbb R^d\) 的意思是「\(d\) 個實數排成一串」,\(\mathbb R^{H\times W\times3}\) 則是排成 \(H\times W\times3\) 的多維陣列。這些東西本來是多維陣列(矩陣),但「攤平」就只是把數字依序排成一列,沒有丟掉任何資訊:

2×2 灰階圖0.10.90.40.7攤平向量 z ∈ ℝ⁴0.10.90.40.7第 1 列接第 2 列
攤平:格子裡的數字是亮度。這只是換一種排法,隨時可以排回去。
手算 向量的維度 \(d\) 就是所有數字的總數:
  • \(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}\),只是把列和行對調。

一句話帶走:不管生成什麼,對數學來說都是生成一個很長的向量 \(z\in\mathbb R^d\)。

03生成就是取樣(投影片 9–11)

問題:什麼叫「生成成功」?老師拿提示詞「A picture of a dog」和四張圖說明 05:42:

投影片 9–10 的圖:同樣四張圖由左到右是雜訊、紅磚小巷、橘貓、牧羊犬。投影片 9 的評語是 Useless < Bad < Wrong animal < Great!,並問這些主觀的話能不能形式化。投影片 10 換成機率的語言:Impossible < Rare < Unlikely < Very likely。

「好不好」是主觀的,數學不能直接處理。關鍵的一步是換個問題:在網路上用這個說明文字搜尋,有多可能找到這張圖?純雜訊幾乎不可能,貓不太可能,狗非常可能。於是

把主觀變成機率一張圖有多好 \(\approx\) 它在資料分佈下有多可能。

這裡的「\(\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)\)。之後的軌跡、向量場都用這種寫法。

雜訊小巷貓狗pdata(z)z
示意圖:把三百萬維壓成一條軸來想。狗的圖落在密度高的地方,雜訊落在密度幾乎為 0 的地方。真實的 \(p_{\text{data}}\) 當然畫不出來。

取樣的意思是依照這個分佈隨機抽一個,寫成 \(z\sim p_{\text{data}}\)。密度高的地方容易被抽到。如果模型學得好,抽出來的大多是狗的圖。

本講的第一個結論生成一個物件 \(=\) 從資料分佈取樣:\(z\sim p_{\text{data}}\)。
投影片 11 的圖:上半定義密度 \(p_{\text{data}}:\mathbb R^d\to\mathbb R_{\ge0}\),旁邊紅字註明「我們不知道這個機率密度!」下半紅框:\(z\sim p_{\text{data}}\) 箭頭指向一張狗的圖。
紅字為什麼重要:我們寫不出 \(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,是同一件事。

投影片 13 的圖:左邊是固定 prompt「Dog」的 \(p_{\text{data}}\),三張都是狗;右邊是 \(p_{\text{data}}(\cdot\mid y)\),\(y\) 依序是 Dog、Cat、Landscape,圖也跟著變。底部寫著:先專心做無條件生成,之後再學怎麼轉成有條件的。

老師在這裡先打預防針:條件生成是第三講的主題,前兩講都只處理固定的分佈。因為無條件的部分才是困難的地方,那一關過了,加條件就不太難 09:46。

怎麼定義生成的新穎性?· 10:16最簡單的定義是:生成的資料點在不在資料集裡。如果接受這個定義,就可以實際檢查,生成一張圖,看網路上找不找得到;找不到的話,模型就真的生成了新的東西。怎麼評估模型有沒有達成「從分佈取樣」這個目標,老師說是個好問題,留到之後講影像生成時再談。

05生成模型的工作(投影片 14–15)

現在可以定義生成模型要做什麼了。我們需要一個自己能取樣的簡單分佈當起點,稱為初始分佈 \(p_{\text{init}}\),幾乎都選標準高斯 \(\mathcal N(0,I_d)\)。

投影片 14 的圖:\(x\sim p_{\text{init}}\)(一張彩色雜訊圖)→ Generative Model → \(z\sim p_{\text{data}}\)(一張狗的圖)。上方標明預設 \(p_{\text{init}}=\mathcal N(0,I_d)\)。

\(\mathcal N(0,I_d)\) 的意思是:\(d\) 個數字各自獨立地從平均 0、變異數 1 的高斯抽出來(\(I_d\) 是 \(d\times d\) 的單位矩陣)。如果把這個向量排回影像,看起來就是一片雜訊。電腦要生成它只要一行程式。

生成模型的工作把 \(p_{\text{init}}\) 的樣本變成 \(p_{\text{data}}\) 的樣本。
有不是這樣的生成模型嗎?· 11:48大部分生成模型一開始都有某種種子,因為任何程式都需要雜訊才能有隨機性。但這張圖不是說「雜訊丟進一個網路,直接得到結果」。這裡的「generative model」應該看成一個更大的黑盒子,可以是一套程序,不一定只是一個網路。

投影片 15 是第一部分的條列總結,內容就是第 2–5 節。

一句話帶走:生成模型 = 一個把簡單雜訊變成資料的程序。接下來的問題是:這個程序怎麼做?

06軌跡、向量場、ODE(投影片 16–17)

這門課的答案是:讓雜訊沿著一條微分方程慢慢流到資料。所以要先把微分方程講清楚。老師全部寫在黑板上 13:21。

黑板 21:40:Flow models 的定義
板書(21:40):軌跡 \(X:[0,1]\to\mathbb R^d,\ t\mapsto X_t\);向量場 \(u:\mathbb R^d\times[0,1]\to\mathbb R^d,\ (x,t)\mapsto u_t(x)\);ODE 的初始條件 \(X_0=x_0\) 和演化 \(\frac{\mathrm d}{\mathrm dt}X_t=u_t(X_t)\);flow \(\psi\) 的兩個條件。右邊兩張小圖畫 \(d=2\) 時的軌跡和向量場。

軌跡

軌跡是一個時間的函數:每個時間 \(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 是天氣圖上的風:地球上每個地點都有一個風向和風速,而且會隨時間變。學生提的重力場也是向量場。

手算 取 \(d=2\),\(u_t(x)=\big(t,\ -x^{(2)}\big)\),其中 \(x^{(2)}\) 是 \(x\) 的第二個座標。問:在 \(t=0.5\)、\(x=(3,4)\) 這裡的速度是多少?
代入:\(u_{0.5}\big((3,4)\big)=(0.5,\ -4)\)。也就是「往右每單位時間 0.5,往下每單位時間 4」。

ODE

常微分方程(ordinary differential equation,ODE)有兩部分,是對軌跡的要求:

ODE 初始條件(從哪裡出發):$$X_0=x_0$$ 演化(每一刻的速度由向量場決定):$$\frac{\mathrm d}{\mathrm dt}X_t=u_t(X_t)$$

第二行左邊是軌跡的速度,右邊是向量場在「時間 \(t\)、目前位置 \(X_t\)」的值。整句話是:不管走到哪,都照腳下的箭頭走。老師說的畫面是羽毛被風吹:羽毛的路徑就是這個 ODE 的軌跡 17:03。

X₀ = x₀X₁ut(Xt)
軌跡的切線處處等於腳下的向量。灰色小箭頭是向量場,橘色箭頭是軌跡上幾個點的 \(u_t(X_t)\)。
投影片 17 的圖:黑底動畫,灰色箭頭是會隨時間變的向量場,綠點從左下出發,後面拖著一條白色軌跡,方向處處順著箭頭。動畫來源標註 mariogemoll.com/flow-matching。
手算:怎麼驗算一條軌跡是不是解 設 \(d=1\)、\(u_t(x)=2t\)、\(x_0=1\)。驗算 \(X_t=1+t^2\):
  1. 初始條件:\(X_0=1+0=1\),對。
  2. 左邊:\(\frac{\mathrm d}{\mathrm dt}(1+t^2)=2t\)。
  3. 右邊:\(u_t(X_t)=2t\),這個向量場剛好不依賴位置。
左右相等,所以是解。驗算只需要微分和代入,之後的每個例子都這樣做。
向量要是單位長度嗎?· 18:05不是。它是一個真正的向量,不只是方向,所以長度也有意義:箭頭越長,走得越快。
初始條件要包含速度嗎?· 18:41實際上已經包含了,因為演化方程對每個 \(t\) 都成立,\(t=0\) 也一樣:起點的速度就是 \(u_0(x_0)\)。
未來只依賴目前狀態嗎?· 19:12對。就這個意義而言,它滿足 Markov 條件,沒有記憶。看模擬演算法時會更清楚。

延伸:更多例子和斜率場的畫法,見補充課 B 的斜率場和向量場與相圖。

一句話帶走:向量場告訴你每個地方該往哪走多快;ODE 要求軌跡照著走。

07Flow(投影片 18)

上一節的軌跡只有一個起點。但生成時會有很多起點(每個高斯樣本都是一個),所以我們要一個函數同時回答所有起點的問題:從 \(x_0\) 出發,到時間 \(t\) 時在哪裡?這個函數就是 flow,記作 \(\psi\) 19:42。

Flow $$\begin{gathered}\psi:\mathbb R^d\times[0,1]\to\mathbb R^d\\(x_0,t)\mapsto\psi_t(x_0)\end{gathered}$$ 時間 0 什麼都沒動:$$\psi_0(x_0)=x_0$$ 對每個起點都是 ODE:$$\frac{\mathrm d}{\mathrm dt}\psi_t(x_0)=u_t\big(\psi_t(x_0)\big)$$

固定起點,\(t\mapsto\psi_t(x_0)\) 就是那條軌跡,所以 \(X_t=\psi_t(X_0)\)。固定時間,\(\psi_t\) 則是一張把整個空間搬動的地圖。

t = 0:起點 x₀t = 1:ψ₁(x₀)每個起點一條軌跡
Flow 是「所有起點的軌跡」收在同一個函數裡。給 \(x_0\) 和 \(t\),它回答位置。
分清楚三個東西
名字輸入輸出回答的問題
向量場 \(u_t(x)\)地點、時間速度在這裡該往哪走?
軌跡 \(X_t\)時間位置這一個粒子現在在哪?
Flow \(\psi_t(x_0)\)起點、時間位置從任一起點出發,現在在哪?
講義的說法是:向量場定義 ODE,ODE 的解就是 flow。
投影片 18 的圖:米色底上有一張紅色方格,藍色箭頭是向量場。動畫開始時紅點均勻排成格子,然後跟著箭頭一起移動,整張方格被扭曲。

老師說 flow 會「warp」空間,數學上它是 diffeomorphism(微分同胚):可微、有反函數、反函數也可微 22:14。白話地說,這張橡皮地圖可以拉伸、扭轉,但不會撕破,也不會把兩個點壓到同一處。

一句話帶走:Flow 把所有起點的軌跡收在一個函數裡:給起點和時間,回答位置。

Demo Aflow 扭曲空間

怎麼看:藍色小箭頭是 \(u_t\);橘色方格是 \(t=0\) 時的正方形格子被 \(\psi_t\) 搬到的位置;綠線是從 \((1,0)\) 出發的軌跡。
  • 收縮:\(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\)。
不管怎麼拖,方格線都不會交叉,這就是 diffeomorphism 的樣子。

三個向量場都有解析解,讀數同時列出,可以對照數值結果(這裡的數值解用 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?他舉了反例,並說這只是「數學八卦」,看不懂也可以略過。不過這個例子很好懂,也會讓定理的條件變得有道理。

黑板 24:50:非唯一解的例子
板書(24:50):\(d=1\),\(u_t(x)=2\sqrt x\),\(x_0=0\);兩個解 \(X_t=0\) 和 \(X_t=t^2\)。
手算:兩個解都對
  1. \(X_t=0\):左邊導數是 0;右邊 \(2\sqrt0=0\)。相等。
  2. \(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\)。
兩個都從 0 出發,卻走向不同的未來。其實還有無限多個:先在 0 停到任意時刻 \(c\),再走 \((t-c)^2\),也滿足方程(這是轉述者補充,黑板上只寫了前兩個)。
Xt = t²c = 0.3c = 0.6Xt = 0t = 1Xt
同一個向量場、同一個起點,卻有無限多條解。這時 flow 無法定義:\(\psi_t(0)\) 該回答哪一個?

壞在哪裡?看 \(u(x)=2\sqrt x\) 在 0 附近的斜率:\(u'(x)=1/\sqrt x\),\(x\to0\) 時趨近無限大。粒子在 0 時速度是 0,可以永遠不動;但只要往右偏一點點,速度就急遽變大。向量場太陡,才讓「停在原地」和「離開」都說得通。定理要排除的正是這種情況:

定理(Picard–Lindelöf)如果向量場 \(u_t(x)\) 連續可微,而且導數有界,那麼 ODE 有唯一的解,也就是說 flow 存在。更一般地,向量場是 Lipschitz 就夠了。

幾個詞的意思:

  • 連續可微:導數存在而且連續。
  • 導數有界:斜率不能無限大。多維時指 Jacobian(所有偏導數排成的矩陣,見補充課 A)有界。
  • Lipschitz:存在常數 \(L\),使得 \(\Vert u_t(x)-u_t(y)\Vert\le L\Vert x-y\Vert\)。兩個地點的速度差,不超過距離的 \(L\) 倍。導數有界就保證了這一點;ReLU 這類有尖角的函數不可微,但仍然是 Lipschitz。
投影片 19 的圖:黑框是定理,紅框是重點:在機器學習實際關心的情況下,ODE/flow 的唯一解都存在。底部灰字:數學課會用 Picard iteration 構造解。

老師強調這個條件在機器學習裡通常都成立,所以這張投影片的核心訊息是:可以直接假設解存在,然後繼續往前走 25:19。講義的理由是神經網路的導數總是有界。解唯一還有一個好處:兩條不同的軌跡永遠不會交叉,否則交叉點就會有兩個未來。這正是 Demo A 看到方格線不交叉的原因。

生成時為什麼需要唯一解?· 25:52它比較是一個數學工具。之後會用到 flow,要知道它們會走到哪裡;如果解有好幾個甚至無限多個,就會很棘手。老師說沒看過相關做法,也許有人可以為不滿足條件的網路寫篇另類的論文,但對這門課的目的來說,解都存在。

延伸:補充課 B 的存在唯一與不交叉。

一句話帶走:向量場不能太陡。在機器學習的情況下,解存在又唯一,所以 flow 可以放心使用。

09線性向量場(投影片 20)

現在看一個真的能寫出解的例子 26:54。向量場是

$$u_t(x)=-\theta x\qquad(\theta\gt0)$$

\(x\) 是正的,速度就是負的,把它往下推;\(x\) 是負的,就往上推。不管在哪,都被推向 0,而且離 0 越遠推得越快。老師宣稱 flow 是

線性 ODE 的 flow$$\psi_t(x_0)=\exp(-\theta t)\,x_0$$

驗算(投影片 20 的兩步證明):

  1. 初始條件:\(\psi_0(x_0)=e^{0}x_0=x_0\)。
  2. 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}$$
手算 \(\theta=2\),\(x_0=3\),\(t=0.5\):
  • 位置:\(3e^{-1}\approx1.1036\)。
  • 軌跡的速度:\(-2\cdot3e^{-1}\approx-2.2073\)。
  • 向量場在該處的值:\(-2\times1.1036=-2.2073\)。兩者相等。
投影片 20 的圖:右上角的圖畫了十條軌跡,起點從 −10 到 10,全部指數衰減到 0。圖的橫軸是 0 到 20,不是課程慣用的 \([0,1]\),只是為了看清楚長時間行為。
Flow 可以看成 ODE 的解嗎?· 27:24可以,它就是 ODE 的解,只是所有初始條件放在一起:給起點和時間,告訴你那時走到哪裡。

老師說,這基本上是這門課唯一一次能寫出解析解 27:54。實際的向量場是神經網路,不可能寫得出解析解,所以只能模擬。

延伸:這個解是怎麼算出來的(不只是驗算),見補充課 B 的分離變數。

一句話帶走:\(u_t(x)=-\theta x\) 的 flow 是 \(e^{-\theta t}x_0\)。驗算只要微分和代入。

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\) 移到右邊:

Euler 法$$X_{t+h}=X_t+h\,u_t(X_t)$$

意思是:看腳下的箭頭,直直走 \(h\) 這麼久,再看新的箭頭。步長是 \(h=1/n\),\(n\) 是步數,走 \(n\) 步剛好從 \(t=0\) 到 \(t=1\)。

投影片 21 的圖:Algorithm 1:設 \(t=0\)、\(h=1/n\)、\(X_0=x_0\);迴圈裡 \(X_{t+h}=X_t+hu_t(X_t)\)(紅字:沿向量場方向走一小步),更新 \(t\leftarrow t+h\);最後回傳 \(X_0,X_h,\dots,X_1\)。
投影片筆誤:迴圈次數。投影片 21、25、31、33 的四個演算法都寫「for \(i=1,\dots,n-1\)」,但回傳 \(X_1\)。迴圈跑 \(n-1\) 次只會走到 \(t=1-h\),到不了 1。要跑 \(n\) 次才對,講義的 Algorithm 1、2 就是寫 \(i=1,\dots,n\)。本頁一律用 \(n\) 次。
手算:用 \(u(x)=-x\)、\(x_0=1\),真解的終點是 \(e^{-1}\approx0.3679\) 取 \(n=2\),\(h=0.5\):
  1. \(t=0\):\(X_{0.5}=1+0.5\times(-1)=0.5\)。
  2. \(t=0.5\):\(X_1=0.5+0.5\times(-0.5)=0.25\)。
每一步都是乘以 \(1-h\),所以 \(n\) 步後 \(X_1=(1-1/n)^n\):
\(n\)Euler 的 \(X_1\)誤差
20.25000.1179
40.31640.0515
100.34870.0192
1000.36600.0018
步數變 10 倍(10 → 100),誤差大約變成 \(1/10\)。Euler 法的誤差大致和 \(h\) 成正比。
誤差真正的解 e⁻ᵗ切線走 h00.51
\(n=2\) 的 Euler 法:每一步的方向都用起點的速度。真解的斜率一路變緩,切線卻不知道,所以走得太低。紅色線段是最後的誤差。
投影片 22 的圖:同一個向量場,左邊 Large step size 的路徑有明顯折角,偏離真正的軌跡,標註「More efficient but higher error」;右邊 Small step size 平滑地貼著軌跡,標註「Lower error but less efficient」。

老師點出實務上的根本取捨 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}$$
手算同樣 \(u(x)=-x\)、\(x_0=1\)、\(h=0.5\):試走 \(X'=0.5\);平均速度 \(\tfrac12(-1-0.5)=-0.75\);所以 \(X_{0.5}=1+0.5\times(-0.75)=0.625\)。真解 \(e^{-0.5}\approx0.6065\),而 Euler 的 0.5 差得遠多了。代價是一步要查兩次向量場。

延伸:補充課 B 的 Euler 與誤差階數、Heun 與 RK4。

一句話帶走:Euler 法就是把導數的定義反過來用:走一小步,再問一次方向。

Demo B步數與誤差

怎麼看:向量場讓點一邊旋轉一邊向內收,解析解是藍色螺旋。橘色是數值解,每個點是一步。右圖橫軸是步數、縱軸是終點誤差,兩軸都是對數;橘線是 Euler,紫線是 Heun,黑點是你目前的選擇。
  • 把步數從 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}}\)。

黑板 35:20:flow model 的定義
板書(35:20):Random init cond:\(X_0\sim p_{\text{init}}\);ODE:\(\frac{\mathrm d}{\mathrm dt}X_t=u_t^\theta(X_t)\);Goal:\(X_{t=1}\sim 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)。合起來就是:

Flow model 隨機起點:$$X_0\sim p_{\text{init}}=\mathcal N(0,I_d)$$ ODE:$$\frac{\mathrm d}{\mathrm dt}X_t=u_t^\theta(X_t)$$ 目標:$$X_1\sim p_{\text{data}}$$
現在只是「宣告目標」。隨便一組 \(\theta\) 不可能達成這個目標。怎麼找到正確的 \(\theta\),是第 2 講的主題。還有:雖然叫 flow model,網路參數化的是向量場,不是 flow。要得到 flow,一定要模擬 ODE。
\(X_1\) 的下標是什麼?· 35:08下標是 \(t=1\)。意思是軌跡的終點要有那個分佈。
投影片 23–24 的圖:投影片 23 左邊是同心圓的 \(p_{\text{init}}\),抽出的 \(X_0\) 是雜訊圖;右邊是有兩個隆起的 \(p_{\text{data}}\),\(X_1\) 是一張圖片。投影片 24 的動畫中,紅色方格和一團黑點從中央的高斯一起被扭曲成目標形狀。圖片來源標註 Yaron Lipman。
\(\theta\) 在演化時是固定的嗎?· 36:08是。訓練時才會改變 \(\theta\)。這裡是模型訓練好、部署時的情況,所以 \(\theta\) 不動,\(\theta\) 就是可學習的參數。

取樣演算法

投影片 25 的圖:和投影片 21 只差兩行:\(X_0\) 改成從 \(p_{\text{init}}\) 抽(紅字「Random initialization!」);回傳只留 \(X_1\)(紅字「Return final point」)。

寫成步驟(迴圈次數照講義修正):

  1. 輸入訓練好的 \(u_t^\theta\) 和步數 \(n\);設 \(t=0\)、\(h=1/n\)。
  2. 抽 \(X_0\sim p_{\text{init}}\)。
  3. 重複 \(n\) 次:\(X_{t+h}=X_t+h\,u_t^\theta(X_t)\);\(t\leftarrow t+h\)。
  4. 回傳 \(X_1\)。

每一步的 \(u_t^\theta(X_t)\) 就是問一次網路:「我現在在 \(X_t\)、時間 \(t\),該往哪走?」 37:09

投影片 26 的圖:兩段影片截圖,左邊是泡在溫泉裡的猴子,右邊是衝浪的無尾熊和陽光(PDF 只留下動畫第一格,所以看起來是一張模糊的動物臉)。老師說這不是簡化過的例子:這些影片真的是用剛才那種演算法,模擬 flow model 生成的 37:40。

老師的結語:取樣其實相當簡單,給你模型,你已經知道怎麼生成了 38:11。

網路給的是向量場?· 38:41對。每組參數給一個向量場,所以這是一大族(無限多個)向量場。

延伸:CS236 第 7–8 講的 normalizing flow 用網路直接表示一個可逆變換,所以每一層都要設計成好算反函數。這裡改參數化速度,任何網路都能用,代價是取樣要跑多步。對照書 B11。

一句話帶走:Flow model = 網路當向量場 + 高斯起點 + 跑 Euler 法。隨機性只來自起點。

12隨機過程(投影片 27)

接下來把 ODE 擴充成隨機微分方程(SDE)。老師開頭先給定心丸 39:11:SDE 在數學上難得多,也形式得多,但核心一直是 flow 的部分;如果你覺得 diffusion 太複雜,可以先跳過,把注意力放在 flow 上,只靠它就已經能達到頂尖結果。

黑板:Diffusion Models 的定義
板書(截自 74:30):stochastic process:\(X_t\in\mathbb R^d\) 是隨機變數,\(X:[0,1]\to\mathbb R^d\) 但 \(X\) 是隨機的;向量場 \(u_t(x)\);diffusion coefficient \(\sigma:[0,1]\to\mathbb R_{\ge0},\ t\mapsto\sigma_t\),下面標註「amount of noise」;SDE。

隨機過程就是隨機的軌跡:對每個 \(t\),\(X_t\) 都是一個隨機變數。每抽一次,就得到一整條不同的路徑。老師提醒:一個隨機過程可以產生很多條軌跡,它是分佈,不是一條固定的路 41:16。

投影片 27 的圖:三個黑底動畫(Sample 1、2、3),都從中央的綠點出發,但畫出三條完全不同的亂跑路徑。

除了向量場,還要一個新東西: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。

黑板 52:05:布朗運動的定義
板書(52:05):① \(W_0=0\);② Gaussian increments:\(W_t-W_s\sim\mathcal N(0,(t-s)I_d)\)(\(t\gt s\));③ Independent increments:\(0\le t_0\lt t_1\lt\dots\lt t_N\) 時,\(W_{t_1}-W_{t_0},\dots,W_{t_N}-W_{t_{N-1}}\) 互相獨立。下方是模擬公式。
布朗運動 \((W_t)_{t\ge0}\)
  1. \(W_0=0\):從 0 出發,只是慣例。
  2. 高斯增量:\(t\gt s\) 時,\(W_t-W_s\sim\mathcal N\big(0,(t-s)I_d\big)\)。變異數和經過的時間成正比。
  3. 獨立增量:不重疊的時間段上,增量互相獨立。下一段往哪走,和之前怎麼走無關。

講義的定義還明確列出路徑連續(\(t\mapsto W_t\) 是連續函數);課堂上沒有列成一條,但老師之後也說了路徑連續。

為什麼一定是變異數和時間成正比

回答「布朗運動真的存在嗎」(下面的問答)時,老師順帶說這些條件不是隨便定的,而且很特別:例如把 \((t-s)\) 平方(標準差和時間成正比),就不存在這樣的過程 50:36。下面補上理由,就用獨立變數變異數相加這一條:

規則:變異數 = 時間差(布朗運動)0.50.5整段直接算:1。0.5 + 0.5 = 1,對得起來假想:變異數 = 時間差²0.250.25整段直接算:1。0.25 + 0.25 ≠ 1,矛盾
把 \([0,1]\) 從 0.5 切開:\(W_1-W_0=(W_{0.5}-W_0)+(W_1-W_{0.5})\)。兩段獨立,所以變異數要相加。
布朗運動真的存在嗎?· 50:05很好的問題,隨機微積分的課才會真的把它構造出來,這不容易,會花掉整堂課。這裡只給正式定義。

怎麼模擬

老師說前面是一大堆形式語言,但模擬很簡單:每一步加一點高斯雜訊,乘上步長的平方根 51:08。

模擬布朗運動$$\begin{gathered}W_{t+h}=W_t+\sqrt h\,\epsilon_t\\\epsilon_t\sim\mathcal N(0,I_d)\end{gathered}$$

字幕在 51:10 寫成「square root of epsilon」,但板書和講義都是 \(\sqrt h\,\epsilon\)。

為什麼是 \(\sqrt h\) 不是 \(h\)?· 52:13因為變異數要和時間成線性:乘上 \(\sqrt h\),變異數就是 \((\sqrt h)^2=h\)。至於為什麼要變異數線性,老師說這是題外話:獨立隨機變數的變異數會相加,這個可加性只有變異數有,標準差沒有;用標準差會導出矛盾。
手算 \(n=4\),\(h=0.25\),\(\sqrt h=0.5\)。假設抽到 \(\epsilon=1.2,\ -0.6,\ 0.4,\ -1.0\):
  • \(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\)
再算終點的變異數:四步獨立,每步變異數 \(h\),合計 \(4\times0.25=1\)。一般地,\(n\) 步合計 \(n\times\frac1n=1\),不管切多細,\(W_1\) 的變異數永遠是 1,和定義的 \(\mathcal N(0,1)\) 一致。如果錯用 \(h\):\(n\times\frac1{n^2}=\frac1n\),步數越多,雜訊越消失。
投影片 28–29 的圖:投影片 28 是三個 2 維的動畫樣本,註明布朗運動像連續的隨機漫步。投影片 29 畫了五條一維路徑,時間軸 0 到 5;每條都鋸齒狀地亂走,有的漂到 5,有的留在 0 附近。

三個奇特的性質

老師把這些稱為「數學家的八卦」 53:46,但第三個是下一節的關鍵:

  1. 連續:畫它的路徑不用離開紙面。
  2. 無限長:但筆永遠停不下來。計算如下(轉述者補充):一步的長度 \(|\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,切越細越長,沒有上限。
  3. 處處不可微:看導數定義的那個比值,\(\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

\(\sigma\) 怎麼設?· 54:49我們自己設。到目前為止,這完全是設計上的選擇。

延伸:補充課 E 從隨機漫步到布朗運動、為什麼 \((\mathrm dW)^2=\mathrm dt\)。

一句話帶走:每步加 \(\sqrt h\) 倍的高斯雜訊。\(\sqrt h\) 是唯一讓雜訊在步數變多時不爆也不消失的選擇。

Demo C布朗運動

怎麼看:左圖是 6 條路徑,右圖是 2,000 條路徑的終點 \(W_1\) 的直方圖,黑線是 \(\mathcal N(0,1)\)。
  • 把 \(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 改寫成完全不用導數的形式,然後在那個形式上加雜訊。

黑板:dX_t 記號,左半
板書左半(62:36):「\(\mathrm dX_t\)-notation」。上行是 ODE,下行是 SDE(老師擋住了「SDE」三個字),各自等價於右邊不含導數的式子。
黑板:dX_t 記號,右半
板書右半(60:00):上行 \(X_{t+h}=X_t+hu_t(X_t)+R_t(h)\);下行多了一項 \(\sigma_t(W_{t+h}-W_t)\)。上方註明 \(W_{t+h}-W_t=\sqrt h\,\epsilon\),\(\epsilon\sim\mathcal N(0,I)\)。下方:such that \(\lim_{h\to0}\frac{\mathbb E[\Vert R_t(h)\Vert^2]}{h}=0\)。

第一步: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 不含導數的寫法$$\begin{gathered}X_{t+h}=X_t+h\,u_t(X_t)+R_t(h)\\\lim_{h\to0}\frac{R_t(h)}{h}=0\end{gathered}$$

這兩行和 ODE 完全等價。\(R_t(h)\) 是誤差項,而 \(R_t(h)/h\to0\) 表示它比 \(h\) 還小得多。把第一行除以 \(h\) 再取極限,就回到導數。

手算 取 ODE \(X_t=t^2\)(\(u_t(x)=2t\))。實際算: $$R_t(h)=(t+h)^2-t^2-h\cdot2t=h^2$$ 所以 \(R_t(h)/h=h\to0\)。\(h=0.01\) 時,主項 \(h\cdot2t\) 的大小是 \(0.02t\),誤差只有 0.0001。

第二步:為什麼誤差要除以 \(h\)

為什麼誤差要除以 \(h\)?· 61:31把 \(hu_t(X_t)\) 這項除以 \(h\),就只剩 \(u_t(X_t)\),它不會隨 \(h\to0\) 消失。我們要誤差比這一項更快趨近 0,所以除以 \(h\) 之後,誤差要消失、這一項不消失。

補上一句為什麼這樣夠:如果只要求 \(R_t(h)\to0\),那 \(h\,u_t(X_t)\) 自己也趨近 0,就分不出哪個是主項、哪個是誤差了。累積的角度也一樣:走到 \(t=1\) 共 \(1/h\) 步,每步的誤差必須比 \(h\) 小,加起來才會消失。

第三步:加上雜訊

現在定義 SDE 就很自然了:在同一個式子裡加一項布朗運動的增量。

SDE 的定義 $$\begin{aligned}X_{t+h}=X_t&+\underbrace{h\,u_t(X_t)}_{\text{決定性}}\\&+\underbrace{\sigma_t(W_{t+h}-W_t)}_{\text{隨機}}\\&+\underbrace{R_t(h)}_{\text{誤差}}\end{aligned}$$ $$\lim_{h\to0}\frac{\mathbb E\big[\Vert R_t(h)\Vert^2\big]}{h}=0$$ 而 \(\mathrm dX_t=u_t(X_t)\,\mathrm dt+\sigma_t\,\mathrm dW_t\) 就只是這段話的簡寫。

誤差現在是隨機的,一個隨機變數不好說「趨近 0」,所以老師改說:它的平方平均要比 \(h\) 小 58:54。整句話翻成白話:下一個位置 = 目前位置,加上沿向量場走一點,再加上 \(\sigma_t\) 倍的布朗增量,其他都小到可以忽略。

因為 \(W_{t+h}-W_t\sim\mathcal N(0,hI_d)\),所以它就是 \(\sqrt h\,\epsilon\)。這就是板書角落寫的那個註記。

記號 \(\mathrm dX_t\)、\(\mathrm dW_t\) 只是記號。講義明確說這是非形式的寫法。不要把它除以 \(\mathrm dt\) 當成導數,\(\mathrm dW_t/\mathrm dt\) 不存在。

大小的比較:雜訊比漂移大得多

抖動的大小 √h漂移的大小 hh = 0.04 時,√h = 0.2(大 5 倍)h
\(h\) 很小時 \(\sqrt h\gg h\)。一小步裡,雜訊的大小是 \(\sigma_t\sqrt h\),漂移的大小才 \(h\Vert u_t\Vert\)。

這也解釋了為什麼雜訊項不能當成 \(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\),上面兩種條件都滿足。

誤差項要怎麼設?· 60:30不用設。它只是說有這麼一個誤差項,不管它是什麼,\(h\) 小的時候都可以放心忽略。和 ODE 那行相比,真正新增的只有布朗增量那一項。
加雜訊有什麼用?· 62:38現在只是能建構出來,用處之後才會說明。它讓演化不再是決定的,結果可能更多樣。但要記得,核心永遠是 flow 的部分,也就是向量場;diffusion coefficient 只是在動態中加一點雜訊。

延伸:補充課 E 的 SDE 與 Euler–Maruyama。

一句話帶走:SDE 沒有導數。它的意思是「每一小步:走 \(h\,u\),再抖 \(\sigma\sqrt h\,\epsilon\)」。

15SDE 的解(投影片 30)

投影片 30 的圖:定理:若向量場連續可微且導數有界,diffusion coefficient 連續,則 SDE 有唯一解(in distribution);更一般地,向量場是 Lipschitz 就成立。紅框:機器學習關心的情況下 SDE 的唯一解存在。底部灰字:隨機微積分課會用隨機積分和 Itô–Riemann 和來構造。

和 ODE 同一個結論:實際上可以假設解存在 63:40。差別有兩處:

  • SDE 沒有 flow。\(X_t\) 不再由 \(X_0\) 決定,因為演化本身就是隨機的,所以不存在一個函數 \(\psi_t(x_0)\)。
  • 「唯一」的意思變成「分佈唯一」。
SDE 的解唯一是什麼意思?· 64:10意思是軌跡的分佈唯一,而且不只是每個時間的分佈相同,是整條軌跡的聯合分佈相同。軌跡上的分佈要用測度論才能建立,老師說這裡先略過。
\(\sigma\) 可以依賴位置嗎?· 64:41可以,原則上也能據此建 flow 和 diffusion model。但一般人不這麼做,目前的頂尖模型用的是不依賴狀態的 diffusion coefficient。老師說自己寫過這方面的論文,有興趣可以問他。

16Euler–Maruyama(投影片 31)

模擬 SDE 就是把第 14 節的定義直接變成程式:丟掉誤差項 \(R_t(h)\),增量換成 \(\sqrt h\,\epsilon\) 65:41。

Euler–Maruyama$$\begin{gathered}X_{t+h}=X_t+h\,u_t(X_t)+\sigma_t\sqrt h\,\epsilon_t\\\epsilon_t\sim\mathcal N(0,I_d)\end{gathered}$$
Xth·ut(Xt)Xt+h這一圈:σt √h · ε
一步:先沿向量場走到藍點,再從虛線範圍內(尺度 \(\sigma_t\sqrt h\))隨機跳到橘點。\(\sigma_t=0\) 時虛線圈縮成一點,就是 Euler 法。
投影片 31 的圖:Algorithm 2,比 Euler 多一行「Draw a sample \(\epsilon\sim\mathcal N(0,I_d)\)」,更新式多了 \(\sigma_t\sqrt h\,\epsilon\)。紅字:加上變異數為 \(h\) 的雜訊,再乘 diffusion coefficient。迴圈次數同樣要改成 \(n\) 次。
手算 \(u(x)=-x\),\(\sigma=1\),\(x_0=1\),\(h=0.25\)(\(\sqrt h=0.5\))。假設抽到 \(\epsilon_0=0.4\)、\(\epsilon_1=-1.0\):
  1. $$\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}$$
  2. $$\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}$$
同樣的步長,Euler 法(\(\sigma=0\))得到 0.75、0.5625。下一次跑 \(\epsilon\) 不同,SDE 的結果也不同;ODE 永遠一樣。

老師的感想是:我們談了一大堆很炫的數學,結果得到一個很直覺的程序 66:11。

SDE 有高階解法嗎?· 66:42高階方法處理的是一階以外的誤差項,SDE 也可以這樣做。它們確實存在,但老師個人知道的高階 ODE 解法比 SDE 解法多得多。
加隨機性的目的是什麼?· 68:18老師先強調,到目前為止隨機性只是一個可以用的工具,之後才會用來建模型。但舉了例子:ODE 從 \(t=0\) 到 \(t=1\) 只是一條線,沒有辦法改變過程;隨機的演化在每一步都有選擇,像一棵可以搜尋的樹,訓練好之後可以做更花俏的事。另外,隨機性在經驗上也能帶來更多樣的結果。
黑板 68:50:ODE 和 SDE 的路徑草圖
板書(68:50):回答上面的問題時畫的兩張草圖:左邊是 ODE 從 \(t=0\) 到 \(t=1\) 的平滑路徑,右邊是鋸齒狀的隨機路徑。
一句話帶走:Euler 法每步多加 \(\sigma_t\sqrt h\,\epsilon\) 就是 Euler–Maruyama;\(\sigma_t=0\) 時兩者相同。

17OU 過程(投影片 32)

把第 9 節的線性向量場加上常數的雜訊,就是 Ornstein–Uhlenbeck(OU)過程 69:19:

OU 過程$$\mathrm dX_t=-\theta X_t\,\mathrm dt+\sigma\,\mathrm dW_t$$

字幕說「an example of an ODE」,但上下文和投影片都是 SDE,應該是口誤。

兩股力量在拉扯:向量場把 \(X_t\) 拉回 0,雜訊一直把它踢開。結果是:不會跑走,也不會停在 0,而是在 0 附近持續抖動。

投影片 32 的圖:四張小圖由左到右,\(\sigma\) 遞增。最左 \(\sigma=0\) 就是第 9 節的平滑衰減曲線;越往右路徑越粗糙,散開的範圍也越大。橫軸 0 到 20。講義的同類圖用 \(\theta=0.25\)。

推導:最後會抖多大

講義只給結論:\(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$$
  1. 平均:\(\epsilon_t\) 的平均是 0,所以 \(m_{k+1}=(1-\theta h)m_k\)。每步縮一點,最後到 0。
  2. 變異數:\(X_t\) 和新的 \(\epsilon_t\) 獨立,兩項的變異數可以相加;常數乘進去要平方: $$v_{k+1}=(1-\theta h)^2v_k+\sigma^2h$$
  3. 穩定下來時:\(v_{k+1}=v_k=v\)。代入: $$v=(1-\theta h)^2v+\sigma^2h$$
  4. 解 \(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}$$
  5. 取 \(h\to0\):\(v\to\dfrac{\sigma^2}{2\theta}\)。
手算 \(\theta=1\),\(\sigma=1\),\(h=0.1\),從 \(v_0=0\) 開始:
  • \(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\)。
注意 \(\sigma\) 的影響是平方,\(\theta\) 是一次方反比:拉力越強,抖得越小;雜訊越大,抖得越大。

分佈是高斯,因為每一步都是「高斯的線性組合加上新的高斯」,而高斯的線性組合還是高斯。

延伸:補充課 E 的 OU 過程解出任意時間的平均和變異數。CS236 的 VP SDE 就是時間相依的 OU 過程,見VE 與 VP。

一句話帶走:拉回 0 的力 + 不停的雜訊 = 變異數 \(\sigma^2/(2\theta)\) 的穩定抖動。

Demo DOU 過程

怎麼看:用 Euler–Maruyama(\(h=0.02\))從 \(x_0=3\) 跑 2,000 條路徑,左圖畫 8 條;右圖是 \(t=T\) 的直方圖,黑線是 \(\mathcal N(0,\sigma^2/(2\theta))\)。讀數裡的「公式」是連續時間的解(補充課 E)。
  • 預設 \(\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。

黑板 74:30:diffusion model 的定義
板書(74:30):同一塊 flow model 的黑板,標題改成 Diffusion model,箭頭上的 ODE 改成 SDE,並新增 Diffusion coefficient \(\sigma_t\);演化式加上 \(+\sigma_t\mathrm dW_t\)。Goal 不變。
Diffusion model $$X_0\sim p_{\text{init}}=\mathcal N(0,I_d)$$ $$\mathrm dX_t=u_t^\theta(X_t)\,\mathrm dt+\sigma_t\,\mathrm dW_t$$ $$\text{目標:}\ X_1\sim p_{\text{data}}$$ 神經網路:\(u_t^\theta\)。固定、不學:\(\sigma_t\)。\(\sigma_t=0\) 時就是 flow model。

\(\sigma_t\) 不是網路,而是我們自己設定的參數 70:55。講義把 ODE 看成 SDE 的特例,所以之後說 SDE 時都包含 ODE。

\(X_1\sim p_{\text{data}}\) 在什麼意義下成立?· 72:26這是目標,不是現況。接下來要訓練網路讓它成立,那是下一講的內容。現在只是宣告想達成什麼。

取樣演算法

投影片 33 的圖:Algorithm 2 的 diffusion 版本:向量場換成 \(u_t^\theta\),\(X_0\) 從 \(p_{\text{init}}\) 抽,只回傳 \(X_1\)。迴圈次數一樣要改成 \(n\) 次。
  1. 輸入 \(u_t^\theta\)、步數 \(n\)、\(\sigma_t\);設 \(t=0\)、\(h=1/n\)。
  2. 抽 \(X_0\sim p_{\text{init}}\)。
  3. 重複 \(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\)。
  4. 回傳 \(X_1\)。
Flow modelDiffusion model
方程ODESDE
網路學什麼\(u_t^\theta\)\(u_t^\theta\)(\(\sigma_t\) 手動設定)
隨機性來源只有起點起點 + 每一步
有 flow \(\psi_t\) 嗎有沒有
模擬EulerEuler–Maruyama
路徑平滑粗糙
投影片 34 的圖:兩段蛋白質結構生成的動畫,左 ODE Sampling、右 SDE Sampling。都從雜訊開始。老師指出右邊 SDE 的演化隨機得多 72:57。
一句話帶走:Diffusion model = flow model 把 ODE 換成 SDE,網路還是只學 \(u_t^\theta\)。

Demo E雜訊變資料

這個 demo 把第 11、18 節的演算法真的跑一次。資料是二維、六群、比例不等的高斯混合(灰圈是每群的 \(2s\) 範圍,\(s=0.3\))。

這裡的向量場不是訓練出來的。這個資料分佈夠簡單,正確的 \(u_t\) 能寫成公式,所以 demo 把公式當成「訓練好的網路」。公式怎麼來的,是第 2、3 講的內容;SDE 的 \(u_t\) 也要加一項,不能直接沿用 ODE 的(第 3 講)。這一頁只需要看取樣的部分。
怎麼看:藍點是 1,500 個粒子,橘線是其中 14 個的路徑。按播放,或拖動 \(t\)。
  • 預設 \(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)

黑板 52:05:flow model 全貌
板書(52:05,那時還是 flow model 的版本):\(p_{\text{init}}\xrightarrow{\text{ODE}}p_{\text{data}}\);神經網路 \(u_t^\theta\),\(\theta\in\mathbb R^k\) 是參數;隨機起點;ODE;目標。

老師的總結 73:57:我們要把高斯雜訊變成資料。定義一個神經網路向量場;如果要模擬 SDE,再加 diffusion coefficient。隨機初始化,然後演化。今天只是建構了模型,定義了它們是什麼、想達成什麼。給你模型,你已經知道怎麼用。

下一講全部關於那個目標:怎麼訓練才能讓 \(X_1\sim p_{\text{data}}\)。真正讓這些模型成功的,是一個簡單又有效率的訓練演算法,也就是 flow matching 74:28。老師特別叮嚀:下一講只講 flow model,所以要先把本講 flow 的部分弄懂 77:01。

為什麼不直接讓網路一步把雜訊變成樣本?· 75:30問題在訓練。這樣做的話有非常有效率的訓練演算法;優點並不在要模擬 ODE,那其實表示要呼叫很多次網路。理想上當然希望一步到位,但到目前為止,還沒有人找到穩定又可擴展的訓練演算法能做到。GAN(另一種生成模型,見 CS236 第 9 講)就是一步,但現在比較少用了。
Flow 和 diffusion 最後的分佈不同嗎?熵也不同嗎?(熵衡量分佈有多分散)· 76:31原則上都希望是資料分佈,所以是同一個分佈,熵也相同。但實際上有訓練誤差、模擬誤差,理論上相同的東西實際可能不同,之後的課會再談。
投影片 35–36 的圖:課務:要通過這門課,要來上課、做 Lab(必要);可以用講義和 office hours。Lab 1 當天開放。下一堂課在週四 11am–12:30pm,E25-111。
Lab 1:實作 Euler、Euler–Maruyama、布朗運動、OU,再用 Langevin 動力學做實驗。可以到課程網站取得。這一頁的 Demo C、D 就是它前半部分的簡化版。

和 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}}\),怎麼辦?
把主觀的「好」近似成「在資料分佈下機率高」,取樣就會傾向抽到好的。不知道密度公式沒關係,我們手上有資料集 \(z_1,\dots,z_N\sim p_{\text{data}}\),訓練時用它們代表分佈。
2. 256×256 的 RGB 影像,\(d\) 是多少?
\(256\times256\times3=196{,}608\)。
3. 驗算 \(X_t=x_0e^{2t}\) 是不是 \(u_t(x)=2x\) 的解。
初始條件:\(X_0=x_0\)。左邊 \(\frac{\mathrm d}{\mathrm dt}x_0e^{2t}=2x_0e^{2t}\);右邊 \(u_t(X_t)=2x_0e^{2t}\)。相等,是解。
4. 向量場、軌跡、flow 的輸入和輸出分別是什麼?
向量場:地點、時間 → 速度。軌跡:時間 → 位置。Flow:起點、時間 → 位置。
5. \(u(x)=2\sqrt x\) 為什麼不滿足定理的條件?會出什麼事?
\(u'(x)=1/\sqrt x\) 在 \(x\to0\) 時無界。從 \(x_0=0\) 出發,\(X_t=0\) 和 \(X_t=t^2\) 都是解,解不唯一,flow 無法定義。
6. 對 \(u(x)=-2x\)、\(x_0=1\),用 \(h=0.25\) 手算兩步 Euler,並和真解比較。
\(X_{0.25}=1+0.25(-2)=0.5\);\(X_{0.5}=0.5+0.25(-1)=0.25\)。真解 \(e^{-2\cdot0.5}=e^{-1}\approx0.3679\)。
7. 投影片的演算法寫「for \(i=1,\dots,n-1\)」,有什麼問題?
\(h=1/n\) 時,跑 \(n-1\) 次只走到 \(t=1-h\),卻說回傳 \(X_1\)。要跑 \(n\) 次,講義就是如此。
8. Flow model 的隨機性從哪裡來?Diffusion model 呢?
Flow model:只有起點 \(X_0\),ODE 本身是決定性的。Diffusion model:起點,加上每一步的 \(\sigma_t\sqrt h\,\epsilon\)。
9. 如果每步雜訊乘 \(h\),\(W_1\) 的變異數是多少?為什麼布朗運動要用 \(\sqrt h\)?
\(n\) 步、每步變異數 \(h^2\),合計 \(nh^2=h=1/n\),步數越多雜訊越消失。用 \(\sqrt h\):\(nh=1\),不隨步數改變。
10. 為什麼 \(\mathrm dX_t=u_t(X_t)\mathrm dt+\sigma_t\mathrm dW_t\) 不能除以 \(\mathrm dt\) 當成導數?
布朗運動處處不可微:\(\frac{W_{t+h}-W_t}{h}\) 的標準差是 \(1/\sqrt h\),\(h\to0\) 時爆掉。這個式子其實是第 14 節那段「下一步 = 目前位置 + \(hu_t(X_t)\) + \(\sigma_t(W_{t+h}-W_t)\) + 誤差」的簡寫。
11. \(u(x)=-x\)、\(\sigma=2\)、\(x_0=0\)、\(h=0.25\),抽到 \(\epsilon_0=1\)、\(\epsilon_1=-0.5\),算 \(X_{0.5}\)。
\(\sqrt h=0.5\)。\(X_{0.25}=0+0+2\times0.5\times1=1\)。\(X_{0.5}=1-0.25-0.5=0.25\)(三項依序是 \(X_{0.25}\)、\(h\,u\)、\(\sigma\sqrt h\,\epsilon_1\))。
12. OU 過程 \(\theta=0.25\)、\(\sigma=1\),長時間後的變異數是多少?\(\sigma\) 變兩倍呢?
\(\sigma^2/(2\theta)=1/0.5=2\)。\(\sigma\) 變兩倍,變異數變四倍,也就是 8。
13. 為什麼不直接訓練一個一步到位的網路?
老師的回答:問題在訓練。模擬 ODE 本身不是優點,它要多次呼叫網路。但到目前為止,還沒有穩定又可擴展的訓練演算法能做到一步;GAN 是一步的,但比較少用了。

延伸閱讀