MIT 6.S184 第 2 講 · Flow Matching
MIT 6.S184 · 第 2 講 · 2026 年 1 月 22 日

Flow Matching:把生成模型變成回歸問題

上一講只宣告了目標:\(X_1\sim p_{\text{data}}\)。這一講回答怎麼訓練。數學繞了一大圈,最後的演算法只有幾行:抽資料 \(z\)、抽雜訊 \(\epsilon\)、抽時間 \(t\),讓網路在 \(tz+(1-t)\epsilon\) 這一點輸出 \(z-\epsilon\)。

讀完這頁你應該能夠

  1. 畫出 flow matching 矩陣:機率路徑、向量場、損失,各有條件和邊際兩個版本,並指出哪些算得出來。
  2. 驗證高斯路徑 \(\mathcal N(\alpha_tz,\beta_t^2I_d)\) 滿足條件路徑的兩個要求。
  3. 從 \(\psi_t(x_0\mid z)=\alpha_tz+\beta_tx_0\) 推出條件向量場的公式。
  4. 解釋邊際向量場為什麼是「用後驗機率加權的平均」,並手算一個例子。
  5. 寫出連續方程,分清楚 \(-\operatorname{div}\) 是流入減流出,並一步一步證明邊際化技巧。
  6. 解釋 \(L_{\text{FM}}\) 算不出來、\(L_{\text{CFM}}\) 算得出來,以及為什麼最小化後者就等於最小化前者。
  7. 寫出訓練和取樣的演算法,說明 simulation-free 的意思和取樣慢的原因。

前置知識檢查

  • 上一講:flow model 的定義、flow 的兩個條件、Euler 法。
  • 高斯的線性變換:\(X\sim\mathcal N(0,I)\) 時,\(aX+b\sim\mathcal N(b,a^2I)\)。見補充課 A。
  • 條件機率與 Bayes 定理:\(p(z\mid x)=p(x\mid z)p(z)/p(x)\)。第 7 節會帶數字算。
  • 邊際化:\(p(x)=\int p(x\mid z)p(z)\,\mathrm dz\),也就是把各種 \(z\) 的可能性加總。
  • 散度和機率守恆:第 8 節會從頭講一次,想看更慢的版本見補充課 A 的散度和補充課 C 的盒子帳本。
  • 最小平方回歸和梯度下降:知道「用梯度下降讓網路輸出接近目標」就夠了。

這一頁怎麼讀、記號

老師兩次強調,第 9、12 節的證明不是通過這門課的必要條件,只是讓你看看研究時會怎麼推 34:26 65:03。第一次讀可以先看定理的陳述和例子。不過這一頁還是把每一步寫出來,想跟的話不用另外查。

逐字稿是 YouTube 自動字幕,有疑問時以黑板和投影片為準。部分學生的提問麥克風沒收到,那些問答的標題是從老師的重述和回答推測的。

記號意思
\(z\)一個資料點
\(\delta_z\)Dirac 分佈:抽出來永遠是 \(z\)
\(p_t(x\mid z)\)、\(p_t(x)\)條件、邊際機率路徑
\(u_t^{\text{target}}(x\mid z)\)、\(u_t^{\text{target}}(x)\)條件、邊際向量場;「target」表示這是訓練的目標
\(u_t^\theta(x)\)神經網路向量場
\(\alpha_t,\beta_t\)雜訊排程(noise scheduler);\(\dot\alpha_t,\dot\beta_t\) 是它們對 \(t\) 的導數
\(\partial_t\)對 \(t\) 偏微分,其他變數(例如 \(x\))不動
\(\mathbb E_{t,z,x}\)\(t\sim\mathrm{Unif}_{[0,1]}\)(0 到 1 之間均勻抽)、\(z\sim p_{\text{data}}\)、\(x\sim p_t(\cdot\mid z)\) 的期望值,黑板的簡寫
時間方向再提醒一次:\(t=0\) 是雜訊,\(t=1\) 是資料。CS236 和 DDPM 的 \(\alpha_t\) 意思也不同:DDPM 的 \(\bar\alpha_t\) 隨 \(t\) 變小。這裡的 \(\alpha_t\) 是資料的係數,隨 \(t\) 變大。

01訓練要做到什麼(投影片 1–4)

投影片 2–3 的圖:投影片 2 複習上一講:flow model 是 \(X_0\sim p_{\text{init}}\) 加 ODE,diffusion model 多一項 \(\sigma_t\mathrm dW_t\),取樣就是從 \(t=0\) 模擬到 \(t=1\)、回傳 \(X_1\)。投影片 3 寫出今天的目標:找到參數 \(\theta\),讓這個 ODE 的終點 \(X_1\sim p_{\text{data}}\)。

沒有訓練,模型只會輸出沒有意義的東西 01:08。所以問題是:

今天的問題怎麼找到 \(\theta\),讓 \(X_0\sim p_{\text{init}}\)、\(\frac{\mathrm d}{\mathrm dt}X_t=u_t^\theta(X_t)\) 的終點滿足 \(X_1\sim p_{\text{data}}\)?

這一講只處理 flow model。老師預告:數學不少,但最後的演算法非常簡單,「punchline 在最後」 01:38。

我們對資料分佈知道什麼?· 02:12不知道密度,只知道樣本,這就是生成模型的定義。另一種設定是有未正規化的密度(形狀對,但積分不等於 1)、沒有資料樣本,像 Markov chain Monte Carlo 處理的問題。我們這裡永遠有資料樣本,目標是學會產生新的樣本。

投影片筆誤:投影片 1 寫「IAP 2026 | Jan 22, 2025」,年份應該是 2026。

02Flow matching 矩陣(投影片 5)

老師自己取了這個名字,把整堂課要的東西排成 2×3 的表 02:42:

機率路徑向量場損失函數
條件(單一資料點)\(p_t(x\mid z)\)\(u_t^{\text{target}}(x\mid z)\)\(L_{\text{CFM}}\)
邊際(整個資料分佈)\(p_t(x)\)\(u_t^{\text{target}}(x)\)\(L_{\text{FM}}\)
投影片 5 的圖:同樣的 2×3 方格,下方註明「Conditional = 單一資料點」「Marginal = 跨資料點的分佈」。

先記住全局:我們真正要的是下面那一列,但它們都算不出來;上面那一列都有公式。這一講的魔法是證明:只用上面那一列訓練,就能學到下面那一列。

03條件機率路徑(投影片 6–7)

上一講只規定了兩端:\(t=0\) 是雜訊,\(t=1\) 是資料。中間呢?機率路徑就是把中間也規定好:每個時間 \(t\) 應該長什麼樣子 03:13。

投影片 6 的圖:上排是同一張圖片從雜訊漸漸變清楚;下排是一批手寫數字從雜訊變清楚。兩排都是從純雜訊到純資料的內插。

Dirac 分佈

先要一個最簡單的分佈。老師說 Dirac 有很多厲害的想法,但最簡單的分佈偏偏以他為名 04:16:

$$x\sim\delta_z\iff x=z$$

從 \(\delta_z\) 抽樣,永遠抽到 \(z\),完全沒有隨機性。它只是把「一個固定的點」寫成分佈的形式。

條件機率路徑

黑板:Dirac 分佈與條件機率路徑
板書(截自 46:00):\(z\in\mathbb R^d\) 是資料點;\(x\sim\delta_z\iff x=z\);條件機率路徑 \(p_t(x\mid z)\)(\(0\le t\le1\),\(x,z\in\mathbb R^d\));條件 P1 和 P2。
條件機率路徑 \(p_t(x\mid z)\) P1:對每個 \(t\) 和 \(z\),\(p_t(\cdot\mid z)\) 都是一個機率分佈。
P2:兩端固定:$$p_0(\cdot\mid z)=p_{\text{init}},\qquad p_1(\cdot\mid z)=\delta_z$$

重點:起點 \(p_{\text{init}}\) 和 \(z\) 無關,黑板上特別標了「ind of \(z\)」,也就是在起點完全不帶資料的資訊。終點則全部塌縮到 \(z\) 這一點。

