搜尋課程與筆記

搜尋筆記

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

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

    M5.3 13 分鐘閱讀 2026年10月

    M5.3 只看得到樣本,怎麼調機器:對 Generator 微分

    本篇重用3 篇

    一台把亂數變成產品的機器

    想像一台機器把亂數 zz 加工成產品 x=Gθ(z)x=G_\theta(z)。在生成模型裡,這台機器是我們能微分的程式:訓練時知道 zz 與 GθG_\theta,但不一定知道成品的密度 pθ(x)p_\theta(x)。

    客戶給了你一個目標:產品的分佈要像某個規格 p∗p^*——不是每個產品都一樣,而是整體的散佈要對。你可以調整機器的參數 θ\theta。這些參數應該往哪個方向更新?

    若把同一份亂數固定住,再稍微改變 θ\theta,我們就能看出產品如何移動。能不能從這些樣本的移動,算出整個分布差距的梯度? 這就是下面要做的事。

    課堂提問Q1

    翻成數學。「產品的分佈」是 θ\theta 的什麼函數?「跟規格的差距」用哪個量寫?直接對它微分會卡在哪裡?

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

    產品 x=Gθ(z)x=G_\theta(z),z∼pzz\sim p_z(骰子的分佈,固定、與 θ\theta 無關)。產品的分佈 pθp_\theta 是 pzp_z 經 GθG_\theta 的 pushforward——同一把骰子、不同的 θ\theta,吐出不同的分佈。差距用 M5.1 的 KL:

    L(θ)=KL(pθ ∥ p∗)=Ex∼pθ[log⁡pθ(x)−log⁡p∗(x)].L(\theta)=\mathrm{KL}(p_\theta\,\|\,p^*)=\mathbb E_{x\sim p_\theta}\big[\log p_\theta(x)-\log p^*(x)\big].

    (方向是 KL(pθ∥p∗)\mathrm{KL}(p_\theta\|p^*):對「機器把產品放在規格幾乎不允許的地方」罰得重——這正是「不要生出不合規格的產品」要的方向。)

    直接微分要處理兩件事:抽樣分布 pθp_\theta 隨參數改變,被積函數的 log⁡pθ(x)\log p_\theta(x) 也隨參數改變。單純呼叫黑箱抽樣器,沒有提供樣本如何隨參數移動的資訊;重參數化提供的正是這條路徑。它不是唯一的梯度估計方式。

    解開第一個結的方法,就是這一篇的物件:把隨機性搬到 θ\theta 外面。x∼pθx\sim p_\theta 與「z∼pzz\sim p_z 然後 x=Gθ(z)x=G_\theta(z)」是同一件事,但第二種寫法裡隨機的只有 zz,它不依賴 θ\theta;θ\theta 只出現在一個普通的、可微的函數 GθG_\theta 裡。這叫 reparameterization(重參數化)。

    固定骰子,只調整參數

    想像你把機器內部的骰子換成一疊預先擲好的紙條:z1,z2,…,zNz_1,z_2,\dots,z_N。現在機器不再隨機——同一張紙條、同一個 θ\theta,永遠吐出同一個產品 Gθ(zi)G_\theta(z_i)。讓參數改變一點,每個產品都往某個方向動一點,動多少由 ∂θGθ(zi)\partial_\theta G_\theta(z_i) 決定:參數對第 ii 個產品的靈敏度。

    現在「分佈的差距」怎麼變?每個產品 xix_i 站在一個地形上:地形的高度是 log⁡pθ(x)−log⁡p∗(x)\log p_\theta(x)-\log p^*(x)——「機器認為這裡多常出現」減「規格認為這裡該多常出現」。產品站在高處(機器放太多、規格要太少)時,把它往地形低處推會讓差距變小。往低處推的方向是 −∇x[log⁡pθ−log⁡p∗]-\nabla_x\big[\log p_\theta-\log p^*\big](M0.0),而參數變動能把它推動的方向是 ∂θG\partial_\theta G。兩者的內積,對所有紙條平均,就是梯度。

    所以整條公式的畫面是:每個樣本站在「機器分佈 vs 規格」的地形上,地形的坡告訴它該往哪走,參數的靈敏度告訴我們調整哪些參數能讓它那樣走。

    Generator gradient:score 差乘上 generator 靈敏度

    圖:固定雜訊後,每個樣本所在位置的 score 差,透過 generator 靈敏度變成參數梯度。

    在一維上把它算出來

    先看一維、θ\theta 是實數的情況。假設 GθG_\theta 可微,pθ,p∗p_\theta,p^* 有適當的光滑密度、KL 有限,且可交換微分與積分。還需要 pθp_\theta 的 support 不隨 θ\theta 改變,或已正確處理邊界項。重參數化後:

    L(θ)=Ez[log⁡pθ(Gθ(z))−log⁡p∗(Gθ(z))].L(\theta)=\mathbb E_{z}\Big[\log p_\theta\big(G_\theta(z)\big)-\log p^*\big(G_\theta(z)\big)\Big].

    期望現在是對固定的 pzp_z 取的,可以直接把 ∂θ\partial_\theta 搬進去(M0.3 的微分穿過積分)。被積函數裡 θ\theta 出現在兩處:GθG_\theta 裡、以及 pθp_\theta 的下標裡。用 chain rule 全部展開:

    ∂θL=Ez[(∂xlog⁡pθ−∂xlog⁡p∗)(Gθ(z))⋅∂θGθ(z)⏟(A) 沿 x 的坡×靈敏度  +  (∂θlog⁡pθ)(Gθ(z))⏟(B) 下標裡的 θ].\begin{aligned} \partial_\theta L &=\mathbb E_z\Big[\underbrace{\big(\partial_x\log p_\theta-\partial_x\log p^*\big)\big(G_\theta(z)\big)\cdot\partial_\theta G_\theta(z)}_{\text{(A) 沿 }x\text{ 的坡}\times\text{靈敏度}} \;+\;\underbrace{\big(\partial_\theta\log p_\theta\big)\big(G_\theta(z)\big)}_{\text{(B) 下標裡的 }\theta}\Big]. \end{aligned}

    (B) 的 ∂θ\partial_\theta 是固定 xx 時對密度參數的偏導數,不是沿 Gθ(z)G_\theta(z) 的 total derivative。在上面的假設下,它的期望是零:

    Ez[∂θlog⁡pθ(Gθ(z))]=Ex∼pθ[∂θlog⁡pθ(x)]=∫pθ ∂θpθpθ dx=∂θ ⁣∫pθ dx=∂θ1=0.\mathbb E_z\big[\partial_\theta\log p_\theta(G_\theta(z))\big]=\mathbb E_{x\sim p_\theta}\big[\partial_\theta\log p_\theta(x)\big]=\int p_\theta\,\frac{\partial_\theta p_\theta}{p_\theta}\,dx=\partial_\theta\!\int p_\theta\,dx=\partial_\theta1=0.

    (第一個等號只是把 Gθ(z)G_\theta(z) 換回名字 xx;最後一步又是微分穿過積分。)所以

      ∂θ KL(pθ∥p∗)=Ez[(∂xlog⁡pθ(x)−∂xlog⁡p∗(x))∣x=Gθ(z)⋅∂θGθ(z)].  \boxed{\;\partial_\theta\,\mathrm{KL}(p_\theta\|p^*)=\mathbb E_{z}\Big[\big(\partial_x\log p_\theta(x)-\partial_x\log p^*(x)\big)\Big|_{x=G_\theta(z)}\cdot\partial_\theta G_\theta(z)\Big].\;}

    多維時,令 JθG∈Rd×mJ_\theta G\in\mathbb R^{d\times m}(樣本 dd 維、參數 mm 維),公式是 ∇θL=Ez[(JθG)⊤(sθ−s∗)]\nabla_\theta L=\mathbb E_z[(J_\theta G)^\top(s_\theta-s^*)],其中 s=∇xlog⁡ps=\nabla_x\log p。這樣得到的梯度才是 mm 維。

    讀一遍每個符號。∇xlog⁡p(x)\nabla_x\log p(x) 是密度的對數梯度——有時叫 score function,它指向「密度上升最快」的方向,並且不需要知道 normalizing constant:log⁡(p~/Z)\log(\tilde p/Z) 對 xx 微分時 log⁡Z\log Z 消失(M0.0 裡 ∇log⁡\nabla\log 的意義)。∂θGθ(z)\partial_\theta G_\theta(z) 是參數的靈敏度,由機器本身給。整條公式說:梯度 == 在每個樣本處,機器的 score 減規格的 score,乘上靈敏度,取平均。

    展開細節為什麼 (B) 消失這件事重要:兩種估計量與變異數

    另一條路是 score-function estimator:對不含 θ\theta 的 ff,∂θEpθ[f]=Epθ[f ∂θlog⁡pθ]\partial_\theta\mathbb E_{p_\theta}[f]=\mathbb E_{p_\theta}[f\,\partial_\theta\log p_\theta]。它使用的是參數方向的 score,與正文的 ∇xlog⁡p\nabla_x\log p 不同;離散輸出也能用。哪一種估計量變異數較小,取決於問題與控制變異數的方法,不是普遍的大小關係 [3]。

    Roeder、Wu 與 Duvenaud [4] 分析去掉零均值項 (B) 的估計量。去掉它仍然 unbiased,但不能只因為 E[B]=0\mathbb E[B]=0 就斷定變異數一定下降:Var(A+B)=Var(A)+Var(B)+2Cov(A,B)\mathrm{Var}(A+B)=\mathrm{Var}(A)+\mathrm{Var}(B)+2\mathrm{Cov}(A,B)。特別在 pθ=p∗p_\theta=p^* 時,(A) 每個樣本都為零,去掉 (B) 才能消除這個來源的抖動。

    公式能用,但缺一樣東西

    回答起點問題。要更新參數,你需要在每個產品 xi=Gθ(zi)x_i=G_\theta(z_i) 處算三樣東西:

    1. ∂θGθ(zi)\partial_\theta G_\theta(z_i)——機器的靈敏度。機器是你自己的,可微就有。
    2. ∇xlog⁡p∗(xi)\nabla_x\log p^*(x_i)——規格的 score。若客戶給的規格是一條公式(例如「常態、均值 5、標準差 1」),直接算。若客戶只給了一批合規格的樣本、沒有公式——這是現實中最常見的情形——這一項你沒有。從樣本估一個分佈的 score 是一個獨立的問題(score matching [5]),要另外訓一個模型。
    3. ∇xlog⁡pθ(xi)\nabla_x\log p_\theta(x_i)——機器自己的 score。這也不是免費的:你知道 GθG_\theta,但你不知道 pθp_\theta 的密度——pushforward 的密度要算 Gθ−1G_\theta^{-1} 的 Jacobian,一般的 GG 做不到。所以這一項也要另外估:拿機器吐出來的樣本、訓一個 score 模型。

    所以這條公式需要兩個 score 的資訊,但不一定需要兩個額外的 neural networks:可能有解析公式,也可能用其他估計方法。若兩者都未知,估計它們是額外的工作。Normalizing constant 在對 xx 微分時被繞過,並不是被算出來;有梯度資訊仍不代表拿到了 likelihood 或 KL 的數值。

    這個判斷依賴的假設:GθG_\theta 對 θ\theta 可微、對 zz 是連續的(產品若是離散的類別,reparameterization 就沒有直接版本,要用展開框裡的 score-function estimator 或其他 relaxation);兩個 score 估得夠準(尤其在樣本稀疏的區域,估錯的 score 會把產品推向錯的方向);以及 KL 的方向——KL(pθ∥p∗)\mathrm{KL}(p_\theta\|p^*) 允許機器「漏掉」規格的某一塊(mode dropping),若客戶要求每一種合規格的產品都要出現,該用另一個方向或另一個距離。

    一維跑一次,然後把 (B) 留著看它抖

    一維、Gθ(z)=θ+zG_\theta(z)=\theta+z、z∼N(0,1)z\sim\mathcal N(0,1),所以 pθ=N(θ,1)p_\theta=\mathcal N(\theta,1);規格 p∗=N(5,1)p^*=\mathcal N(5,1)。此時一切都有 closed form:KL=(θ−5)2/2\mathrm{KL}=(\theta-5)^2/2,真梯度是 θ−5\theta-5。兩個 score:∂xlog⁡pθ(x)=−(x−θ)\partial_x\log p_\theta(x)=-(x-\theta)、∂xlog⁡p∗(x)=−(x−5)\partial_x\log p^*(x)=-(x-5),差是 θ−5\theta-5——與 xx 無關,每個樣本都給出精確的梯度;靈敏度 ∂θG=1\partial_\theta G=1。

    import numpy as np
    rng = np.random.default_rng(0)
    theta, target, lr = 0.0, 5.0, 0.1
    for step in range(60):
        z = rng.standard_normal(256)
        x = theta + z                                              # reparameterization:固定骰子 z,x 是 θ 的可微函數
        score_model  = -(x - theta)                                # ∇ₓ log p_θ(x)
        score_target = -(x - target)                               # ∇ₓ log p*(x)
        grad_A = np.mean((score_model - score_target) * 1.0)       # (A):兩個 score 的差 × ∂G/∂θ
        grad_B = np.mean((x - theta))                              # (B):∂_θ log p_θ 在樣本處 —— 期望為零、單樣本不為零
        theta -= lr * grad_A
        if step % 15 == 0: print(step, round(theta, 3), round(grad_A, 3), round(grad_B, 3))
    print(theta)                                                   # → 5.0

    θ\theta 從 0 走到 5,grad_A 每步恰等於 θ−5\theta-5(因為兩個 score 的差不依賴 xx,這個例子裡 (A) 沒有抽樣雜訊)。grad_B 每步在 ±0.06\pm0.06 附近抖——它的期望是零,但每一批都不是零;若把它加進更新,θ\theta 收斂後仍會在 5 附近抖動,而只用 (A) 的版本在最佳點每一步都精確為零。

    若改用有限樣本估出的 score,尾端資訊不足可能帶來偏差,結果需要另外檢查。也不能把「非線性 generator」直接等同「沒有解析密度」:例如 θ+∣z∣\theta+|z| 仍有 shifted half-normal 密度,卻因 support 隨 θ\theta 移動,不能直接沿用 (B) 為零的證明。低維 latent 映到高維空間時,甚至可能沒有環境空間的密度;這時必須先確認 KL 與 score 公式是否有定義。

    互動 demo:切換生成器與規格資訊,逐步看 score 差如何推動 θ。

    檢查理解

    想一想

    一個推薦系統的「機器」輸出的是離散的商品編號 x∈{1,…,K}x\in\{1,\dots,K\},由 θ\theta 決定各編號的機率。你想調 θ\theta 讓輸出分佈接近某個目標。本篇的 reparameterization 公式:

    想一想

    把 (B) 那一項 ∂θlog⁡pθ\partial_\theta\log p_\theta 在樣本處的值留在梯度裡,不去掉。長期而言:

    想一想

    客戶只給了 200 個合規格的樣本,沒有公式。你用本篇的梯度公式調機器,發現產品分佈在規格的主體吻合得很好、但尾端明顯偏掉。最合理的診斷是:

    參考文獻

    1. Kingma, D. P., Welling, M. Auto-Encoding Variational Bayes. ICLR 2014.(reparameterization trick 的出處之一。)
    2. Rezende, D. J., Mohamed, S., Wierstra, D. Stochastic Backpropagation and Approximate Inference in Deep Generative Models. ICML 2014.(同時期獨立提出的「stochastic backpropagation」。)
    3. Mohamed, S., Rosca, M., Figurnov, M., Mnih, A. Monte Carlo Gradient Estimation in Machine Learning. JMLR 21, 2020.(score-function 與 pathwise(reparameterization)兩類估計量的系統比較與變異數分析。)
    4. Roeder, G., Wu, Y., Duvenaud, D. Sticking the Landing: Simple, Lower-Variance Gradient Estimators for Variational Inference. NeurIPS 2017.(把期望為零的 (B) 項去掉可以降低變異數。)
    5. Hyvärinen, A. Estimation of Non-Normalized Statistical Models by Score Matching. JMLR 6, 2005.(只有樣本時如何估 ∇xlog⁡p\nabla_x\log p。)