U2.3 9 分鐘閱讀 2026年9月

U2.3 代入最簡單的一條路:直線插值

本篇重用M2.0河面上的箭頭:Vector Field 與 ODE·M1.1從鞋子猜身高:Conditional Expectation

最沒有花招的選法

U2.2 的框架可以代任何一對 (αt,σt)(\alpha_t,\sigma_t) 進去。最沒有花招的選法是兩點之間走直線:αt=t\alpha_t=tσt=1t\sigma_t=1-t

xt=tx1+(1t)x0,ut(xx0,x1)=x1x0.x_t=t\,x_1+(1-t)\,x_0,\qquad u_t(x\mid x_0,x_1)=x_1-x_0 .

條件速度是一個常數——不隨 tt 變、也不隨位置變。所以網路的工作被講成了一句很短的話:看到 xtx_ttt,猜出「終點減起點」。

程式碼上,這只是把 U2.2 那五行的目標換掉一行:target = x1 - x0

補充這條路在文獻裡有三個名字

同一條線性路徑在三篇論文裡各有講法:rectified flow [1] 從「把軌跡拉直」出發、stochastic interpolants [2] 從「把 (αt,σt)(\alpha_t,\sigma_t) 當設計變數」出發、Lipman et al. [3] 稱它為 OT path(在獨立配對下)。

它們寫下來的訓練目標是同一個。

差別在動機與後續怎麼發展,不在這一行式子。

條件路徑每一條都是直線。
那訓好之後,粒子會走直線嗎?

課堂提問Q1

有一個聽起來很順的推理:

每一條條件路徑都是直的,而邊際速度是這些條件速度的平均。一堆直線方向平均起來還是一個方向,所以邊際軌跡當然也是直的。

這個推理錯在哪?

先想一想,再展開看整理後的答案

錯在「平均起來的那個方向」不必是其中任何一條在走的方向

回到邊際速度的定義:ut(x)=E[x1x0xt=x]u_t(x)=\mathbb E[x_1-x_0\mid x_t=x]。在位置 xx、時刻 tt,會有很多組配對的直線正好經過這裡,而它們的方向各不相同——邊際速度是這些方向的平均,不是其中任何一條。

用兩組配對就能算出來。x0{(1,1),(1,1)}x_0\in\lbrace(-1,-1),(1,-1)\rbracex1{(1,1),(1,1)}x_1\in\lbrace(1,1),(-1,1)\rbrace,配對方式是 (1,1)(1,1)(-1,-1)\to(1,1)(1,1)(1,1)(1,-1)\to(-1,1),各佔一半。兩條直線都在 t=12t=\tfrac12 經過原點,而它們的條件速度分別是 (2,2)(2,2)(2,2)(-2,2)。所以

u1/2((0,0))=12(2,2)+12(2,2)=(0,2).u_{1/2}\big((0,0)\big)=\tfrac12(2,2)+\tfrac12(-2,2)=(0,2).

正上方。這個方向任何一條條件直線都沒有在走——水平的分量互相抵消掉了。走到原點的粒子會被推著往上,然後才分岔到左上或右上。

再往下一層,還有一個更硬的理由:U2.1 說 ODE 的軌跡不能交叉。條件直線會交叉(獨立配對之下幾乎一定會),所以邊際 ODE 的軌跡不可能就是那些直線——它只能是一組彼此不交叉的曲線,在分布層面給出同一個 ptp_t

理解它為什麼不會,是 U3 整個單元的起點。一句話串起來:「彎」來自「交叉」,「交叉」來自「隨機配對」。 這三個詞在 U3 分別長成 U3.2U3.3U3.4

互動 demo:交叉、彎曲,與要走幾步。 起點與資料各是兩團,配對方式是唯一的變數。「隨機配對」下條件直線交出一個 X,邊際軌跡被迫繞開,實測彎曲度約 1.59;按「依位置配對」,兩邊各走各的,彎曲度掉到 1.00。再切 Euler 步數看終點誤差:隨機配對 4 步差 1.49、20 步 0.26、200 步才 0.01;依位置配對 4 步就只差 0.03。兩種配對的 p0p_0p1p_1 一模一樣。(這裡的彎曲度是在四團的 toy 上量的;U2.4 比較線性與 VP 時用的是雙月,兩組數字不要直接對比。)

直不直,決定要走幾步