投影片 7 的圖:五格紫底熱圖從 \(t=0\) 到 \(t=1\),中央的高斯光斑一格比一格小,最後在紅色箭頭標的 \(z\) 處變成一個點。

老師提醒:這是一個設計上的選擇,可以選不同的路徑,只是有一個例子特別重要 07:22。

04高斯路徑

黑板:高斯機率路徑
板書(11:31):noise schedulers \(\alpha_t,\beta_t\in\mathbb R\),滿足 \(\alpha_0=\beta_1=0\)、\(\alpha_1=\beta_0=1\);\(p_t(\cdot\mid z)=\mathcal N(\alpha_tz,\beta_t^2I_d)\);右上角框起來的最簡單選擇 \(\alpha_t=t\)、\(\beta_t=1-t\),右邊的小圖畫這兩條直線;下面是兩端的驗算,\(p_0(\cdot\mid z)=\mathcal N(0,I_d)\)、\(p_1(\cdot\mid z)=\mathcal N(z,0)=\delta_z\)。

實務上幾乎都用這個路徑。先選兩個自己定的函數,雜訊排程:

αt = tβt = 1 − tt = 0t = 110全是雜訊 → 全是資料
最簡單的排程:\(\alpha_t=t\)、\(\beta_t=1-t\)。老師說,想馬上固定下來就選這一組 08:55。
高斯條件路徑$$p_t(\cdot\mid z)=\mathcal N\big(\alpha_tz,\ \beta_t^2I_d\big)$$平均是資料乘 \(\alpha_t\),變異數由 \(\beta_t\) 決定。\(\alpha_t,\beta_t\) 要連續可微、單調,\(\alpha_0=\beta_1=0\),\(\alpha_1=\beta_0=1\)。

驗證 09:57:

  • P1:高斯是分佈,對。
  • \(t=0\):\(\mathcal N(0\cdot z,\ 1^2I_d)=\mathcal N(0,I_d)\),和 \(z\) 無關,對。這就是為什麼要求 \(\alpha_0=0\)、\(\beta_0=1\)。
  • \(t=1\):\(\mathcal N(z,0)\),平均 \(z\)、變異數 0,也就是永遠抽到 \(z\),即 \(\delta_z\),對。

怎麼抽樣

上一講用過的規則:標準高斯乘 \(\beta_t\) 再加上 \(\alpha_tz\),平均變成 \(\alpha_tz\),變異數變成 \(\beta_t^2\)。所以

$$x=\alpha_tz+\beta_t\epsilon,\qquad\epsilon\sim\mathcal N(0,I_d)$$
手算 \(d=1\),\(\alpha_t=t\),\(\beta_t=1-t\),\(z=4\),\(t=0.25\)。分佈是 \(\mathcal N(1,\ 0.75^2)\)。抽到 \(\epsilon=-1.2\) 時:\(x=0.25\times4+0.75\times(-1.2)\),也就是 \(1-0.9=0.1\)。
機率路徑就是內插嗎?· 11:29對。它是兩個分佈之間的內插:從想開始的分佈,到目前為止只是單一資料點。現在看起來有點無聊,因為誰會想走到一個已知的資料點?接下來會推廣。
排程不同,就是不同的路徑?· 12:05對。每一組滿足條件的 \(\alpha_t,\beta_t\) 都給一條機率路徑,所以這是一族路徑。之後再固定,現在它是設計上的選擇。
一句話帶走:條件路徑是「從高斯慢慢縮成一個點」,用 \(x=\alpha_tz+\beta_t\epsilon\) 就能抽樣。

05邊際機率路徑(投影片 8–12)

走到單一資料點沒什麼用。現在讓 \(z\) 變成隨機的 12:39:

黑板:邊際機率路徑
板書(46:00):\(z\sim p_{\text{data}},\ x\sim p_t(\cdot\mid z)\Rightarrow x\sim p_t\);P2 推出 \(p_0=p_{\text{init}}\)、\(p_1=p_{\text{data}}\);密度 \(p_t(x)=\int p_t(x\mid z)p_{\text{data}}(z)\,\mathrm dz\)。右上是小小的圖模型 \(z\to x\),右下是 \(x\) 指向三個資料點的草圖(第 7 節會用)。
zz ∼ pdatapt(·|z)(加雜訊)xx ∼ pt忘掉 z
抽樣分兩步:先抽資料,再加雜訊,然後忘掉 \(z\) 是誰。得到的 \(x\) 的分佈就是 \(p_t\)。
邊際機率路徑 抽樣:$$z\sim p_{\text{data}},\ x\sim p_t(\cdot\mid z)\ \Rightarrow\ x\sim p_t$$ 密度:$$p_t(x)=\int p_t(x\mid z)\,p_{\text{data}}(z)\,\mathrm dz$$

兩端會自動是我們要的 15:09:

  • \(t=0\):不管抽到哪個 \(z\),下一步都從 \(p_{\text{init}}\) 抽,等於 \(z\) 沒用到,所以 \(p_0=p_{\text{init}}\)。
  • \(t=1\):抽到 \(z\) 後,下一步從 \(\delta_z\) 抽,得到的就是 \(z\) 本身,所以 \(p_1=p_{\text{data}}\)。

這樣就有了一條從高斯到資料分佈的路徑。老師再次強調,這只是一個建構、一個設計選擇,還沒有談怎麼走。

投影片 9–10 的圖:投影片 9 把紅點 \(z\) 改成 \(z\sim p_{\text{data}}\),資料是棋盤圖案。投影片 10 上排是條件路徑,下排是邊際路徑:從中央的高斯光斑,慢慢分裂成棋盤格。
兩邊的「知道」不一樣。我們能抽樣 \(p_t\)(拿一筆資料,加雜訊),但算不出密度 \(p_t(x)\):那個積分要對所有可能的資料積,而 \(p_{\text{data}}\) 我們沒有公式。這個差別在整堂課都很關鍵。
公式裡的 \(p_{\text{data}}(z)\) 我們不知道吧?· 16:40對,不知道,不能在 \(z\) 上算它的值,但可以從它抽樣。接下來會看到,這樣還是能學會從它取樣。
手算:兩個資料點 \(d=1\),資料只有 \(z_1=2\)、\(z_2=-2\),機率各 0.5,用 \(\alpha_t=t\)、\(\beta_t=1-t\)。此時積分變成加總。\(t=0.5\),標準差 0.5,平均分別是 1 和 −1: $$\begin{aligned}p_{0.5}(x)=\ &0.5\,\mathcal N(x;1,0.5^2)\\+\ &0.5\,\mathcal N(x;-1,0.5^2)\end{aligned}$$ 在 \(x=0.5\):\(\mathcal N(0.5;1,0.25)\approx0.4839\),\(\mathcal N(0.5;-1,0.25)\approx0.0089\),所以 \(p_{0.5}(0.5)\approx0.2464\)。這個例子第 7 節還會用到。
投影片 8 的圖:黑底上一團綠色粒子,動畫裡每一格粒子都跳來跳去。紅字註明:機率路徑只規定每個時刻的邊際分佈(快照),完全沒有說單一粒子怎麼隨時間移動,沒有動力學。

投影片 11、12 是逐步填滿的總表,只填到路徑這一格;投影片 21、22、33、34 是之後的版本,內容在第 16 節。

一句話帶走:先抽資料再加雜訊,就能從邊際路徑抽樣;它從高斯走到資料分佈,但密度算不出來。

Demo A機率路徑

