搜尋課程與筆記

搜尋筆記

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

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

    M2.1 10 分鐘閱讀 2026年10月

    M2.1 從一片葉子到一群葉子:Flow Map 與 Pushforward

    本篇重用2 篇

    一千片葉子

    上一篇(M2.0)解決了一片葉子的問題:水流地圖 vv 已知,葉子從 x0x_0 出發,一分鐘後在一個確定的位置。

    現在換個玩法。你抓起一把葉子——一千片——從橋上撒下去。它們不會落在同一點,而是散在橋下一小塊水面上:靠中間多、靠邊少。一分鐘後,這一千片葉子會散成什麼樣子?哪裡密、哪裡稀?

    每片葉子都順著同一張地圖走,但整團葉子不一定只平移到下游:前面的水流較快,葉子會被拉開;往中央匯合時,葉子又會變擠。已知每個起點會被送到哪,能不能算出搬運後的 density? 這次要追的不是一片葉子,而是整個 distribution。

    課堂提問Q1

    翻成數學。「一千片葉子的散佈」是什麼物件?「一分鐘後的散佈」又是什麼?我們想求的量,跟上一篇的 x(60)x(60) 有什麼關係?

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

    課堂上第一個反應通常是「一千個點的位置」。這沒錯,但它是樣本,不是我們想要的東西。一千片葉子是從某個分佈抽出來的:撒葉子的手決定了「落在橋下哪個位置」的機率密度 p0(x)p_0(x)——中間高、邊緣低。所以:

    起點是一個隨機變數 X0∼p0X_0\sim p_0,一千片葉子是它的一千個獨立樣本。

    每片葉子接下來的路是確定的。 上一篇說,從 x0x_0 出發的葉子在時刻 tt 的位置是 ODE 的唯一解。把這個對應寫成一個函數:

    Φt(x0)  =  從 x0 出發、順著 v 走到時刻 t 的位置.\Phi_t(x_0)\;=\;\text{從 }x_0\text{ 出發、順著 }v\text{ 走到時刻 }t\text{ 的位置}.

    Φt:Rd→Rd\Phi_t:\mathbb R^d\to\mathbb R^d 叫 flow map:它不是一片葉子的路,而是「所有起點同時被送到哪」的一張總表。

    一分鐘後的散佈是隨機變數 Xt=Φt(X0)X_t=\Phi_t(X_0) 的分佈,記成 ptp_t。我們想求的就是 ptp_t。它和上一篇的關係是:上一篇算的是一個特定輸入 x0x_0 的輸出 Φt(x0)\Phi_t(x_0);這一篇是把整個分佈送進 Φt\Phi_t。這個操作有名字,叫 pushforward(把分佈往前推),寫成 pt=(Φt)# p0p_t=(\Phi_t)_\#\,p_0。

    一塊會變形的果凍

    把橋下那團葉子想成一塊軟果凍,每一小塊果凍就是一小群葉子。水流帶著果凍往下游走,同時把它揉變形:流速在前進方向變快的地方,果凍被拉長,同樣多的葉子占了更大的面積,變稀;水流往中央匯合的地方,果凍被壓扁,變密。

    但有兩件事水流做不到。第一,它不能讓兩塊不同的果凍融成一塊——那需要兩片不同的葉子在同一時刻到達同一點,上一篇說這不會發生。第二,它不能把果凍撕開——軌跡是連續的。所以一分鐘後的果凍,是原本那塊被連續、不重疊地變形的結果:每一小塊有多少葉子沒變,只是占的面積變了。密度 = 葉子數 ÷ 面積,所以密度的變化完全由面積的伸縮決定。

    同一團葉子與格網被 flow map 拉長並壓扁。

    圖:小塊中的點數不變;面積伸縮透過 Jacobian 改變密度。

    flow map、pushforward、change of variables

    Flow map 的性質。 假設速度場滿足存在唯一的條件,而且解在需要的正向、反向時間區間都存在。由 M2.0 可得:

    1. Φ0=id\Phi_0=\mathrm{id};且 Φt\Phi_t 對 x0x_0 是 continuous 的(起點差一點、終點差一點,差距至多放大 eLte^{Lt} 倍——這是 M2.3 裡 Grönwall 不等式的內容,先當結論)。
    2. 可逆。 Φt\Phi_t 是一對一的:若 Φt(a)=Φt(b)\Phi_t(a)=\Phi_t(b),兩條軌跡在時刻 tt 相交,唯一性說它們整條相同,故 a=ba=b。反函數就是「把時間倒著走」:Φt−1\Phi_t^{-1} 是 vector field −v(x,t−s)-v(x,t-s) 走 tt 秒的 flow map。所以 Φt\Phi_t 是一個 diffeomorphism(可微、可逆、反函數也可微的映射),只要 vv 夠 smooth。
    3. 若 vv 不隨時間變,還有 Φs+t=Φs∘Φt\Phi_{s+t}=\Phi_s\circ\Phi_t:先走 tt 秒再走 ss 秒,等於一次走 s+ts+t 秒。

    Pushforward 的定義。 給一個可測映射 Φ\Phi 與一個分佈 p0p_0,Φ#p0\Phi_\#p_0 是「先從 p0p_0 抽 X0X_0、再算 Φ(X0)\Phi(X_0)」得到的分佈。用集合寫:對任何區域 AA,

    (Φ#p0)(A)  =  p0(Φ−1(A))(\Phi_\#p_0)(A)\;=\;p_0\big(\Phi^{-1}(A)\big)

    ——落在 AA 的機率,等於「會被送進 AA 的那些起點」在 p0p_0 下的機率。這個定義對任何映射都成立,不需要可逆。

    密度公式(change of variables)。 假設起點有 density p0p_0,且 Φt\Phi_t 是 diffeomorphism,Jacobian 的行列式不為零。此時:

    pt(y)  =  p0(Φt−1(y))  ∣det⁡∇Φt−1(y)∣  =  p0(x)∣det⁡∇Φt(x)∣ ,x=Φt−1(y).p_t(y)\;=\;p_0\big(\Phi_t^{-1}(y)\big)\;\Big|\det\nabla\Phi_t^{-1}(y)\Big| \;=\;\frac{p_0(x)}{\big|\det\nabla\Phi_t(x)\big|}\,,\qquad x=\Phi_t^{-1}(y).

    三行推導:取 yy 附近的小方塊 AA,它的原像 Φt−1(A)\Phi_t^{-1}(A) 是 xx 附近的一個小平行體,體積是 ∣det⁡∇Φt−1(y)∣⋅vol(A)|\det\nabla\Phi_t^{-1}(y)|\cdot\mathrm{vol}(A)(Jacobian 就是「局部把體積放大多少倍」)。兩邊的機率相等:pt(y) vol(A)≈p0(x) ∣det⁡∇Φt−1(y)∣ vol(A)p_t(y)\,\mathrm{vol}(A)\approx p_0(x)\,|\det\nabla\Phi_t^{-1}(y)|\,\mathrm{vol}(A)。消掉 vol(A)\mathrm{vol}(A) 即得。□\square

    這正是上一節「密度變化完全來自面積伸縮」的公式版:∣det⁡∇Φt∣|\det\nabla\Phi_t| 就是果凍那一小塊被放大的倍數。

    展開細節一維的完整例子:ẋ = −x,起點是標準 Gaussian

    flow map 是 Φ_t(x) = e^(−t) x(代入:d/dt e^(−t)x = −e^(−t)x = −Φ_t ✓)。反函數 Φ_t^(−1)(y) = e^t y,導數 e^t。若 p₀ = N(0,1),則 p_t(y) = p₀(e^t y)·e^t = (2π)^(−1/2) e^t exp(−e^(2t) y²/2), 也就是 N(0, e^(−2t)):所有葉子往原點收攏,分佈越來越窄,但總質量不變(積分仍是 1,因為多出來的 e^t 正好補償變窄)。這個例子在下一篇會再用一次,用另一條路算出同一個答案。

    直覺的一半對、一半漏

    公式描述的是局部體積,不是整個形狀。即使 ∣det⁡∇Φt∣=1|\det\nabla\Phi_t|=1,一塊正方形仍可以被剪切成平行四邊形;面積沒變,形狀卻變了。對 smooth 的 flow,∇⋅v=0\nabla\cdot v=0 會保體積;一般情況則是小塊中的葉子數不變,density 按局部體積伸縮的反比改變。

    Pushforward 的集合定義只需要一個已選定的可測映射,不要求可逆。上面的單一反函數公式則需要更強的條件:若多個起點被送到同一點,就不能直接套用它;若一整塊質量被壓成一點,結果甚至不再有普通的 density。ODE 解不唯一時,也必須先說明選擇哪條解,才有一個確定的 Φt\Phi_t。

    數葉子,還是算公式

    兩種方法各有成本。抽 NN 個起點、解 ODE 後數落進某個固定區域的比例,sampling error 通常是 O(N−1/2)O(N^{-1/2});若要估計 density,還有直方圖格子大小帶來的誤差。Change of variables 沒有這種 sampling error,但一般要數值計算反向 flow 與 Jacobian,也不表示完全沒有誤差。

    import numpy as np
    t, N = 1.0, 1000
    x0 = np.random.randn(N)                 # p0 = N(0,1)
    xt = np.exp(-t) * x0                    # Phi_t for xdot = -x(此例有 closed form)
    ys = np.linspace(-2, 2, 200)
    p_formula = np.exp(t) * np.exp(-(np.exp(t)*ys)**2/2) / np.sqrt(2*np.pi)
    hist, edges = np.histogram(xt, bins=40, range=(-2, 2), density=True)
    # 直方圖與 p_formula 應重合;N 改成 100 看直方圖變毛

    檢查理解

    想一想

    你把一張照片的每個像素座標經過同一個可逆的幾何變形(例如魚眼鏡頭效果)。「原圖中某區域的像素密度」與「變形後對應區域的像素密度」之間的關係,該用哪個工具?

    想一想

    假設已經選定一個可測映射 Φt\Phi_t,但它把不同起點送到同一點。這時:

    想一想

    場 v(x,y)=(−y, x)v(x,y)=(-y,\,x)(整條河在原地打轉)把 p0=N(0,I)p_0=\mathcal N(0,I) 推到時刻 tt 的 ptp_t 是:

    參考文獻

    1. Hirsch, M. W., Smale, S., Devaney, R. L. Differential Equations, Dynamical Systems, and an Introduction to Chaos. Academic Press, 3rd ed., 2013.(第 7 章:flow 的定義與性質,Φs+t=Φs∘Φt\Phi_{s+t}=\Phi_s\circ\Phi_t。)
    2. Villani, C. Topics in Optimal Transportation. AMS Graduate Studies in Mathematics 58, 2003.(第 1 章:pushforward(transport of measure)的定義與 change of variables。)
    3. Grimmett, G., Stirzaker, D. Probability and Random Processes. Oxford University Press, 3rd ed., 2001.(第 4 章:隨機變數的函數與密度的變數變換公式。)