取樣就是解那條 ODE,而我們只能用有限步。最簡單的 Euler 是

xt+h=xt+huθ(xt,t),x_{t+h}=x_t+h\,u_\theta(x_t,t),

也就是假設這一段時間內速度不變——等於拿一條割線去代替真正的軌跡。軌跡本來就是直線時,一步到終點、誤差為零;軌跡越彎,割線和曲線差得越多。

所以「軌跡有多直」不是美學問題,它直接決定取樣需要幾步U1.4 裡 DDIM 步數少的時候會掉品質,原因也是同一個。demo 裡那組數字就是這件事的量化版本:同樣的兩個分布,只換配對,4 步的誤差差了將近五十倍。

換到 ϵ\epsilon 座標看,其實不是同一個 loss

x0x_0 改叫 ϵ\epsilon(在 FM 慣例裡起點就是噪聲),xt=tx1+(1t)ϵx_t=t\,x_1+(1-t)\epsilon。給定 xtx_tϵ\epsilon 就能反解出 x1=(xt(1t)ϵ)/tx_1=(x_t-(1-t)\epsilon)/t,代回去:

ut=x1ϵ=xttϵt.u_t=x_1-\epsilon=\frac{x_t}{t}-\frac{\epsilon}{t}.

網路那一邊也照同一個關係讀:把 uθu_\theta 寫成 uθ=xtϵθtu_\theta=\dfrac{x_t-\epsilon_\theta}{t}(這就是「把速度網路當成噪聲網路來看」的意思)。兩式相減,xt/tx_t/t 消掉:

uθut2=1t2ϵθϵ2.\|u_\theta-u_t\|^2=\frac{1}{t^2}\,\|\epsilon_\theta-\epsilon\|^2 .

第一,學速度和學噪聲仍然是同一件事,兩者只差一個 affine transformation——這延續 U1.2 對三種 parametrization 的討論。(那裡把「預測資料」叫 x0x_0-prediction,因為 diffusion 的慣例裡 x0x_0 是資料;在本單元的慣例下同一件事要叫 x1x_1-prediction。這是最容易讀錯的一個術語。

第二,注意那個 1/t21/t^2。均勻抽 tt 的 FM loss,換到 ϵ\epsilon 座標之後帶著 1/t21/t^2 的權重;而 tt 小是噪聲端,所以FM 其實把噪聲端看得比均勻的 ϵ\epsilon-loss 重很多

拿它跟 DDPM 比就看得很清楚。U1.2 最後那五行跑的是 Lsimple\mathcal L_{\text{simple}}——均勻加權的 ϵ\epsilon-MSE,那是刻意把推導出來的 w(t)w(t) 丟掉之後的版本。所以:

換到 ϵ\epsilon 座標之後的權重
DDPM 實際在跑的 Lsimple\mathcal L_{\text{simple}}均勻(11
線性 FM、均勻抽 tt1/t21/t^2tt 小的那一端被放大

兩邊都是 ϵ\epsilon-MSE,差的就是這個權重。

FM 與 DDPM 的差別不只在路徑(線性 vs VP),還在那個沒有人明說的加權。

U1.2 說過 forward process 與 weighting 可以分開設計,這裡是它最乾淨的例子:兩個模型可以只差加權,訓出來的結果卻不一樣。U2.4 會把這兩軸攤在同一張表上。

消化一下

想一想

線性 FM 用均勻的 tt 訓練,等價於 ϵ\epsilon-prediction 配上什麼加權?

想一想

在兩條條件直線的交叉點上,邊際速度是什麼?

想一想

下列哪一個改動最直接減少邊際軌跡的彎曲?

參考文獻

  1. Liu, X., Gong, C., Liu, Q. Flow Straight and Fast: Learning to Generate and Transfer Data with Rectified Flow. ICLR 2023. (從「把軌跡拉直」出發的版本;U3.3 會細講。)
  2. Albergo, M. S., Vanden-Eijnden, E. Building Normalizing Flows with Stochastic Interpolants. ICLR 2023. (把 (αt,σt)(\alpha_t,\sigma_t) 當成可以挑的東西。)
  3. Lipman, Y., Chen, R. T. Q., Ben-Hamu, H., Nickel, M., Le, M. Flow Matching for Generative Modeling. ICLR 2023. (線性路徑在這篇裡叫 OT path。)