怎麼看:藍點是 1,500 個樣本 \(x=\alpha_tz+\beta_t\epsilon\),橘線是其中一個粒子的路徑。資料是 \(4\times4\) 的棋盤。
  • 切換條件/邊際,拖動 \(t\):條件路徑縮成綠點,邊際路徑從高斯變成棋盤。
  • 讀數的「公式」:條件路徑的變異數是 \(\beta_t^2\),邊際路徑是 \(\alpha_t^2\mathrm{Var}(z)+\beta_t^2\)。預設 \(t=0.6\) 的邊際路徑:模擬 1.268,公式 \(0.36\times2.985+0.16=1.235\);條件路徑:模擬 0.163,公式 0.160。
  • 打開每個時刻重抽 \(\epsilon\):藍點的分佈完全不變,但橘色粒子開始亂跳。這就是投影片 8 的意思:路徑只規定快照。粒子要怎麼走,是向量場的事,下一節才講。
  • 切換排程:兩端相同,中間的形狀不同。

06條件向量場(投影片 13–15)

現在加入動力學。我們要找向量場,讓粒子真的照路徑走 18:41。先從單一資料點開始。

條件向量場 \(u_t^{\text{target}}(x\mid z)\)任何滿足下面這件事的向量場: $$\begin{gathered}X_0\sim p_{\text{init}}\\\frac{\mathrm d}{\mathrm dt}X_t=u_t^{\text{target}}(X_t\mid z)\\\Rightarrow\ X_t\sim p_t(\cdot\mid z)\end{gathered}$$ 也就是說,從高斯出發照這個 ODE 走,每個時間的分佈都剛好是條件路徑。

注意 \(z\) 在這裡是固定的參數,每個資料點有自己的一個向量場。

高斯路徑的公式

條件高斯向量場$$\begin{aligned}u_t^{\text{target}}(x\mid z)=\ &\Big(\dot\alpha_t-\frac{\dot\beta_t}{\beta_t}\alpha_t\Big)z\\&+\frac{\dot\beta_t}{\beta_t}x\end{aligned}$$

老師說他自己也總是記不住這個公式,不用背 21:42。要記得的是它的形狀:\(z\) 和 \(x\) 的線性組合,係數由排程決定。下面推導它。

投影片 13 的圖:公式加兩步的證明概要:Step 1 檢查 flow 是 \(\psi_t(x_0\mid z)=\alpha_tz+\beta_tx_0\);Step 2 起點隨機時 \(X_t\sim\mathcal N(\alpha_tz,\beta_t^2I_d)\)。

推導

想法:不要直接找向量場,先找一個會產生正確分佈的搬動規則,再反推速度。抽樣公式已經告訴我們答案:起點 \(x_0\) 在時間 \(t\) 應該搬到

$$\psi_t(x_0\mid z)=\alpha_tz+\beta_tx_0$$

第一步:它給出正確的分佈。令 \(X_t=\psi_t(X_0\mid z)\),\(X_0\sim\mathcal N(0,I_d)\)。高斯的線性變換還是高斯,平均平移 \(\alpha_tz\),變異數乘 \(\beta_t^2\),所以 \(X_t\sim\mathcal N(\alpha_tz,\beta_t^2I_d)=p_t(\cdot\mid z)\)。 24:12

第二步:從 flow 反推向量場。上一講 flow 的定義是 \(\frac{\mathrm d}{\mathrm dt}\psi_t=u_t(\psi_t)\)。對 \(\alpha_tz+\beta_tx_0\) 微分:

$$\dot\alpha_tz+\dot\beta_tx_0=u_t^{\text{target}}\big(\alpha_tz+\beta_tx_0\mid z\big)$$

括號裡是粒子目前的位置,叫它 \(x=\alpha_tz+\beta_tx_0\)。我們要的是用 \(x\) 表示的向量場,所以把 \(x_0\) 解出來:\(x_0=(x-\alpha_tz)/\beta_t\),代回左邊:

$$\begin{aligned}u_t^{\text{target}}(x\mid z)&=\dot\alpha_tz+\dot\beta_t\cdot\frac{x-\alpha_tz}{\beta_t}\\&=\Big(\dot\alpha_t-\frac{\dot\beta_t}{\beta_t}\alpha_t\Big)z\\&\quad+\frac{\dot\beta_t}{\beta_t}x\end{aligned}$$

出處:講義 §3.2 的高斯例子。投影片的概要是「檢查 ODE」;講義是從 flow 推回來,方向相反但內容相同。除以 \(\beta_t\) 要求 \(\beta_t\neq0\),也就是 \(t\lt1\)。

手算:直線排程 \(\alpha_t=t\)、\(\beta_t=1-t\),所以 \(\dot\alpha_t=1\)、\(\dot\beta_t=-1\)。代入: $$\begin{aligned}&u_t^{\text{target}}(x\mid z)\\&=\Big(1+\frac{t}{1-t}\Big)z-\frac{x}{1-t}\\&=\frac{z-x}{1-t}\end{aligned}$$ 意思很直觀:離終點還有 \(z-x\) 這麼遠,剩下 \(1-t\) 的時間,所以速度是兩者相除。
取 \(d=1\)、\(z=2\)、\(x_0=-1\)、\(t=0.5\):位置 \(x=0.5\times2+0.5\times(-1)=0.5\);速度 \((2-0.5)/0.5=3\)。而 \(\psi_t\) 的導數是 \(\dot\alpha_tz+\dot\beta_tx_0=2+1=3\)。兩者相等。
zt = 0:N(0, I)t 越大,圈越小、越靠近 z
直線排程下,每個起點都沿直線走向 \(z\)。整團高斯一邊移動一邊縮小,\(t=1\) 時塌成一點。
投影片 14–15 的圖:投影片 14 畫一串同心圓從左邊的大高斯縮小,一路走到右邊的黑點 \(z\)。投影片 15 是動畫:藍色箭頭是條件向量場,紅色方格被帶著走,粒子團塌向一點。

老師指出一個漂亮的事實:把高斯推成一個點的向量場,對 \(x\) 只是線性函數,而且他推測這是高斯特有的性質,但也說自己不完全確定 24:43。這個公式就是之後的訓練目標。

動畫裡的高斯為什麼變成圓環?· 25:43這是繪圖造成的假象,畫的是密度的等高線。
這個向量場有什麼用?· 26:15到目前為止沒有用。你應該懷疑:這只是在生成我們早就知道的點 \(z\)。但接下來會把它當成積木,用來生成整個資料分佈。
一句話帶走:條件向量場有公式,它只是 \(z\) 和 \(x\) 的線性組合。直線排程下就是 \((z-x)/(1-t)\)。

07邊際向量場(投影片 16–18)

現在做最關鍵的一步:用條件向量場造出會生成整個分佈的向量場 27:15。

黑板:邊際向量場與邊際化定理
板書(截自 64:00):邊際向量場的公式,標出 cond VF 和 posterior。下方是定理(Marginalization Trick):\(X_0\sim p_{\text{init}}\)、沿 \(u_t^{\text{target}}\) 走 \(\Rightarrow X_t\sim p_t\),右邊框起來的是 \(X_1\sim p_{\text{data}}\)。
板書的小疏漏:黑板寫成「\(\mathrm d\,u_t^{\text{target}}(X_t)\mathrm dt\)」,漏了「\(\mathrm dX_t=\)」。應該是 \(\mathrm dX_t=u_t^{\text{target}}(X_t)\,\mathrm dt\)。
邊際向量場 $$\begin{aligned}&u_t^{\text{target}}(x)\\&=\int\underbrace{u_t^{\text{target}}(x\mid z)}_{\text{條件向量場}}\\&\qquad\cdot\underbrace{\frac{p_t(x\mid z)\,p_{\text{data}}(z)}{p_t(x)}}_{\text{後驗 }p_t(z\mid x)}\mathrm dz\end{aligned}$$

讀懂這個公式

分數那一項就是 Bayes 定理 28:48:\(p_{\text{data}}(z)\) 是先驗,\(p_t(x\mid z)\) 是概似,分母是正規化。它回答:我現在在 \(x\),這個 \(x\) 有多可能是從 \(z\) 這張圖加雜訊來的?

老師的說法 29:49:你是位置 \(x\) 上的粒子,不知道自己的目的地。每個資料點都可能是你的來源,於是逐一檢查 \(z_1,z_2,z_3,\dots\),每個都有一個「走向它」的方向,再用你相信它的程度加權平均。所以這是一個條件期望值:

