Flow Matching:把生成模型變成回歸問題
上一講只宣告了目標:\(X_1\sim p_{\text{data}}\)。這一講回答怎麼訓練。數學繞了一大圈,最後的演算法只有幾行:抽資料 \(z\)、抽雜訊 \(\epsilon\)、抽時間 \(t\),讓網路在 \(tz+(1-t)\epsilon\) 這一點輸出 \(z-\epsilon\)。
讀完這頁你應該能夠
- 畫出 flow matching 矩陣:機率路徑、向量場、損失,各有條件和邊際兩個版本,並指出哪些算得出來。
- 驗證高斯路徑 \(\mathcal N(\alpha_tz,\beta_t^2I_d)\) 滿足條件路徑的兩個要求。
- 從 \(\psi_t(x_0\mid z)=\alpha_tz+\beta_tx_0\) 推出條件向量場的公式。
- 解釋邊際向量場為什麼是「用後驗機率加權的平均」,並手算一個例子。
- 寫出連續方程,分清楚 \(-\operatorname{div}\) 是流入減流出,並一步一步證明邊際化技巧。
- 解釋 \(L_{\text{FM}}\) 算不出來、\(L_{\text{CFM}}\) 算得出來,以及為什麼最小化後者就等於最小化前者。
- 寫出訓練和取樣的演算法,說明 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)\) 的期望值,黑板的簡寫 |
01訓練要做到什麼(投影片 1–4)
沒有訓練,模型只會輸出沒有意義的東西 01:08。所以問題是:
這一講只處理 flow model。老師預告:數學不少,但最後的演算法非常簡單,「punchline 在最後」 01:38。
投影片筆誤:投影片 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}}\) |
先記住全局:我們真正要的是下面那一列,但它們都算不出來;上面那一列都有公式。這一講的魔法是證明:只用上面那一列訓練,就能學到下面那一列。
03條件機率路徑(投影片 6–7)
上一講只規定了兩端:\(t=0\) 是雜訊,\(t=1\) 是資料。中間呢?機率路徑就是把中間也規定好:每個時間 \(t\) 應該長什麼樣子 03:13。
Dirac 分佈
先要一個最簡單的分佈。老師說 Dirac 有很多厲害的想法,但最簡單的分佈偏偏以他為名 04:16:
$$x\sim\delta_z\iff x=z$$從 \(\delta_z\) 抽樣,永遠抽到 \(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\) 這一點。
老師提醒:這是一個設計上的選擇,可以選不同的路徑,只是有一個例子特別重要 07:22。
04高斯路徑

實務上幾乎都用這個路徑。先選兩個自己定的函數,雜訊排程:
驗證 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)$$05邊際機率路徑(投影片 8–12)
走到單一資料點沒什麼用。現在讓 \(z\) 變成隨機的 12:39:

