M5.3 只看得到樣本,怎麼調機器:對 Generator 微分
本篇重用3 篇
一台把亂數變成產品的機器
想像一台機器把亂數 加工成產品 。在生成模型裡,這台機器是我們能微分的程式:訓練時知道 與 ,但不一定知道成品的密度 。
客戶給了你一個目標:產品的分佈要像某個規格 ——不是每個產品都一樣,而是整體的散佈要對。你可以調整機器的參數 。這些參數應該往哪個方向更新?
若把同一份亂數固定住,再稍微改變 ,我們就能看出產品如何移動。能不能從這些樣本的移動,算出整個分布差距的梯度? 這就是下面要做的事。
課堂提問Q1
翻成數學。「產品的分佈」是 的什麼函數?「跟規格的差距」用哪個量寫?直接對它微分會卡在哪裡?
先想一想,再展開看整理後的答案
產品 ,(骰子的分佈,固定、與 無關)。產品的分佈 是 經 的 pushforward——同一把骰子、不同的 ,吐出不同的分佈。差距用 M5.1 的 KL:
(方向是 :對「機器把產品放在規格幾乎不允許的地方」罰得重——這正是「不要生出不合規格的產品」要的方向。)
直接微分要處理兩件事:抽樣分布 隨參數改變,被積函數的 也隨參數改變。單純呼叫黑箱抽樣器,沒有提供樣本如何隨參數移動的資訊;重參數化提供的正是這條路徑。它不是唯一的梯度估計方式。
解開第一個結的方法,就是這一篇的物件:把隨機性搬到 外面。 與「 然後 」是同一件事,但第二種寫法裡隨機的只有 ,它不依賴 ; 只出現在一個普通的、可微的函數 裡。這叫 reparameterization(重參數化)。
固定骰子,只調整參數
想像你把機器內部的骰子換成一疊預先擲好的紙條:。現在機器不再隨機——同一張紙條、同一個 ,永遠吐出同一個產品 。讓參數改變一點,每個產品都往某個方向動一點,動多少由 決定:參數對第 個產品的靈敏度。
現在「分佈的差距」怎麼變?每個產品 站在一個地形上:地形的高度是 ——「機器認為這裡多常出現」減「規格認為這裡該多常出現」。產品站在高處(機器放太多、規格要太少)時,把它往地形低處推會讓差距變小。往低處推的方向是 (M0.0),而參數變動能把它推動的方向是 。兩者的內積,對所有紙條平均,就是梯度。
所以整條公式的畫面是:每個樣本站在「機器分佈 vs 規格」的地形上,地形的坡告訴它該往哪走,參數的靈敏度告訴我們調整哪些參數能讓它那樣走。
圖:固定雜訊後,每個樣本所在位置的 score 差,透過 generator 靈敏度變成參數梯度。
在一維上把它算出來
先看一維、 是實數的情況。假設 可微, 有適當的光滑密度、KL 有限,且可交換微分與積分。還需要 的 support 不隨 改變,或已正確處理邊界項。重參數化後:
期望現在是對固定的 取的,可以直接把 搬進去(M0.3 的微分穿過積分)。被積函數裡 出現在兩處: 裡、以及 的下標裡。用 chain rule 全部展開:
(B) 的 是固定 時對密度參數的偏導數,不是沿 的 total derivative。在上面的假設下,它的期望是零:
(第一個等號只是把 換回名字 ;最後一步又是微分穿過積分。)所以
多維時,令 (樣本 維、參數 維),公式是 ,其中 。這樣得到的梯度才是 維。
讀一遍每個符號。 是密度的對數梯度——有時叫 score function,它指向「密度上升最快」的方向,並且不需要知道 normalizing constant: 對 微分時 消失(M0.0 裡 的意義)。 是參數的靈敏度,由機器本身給。整條公式說:梯度 在每個樣本處,機器的 score 減規格的 score,乘上靈敏度,取平均。
展開細節為什麼 (B) 消失這件事重要:兩種估計量與變異數
另一條路是 score-function estimator:對不含 的 ,。它使用的是參數方向的 score,與正文的 不同;離散輸出也能用。哪一種估計量變異數較小,取決於問題與控制變異數的方法,不是普遍的大小關係 [3]。
Roeder、Wu 與 Duvenaud [4] 分析去掉零均值項 (B) 的估計量。去掉它仍然 unbiased,但不能只因為 就斷定變異數一定下降:。特別在 時,(A) 每個樣本都為零,去掉 (B) 才能消除這個來源的抖動。
公式能用,但缺一樣東西
回答起點問題。要更新參數,你需要在每個產品 處算三樣東西:
- ——機器的靈敏度。機器是你自己的,可微就有。
- ——規格的 score。若客戶給的規格是一條公式(例如「常態、均值 5、標準差 1」),直接算。若客戶只給了一批合規格的樣本、沒有公式——這是現實中最常見的情形——這一項你沒有。從樣本估一個分佈的 score 是一個獨立的問題(score matching [5]),要另外訓一個模型。
- ——機器自己的 score。這也不是免費的:你知道 ,但你不知道 的密度——pushforward 的密度要算 的 Jacobian,一般的 做不到。所以這一項也要另外估:拿機器吐出來的樣本、訓一個 score 模型。
所以這條公式需要兩個 score 的資訊,但不一定需要兩個額外的 neural networks:可能有解析公式,也可能用其他估計方法。若兩者都未知,估計它們是額外的工作。Normalizing constant 在對 微分時被繞過,並不是被算出來;有梯度資訊仍不代表拿到了 likelihood 或 KL 的數值。
這個判斷依賴的假設: 對 可微、對 是連續的(產品若是離散的類別,reparameterization 就沒有直接版本,要用展開框裡的 score-function estimator 或其他 relaxation);兩個 score 估得夠準(尤其在樣本稀疏的區域,估錯的 score 會把產品推向錯的方向);以及 KL 的方向—— 允許機器「漏掉」規格的某一塊(mode dropping),若客戶要求每一種合規格的產品都要出現,該用另一個方向或另一個距離。
一維跑一次,然後把 (B) 留著看它抖
一維、、,所以 ;規格 。此時一切都有 closed form:,真梯度是 。兩個 score:、,差是 ——與 無關,每個樣本都給出精確的梯度;靈敏度 。
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
從 0 走到 5,grad_A 每步恰等於 (因為兩個 score 的差不依賴 ,這個例子裡 (A) 沒有抽樣雜訊)。grad_B 每步在 附近抖——它的期望是零,但每一批都不是零;若把它加進更新, 收斂後仍會在 5 附近抖動,而只用 (A) 的版本在最佳點每一步都精確為零。
若改用有限樣本估出的 score,尾端資訊不足可能帶來偏差,結果需要另外檢查。也不能把「非線性 generator」直接等同「沒有解析密度」:例如 仍有 shifted half-normal 密度,卻因 support 隨 移動,不能直接沿用 (B) 為零的證明。低維 latent 映到高維空間時,甚至可能沒有環境空間的密度;這時必須先確認 KL 與 score 公式是否有定義。
互動 demo:切換生成器與規格資訊,逐步看 score 差如何推動 θ。
檢查理解
參考文獻
- Kingma, D. P., Welling, M. Auto-Encoding Variational Bayes. ICLR 2014.(reparameterization trick 的出處之一。)
- Rezende, D. J., Mohamed, S., Wierstra, D. Stochastic Backpropagation and Approximate Inference in Deep Generative Models. ICML 2014.(同時期獨立提出的「stochastic backpropagation」。)
- Mohamed, S., Rosca, M., Figurnov, M., Mnih, A. Monte Carlo Gradient Estimation in Machine Learning. JMLR 21, 2020.(score-function 與 pathwise(reparameterization)兩類估計量的系統比較與變異數分析。)
- Roeder, G., Wu, Y., Duvenaud, D. Sticking the Landing: Simple, Lower-Variance Gradient Estimators for Variational Inference. NeurIPS 2017.(把期望為零的 (B) 項去掉可以降低變異數。)
- Hyvärinen, A. Estimation of Non-Normalized Statistical Models by Score Matching. JMLR 6, 2005.(只有樣本時如何估 。)