$$u_t^{\text{target}}(x)=\mathbb E\big[u_t^{\text{target}}(x\mid z)\ \big|\ x\big]$$
z₁(0.62)z₂(0.28)z₃(0.10)x藍色:加權平均 = 邊際向量場
橘色是走向各資料點的方向,粗細代表後驗機率。藍色是加權平均。這就是黑板右上角那張草圖的意思。
手算:接續第 5 節的兩個資料點 \(z_1=2\)、\(z_2=-2\)、\(t=0.5\)、\(x=0.5\)。
  1. 走向各資料點的速度,用 \((z-x)/(1-t)\):走向 \(z_1\) 是 \((2-0.5)/0.5=3\);走向 \(z_2\) 是 \((-2-0.5)/0.5=-5\)。
  2. 後驗:分子各是 \(0.5\times0.4839=0.2420\) 和 \(0.5\times0.0089=0.0044\),除以兩者的和 0.2464,得到 0.982 和 0.018。
  3. 加權平均:\(0.982\times3+0.018\times(-5)\),約等於 \(2.856\)。
\(x=0.5\) 比較靠近 \(z_1\) 那一團,所以幾乎完全相信自己要去 \(z_1\)。如果 \(x=0\),兩者對稱,後驗各 0.5,速度 \(0.5\times4+0.5\times(-4)=0\),粒子暫時不動。

定理

邊際化技巧(Marginalization Trick) $$\begin{gathered}X_0\sim p_{\text{init}},\quad\frac{\mathrm d}{\mathrm dt}X_t=u_t^{\text{target}}(X_t)\\\Rightarrow\ X_t\sim p_t\quad(0\le t\le1)\end{gathered}$$ 特別地,\(X_1\sim p_{\text{data}}\):\(u_t^{\text{target}}\) 把雜訊變成資料。

老師說,這大概是這些模型的核心。我們其實只在乎 \(t=1\) 那一刻,但定理保證整條路都對 32:24。條件向量場就像樂高積木,拼出能完成任務的東西。這裡的「拼」是數學上的建構,還沒有學,但現在知道要學什麼了 32:54。

投影片 16–18 的圖:投影片 16、17 是上一講看過的玩具例子(高斯變成扭曲的雙峰形狀),現在知道那個動畫就是邊際向量場的 flow。投影片 18 是 2×3 的小圖,分條件和邊際兩列,各列是 Ground truth、ODE samples、ODE Trajectories,顯示模擬 ODE 得到的分佈和真實路徑相同。影片沒有停在投影片 18,它對應講義 §3.2 的圖。
一句話帶走:邊際向量場 = 所有「走向資料點」的方向,用後驗機率加權平均。它把高斯帶到資料分佈,但裡面的積分算不出來。

Demo B後驗加權平均

怎麼看:三個綠點是資料,先驗機率 0.5、0.3、0.2。黑點是你的位置 \(x\),點一下畫面就能移動它。橘色箭頭走向各資料點,越粗代表後驗越大;藍色粗箭頭是加權平均,也就是 \(u_t^{\text{target}}(x)\)。紫色虛線是沿這個向量場走到 \(t=1\) 的路徑。灰色小箭頭只顯示場的方向。橘色和藍色箭頭的長度有依時間縮放,方便畫在畫面上。
  • 把 \(t\) 拉到 0:後驗變回先驗 0.500、0.300、0.200,因為 \(t=0\) 時的 \(x\) 不帶任何資料的資訊。此時場是 \((-0.700,0.350)\),正是資料的平均減 \(x\)(自我測驗第 12 題)。
  • 預設位置 \((0.4,0.6)\) 在 \(t=0.5\) 時後驗是 0.081、0.909、0.010,已經幾乎認定是 \(z_2\);\(t=0.9\) 時是 0.000、1.000、0.000。\(t\) 越大,\(x\) 帶的資訊越多,平均就越接近單一方向。
  • 點不同的位置,看紫線通往哪一個資料點。它走的不是直線,這和條件向量場不同。

08連續方程(投影片 19–20)

要證明定理,需要一個工具把「粒子照 ODE 走」和「密度怎麼變」連起來。這就是連續方程 34:57。

連續方程給定 \(X_0\sim p_{\text{init}}=p_0\)、\(\frac{\mathrm d}{\mathrm dt}X_t=u_t(X_t)\),則 $$\begin{gathered}X_t\sim p_t\ \ (0\le t\le1)\\\iff\ \partial_tp_t(x)=-\operatorname{div}(p_tu_t)(x)\end{gathered}$$ 對所有 \(x\) 和 \(t\) 成立。

散度的定義:把每個分量對自己的座標偏微分,再加起來。

$$\operatorname{div}(v_t)(x)=\sum_{i=1}^d\frac{\partial}{\partial x_i}v_t^i(x)$$
投影片 19–20 的圖:投影片 19 上面的框是「跟著機率路徑」,下面的框是「連續方程成立」,旁邊的雙箭頭寫 equivalent。投影片 20 畫一個小方框 \(x\),下方箭頭標 Inflow 指入,上方箭頭標 Outflow 指出,背景是向量場的流線。
投影片和口頭的正負號講反了。投影片 20 在 \(-\operatorname{div}(p_tu_t)\) 下面寫「Outflow − inflow」,老師也說散度是流入減流出、負散度是流出減流入 36:29。正確的是相反:散度是流出減流入,\(-\operatorname{div}\) 才是流入減流出。講義的文字也是這樣寫的。下面用數字確認:流入比流出多時,密度應該增加。

像會計一樣記帳

老師的比喻是對的:像會計一樣,看流進多少、流出多少 35:59。取一維、一個很小的盒子 \([a,a+\Delta]\)。粒子以速度 \(u\) 移動,每單位時間通過某個位置的機率是 \(p\cdot u\),這叫機率通量:密度越大、速度越快,流過的就越多;沒有機率的地方就沒有東西可流。

流入p·u = 0.40流出p·u = 0.45盒子寬 0.1流入 − 流出 = −0.05,盒內的機率在減少
左邊 \(p=0.4,u=1\),流入 0.40;右邊 \(p=0.3,u=1.5\),流出 0.45。流出比較多,盒子裡的機率每單位時間少 0.05。
  1. 帳本:盒子裡的機率約等於 \(p\Delta\),它的變化率等於流入減流出: $$\partial_tp\cdot\Delta=(pu)(a)-(pu)(a+\Delta)$$
  2. 除以 \(\Delta\),取 \(\Delta\to0\):右邊正是導數的定義再加一個負號, $$\partial_tp=-\frac{\partial}{\partial x}(pu)$$
  3. 代數字:\(\Delta=0.1\),\(-\frac{0.45-0.40}{0.1}=-0.5\),所以密度每單位時間降 0.5。
  4. 多維:每個座標方向都有一筆這樣的帳,加起來就是散度。
手算:用真的高斯驗算 \(z=0\)、\(p_t=\mathcal N(0,\sigma^2)\)、\(\sigma=1-t\)、\(u=-x/\sigma\)(往中心縮)。在 \(t=0.5\)、\(x=0\),也就是正中央:
  • 左邊:高斯在中央的高度是 \(p=\frac{1}{\sigma\sqrt{2\pi}}\),\(\partial_tp=\frac{1}{\sigma^2\sqrt{2\pi}}\)(\(\sigma\) 每單位時間減 1)。代入 \(\sigma=0.5\),得 \(1.596\)。
  • 右邊:\(pu=-xp/\sigma\)。在 \(x=0\) 對 \(x\) 微分,只有微到 \(x\) 那一項留下,得 \(-p/\sigma\)。所以 \(-\partial_x(pu)=p/\sigma\),也就是 \(0.7979/0.5=1.596\)。
兩邊相等,而且是正的:粒子往中央集中,中央的密度增加。流入多於流出,符號也對。