兩端會自動是我們要的 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}}\)。
這樣就有了一條從高斯到資料分佈的路徑。老師再次強調,這只是一個建構、一個設計選擇,還沒有談怎麼走。
投影片 11、12 是逐步填滿的總表,只填到路徑這一格;投影片 21、22、33、34 是之後的版本,內容在第 16 節。
Demo A機率路徑
- 切換條件/邊際,拖動 \(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。先從單一資料點開始。
注意 \(z\) 在這裡是固定的參數,每個資料點有自己的一個向量場。
高斯路徑的公式
老師說他自己也總是記不住這個公式,不用背 21:42。要記得的是它的形狀:\(z\) 和 \(x\) 的線性組合,係數由排程決定。下面推導它。
推導
想法:不要直接找向量場,先找一個會產生正確分佈的搬動規則,再反推速度。抽樣公式已經告訴我們答案:起點 \(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\)。
取 \(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\)。兩者相等。
老師指出一個漂亮的事實:把高斯推成一個點的向量場,對 \(x\) 只是線性函數,而且他推測這是高斯特有的性質,但也說自己不完全確定 24:43。這個公式就是之後的訓練目標。
07邊際向量場(投影片 16–18)
現在做最關鍵的一步:用條件向量場造出會生成整個分佈的向量場 27:15。

讀懂這個公式
分數那一項就是 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-x)/(1-t)\):走向 \(z_1\) 是 \((2-0.5)/0.5=3\);走向 \(z_2\) 是 \((-2-0.5)/0.5=-5\)。
- 後驗:分子各是 \(0.5\times0.4839=0.2420\) 和 \(0.5\times0.0089=0.0044\),除以兩者的和 0.2464,得到 0.982 和 0.018。
- 加權平均:\(0.982\times3+0.018\times(-5)\),約等於 \(2.856\)。
定理
老師說,這大概是這些模型的核心。我們其實只在乎 \(t=1\) 那一刻,但定理保證整條路都對 32:24。條件向量場就像樂高積木,拼出能完成任務的東西。這裡的「拼」是數學上的建構,還沒有學,但現在知道要學什麼了 32:54。
Demo B後驗加權平均
- 把 \(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。
散度的定義:把每個分量對自己的座標偏微分,再加起來。
$$\operatorname{div}(v_t)(x)=\sum_{i=1}^d\frac{\partial}{\partial x_i}v_t^i(x)$$像會計一樣記帳
老師的比喻是對的:像會計一樣,看流進多少、流出多少 35:59。取一維、一個很小的盒子 \([a,a+\Delta]\)。粒子以速度 \(u\) 移動,每單位時間通過某個位置的機率是 \(p\cdot u\),這叫機率通量:密度越大、速度越快,流過的就越多;沒有機率的地方就沒有東西可流。
- 帳本:盒子裡的機率約等於 \(p\Delta\),它的變化率等於流入減流出: $$\partial_tp\cdot\Delta=(pu)(a)-(pu)(a+\Delta)$$
- 除以 \(\Delta\),取 \(\Delta\to0\):右邊正是導數的定義再加一個負號, $$\partial_tp=-\frac{\partial}{\partial x}(pu)$$
- 代數字:\(\Delta=0.1\),\(-\frac{0.45-0.40}{0.1}=-0.5\),所以密度每單位時間降 0.5。
- 多維:每個座標方向都有一筆這樣的帳,加起來就是散度。
- 左邊:高斯在中央的高度是 \(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。「流入、流出」和散度的關係不必一次想通。講義附錄有定理本身的證明。
09邊際化技巧的證明

靠連續方程,我們只要證明 \(u_t^{\text{target}}\) 和 \(p_t\) 滿足 \(\partial_tp_t=-\operatorname{div}(p_tu_t^{\text{target}})\)。從左邊開始 38:18。這裡唯一的已知是:條件路徑滿足連續方程,因為條件向量場就是為此而造的。
- 代入 \(p_t\) 的定義: $$\partial_tp_t(x)=\partial_t\int p_t(x\mid z)\,p_{\text{data}}(z)\,\mathrm dz$$
- 交換微分和積分:\(p_{\text{data}}(z)\) 不含 \(t\),老師說這在這裡的正則條件(函數夠平滑)下可以做 38:49: $$=\int\partial_tp_t(x\mid z)\,p_{\text{data}}(z)\,\mathrm dz$$
- 對條件路徑用連續方程 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}$$
- 把散度移到積分外:散度只是對 \(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}$$
- 乘上再除以 \(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}$$
- 認出積分就是邊際向量場 42:54: $$=-\operatorname{div}\big(p_t\,u_t^{\text{target}}\big)(x)$$
頭尾正是連續方程,證畢。順序其實是反過來的:老師說,邊際向量場的公式正是這樣得到的 43:25。走到第 4 步,我們需要把括號寫成 \(p_t\times\)某個東西,那個東西就是定義。後驗不是天外飛來,是為了讓這一步成立。
課堂問答
Demo C為什麼要用後驗
- 用後驗(預設 \(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。要學一個函數,最直接就是回歸。

期望值的三步在程式裡就是 56:56:隨機挑時間,從資料集隨機拿一張圖,加一點雜訊。老師說這是在確保向量場在所有時間都對。
好消息:最小值點一定是 \(u_t^\theta=u_t^{\text{target}}\),因為兩者相等時損失是 0。壞消息:算不出來,\(u_t^{\text{target}}(x)\) 裡的積分要走過整個資料分佈 54:54。
老師的邏輯:做不到想做的事,就想想能做什麼。我們能算條件向量場,於是直接把目標換掉 55:55:
只差在目標有沒有「\(\mid z\)」。可是這看起來很可疑:我們要的是邊際,卻在回歸條件的,最小值點是什麼?
11只差一個常數
老師稱這大概是所有這些模型的主要結論 58:57。圖上看,兩條曲線形狀一樣,只是上下平移:

兩個推論正是訓練需要的全部 60:59:
- 梯度相同:常數的梯度是 0,所以 \(\nabla_\theta L_{\text{FM}}=\nabla_\theta L_{\text{CFM}}\)。訓練只需要梯度。
- 最小值點相同:最小值不同,但達成最小值的 \(\theta\) 相同,而那正是 \(u_t^{\theta^*}=u_t^{\text{target}}\)(假設網路表達力足夠)。
- 條件損失:\(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\)。
也因此 \(L_{\text{CFM}}\) 不會降到 0:最好的情況,\(v=1\) 時還剩 3,那是目標本身的變異數。損失的絕對值沒有意義,不能拿「還沒到 0」當作沒訓練好(這段是轉述者的補充)。
12定理的證明

證明的想法很簡單:展開平方,留下會隨 \(\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)\) 消掉。
出處:講義 §3.3 的 Theorem 與 Direct Proof。
13訓練演算法(投影片 24)
老師的讚嘆 64:32:這把生成模型變成了回歸。訓練深度網路該怎麼做就怎麼做,什麼都沒變。
這正是這類方法革命性的地方 71:33。在這些論證出現之前,沒有人知道怎麼這樣訓練 flow model,得把軌跡滾過很多步才能算損失,非常昂貴。
延伸:這也是和 CS236 第 8 講提到的 Neural ODE 的差別,Neural ODE 訓練時要解 ODE,見書 B11。而「條件目標可以取代邊際目標」的結構,和 CS236 第 13 講的 denoising score matching 是同一招,下一講會再遇到。
14高斯路徑與直線排程(投影片 25–30)
有學生問「抽 \(x\)」實際上是什麼意思,老師說這正好接到下一張投影片 73:04。
代入 \(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}$$意思是:\(\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:
- 抽資料 \(z\),抽 \(t\sim\mathrm{Unif}_{[0,1]}\),抽 \(\epsilon\sim\mathcal N(0,I_d)\)。
- 令 \(x=tz+(1-t)\epsilon\)。
- 損失 \(\mathcal L(\theta)=\Vert u_t^\theta(x)-(z-\epsilon)\Vert^2\)。
- 梯度下降更新 \(\theta\),回到第 1 步。
老師點出關鍵:我們沒有告訴網路 \(z\) 是什麼。它只看到有雜訊的 \(x\) 和 \(t\),得自己想辦法 78:11。同一個 \(x\) 可能來自很多 \((z,\epsilon)\),網路只能輸出它們的平均,也就是邊際向量場。
這個路徑在講義裡叫 CondOT 機率路徑。老師說這不是簡化過的版本 78:41:Meta MovieGen 和 Stable Diffusion 3 都是用它訓練的;現在很多模型是閉源的,不知道細節,但他猜也是用這個。
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}}\) 從 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),要靠更大的網路或更久的訓練。
15取樣與代價(投影片 31)
訓練完怎麼生成?老師說這是個陷阱題,因為上一講已經學過了 79:12:抽 \(X_0\sim p_{\text{init}}\),跑 Euler 法,回傳 \(X_1\)。
代價是取樣慢 79:45。老師說的數字是大約 100 步(他也說不完全確定實際用多少)。影片是很大的張量(多維陣列),要放在記憶體裡呼叫網路一百次,這也是影片訂閱為什麼這麼貴。訓練既簡單又可擴展,代價是推論時要多花計算 80:15。
| 訓練一步 | 生成一張 | |
|---|---|---|
| 網路呼叫 | 1 次(每筆資料) | 約 100 次 |
| 模擬 ODE | 不用 | 要 |
16總結與下一講(投影片 32–35)
老師最後走回矩陣 80:45:
| 條件(算得出來) | 邊際(算不出來) | |
|---|---|---|
| 路徑 從雜訊到資料的分佈 | \(\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:很神奇,我們從來沒看過邊際向量場,卻還是學得到它。
和其他頁面的關聯
- 書 B12(§5.2)和 B13(§5.3)是同一個主題,更廣義:來源分佈不必是高斯,路徑的選擇也更多。
- CS236 第 13 講的 denoising score matching:同樣用條件目標取代算不出來的邊際目標。
- 補充課 C:連續方程和密度怎麼跟著 flow 改變。
常見誤解
- 「條件向量場就是網路最後學到的東西。」網路學到的是邊際向量場。條件向量場只是訓練時的目標,單獨拿來模擬只會走到已知的 \(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. 條件機率路徑要滿足哪兩個條件?
2. 為什麼排程要 \(\alpha_0=0\)、\(\beta_0=1\)、\(\alpha_1=1\)、\(\beta_1=0\)?
3. 怎麼從 \(p_t\) 抽樣?為什麼算得出樣本,卻算不出密度?
4. 推導:\(\alpha_t=t\)、\(\beta_t=1-t\) 時條件向量場是什麼?
5. \(z_1=3\)、\(z_2=-1\),後驗在某點是 0.6、0.4。若 \(t=0.5\)、\(x=1\),邊際向量場是多少?
6. 盒子寬 0.2,左邊通量 0.5,右邊通量 0.3。密度的變化率是多少?
7. 在邊際化技巧的證明中,哪一步用到「條件向量場滿足條件路徑」?
8. 為什麼最小化 \(L_{\text{CFM}}\) 就夠了?
9. 定理的證明中,為什麼中間項會相等?
10. 把直線排程的訓練一步寫成程式的步驟。
11. 什麼是 simulation-free?代價在哪裡?
12. 在 \(t=0\) 的位置 \(x\),直線排程的邊際向量場等於什麼?
延伸閱讀
- Holderrieth & Erives,An Introduction to Flow Matching and Diffusion Models,§3 Flow Matching:本頁的定義、定理和證明都對照過 TeX 原文。
- 課程網站的 Lab 2。
- 補充課 C 連續方程:第 8 節的背景。
- 書 B12、B13:Lai 等人書中的 flow matching。