搜尋課程與筆記

搜尋筆記

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

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

    U1.0 25 分鐘閱讀 2026年10月

    U1.0 生成到底在學什麼?

    本篇重用5 篇

    一個看起來很簡單的要求

    我們手上有五萬張 32×32 的圖片。 從過去對機器學習與深度學習的理解,我們已經很熟悉一套基本做法: 定義 loss,然後用梯度下降把它降下來。 現在,突然有人丟給你一個不太一樣的問題: 只靠這些我們已經會的工具,能不能讓模型「生」出一張它從沒看過,卻看起來像是來自同一批資料的新圖片?

    示意圖:左邊是 50,000 張同一批的 32×32 動物圖,中間是 loss 曲線與 gradient descent 的一步,右邊是一張帶問號的新圖。

    圖:問題長什麼樣。 這其實就是我們現在面對的問題:手上有一堆樣本,我們會做的事情是透過定義 loss 去做 gradient descent,但最後想得到的,卻是一個看起來像是新的、卻又合理的樣本。

    這篇我們想要把這句看起來很直覺的要求,慢慢翻成一個我們真的可以處理的數學問題,並在工程上實作看看。首先我們要先理解:

    什麼叫做「生」出一張圖片?
    以及,什麼又叫做
    「看起來像是來自同一批資料」?

    「生」一張圖片,與「來自同一批資料」

    一張 32×32 的彩色 RGB 圖片,總共由 32×32×3=307232\times32\times3=3072 個數字構成(RGB 共 3 種顏色)。把每個數字當成一個座標,一張圖就可以被想成 3072 維歐氏空間 R3072\mathbb R^{3072} 裡的一個點。

    補充3072 維空間裡的一個點是什麼意思?

    就是一個由 3072 個數字排成的向量。比較熟悉的例子是 R3\mathbb R^3:一個點就是 (x1,x2,x3)(x_1,x_2,x_3) 這樣三個數字,例如 (1, 2, −0.5)(1,\,2,\,-0.5),可以想成三維空間裡的一個位置。R3072\mathbb R^{3072} 只是把「三個數字」換成「3072 個數字」。

    所以,每一張可能出現的 32×32 RGB 圖片,都對應到這個空間中的某一個點。但這些圖片並不是毫無規律地出現在整個空間裡:真實世界中,某些圖片比較常出現、某些圖片比較少見,還有很大量的點可能對應到的只是一團噪聲,或根本不像合理的圖片。

    也就是說,所有可能的資料背後,其實存在著某種 distribution:它描述了資料比較可能出現在哪裡、又比較不可能出現在哪裡。我們把這個真實但未知的資料分布記成 pdatap_{\text{data}}。

    如果把它想成連續分布,pdata(x)p_{\text{data}}(x) 就是它的 probability density。不要直接把它理解成「資料剛好出現在 xx 這個點的機率」,而比較適合理解成:資料有多密集地出現在 xx 附近。pdata(x)p_{\text{data}}(x) 越高,代表從這個資料來源中抽樣時,我們越容易看到落在這附近的圖片;越低,則代表這附近的圖片比較少見。

    補充為什麼不說「機率」?

    在連續空間裡,任何單一個點的機率都是 0;而 pdata(x)p_{\text{data}}(x) 這個值本身甚至可以大於 1,所以它不可能是機率。有意義的是把密度乘上一小塊體積:pdata(x) dxp_{\text{data}}(x)\,\mathrm dx 才近似「抽一個樣本、它落在 xx 附近那一小塊」的機率,而如果把整個空間積分起來,則會等於 1——因為樣本一定會落在空間中的某個位置。

    因此,pdatap_{\text{data}} 是一個定義在整個資料空間上的函數:空間中的每個位置都有一個 density value。如果我們能把這個值當成高度畫出來,它就像是一片地形——資料常出現的地方是高地,少出現的地方比較低,而局部最密集的位置就是 mode。

    現在回頭看我們手上的五萬張圖片。這五萬張圖片不是 pdatap_{\text{data}} 本身,而只是從 pdatap_{\text{data}} 中抽出來的五萬個樣本;換成幾何的語言,它們就是 R3072\mathbb R^{3072} 裡我們實際觀察到的五萬個點。因為它們來自同一個 pdatap_{\text{data}},所以通常也會反映出背後分布的一部分結構:某些區域的樣本很多,某些區域很少,還有大量區域我們可能一個樣本都沒有看過。

    從看得見的動物照片,到資料空間中的樣本點,再把整個空間上的 density 畫成地形;樣本點和產生樣本的 distribution 是不同物件。

    左欄是我們拿得到的照片,中欄把每張照片看成一個點,右欄才是背後的 pdata(x)p_{\text{data}}(x)。每個位置都有 density value,不只樣本所在處;山峰是 mode。真實圖片位於 R3072\mathbb R^{3072},這裡用二維位置加上 density 高度示意。

    Week 3 投影片 2 · 點圖查看原圖

    有了這個畫面,「生成」和「看起來像是來自同一批資料」其實就可以一起說清楚了。

    所謂生成,就是希望再從 pdatap_{\text{data}} 中抽出一個新的點。不是從原本五萬張圖片裡挑一張出來——那比較像是檢索——而是產生一個我們之前沒有看過的新樣本。

    為什麼這個新樣本仍然會「像」原本的資料?因為它和那五萬張圖片來自同一個 distribution。pdatap_{\text{data}} 密度高的地方比較容易被抽到,密度低的地方比較不容易,所以抽出來的點大多會落在合理的區域。

    但要注意,我們並沒有一條規則可以直接「禁止」它落在低密度的地方;只是那些地方本來就比較不容易被抽到而已。

    所以,「看起來像是來自同一批資料」更精確地說,就是:

    這個新的點,也像是從同一個 pdatap_{\text{data}} 裡抽出來的。

    麻煩也正在這裡:決定資料怎麼生成的是背後的 pdatap_{\text{data}},但我們看不到它——拿得到的只有從它抽出來的有限樣本。我們看得到的是五萬個點,真正想知道的卻是產生這些點的那片「地形」。

    如果直接讓神經網路表示 density 呢?

    既然「生成」就是從 pdatap_{\text{data}} 再抽一個樣本,最直接的想法自然是:用一個神經網路表示 pθ(x)p_\theta(x),讓它逼近 pdatap_{\text{data}},訓練好後再從 pθp_\theta 抽樣。

    但在寫 loss 之前,這個網路得先輸出一個合法的 density。這代表它必須同時滿足兩個要求:

    • 每個位置都不能是負的: pθ(x)≥0p_\theta(x)\geq 0;
    • 把整個空間積分起來必須等於 1: ∫pθ(x) dx=1\int p_\theta(x)\,dx=1。

    一般神經網路可以輸出任意實數,所以第一個要求不會自動成立;而且就算我們已經讓每個位置的輸出都是正的,第二個要求仍然不一定成立。因此,我們要分別用數學把這兩個要求補上。

    先讓網路輸出一個數值 Eθ(x)E_\theta(x),再把 −Eθ(x)-E_\theta(x) 放進 exponential:

    p~θ(x)=e−Eθ(x)>0.\tilde p_\theta(x)=e^{-E_\theta(x)}>0.

    這一步滿足了第一個要求。Eθ(x)E_\theta(x) 越低,xx 附近的 p~θ(x)\tilde p_\theta(x) 就越高;但 p~θ\tilde p_\theta 的總量還不一定是 1。於是我們先算出整個空間的總量 ZθZ_\theta,再把每個位置都除以它:

    正的權重,怎麼變成合法的 density?

    Zθ=∫p~θ(x) dx,pθ(x)=p~θ(x)Zθ. \begin{gathered} \reveal{2}{Z_\theta=\int\tilde p_\theta(x)\,dx,}\\[.2em] \reveal{1}{p_\theta(x)=} \reveal{3}{\frac{\reveal{1}{\tilde p_\theta(x)}}{\reveal{2}{Z_\theta}}.} \end{gathered}
    1. 每個位置已經有正的權重 p~θ(x)\tilde p_\theta(x),但它還不是總量為 1 的 density。
    2. 把整個空間的權重積分起來,得到同一個總量 ZθZ_\theta。
    3. 只要總量有限,每個位置都除以它,就把總量調成 1。

    只要 ZθZ_\theta 有限,這一步就滿足了第二個要求,因為 ∫pθ(x) dx=1\int p_\theta(x)\,dx=1。這種先替每個位置指定 energy,再把 energy 轉成 distribution 的模型,叫做 energy-based model [1]。

    補充為什麼叫做 energy?

    這個名字來自統計物理。在那裡,一個狀態出現的機率常寫成

    p(x)∝e−E(x).p(x)\propto e^{-E(x)}.

    能量 E(x)E(x) 越低,e−E(x)e^{-E(x)} 就越大,這個狀態也越容易出現。Energy-based model 沿用同一個數學形式:讓神經網路替每個 xx 指定一個數值 Eθ(x)E_\theta(x),低 energy 代表模型認為這個 xx 比較可能,高 energy 則代表比較不可能。

    這裡的 energy 不一定是真實世界中的物理能量;它只是模型用來表示「這個 xx 和資料有多相符」的一個數值。真正的 probability density,仍要經過 exponential 與 normalization 才會得到。

    現在 density 有了,我們可以用 maximum likelihood:讓資料真正出現的位置,在 pθp_\theta 下有較高的 density。把 negative log-likelihood 寫開,

    Ldensity(θ)=−Ex∼pdatalog⁡pθ(x)=Ex∼pdataEθ(x)+log⁡Zθ.\mathcal L_{\text{density}}(\theta) =-\mathbb E_{x\sim p_{\text{data}}}\log p_\theta(x) =\mathbb E_{x\sim p_{\text{data}}}E_\theta(x)+\log Z_\theta .

    第一項會把訓練資料附近的 energy 往下拉。麻煩在第二項:ZθZ_\theta 是對整個 3072 維圖片空間積分,不能只靠手上的五萬張圖片算出來。

    不過,真正訓練時需要的不是 ZθZ_\theta 的數值,而是 loss 的 gradient。對上式微分後,

    ∇θLdensity=Ex∼pdata ⁣[∇θEθ(x)]−Ex′∼pθ ⁣[∇θEθ(x′)].\nabla_\theta\mathcal L_{\text{density}} = \mathbb E_{x\sim p_{\text{data}}}\!\left[\nabla_\theta E_\theta(x)\right] - \mathbb E_{x'\sim p_\theta}\!\left[\nabla_\theta E_\theta(x')\right].

    第一個期望可以用 training data 估計;第二個期望卻是對模型自己的 distribution 取平均。要算它,我們得先從目前的 pθp_\theta 抽出很多 x′x'。於是出現了一個循環:我們原本想訓練一個能抽樣的 distribution,訓練它的 gradient 卻先要求我們已經會從它抽樣。

    這種「式子寫得出來,但其中的計算無法直接完成」的情況,通常稱為難以直接計算(intractable)。Energy-based model 並不是不能訓練;常見方法會用 approximate sampling 來估第二項。只是對我們現在的目標來說,它已經指出第一個困難:直接學 density,normalization 與 sampling 會綁在一起。

    換一個角度:不學密度,直接學一個能生成樣本的函數?

    既然直接學一個可抽樣的 density 會遇到上面的循環,那換個角度:有沒有哪個 distribution 是我們本來就會抽的?有——標準 Gaussian N(0,I)\mathcal N(0,I)。

    符號為什麼 Gaussian 這麼好抽?

    N(0,I)\mathcal N(0,I) 是 Rd\mathbb R^{d} 上的標準常態分布。它之所以「很好抽」,關鍵不是 density 長得簡單,而是電腦已經有成熟的方法,可以直接產生標準 Gaussian random numbers;不需要先訓練另一個模型,也不需要在空間裡反覆移動許多步。

    到了 dd 維就更簡單,因為每個座標彼此獨立:

    zi∼iidN(0,1),pz(z)=(2π)−d/2exp⁡ ⁣(−12∥z∥2).z_i\overset{\text{iid}}{\sim}\mathcal N(0,1),\qquad p_z(z)=(2\pi)^{-d/2}\exp\!\Big(-\tfrac{1}{2}\|z\|^2\Big).

    所以抽一個 dd 維樣本,只是直接抽 dd 個一維 Gaussian——程式裡的一行 torch.randn(d),背後做的就是這件事。

    既然 Gaussian 這麼容易抽,就可以換一個角度想:把 N(0,I)\mathcal N(0,I) 當成一種隨手可得的原料——想要多少就抽多少。但我們真正想要的不是 Gaussian noise,而是來自 pdatap_{\text{data}} 的圖片。那問題就變成:

    能不能找到一台「加工機器」,把這些隨手可得的 Gaussian 原料,變成我們真正想要的資料?

    把這台機器寫成一個函數(function)GG:先抽一個 z∼N(0,I)z\sim\mathcal N(0,I),再把它丟進 GG,得到 x=G(z)x=G(z)。如果 GG 學得夠好,讓大量不同的 zz 經過它之後,產生的 xx 整體上正好遵循 pdatap_{\text{data}},那生成問題就解決了:

    z∼N(0,I)⟹G(z)∼pdata.z\sim\mathcal N(0,I)\quad\Longrightarrow\quad G(z)\sim p_{\text{data}}.

    生成一個新樣本於是只剩兩件事:先抽一個很好抽的 zz,再用 GG 把它變成我們真正想要的 xx。 用機率的語言說,GG 把 N(0,I)\mathcal N(0,I) 這個 distribution 搬成了 pdatap_{\text{data}}——這件事叫做 pushforward;而負責搬運的這個 GG,也常被稱作把 N(0,I)\mathcal N(0,I) 送到 pdatap_{\text{data}} 的 transport map(傳輸映射)。

    定義Pushforward

    給一個分布 pzp_z 和一個(可測)函數 GG,把每個樣本都送過 GG 之後得到的新分布記成 G#pzG_\#p_z,定義是:對任意集合 AA,

    (G#pz)(A)  =  pz(G−1(A)),\big(G_\#p_z\big)(A)\;=\;p_z\big(G^{-1}(A)\big),

    也就是「G(z)G(z) 落在 AA 裡」的機率,等於「zz 落在會被 GG 送進 AA 的那些位置」的機率。等價的寫法是對任意函數 ff,

    Ex∼G#pz[f(x)]=Ez∼pz[f(G(z))].\mathbb E_{x\sim G_\#p_z}\big[f(x)\big]=\mathbb E_{z\sim p_z}\big[f(G(z))\big].

    於是我們的目標可以一行寫完:找一個 GG 使 G#N(0,I)=pdataG_\#\mathcal N(0,I)=p_{\text{data}}。

    把容易抽樣的 Gaussian 點雲送過 transport map G_theta,得到資料常出現區域的點雲;中間以沙堆變成沙堡比喻重新安排位置。

    左邊先抽 z∼pz=N(0,I)z\sim p_z=\mathcal N(0,I),中間用帶參數的 GθG_\theta 決定每個 zz 被送到哪裡,右邊收集 x=Gθ(z)x=G_\theta(z)。目標是這整批輸出的 distribution Gθ#pzG_{\theta\#}p_z 接近 pdatap_{\text{data}};沙堆變成沙堡,對應的就是重新安排每粒沙的位置。

    Week 3 投影片 6 · 點圖查看原圖

    那接下來的問題就很直接了:我們要怎麼學這個 GG? 我們手上有 pdatap_{\text{data}} 的樣本、也有 G(z)G(z) 的樣本,得從這裡寫出一個對 θ\theta 可微的 loss。

    課堂提問Q1

    手上既然有真實資料 xx,也有生成出來的 G(z)G(z),那用傳統 prediction 的做法不就好了:抽一批 zz、算出 G(z)G(z),再跟資料算 L2L_2:

    隨機配對之後,這個 loss 在要求什麼?

    L(θ)=Ez, x[∥Gθ(z)−x∥2]. \begin{gathered} \reveal{1}{\mathcal L(\theta)=}\\[.2em] \reveal{5}{\mathbb E_{z,\,x}\Big[ \reveal{4}{\big\|\reveal{2}{G_\theta}\reveal{1}{(z)}\reveal{3}{-x}\big\|^2} \Big].} \end{gathered}
    1. 先抽一個容易取得的 Gaussian 原料 zz。
    2. 把 zz 送進 GθG_\theta,得到一張生成圖片。
    3. 再獨立抽一張真實圖片 xx,拿它來和生成圖片比較。
    4. 用兩張圖片的平方距離,衡量這一次配對的誤差。
    5. 對獨立抽到的 zz 與 xx 取平均,也就是把各種隨機配對都當作學習目標。

    這樣訓練下去會發生什麼事?

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

    問題在於:L2L_2 需要配對,但這裡沒有人告訴我們哪個 zz 該對到哪張圖。zz 是我們自己隨手抽的,xx 是資料集裡隨手拿的一張,兩者之間本來就沒有任何對應關係。

    而如果配對是隨機的,這個 loss 的最佳解可以直接算出來。固定一個 zz,因為 xx 與 zz 獨立,

    arg⁡min⁡v Ex∥v−x∥2=E[x]⟹Gθ(z)≡Ex∼pdata[x]  對所有 z.\arg\min_{v}\ \mathbb E_{x}\big\|v-x\big\|^2=\mathbb E[x] \qquad\Longrightarrow\qquad G_\theta(z)\equiv\mathbb E_{x\sim p_{\text{data}}}[x]\ \ \text{對所有 } z .

    也就是說,模型的最佳策略是不管拿到什麼 zz,都輸出同一張「所有訓練圖片的平均」——一張灰灰的、模糊的四不像。它的 L2L_2 很低,但完全沒有多樣性,更不是從 pdatap_{\text{data}} 抽出來的樣本。這正是 regression 遇到多解問題時會出現的回歸到平均。

    同一區域的 z 在不同次訓練可能被隨機配到貓、狗或汽車;因為 z 和 x 獨立,平方誤差的最佳輸出是與 z 無關的資料平均。

    左邊的箭頭只是這次隨機配出的 training pairs;下一次,同一區域的 zz 又可能被配到完全不同的 xx。因此固定 zz 時,target 仍來自完整的 pdatap_{\text{data}},右邊的最佳解才會是 G⋆(z)=E[x]G^\star(z)=\mathbb E[x],對所有 zz 都一樣。

    Week 3 投影片 7 · 點圖查看原圖

    再往上看一層,會發現是目標本身錯位了:我們真正要的是「G(z)G(z) 的分布等於 pdatap_{\text{data}}」——一個分布層級的條件;而 L2L_2 問的是「這一個 G(z)G(z) 有沒有對上這一張 xx」——一個逐樣本的條件。兩堆樣本可以分布完全相同,隨機抽樣卻沒有任何一對彼此靠近。因此,設計一個逐樣本的 loss 去學一個分布層級的目標,最後自然只會學到平均。

    於是有兩個自然的方向:

    • 換一個分布層級的目標,直接比較生成出來的整體 distribution 與 pdatap_{\text{data}};
    • 或者,自己把配對定下來——如果每個 zz 都被指定好要變成哪個 xx(甚至指定整條中間路徑),逐樣本的回歸就重新變得合理。

    我們先看第一個方向能走到哪裡,再回來看「自己製造配對」會帶出什麼方法。

    如果 GθG_\theta 可逆,能不能把 density 算回來?

    課堂提問的結論是:隨機配對的 L2L_2 在比較單一樣本,但我們真正需要的是一個分布層級的目標。既然 GθG_\theta 已經能產生樣本,一個自然的想法是先把它產生的 density pθ(x)p_\theta(x) 算出來,再用 likelihood 訓練。

    麻煩是,知道怎麼算 x=Gθ(z)x=G_\theta(z),不代表知道某個 xx 的 density。要把 pθ(x)p_\theta(x) 算回來,我們至少得知道這個 xx 是由哪一個 zz 變來的,以及 GθG_\theta 在附近把空間拉開或壓縮了多少。

    如果 GθG_\theta 可逆而且夠光滑,第一件事可以用 Gθ−1(x)G_\theta^{-1}(x) 找回 zz;第二件事則由 Jacobian determinant 記錄。Change of variables 於是給出

    log⁡pθ(x)=log⁡pz ⁣(Gθ−1(x))+log⁡∣det⁡∂Gθ−1∂x(x)∣.\log p_\theta(x)=\log p_z\!\big(G_\theta^{-1}(x)\big)+\log\Big|\det\frac{\partial G_\theta^{-1}}{\partial x}(x)\Big| .

    第一項問的是「倒推回去的 zz 在 Gaussian 裡有多常見」;第二項修正 GθG_\theta 對局部體積造成的改變。這類用一連串可逆 transformation,把簡單 distribution 變成複雜 distribution 的模型,叫做 normalizing flow [2, 3]。

    只要 inverse 與 log-det 都算得出來,pθ(x)p_\theta(x) 就能直接計算,我們也就能使用 maximum likelihood:

    min⁡θ L(θ)=− Ex∼pdata[log⁡pθ(x)].\min_\theta\ \mathcal L(\theta)=-\,\mathbb E_{x\sim p_{\text{data}}}\big[\log p_\theta(x)\big].
    補充什麼是 maximum likelihood?為什麼這樣做有用?

    可以把模型分布 pθp_\theta 想成一個下注的人。他手上的籌碼總額固定——這對應到

    ∫pθ(x) dx=1.\int p_\theta(x)\,dx=1 .

    他要做的,就是把這些籌碼分配到整個資料空間:某些地方押多一點,某些地方押少一點。

    接著,我們把手上的五萬張圖片 x(1),…,x(N)x^{(1)},\ldots,x^{(N)} 一張一張攤出來,每次都問:「這張圖片出現的位置,你押了多少?」模型在 x(i)x^{(i)} 上押的量就是 pθ(x(i))p_\theta(x^{(i)});取 log 之後的 log⁡pθ(x(i))\log p_\theta(x^{(i)}),就是這筆資料對 log-likelihood 的貢獻。

    因為籌碼總額固定,模型不能靠「所有地方都押很多」來作弊:押到幾乎不會出現資料的地方,就代表能留給真正資料區域的籌碼變少了。所以想讓 likelihood 變高,模型就必須慢慢把更多的 probability mass 放到資料真正容易出現的地方——直覺上,就是讓 pθp_\theta 的地形越來越像 pdatap_{\text{data}}。

    對 NN 個獨立樣本來說,

    1N∑i=1Nlog⁡pθ(x(i))  ≈  Ex∼pdata[log⁡pθ(x)],\frac1N\sum_{i=1}^N \log p_\theta\big(x^{(i)}\big)\;\approx\;\mathbb E_{x\sim p_{\text{data}}}\big[\log p_\theta(x)\big],

    因此 maximum likelihood 就是在最大化「資料實際出現位置上的平均 log probability」。

    而且它確實是一個 distribution-level 的 objective,因為

    KL(pdata ∥ pθ)=Epdata[log⁡pdata(x)]−Epdata[log⁡pθ(x)],\mathrm{KL}\big(p_{\text{data}}\,\|\,p_\theta\big)=\mathbb E_{p_{\text{data}}}\big[\log p_{\text{data}}(x)\big]-\mathbb E_{p_{\text{data}}}\big[\log p_\theta(x)\big],

    第一項和 θ\theta 無關,所以最大化 likelihood,就等價於最小化 KL(pdata∥pθ)\mathrm{KL}(p_{\text{data}}\|p_\theta)——而它等於 0 的唯一情況,就是兩個分布完全相同(M5.1)。

    這個方法確實解決了「怎麼為整體 distribution 寫 loss」的問題,但條件也很明確。每看到一張 training image xx,我們都必須算出 Gθ−1(x)G_\theta^{-1}(x),還要計算 Jacobian determinant。一般神經網路通常沒有便宜的 inverse;而一般 d×dd\times d Jacobian 的 determinant 需要 O(d3)O(d^3) 的計算,在 d=3072d=3072 時也很難每一步都做。

    因此,normalizing flow 不能直接使用任意神經網路。它必須刻意限制每一層的結構,讓 inverse 與 log-det 都算得動。這是它為精確 likelihood 做的交換:

    要把 likelihood 精確寫成 loss,就得讓 GθG_\theta 保持可逆,並讓 Jacobian determinant 容易計算。

    同一個終點,可以有很多種搬法

    即使最後生成的 distribution 完全相同,把 Gaussian 搬成 pdatap_{\text{data}} 的方法也通常不只一種。很多不同的 GG,都可能滿足

    G#pz=pdata.G_\#p_z=p_{\text{data}} .

    想像要把一倉庫的紙箱,重新排成另一個倉庫的樣子。只要最後每個位置上的紙箱數量相同,就算搬運成功;但哪一箱要搬去哪裡、中途要走哪條路,可能有很多種安排。Distribution 只規定最後整批貨物要長成什麼樣子,沒有替每一個起點指定終點。

    這就是 transport map 的 underdetermined:終點固定了,搬法卻沒有唯一答案。Maximum likelihood 可以判斷最後的 pθp_\theta 是否接近 pdatap_{\text{data}},但不會替我們指定唯一的配對或路徑;normalizing flow 則為了算這個 likelihood,必須限制 GθG_\theta 的結構。

    互動 demo:終點相同,搬法不只一種。 按「換一組配對」,t=0t=0 的 Gaussian 與 t=1t=1 的目標 distribution 都不會變;改變的是哪些點被配在一起,以及它們中途怎麼走。

    如果配對不存在,我們能不能自己製造?

    到這裡,我們遇到的困難其實都和「整體」有關:直接學 density,要處理整個空間的 normalization;直接學 GθG_\theta,隨機配對的 L2L_2 只會學到平均;改用 exact likelihood,又要限制 GθG_\theta 必須可逆且 log-det 好算。

    但課堂提問也留下了一個線索:L2L_2 本身沒有錯,錯的是我們隨便把 zz 和 xx 配在一起。如果 training pairs 是我們自己造出來的,普通的 regression 就可能重新變得有用。

    怎麼造?先不要從 Gaussian 猜它應該變成哪張圖片,而是把方向反過來。Training 時我們手上本來就有乾淨資料 x0x_0;如果我們自己訂一套規則,逐步把它加入 noise,就能親手製造出 x1,x2,…,xTx_1,x_2,\ldots,x_T。

    這很像我們先錄下一段「把紙箱逐步打散」的影片。影片中的每一格怎麼來,我們都知道;因此要學著倒放時,不必一口氣猜完整的搬運方式,而可以先練習:看到這一格,下一步該怎麼往前一格修正?

    這套由乾淨資料逐步加入 noise 的規則,就是接下來要建立的 forward process。它不會讓 reverse direction 自動變簡單,但會提供我們可以直接抽樣的 noisy states,並把原本「一步生成整張圖片」的問題,拆成許多不同 noise levels 上的學習問題。

    Diffusion 的第一步,不是先猜一個完整的 generator,而是先設計一個能由資料自行製造 training pairs 的 forward process。

    接下來真正要決定的是:noise 該怎麼一步一步加入,才能讓任意時刻的 xtx_t 都容易產生、最後的 xTx_T 又變成我們熟悉且容易抽樣的 distribution?

    消化一下

    想一想

    對 L(θ)=Ez, x∥Gθ(z)−x∥2\mathcal L(\theta)=\mathbb E_{z,\,x}\|G_\theta(z)-x\|^2(zz 與 xx 各自獨立隨機抽)做 minimization,如果真的達到最優解,GθG_\theta 會變成什麼?

    想一想

    Normalizing flow 要求 GG 可逆、且 Jacobian determinant 好算。這個要求是為了:

    想一想

    用 energy-based model 的 maximum likelihood 訓練時,gradient 裡最麻煩的是哪一項?

    想一想

    為什麼 diffusion model 要先設計一條由資料逐步加入 noise 的 forward process?

    參考文獻

    1. LeCun, Y., Chopra, S., Hadsell, R., Ranzato, M., Huang, F. A Tutorial on Energy-Based Learning. 2006.
    2. Papamakarios, G., Nalisnick, E., Rezende, D. J., Mohamed, S., Lakshminarayanan, B. Normalizing Flows for Probabilistic Modeling and Inference. JMLR 2021.
    3. Rezende, D. J., Mohamed, S. Variational Inference with Normalizing Flows. ICML 2015.