延伸:補充課 C 的盒子帳本有完整的推導;補充課 A 的散度解釋為什麼「偏導數的和」就是淨流出,老師也說他很久都沒有好的直覺 40:53。「流入、流出」和散度的關係不必一次想通。講義附錄有定理本身的證明。

一句話帶走:密度的變化 = 流入 − 流出 = \(-\operatorname{div}(p_tu_t)\)。要驗證粒子跟著路徑走,只要驗證這條方程。

09邊際化技巧的證明

黑板:邊際化技巧的證明
板書(43:40):右上是散度的定義;下面三行就是證明。中間那行的括號裡,分子分母都乘了 \(p_t(x)\),底下的大括號標著 \(u_t^{\text{target}}\)。

靠連續方程,我們只要證明 \(u_t^{\text{target}}\) 和 \(p_t\) 滿足 \(\partial_tp_t=-\operatorname{div}(p_tu_t^{\text{target}})\)。從左邊開始 38:18。這裡唯一的已知是:條件路徑滿足連續方程,因為條件向量場就是為此而造的。

  1. 代入 \(p_t\) 的定義: $$\partial_tp_t(x)=\partial_t\int p_t(x\mid z)\,p_{\text{data}}(z)\,\mathrm dz$$
  2. 交換微分和積分:\(p_{\text{data}}(z)\) 不含 \(t\),老師說這在這裡的正則條件(函數夠平滑)下可以做 38:49: $$=\int\partial_tp_t(x\mid z)\,p_{\text{data}}(z)\,\mathrm dz$$
  3. 對條件路徑用連續方程 39:21: $$\begin{aligned}=\int&-\operatorname{div}\big(p_t(\cdot\mid z)\\&\quad u_t^{\text{target}}(\cdot\mid z)\big)(x)\,p_{\text{data}}(z)\,\mathrm dz\end{aligned}$$
  4. 把散度移到積分外:散度只是對 \(x\) 的偏導數相加,而積分是對 \(z\),所以可以交換 41:53: $$\begin{aligned}=-\operatorname{div}\Big(\int&p_t(x\mid z)\,u_t^{\text{target}}(x\mid z)\\&\cdot p_{\text{data}}(z)\,\mathrm dz\Big)\end{aligned}$$
  5. 乘上再除以 \(p_t(x)\),其實就是乘 1 42:24: $$\begin{aligned}=-\operatorname{div}\Big(&p_t(x)\int u_t^{\text{target}}(x\mid z)\\&\cdot\frac{p_t(x\mid z)\,p_{\text{data}}(z)}{p_t(x)}\mathrm dz\Big)\end{aligned}$$
  6. 認出積分就是邊際向量場 42:54: $$=-\operatorname{div}\big(p_t\,u_t^{\text{target}}\big)(x)$$

頭尾正是連續方程,證畢。順序其實是反過來的:老師說,邊際向量場的公式正是這樣得到的 43:25。走到第 4 步,我們需要把括號寫成 \(p_t\times\)某個東西,那個東西就是定義。後驗不是天外飛來,是為了讓這一步成立。

課堂問答

為什麼是後驗,不直接對 \(p_{\text{data}}(z)\) 平均?· 45:29如果只對 \(p_{\text{data}}(z)\) 平均,等於忽略一項資訊:你知道自己現在在 \(x\)。你應該把一切都以這件事為條件。\(p_{\text{data}}\) 可以看成先驗,先驗不知道你在哪裡;有了 \(x\) 才能用 Bayes 定理更新對乾淨資料的信念。下面的 Demo C 可以直接比較兩者。
這就是 Bayesian update 嗎?· 46:30對,這就是 Bayesian update:給定 \(x\),當成觀察到的資料,更新對乾淨資料的信念。老師說這正是這個想法的精髓。
\(p_t(x\mid z)\) 只是在量距離,後驗有什麼有趣的?· 47:01\(p_t(x\mid z)\) 的 log 確實只是平方距離,但這裡要對所有可能的 \(z\) 邊際化,沒有固定資料點。所以後驗取決於資料分佈的形狀,而這正是我們要建模的東西。
滿足連續方程的向量場是唯一的嗎?· 48:05不是。固定 \(p_t\),可以有無限多個不同的向量場滿足它:方程是線性的,兩個解的凸組合(權重和為 1 的加權平均)還是解。這套方法關鍵的一步是明確地建構要學的那一個,也就是邊際向量場,不是隨便選一個。
反過來,向量場決定路徑嗎?· 49:07也不唯一。例子:\(u_t\) 處處是 0,那麼任何靜止不變的分佈都滿足方程,可以是高斯,也可以是別的。(投影片 19 的等價關係另外固定了起點,轉述者補充:起點固定之後,在定理的條件下 ODE 的解唯一,路徑也就定了。)
我們的向量場唯一嗎?· 50:13我們的邊際向量場是唯一的,因為公式把它明確定下來了。條件向量場可能不唯一。但核心是我們的選擇行得通,其他選項存不存在,我們可以接受不管。
投影片 23 的圖:兩段 Meta MovieGen 的影片:溫泉裡的猴子、衝浪的無尾熊(PDF 只留下動畫第一格,所以看起來是模糊的動物臉)。紅框寫:這些影片是模擬學到的邊際向量場的 ODE 生成的。老師用它提醒,這不是抽象的數學 50:45。
一句話帶走:對條件路徑用連續方程,把散度移到積分外,再乘除 \(p_t(x)\),邊際向量場就自己出現了。

Demo C為什麼要用後驗

怎麼看:一維資料只有兩個點 \(-2\)(機率 0.7)和 \(1.5\)(機率 0.3)。上圖:黑線是真正的 \(p_t\),橘色直方圖是 4,000 個粒子從高斯出發,沿所選向量場模擬到 \(t\) 的結果。下圖:藍線是 \(\partial_tp_t\),橘色虛線是 \(-\partial_x(p_tu_t)\)。連續方程成立時,兩條線疊在一起。
  • 用後驗(預設 \(t=0.6\)):兩條線完全重合,最大差距 \(7.2\times10^{-6}\),全場最大值 2.70;粒子直方圖貼著黑線,總變異距離(兩個分佈差的絕對值積分再除以 2,0 是相同、1 是完全不重疊)0.032,主要是抽樣誤差。
  • 用先驗,就是課堂上那位學生問的版本:\(t=0.6\) 時差距 2.8,和方程本身一樣大,總變異距離 0.598;\(t=0.9\) 時是 1.000。此時向量場是 \((\bar z-x)/(1-t)\),\(\bar z=-0.95\) 是資料的平均,所有粒子都衝向這個平均,根本不是任何一筆資料。\(t=0\) 時兩者相同(差距 \(2\times10^{-7}\)),因為那時後驗就等於先驗。

10兩個損失函數

終於到機器學習了。目標是讓 \(u_t^\theta\approx u_t^{\text{target}}\) 53:09。要學一個函數,最直接就是回歸。

黑板:FM 和 CFM 損失
板書(64:00):「3.3 Flow Matching:Learn marginal vector field」。Flow matching loss 旁邊打了 ✗ Tractable、✓ Minimizer;Conditional FM loss 旁邊打了 ✓ Tractable、✓ Minimizer,後面的勾是定理證完才補上的。
Flow matching 損失(想要的) $$\begin{aligned}&L_{\text{FM}}(\theta)\\&=\mathbb E_{t,z,x}\Big[\big\Vert u_t^\theta(x)-u_t^{\text{target}}(x)\big\Vert^2\Big]\end{aligned}$$ 其中 \(t\sim\mathrm{Unif}_{[0,1]}\)、\(z\sim p_{\text{data}}\)、\(x\sim p_t(\cdot\mid z)\)。

期望值的三步在程式裡就是 56:56:隨機挑時間,從資料集隨機拿一張圖,加一點雜訊。老師說這是在確保向量場在所有時間都對。

