搜尋課程與筆記

搜尋筆記

輸入主題、關鍵字或單元編號,例如 Flow Matching、U4。

    按 Esc 關閉 · ⌘ / Ctrl K 開啟搜尋

    U2.1 12 分鐘閱讀 2026年10月

    U2.1 沿著人潮學會怎麼走

    本篇重用3 篇

    上一篇中,我們有了新的、想解決的問題:兩個 distribution 之間的搬運。

    我們也聊到可以把它想成:把一堆沙子從一種分布形狀,慢慢搬成另一種形狀。要描述這個搬運,我們需要決定兩件事:中間怎麼走(path),以及每個地方要往哪裡走(velocity)。

    接下來的問題便是:

    要怎麼找到這條路?
    要怎麼知道每一個時刻該往哪裡走?

    如果知道起點和終點的話

    我們先把沙子換成人群。想像跨年煙火剛結束,人群正從台北 101 周圍散場,大家紛紛走向捷運站:有人去市政府站,有人走向台北 101/世貿站,也有人往象山站。

    先想一個比較簡單的情況:假設每個人都知道自己的起點 x0x_0 與終點 x1x_1。那麼要從起點走到終點,只要選一條在 t=0t=0 從 x0x_0 出發、在 t=1t=1 抵達 x1x_1 的曲線,記成

    It(x0,x1).I_t(x_0,x_1).
    地圖上從藍色起點 x0 到橘色終點 x1 的參考路徑,行人位置標為 I_t(x0,x1)

    圖:先知道起點 x0x_0 與終點 x1x_1,才能替這一組端點畫出 It(x0,x1)I_t(x_0,x_1);路線可以彎,也可以直接選直線。

    Week 4 投影片 18 · 點圖查看原圖

    最簡單暴力的選擇,自然就是橫衝直撞地走直線:

    It(x0,x1)=(1−t)x0+tx1,I˙t(x0,x1)=x1−x0.I_t(x_0,x_1)=(1-t)x_0+tx_1,\qquad \dot I_t(x_0,x_1)=x_1-x_0.

    只要給定一組 (x0,x1)(x_0,x_1),這條直線給出的位置變化和速度都可以直接算出來,不需要任何神經網路模型。

    名稱端點也隨機之後,這個 construction 就是最簡單的 stochastic interpolant

    固定 (x0,x1)(x_0,x_1) 時,It(x0,x1)I_t(x_0,x_1) 是替這一組端點畫出的 reference path。訓練時改成抽隨機端點 (X0,X1)(X_0,X_1) 後,It(X0,X1)I_t(X_0,X_1) 本身也成了 random variable;文獻把這種連接兩端 distributions 的 random process 稱為 stochastic interpolant。

    這一篇先用 reference path 的說法,專心看單一路線怎麼產生 velocity label;U2.4 再正式展開 stochastic interpolant 的一般形式。

    課堂提問Q1

    雖然這個方法看起來超讚,但有一個問題藏在裡面。你看得出來嗎?

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

    對生成模型來說,我們並不知道終點在哪裡;一開始只有起點。想像我們要轉換一張圖片的風格:給定的圖片是起點。如果終點圖片也已經知道了,直接回傳它就好,根本不需要再生成。

    真正生成時,我們只會知道:

    現在是時間 tt,而我人在位置 xx。

    我們並不知道自己對應到訓練資料裡的哪一組 (x0,x1)(x_0,x_1)。所以真正需要的,是一條所有人都能使用的規則:

    vt(x).v_t(x).

    可是,站在同一個街口,卻有人往三個不同的捷運站走。這個 velocity field 到底該聽誰的?

    想像你就是那個不知道終點、手機沒電、也沒有地圖的迷路者。站在陌生的街口,你會怎麼做?

    最自然的方法:隨人潮而動

    想像一下,如果我們自己不知道該怎麼走,最自然的方法是什麼?答案很直覺:跟著人潮走。

    站在時間 tt、位置 xx,我們可以看看那些知道怎麼走的人——也就是前面已經畫好的 reference paths。看看哪些人的路徑剛好在時間 tt 經過這裡,再參考他們當下的方向與速度。

    我們也可以讓神經網路做一模一樣的事情。每一條 reference path 都告訴我們:在位置 ItI_t、時間 tt 時,應該有一個 reference velocity I˙t\dot I_t。於是,我們把它當成 label,直接做 regression:

    怎麼讓模型跟著這個人的速度走?

    LCFM(θ)=Et,(X0,X1)[∥vθ(It,t)−I˙t∥2]. \begin{gathered} \reveal{1}{\mathcal L_{\mathrm{CFM}}(\theta)=} \\[.25em] \reveal{5}{\mathbb E_{t,(X_0,X_1)}\big[} \reveal{4}{\big\|} \reveal{2}{v_\theta}\reveal{1}{(I_t,t)} \reveal{3}{-\dot I_t} \reveal{4}{\big\|^2} \reveal{5}{\big].} \end{gathered}
    1. 抽一組端點與時間 tt,算出位置 ItI_t,得到輸入 (It,t)(I_t,t)。
    2. 讓模型在這個位置與時間,給出速度 vθ(It,t)v_\theta(I_t,t)。
    3. 這個人當下的速度是 I˙t\dot I_t;拿它當 label,與模型的速度相減。
    4. 把速度差的長度取平方,衡量這一次跟得有多接近。
    5. 再對不同時間 tt 與端點 (X0,X1)(X_0,X_1) 的平方誤差取平均,也就是考慮所有我們能產生的 label,參考所有的速度作為學習目標。

    也就是說,每次看到一條 reference path,vθv_\theta 都會被要求:站在 ItI_t 這個位置時,盡量跟這個人的速度 I˙t\dot I_t 一樣。

    依序抽出端點、抽出時間 t、算出位置 I_t,再計算該位置的速度 label

    圖:一筆 training pair 的製造流程。直線只用來算出輸入 (It,t)(I_t,t) 與速度 label I˙t\dot I_t,不需要先跑一趟 ODE。

    Week 4 投影片 24 · 點圖查看原圖

    每次 training 時,我們只需要抽一組端點與時間 tt,就能直接算出 ItI_t 與 I˙t\dot I_t,不必先解 ODE、真的模擬一條 trajectory,才能製造這組 training pair。Lipman 等人的 Flow Matching 原論文 [1] 把這種訓練方式稱為 simulation-free training。

    這裡的 simulation-free 只是在說訓練時不用解 ODE;模型訓練完成後,要沿著 learned velocity 生成資料,仍然需要 numerical solver。這件事會在〈訓練完之後,要怎麼真的沿著這個 field 走?〉再接著討論。

    但還記得剛才的問題嗎?同一個時間 tt,可能有很多條 reference paths 都經過同一個位置 xx。有人往市政府站,有人往 101/世貿站,也有人往象山站;可是 vθ(x,t)v_\theta(x,t) 只能給出一個速度。那它到底該聽誰的?

    L2 自己會完成「從眾」

    咦?還記得我們在 U1 看過的事情嗎?當一個函數必須同時對很多不同的 target 最小化 L2 距離時,最好的選擇就是:取平均。

    M1.2 已經證過:固定輸入之後,L2 regression 的最佳解就是 label 的 conditional mean。現在只要把輸入換成 (It,t)(I_t,t),把 label 換成 I˙t\dot I_t。先把 It(X0,X1)I_t(X_0,X_1) 簡寫成 ItI_t,照剛才的想法,一部分一部分寫出來:

    站在同一個街口,該聽誰的?

    vt∗(x)=E[I˙t∣It=x] \reveal{1}{v_t^*(x)=} \reveal{4}{\mathbb E\big[} \reveal{3}{\dot I_t\mid} \reveal{2}{I_t=x} \reveal{4}{\big]}
    1. 在時刻 tt、位置 xx,該怎麼選速度?
    2. 先看此刻經過 xx 的人:It=xI_t=x。
    3. 再看他們各自的方向與速度:I˙t\dot I_t。
    4. 依這個條件下的可能性,把這些速度取平均。

    這條式子的意思,其實就是剛才的散場例子:

    站在 xx,看看所有可能在時間 tt 經過這裡的人,再把他們的方向與速度取平均。

    同一位置的三個橘色參考速度,經 L2 regression 合成一個深藍色平均速度

    圖:固定 (x,t)(x,t) 後,橘色箭頭表示相容的 reference velocities;深藍色箭頭是依它們的條件機率平均後得到的 vt∗(x)v_t^*(x)。

    Week 4 投影片 26 · 點圖查看原圖

    所以,L2 objective 和 conditional expectation 並不是兩個分開的技巧。L2 objective 是我們實際拿來訓練的方法;conditional expectation,則是它在理想情況下學到的 velocity field。

    你可以直接拖動黃色的迷路者,替它指定新的起點 x(0)x(0)。周圍的方向圓盤把相容的 reference velocities 依方向聚合:扇區越長、越亮,代表那個方向的 posterior signal 越強;黃色箭頭則是它們的 weighted average,也就是 vt(x)v_t(x)。黃線記錄迷路者一路沿著 vtv_t 走出的 ODE trajectory:實線是已走過的部分,虛線是接下來的路。拖動時,時間會回到 00,再從新的起點向前計算整條軌跡;你也可以切換不同的 empirical target samples,看同一條公式如何產生不同的 flow。

    這就是 Lipman 等人提出的 Flow Matching [1] 的核心做法:先製造容易監督的 reference paths,再讓 regression 把它們整理成一個共同的 velocity field。

    訓練完之後,要怎麼真的沿著這個 field 走?

    訓練完成後,模型給我們的是:站在任意位置 xx、時間 tt,現在應該往哪裡走。要生成資料,我們先在 t0=0t_0=0 從起點 distribution 抽一個 xt0∼p0x_{t_0}\sim p_0,再解

    dxtdt=vθ(xt,t).\frac{\mathrm dx_t}{\mathrm dt}=v_\theta(x_t,t).

    一般來說,這條 ODE 沒有 closed-form solution。所以實作時,我們會把 00 到 11 這個區間切成許多小段 [tk,tk+1][t_k,t_{k+1}],再用 numerical solver 做近似迭代。沿用圖中的 notation,這一段用 xtkx_{t_k} 記 sampler 在時間 tkt_k 算出的近似位置;若使用固定步長 Δt=tk+1−tk\Delta t=t_{k+1}-t_k,最簡單的 Euler method 會採用

    xtk+1=xtk+Δt vθ ⁣(xtk,tk).x_{t_{k+1}} = x_{t_k}+\Delta t\, v_\theta\!\left(x_{t_k},t_k\right).
    Euler 生成時交替詢問目前位置的 velocity,再走一步,並於新位置重新詢問

    圖:在 xtkx_{t_k} 詢問 vθ(xtk,tk)v_\theta(x_{t_k},t_k),再沿這個 velocity 走 Δt\Delta t,得到 xtk+1x_{t_{k+1}};下一步從新位置重新詢問。

    Week 4 投影片 28 · 點圖查看原圖

    這條式子其實就很像迷路的人實際採用的做法:先問一次現在該往哪裡走,沿著這個方向走一小步,再從新的位置重新問一次。 每一步都要呼叫一次網路;而且就像黎曼積分一樣,通常切得越細,就走得越準,但生成也會越慢。

    如果沿途的 velocity 幾乎不變,一大步也可能走得很好;如果方向或速度大小不斷改變,就必須頻繁確認。我們會在 U3 再回來看看:除了使用更準確的 numerical solver,能不能直接減少這些變化,讓少步 sampling 也能走得準。

    快速回顧一下

    想一想

    直線 reference path It=(1−t)x0+tx1I_t=(1-t)x_0+tx_1 的速度是多少?

    想一想

    在理想函數層級,CFM 的 L2 objective 會學到什麼?

    參考文獻

    1. Lipman, Y., Chen, R. T. Q., Ben-Hamu, H., Nickel, M., Le, M. Flow Matching for Generative Modeling. ICLR 2023. (CFM objective 與 conditional vector fields。)