好消息:最小值點一定是 \(u_t^\theta=u_t^{\text{target}}\),因為兩者相等時損失是 0。壞消息:算不出來,\(u_t^{\text{target}}(x)\) 裡的積分要走過整個資料分佈 54:54。

老師的邏輯:做不到想做的事,就想想能做什麼。我們能算條件向量場,於是直接把目標換掉 55:55:

條件 flow matching 損失(算得出來的) $$\begin{aligned}&L_{\text{CFM}}(\theta)\\&=\mathbb E_{t,z,x}\Big[\big\Vert u_t^\theta(x)\\&\qquad-u_t^{\text{target}}(x\mid z)\big\Vert^2\Big]\end{aligned}$$

只差在目標有沒有「\(\mid z\)」。可是這看起來很可疑:我們要的是邊際,卻在回歸條件的,最小值點是什麼?

11只差一個常數

定理$$L_{\text{FM}}(\theta)=L_{\text{CFM}}(\theta)+C$$\(C\) 不依賴 \(\theta\)。

老師稱這大概是所有這些模型的主要結論 58:57。圖上看,兩條曲線形狀一樣,只是上下平移:

黑板:定理的兩個推論和損失曲線
板書(64:00):① 梯度相同;② \(\theta^*\) 是 CFM 的最小值點時,\(u_t^{\theta^*}=u_t^{\text{target}}\)。右邊畫兩條曲線,處處相差 \(C\),最低點在同一個 \(\theta^*\)。
CCθ*(同一個最小值點)LCFMLFMθ
重畫黑板的圖。最低點的高度不同,但位置相同。實際上 \(L_{\text{CFM}}\) 在上面(\(C\lt0\)),理由見下面的手算。

兩個推論正是訓練需要的全部 60:59:

  1. 梯度相同:常數的梯度是 0,所以 \(\nabla_\theta L_{\text{FM}}=\nabla_\theta L_{\text{CFM}}\)。訓練只需要梯度。
  2. 最小值點相同:最小值不同,但達成最小值的 \(\theta\) 相同,而那正是 \(u_t^{\theta^*}=u_t^{\text{target}}\)(假設網路表達力足夠)。
手算:為什麼回歸會自動取平均 固定 \(t\) 和 \(x\),只看這一點。假設後驗是 0.75 機率的目標 \(+2\),0.25 機率的目標 \(-2\)(\(d=1\))。網路在這裡輸出一個數 \(v\):
  • 條件損失:\(0.75(v-2)^2+0.25(v+2)^2\),展開是 \(v^2-2v+4\)。
  • 邊際目標:平均是 \(0.75\times2+0.25\times(-2)=1\),邊際損失是 \((v-1)^2=v^2-2v+1\)。
相減正好是常數:條件損失 \(=\) 邊際損失 \(+3\),也就是這一點的 \(C=-3\)。兩個都在 \(v=1\) 最小。網路同一個 \(x\) 只能輸出一個值,被 \(+2\) 和 \(-2\) 兩個目標拉扯,平方損失的答案就是平均。
也因此 \(L_{\text{CFM}}\) 不會降到 0:最好的情況,\(v=1\) 時還剩 3,那是目標本身的變異數。損失的絕對值沒有意義,不能拿「還沒到 0」當作沒訓練好(這段是轉述者的補充)。
一句話帶走:我們從來沒看過邊際向量場,卻能學到它。只要用算得出來的條件目標做回歸,平方損失會自動幫你平均。

12定理的證明

黑板:定理的證明
板書(71:00):\(\Vert a-b\Vert^2=\Vert a\Vert^2-2a^Tb+\Vert b\Vert^2\) 套到兩個損失,兩邊相同的 \(\Vert u_t^\theta\Vert^2\) 劃掉,和 \(\theta\) 無關的 \(\Vert u^{\text{target}}\Vert^2\) 也劃掉。最後寫「Middle terms: Plug in formulas」和一個方塊,代表證畢。

證明的想法很簡單:展開平方,留下會隨 \(\theta\) 改變的東西,比較它們 65:35。

第一步:展開。用 \(\Vert a-b\Vert^2=\Vert a\Vert^2-2a^Tb+\Vert b\Vert^2\)(\(a^Tb\) 是內積:對應分量相乘再加總):

$$\begin{aligned}L_{\text{FM}}=\mathbb E_{t,z,x}\big[&\Vert u_t^\theta(x)\Vert^2\\&-2u_t^\theta(x)^Tu_t^{\text{target}}(x)\\&+\Vert u_t^{\text{target}}(x)\Vert^2\big]\end{aligned}$$ $$\begin{aligned}L_{\text{CFM}}=\mathbb E_{t,z,x}\big[&\Vert u_t^\theta(x)\Vert^2\\&-2u_t^\theta(x)^Tu_t^{\text{target}}(x\mid z)\\&+\Vert u_t^{\text{target}}(x\mid z)\Vert^2\big]\end{aligned}$$

第二步:比較三項 67:59。

  • 第一項兩邊一模一樣。
  • 第三項都不含 \(\theta\),只是常數。把它們的差叫 \(C\): $$\begin{aligned}C=\ &\mathbb E\Vert u_t^{\text{target}}(x)\Vert^2\\&-\mathbb E\Vert u_t^{\text{target}}(x\mid z)\Vert^2\end{aligned}$$
  • 剩下要證明的只有中間項相等。

第三步:中間項。老師說「只要代入公式」,講義寫出了細節。固定 \(t\),把 \(L_{\text{FM}}\) 的中間項寫成積分(這一項不含 \(z\),所以對 \(x\sim p_t\) 積就夠):

$$\int p_t(x)\,u_t^\theta(x)^Tu_t^{\text{target}}(x)\,\mathrm dx$$ $$\begin{aligned}=\int&p_t(x)\,u_t^\theta(x)^T\\&\cdot\Big[\int u_t^{\text{target}}(x\mid z)\\&\quad\cdot\frac{p_t(x\mid z)p_{\text{data}}(z)}{p_t(x)}\mathrm dz\Big]\mathrm dx\end{aligned}$$ $$\begin{aligned}=\iint&u_t^\theta(x)^Tu_t^{\text{target}}(x\mid z)\\&\cdot p_t(x\mid z)\,p_{\text{data}}(z)\,\mathrm dz\,\mathrm dx\end{aligned}$$

第一個等號代入邊際向量場的定義。第二個等號的 \(p_t(x)\) 上下消掉,積分換順序。最後的 \(p_t(x\mid z)p_{\text{data}}(z)\) 正是「先抽 \(z\) 再抽 \(x\)」的機率,所以它等於 \(\mathbb E_{z,x}[u_t^\theta(x)^Tu_t^{\text{target}}(x\mid z)]\),也就是 \(L_{\text{CFM}}\) 的中間項。對 \(t\) 再取期望值,證畢。

整個證明的關鍵就在這裡:邊際向量場分母的 \(p_t(x)\) 剛好和期望值的 \(p_t(x)\) 消掉。

\(L_{\text{FM}}\) 的期望值要包含 \(z\) 嗎?· 70:03對,要有 \(z\),雖然式子裡沒出現 \(z\),可以把它邊際掉,寫成從 \(p_t\) 抽 \(x\),是同一件事。學生指出可以寫得更簡潔,老師說他這樣寫是教學上的選擇,讓兩個損失看起來只差在目標。

出處:講義 §3.3 的 Theorem 與 Direct Proof。

13訓練演算法(投影片 24)

投影片 24 的圖:Algorithm 3:對每個 mini-batch(一小批資料),抽一筆資料 \(z\)、抽 \(t\sim\mathrm{Unif}_{[0,1]}\)、抽 \(x\sim p_t(\cdot\mid z)\)、計算 \(\mathcal L(\theta)=\Vert u_t^\theta(x)-u_t^{\text{target}}(x\mid z)\Vert^2\),再用梯度下降更新。

老師的讚嘆 64:32:這把生成模型變成了回歸。訓練深度網路該怎麼做就怎麼做,什麼都沒變。

Simulation-free我們在訓練一個 flow model,訓練時卻從來沒有模擬過 ODE。每一步只要呼叫一次網路,對著目標回歸。

這正是這類方法革命性的地方 71:33。在這些論證出現之前,沒有人知道怎麼這樣訓練 flow model,得把軌跡滾過很多步才能算損失,非常昂貴。

延伸:這也是和 CS236 第 8 講提到的 Neural ODE 的差別,Neural ODE 訓練時要解 ODE,見書 B11。而「條件目標可以取代邊際目標」的結構,和 CS236 第 13 講的 denoising score matching 是同一招,下一講會再遇到。

一句話帶走:抽資料、抽時間、加雜訊,對條件向量場做回歸。訓練時完全不用模擬 ODE。

14高斯路徑與直線排程(投影片 25–30)

有學生問「抽 \(x\)」實際上是什麼意思,老師說這正好接到下一張投影片 73:04。

投影片 25 的圖:上面列出 \(\mathcal N(\alpha_tz,\beta_t^2I_d)\)、條件向量場、抽樣方式;下面把抽樣代進 CFM 損失,三行等式最後標出「noise+data」和「velocity」。

代入 \(x=\alpha_tz+\beta_t\epsilon\) 後,條件向量場大幅簡化:

$$\begin{aligned}&u_t^{\text{target}}(x\mid z)\\&=\Big(\dot\alpha_t-\frac{\dot\beta_t}{\beta_t}\alpha_t\Big)z+\frac{\dot\beta_t}{\beta_t}\big(\alpha_tz+\beta_t\epsilon\big)\\&=\dot\alpha_tz-\frac{\dot\beta_t}{\beta_t}\alpha_tz+\frac{\dot\beta_t}{\beta_t}\alpha_tz+\dot\beta_t\epsilon\\&=\dot\alpha_tz+\dot\beta_t\epsilon\end{aligned}$$
高斯路徑的 CFM 損失 $$\begin{aligned}&L_{\text{CFM}}(\theta)\\&=\mathbb E\Big[\big\Vert u_t^\theta(\underbrace{\alpha_tz+\beta_t\epsilon}_{\text{雜訊+資料}})\\&\qquad-(\underbrace{\dot\alpha_tz+\dot\beta_t\epsilon}_{\text{速度}})\big\Vert^2\Big]\end{aligned}$$ 其中 \(t\sim\mathrm{Unif}_{[0,1]}\)、\(z\sim p_{\text{data}}\)、\(\epsilon\sim\mathcal N(0,I_d)\)。

意思是:\(\alpha_tz+\beta_t\epsilon\) 是一條隨時間移動的路徑,\(\dot\alpha_tz+\dot\beta_t\epsilon\) 就是這條路徑的速度。要網路在路上每一點預測當下的速度 75:04。

直線排程

再選最簡單的 \(\alpha_t=t\)、\(\beta_t=1-t\),\(\dot\alpha_t=1\)、\(\dot\beta_t=-1\) 76:39:

最終的損失$$\begin{aligned}&L_{\text{CFM}}(\theta)\\&=\mathbb E\Big[\big\Vert u_t^\theta\big(tz+(1-t)\epsilon\big)\\&\qquad-(z-\epsilon)\big\Vert^2\Big]\end{aligned}$$
ε(雜訊)z(資料)x = t z + (1−t) ε目標 z − ε
在雜訊 \(\epsilon\) 和資料 \(z\) 的連線上隨機取一點,要網路輸出這條線的方向 \(z-\epsilon\)。投影片 27 畫的就是這張圖。
投影片 26–28 的圖:投影片 26 寫出直線排程的損失,標出「Linear interpolation of noise and data」和「Difference between noise and data」。投影片 27 在玩具例子上畫從 \(\epsilon\) 到 \(z\) 的藍色直線。投影片 28 是 Algorithm 4。
演算法(CondOT 路徑)
  1. 抽資料 \(z\),抽 \(t\sim\mathrm{Unif}_{[0,1]}\),抽 \(\epsilon\sim\mathcal N(0,I_d)\)。
  2. 令 \(x=tz+(1-t)\epsilon\)。
  3. 損失 \(\mathcal L(\theta)=\Vert u_t^\theta(x)-(z-\epsilon)\Vert^2\)。
  4. 梯度下降更新 \(\theta\),回到第 1 步。
手算一步\(d=1\),抽到 \(z=2\)、\(\epsilon=-1\)、\(t=0.5\)。\(x=0.5\times2+0.5\times(-1)=0.5\),目標 \(z-\epsilon=3\)。如果網路輸出 \(u=1\),這筆損失是 \((1-3)^2=4\)。目標 3 和第 6 節算的條件速度相同。

老師點出關鍵:我們沒有告訴網路 \(z\) 是什麼。它只看到有雜訊的 \(x\) 和 \(t\),得自己想辦法 78:11。同一個 \(x\) 可能來自很多 \((z,\epsilon)\),網路只能輸出它們的平均,也就是邊際向量場。

這個路徑在講義裡叫 CondOT 機率路徑。老師說這不是簡化過的版本 78:41:Meta MovieGen 和 Stable Diffusion 3 都是用它訓練的;現在很多模型是閉源的,不知道細節,但他猜也是用這個。

投影片 29–30 的圖:投影片 29 是 Meta MovieGen 的影片截圖,投影片 30 是 Stable Diffusion 3 的三張生成圖。紅框都寫:這些模型就是用剛才的演算法訓練的。
一句話帶走:在 \(\epsilon\) 到 \(z\) 的直線上挑一點,要網路輸出 \(z-\epsilon\)。這就是全部。

Demo D親手訓練一個 flow model

就是上面那四行,在瀏覽器裡真的跑:網路是 3 層、每層 64 個單元的 MLP(最基本的全連接網路),每步 64 筆資料,共 3,000 步,電腦上大約 13 秒,手機可能更久。資料是二維、六群、比例不等的高斯混合(灰圈是每群的 \(2s\) 範圍,\(s=0.3\))。

這個資料簡單到能算出真正的 \(u_t^{\text{target}}\),所以這裡可以做在真實問題裡做不到的事:同時量 \(L_{\text{FM}}\) 和 \(L_{\text{CFM}}\)。訓練只用 \(L_{\text{CFM}}\) 的梯度,\(L_{\text{FM}}\) 只是旁觀。兩者都在同一組固定的 1,000 筆資料上量。

怎麼看:左圖橘線是 \(L_{\text{CFM}}\),藍線是 \(L_{\text{FM}}\)。右圖是用目前的網路,以 \(n\) 步 Euler 法取樣 1,200 個點的結果。
  • 按「開始訓練」,看兩條線一起往下:\(L_{\text{CFM}}\) 從 34.357 降到 5.438,\(L_{\text{FM}}\) 從 29.045 降到 0.137。兩者的差全程介於 −5.349 和 −5.243,這就是定理說的常數 \(C\),微小的波動來自只用 1,000 筆估計。\(L_{\text{CFM}}\) 停在 5 左右不是沒學好,而是目標本身的變異數。
  • 右圖:訓練前的取樣只有 2.1% 落在中心附近,訓練後是 84.3%(\(n=50\),真實資料 98.9%)。第一行的「模擬 ODE 的次數」全程是 0。
  • 訓練完拖動取樣步數:\(n=1\) 是 0.0%,2 是 31.5%,5 是 71.7%,10 是 78.8%,20 是 82.5%,100 是 84.8%。多走幾步之後就不再進步,剩下的差距是訓練誤差(\(L_{\text{FM}}\) 還有 0.137),要靠更大的網路或更久的訓練。
LCFMLFM

15取樣與代價(投影片 31)

訓練完怎麼生成?老師說這是個陷阱題,因為上一講已經學過了 79:12:抽 \(X_0\sim p_{\text{init}}\),跑 Euler 法,回傳 \(X_1\)。

投影片 31 的圖:上一講的 Algorithm 1,紅字標出 Random initialization 和 Return final point。這裡的迴圈次數同樣寫成 \(n-1\),正確是 \(n\) 次,理由見上一講第 10 節。

代價是取樣慢 79:45。老師說的數字是大約 100 步(他也說不完全確定實際用多少)。影片是很大的張量(多維陣列),要放在記憶體裡呼叫網路一百次,這也是影片訂閱為什麼這麼貴。訓練既簡單又可擴展,代價是推論時要多花計算 80:15。

訓練一步生成一張
網路呼叫1 次(每筆資料)約 100 次
模擬 ODE不用要
一句話帶走:訓練一步只呼叫一次網路,但生成一張要呼叫大約 100 次。

16總結與下一講(投影片 32–35)

老師最後走回矩陣 80:45:

投影片 32–34 的圖:投影片 32 在矩陣下加上每一行的用途。投影片 33 是條件那一列的總表,紅框「全部都有解析公式」。投影片 34 是邊際那一列,紅框「全部算不出來,但還是學得到」。
條件(算得出來)邊際(算不出來)
路徑
從雜訊到資料的分佈
\(\mathcal N(\alpha_tz,\beta_t^2I_d)\)
內插 \(p_{\text{init}}\) 和資料點
\(\int p_t(x\mid z)p_{\text{data}}(z)\mathrm dz\)
內插 \(p_{\text{init}}\) 和 \(p_{\text{data}}\)
向量場
要學的目標
\(\big(\dot\alpha_t-\frac{\dot\beta_t}{\beta_t}\alpha_t\big)z+\frac{\dot\beta_t}{\beta_t}x\)
ODE 跟著條件路徑
\(\int u_t^{\text{target}}(x\mid z)\frac{p_t(x\mid z)p_{\text{data}}(z)}{p_t(x)}\mathrm dz\)
ODE 跟著邊際路徑
損失
訓練時最小化
\(L_{\text{CFM}}\):實際最小化的\(L_{\text{FM}}\):透過 CFM 隱式地最小化

老師的結語 82:16:很神奇,我們從來沒看過邊際向量場,卻還是學得到它。

投影片的小問題:投影片 21、22 的標題寫著「and Score」,表格裡卻沒有 score 那一列(score 是下一講的主題)。投影片 32 的「traing」是 training。
怎麼處理文字提示?· 52:09這是下一講的主題,建立在今天的內容上。
投影片 35 的圖:下一堂課:週五 11am–12:30pm,E25-111,主題 score matching 和 guidance。
Lab 2:實作 flow matching,也含下一講的 score matching。可以到課程網站取得。這一頁的 Demo D 是它的最小版本。

和其他頁面的關聯

常見誤解

  • 「條件向量場就是網路最後學到的東西。」網路學到的是邊際向量場。條件向量場只是訓練時的目標,單獨拿來模擬只會走到已知的 \(z\)。
  • 「訓練時網路看得到 \(z\)。」看不到。輸入只有 \(x\) 和 \(t\),\(z\) 只出現在目標裡。
  • 「學到的路徑是直線。」條件向量場的路徑是直線,邊際向量場的通常是彎的(Demo B)。取樣時走的是後者,所以 Euler 法要走好幾步。
  • 「\(L_{\text{CFM}}\) 應該要降到 0。」不會。它的下限是目標的變異數(第 11 節手算、Demo D),損失的絕對值沒有意義。
  • 「\(-\operatorname{div}(p_tu_t)\) 是流出減流入。」投影片這樣寫,但正確是流入減流出(第 8 節)。
  • 「用 \(p_{\text{data}}\) 加權就好,何必後驗。」那樣會忽略「我在 \(x\)」這個資訊,所有粒子都會走向資料的平均(Demo C)。
  • 「機率路徑決定了粒子的走法。」路徑只規定每個時刻的分佈。向量場才決定粒子怎麼動,而且同一條路徑可以有無限多個向量場。
  • 「Flow matching 訓練要模擬 ODE。」不用,這就是 simulation-free。只有取樣時才要。

自我測驗

1. 條件機率路徑要滿足哪兩個條件?
P1:每個 \(p_t(\cdot\mid z)\) 都是機率分佈。P2:\(p_0(\cdot\mid z)=p_{\text{init}}\)(和 \(z\) 無關),\(p_1(\cdot\mid z)=\delta_z\)。
2. 為什麼排程要 \(\alpha_0=0\)、\(\beta_0=1\)、\(\alpha_1=1\)、\(\beta_1=0\)?
\(t=0\) 時 \(\mathcal N(0,I_d)\) 才和 \(z\) 無關;\(t=1\) 時 \(\mathcal N(z,0)=\delta_z\) 才塌縮到 \(z\)。
3. 怎麼從 \(p_t\) 抽樣?為什麼算得出樣本,卻算不出密度?
抽 \(z\sim p_{\text{data}}\)(從資料集拿一筆),抽 \(\epsilon\),令 \(x=\alpha_tz+\beta_t\epsilon\)。密度 \(\int p_t(x\mid z)p_{\text{data}}(z)\mathrm dz\) 要對所有可能的資料積分,而 \(p_{\text{data}}\) 沒有公式。
4. 推導:\(\alpha_t=t\)、\(\beta_t=1-t\) 時條件向量場是什麼?
flow \(\psi_t=tz+(1-t)x_0\),導數 \(z-x_0\)。解出 \(x_0=(x-tz)/(1-t)\),代入得 \(z-\frac{x-tz}{1-t}=\frac{z-tz-x+tz}{1-t}=\frac{z-x}{1-t}\)。
5. \(z_1=3\)、\(z_2=-1\),後驗在某點是 0.6、0.4。若 \(t=0.5\)、\(x=1\),邊際向量場是多少?
條件速度:\((3-1)/0.5=4\)、\((-1-1)/0.5=-4\)。加權:\(0.6\times4+0.4\times(-4)=0.8\)。
6. 盒子寬 0.2,左邊通量 0.5,右邊通量 0.3。密度的變化率是多少?
流入 − 流出 = 0.2,每單位時間盒內機率增加 0.2;密度變化率 \(0.2/0.2=1\),等於 \(-\frac{0.3-0.5}{0.2}=1\)。
7. 在邊際化技巧的證明中,哪一步用到「條件向量場滿足條件路徑」?
把 \(\partial_tp_t(x\mid z)\) 換成 \(-\operatorname{div}(p_t(\cdot\mid z)u_t^{\text{target}}(\cdot\mid z))\) 那一步,也就是對條件路徑用連續方程。
8. 為什麼最小化 \(L_{\text{CFM}}\) 就夠了?
\(L_{\text{FM}}=L_{\text{CFM}}+C\),\(C\) 和 \(\theta\) 無關,所以梯度和最小值點都相同;\(L_{\text{FM}}\) 的最小值點就是 \(u_t^{\text{target}}\)。
9. 定理的證明中,為什麼中間項會相等?
代入邊際向量場的定義後,分母的 \(p_t(x)\) 和期望值裡的 \(p_t(x)\) 消掉,剩下 \(p_t(x\mid z)p_{\text{data}}(z)\),正是先抽 \(z\) 再抽 \(x\) 的聯合機率。
10. 把直線排程的訓練一步寫成程式的步驟。
抽 \(z,t,\epsilon\);\(x=tz+(1-t)\epsilon\);\(\mathcal L=\Vert u_t^\theta(x)-(z-\epsilon)\Vert^2\);梯度下降。
11. 什麼是 simulation-free?代價在哪裡?
訓練時不用模擬 ODE,每筆資料只呼叫一次網路。代價在取樣:要跑大約 100 步,呼叫網路 100 次。
12. 在 \(t=0\) 的位置 \(x\),直線排程的邊際向量場等於什麼?
\(t=0\) 時 \(p_0(x\mid z)\) 和 \(z\) 無關,後驗等於先驗。所以 \(u_0^{\text{target}}(x)=\int(z-x)p_{\text{data}}(z)\mathrm dz\),也就是 \(\mathbb E[z]-x\),指向資料的平均。

延伸閱讀