f-GAN、Wasserstein GAN 與 BiGAN:minimax 的框架能最佳化哪些距離?
上一講的 GAN 在理想條件下最小化 JSD。這講把同一招推廣:用 Fenchel conjugate 把任何 f-divergence 寫成「對 discriminator 取最大值」的變分形式(f-GAN)。f-divergence 在兩個分佈的支撐集不重疊時會失去梯度,所以改用 Wasserstein(earth mover)距離,透過 Kantorovich–Rubinstein 對偶得到 WGAN。最後,GAN 沒有 encoder,BiGAN 讓 discriminator 看 \((\mathbf x,\mathbf z)\) 配對來學一個。
讀完這頁你應該能夠
- 寫出 f-divergence 的定義與條件,用 Jensen 不等式證明它非負,並說出 KL、reverse KL 對應的 \(f\)。
- 寫出 Fenchel conjugate 的定義,證明 \(f^{**}\le f\),並用「支撐線」的圖像解釋它。
- 推導 f-GAN 的變分下界 \(D_f(p,q)\ge\sup_T\mathbb E_p[T] - \mathbb E_q[f^*(T)]\),說明為什麼它不需要 likelihood,以及為什麼是下界。
- 用兩個點質量的例子說明 KL 和 JS 在支撐集不重疊時沒有梯度,而 Wasserstein 距離有。
- 寫出 Wasserstein 距離的 coupling 定義與 Kantorovich–Rubinstein 對偶,說明 WGAN 怎麼近似 1-Lipschitz 限制。
- 說明 BiGAN 的架構:encoder、generator,以及 discriminator 看的是什麼。
前置知識檢查
- 第 9 講:GAN 的 minimax 目標、最佳 discriminator、\(2D_{\mathrm{JSD}}-\log 4\)、non-saturating loss、mode collapse。
- 第 4 講:KL 非負的證明(Jensen 不等式);第 5 講:ELBO 是下界、用最佳化去逼近它。
- 凸函數的定義、切線在凸函數下方。
- 聯合分佈與邊際分佈(Wasserstein 距離要用到)。
本頁對照過投影片圖片;標「出處」的補充來自 Nowozin et al. (2016) f-GAN 原文(TeX 原始檔)、Lilian Weng〈From GAN to WGAN〉、Arjovsky et al. (2017)、Gulrajani et al. (2017)、Lai et al. (2026)(arXiv 2510.21890v3)§1.1.1 與 §7.2.1。
01回顧與今天的計畫(投影片 2–3)
GAN 的好處是 likelihood-free:不用為了能算 \(p_\theta(\mathbf x)\) 而選特殊架構。訓練一個分類器分辨真假樣本,它的表現就是「模型有多像資料」的指標。在最佳 discriminator 之下,generator 最小化的是 \(2D_{\mathrm{JSD}}(p_{\text{data}},p_G) - \log 4\)。00:04
投影片 3 指向 The GAN Zoo,那裡列了數百種有名字的 GAN。今天的四個主題:05:52
- 用 f-GAN 得到一大類 likelihood-free 的目標。
- Wasserstein GAN。
- 用 BiGAN 推斷潛在表示。
- 應用:用 CycleGAN 做影像轉換(課堂上沒時間講,見第 8 節)。
02f-divergence(投影片 4–7)
第一部分的模型都用 KL,因為它和 likelihood 配合得很好;GAN 近似地用了 JSD。還有哪些選擇?07:27
- 凸:圖形上任兩點的連線在函數上方。
- 下半連續:技術條件,類似連續;如果有跳躍,函數值要在跳躍的較低側或更低。不重要。09:05
- 直覺:逐點看密度比 \(p/q\),用 \(f\) 決定「比值偏離 1 時懲罰多少」。比值等於 1 的地方懲罰為 0。
投影片 5 的圖:一條向上彎的凸曲線,上面取兩點連成一條直線段,直線段整段在曲線上方;x 軸上標了一點 \(x_0\),示意下半連續的定義。
非負性:和第 4 講證明 KL 非負的方法一樣,用 Jensen 不等式(\(f\) 凸):11:15
而 \(p = q\) 時處處比值為 1,\(D_f = 0\)。所以它是一個合理的訓練目標。
換 f,得到不同的散度
| 名稱 | \(D_f(p\Vert q)\) | \(f(u)\) |
|---|---|---|
| KL | \(\int p\log\frac pq\) | \(u\log u\) |
| Reverse KL | \(\int q\log\frac qp\) | \(-\log u\) |
| Pearson \(\chi^2\) | \(\int\frac{(p-q)^2}{q}\) | \((u-1)^2\) |
| Squared Hellinger | \(\int(\sqrt p-\sqrt q)^2\) | \((\sqrt u-1)^2\) |
| Total variation | \(\frac12\int|p-q|\) | \(\frac12|u-1|\) |
| Jensen–Shannon | \(\frac12 D_{\mathrm{KL}}(p\Vert m)+\frac12 D_{\mathrm{KL}}(q\Vert m)\),\(m=\frac{p+q}2\) | \(\frac12\big[u\log u-(u+1)\log\frac{u+1}{2}\big]\) |
| GAN | \(2D_{\mathrm{JSD}} - \log 4\) | \(u\log u-(u+1)\log(u+1)\) |
投影片 6 的表(Nowozin et al. 2016):列出約 12 種 f-divergence,包括 total variation、KL、reverse KL、Pearson \(\chi^2\)、Neyman \(\chi^2\)、squared Hellinger、Jeffrey、Jensen–Shannon、加權 JS、GAN、α-divergence,每列有積分形式和生成函數 \(f(u)\)。上表是其中幾列,並依 \(D_f(p\Vert q)=\mathbb E_q[f(p/q)]\) 重新核對過,見下方說明。13:54
問題:密度比算不出來
想訓練模型,可以最小化 \(D_f(p_\theta,p_{\text{data}})\) 或 \(D_f(p_{\text{data}},p_\theta)\):15:56
期望可以用樣本近似,但密度比需要 \(p_{\text{data}}(\mathbf x)\)。就算模型的 likelihood 算得出來,資料的密度也永遠算不出來。目標是把它改寫成只需要兩邊樣本的形式:這樣就回到 GAN 的設定,generator 可以是任意網路。18:00
03Fenchel conjugate(投影片 8)
- \(f^*\) 一定是凸的(即使 \(f\) 不是):對每個固定的 \(u\),\(ut-f(u)\) 是 \(t\) 的線性函數;一堆線性函數的上確界(pointwise supremum)是凸的。25:23
- \(f^{**}\le f\):由定義,對所有 \(t,u\),\(f^*(t)\ge ut-f(u)\),移項得 \(f(u)\ge ut - f^*(t)\)。這對所有 \(t\) 成立,所以 \(f(u)\ge\sup_t\big(ut-f^*(t)\big) = f^{**}(u)\)。26:26
- Strong duality:當 \(f\) 凸且下半連續時,\(f^{**} = f\)。conjugate 兩次就回到原函數。27:59
老師把接下來的策略比作 ELBO:把 \(f\) 改寫成一個最佳化問題(\(f = f^{**} = \sup_t\ldots\)),再用「不完全最佳化」得到一個下界。
幾何直覺:支撐線(supporting lines)
固定 \(t\),直線 \(y = tu - f^*(t)\) 是斜率為 \(t\)、而且「剛好碰到 \(f\) 圖形、但不穿過它」的那條直線:\(f^*(t)\) 正是讓直線往上推到碰到曲線為止所需的截距(取負號)。所以 \(f^{**}(u) = \sup_t\big(tu - f^*(t)\big)\) 的意思是:在點 \(u\) 上,看所有斜率的支撐線,取最高的那條。凸函數就是它所有切線的上包絡,所以 \(f^{**} = f\);非凸函數則會被「凸包」取代,所以只有 \(f^{**}\le f\)。課堂上老師也這樣說:這是在用一族支撐超平面描述函數圖形的凸包。40:01
最佳的 t:如果 \(f\) 可微,\(\sup_u(ut - f(u))\) 的一階條件是 \(t = f'(u)\)。反過來,給定 \(u\),達到 \(\sup_t(tu - f^*(t))\) 的 \(t\) 就是 \(t^* = f'(u)\):在 \(u\) 的切線斜率。這在下一節會變成「最佳 discriminator」。
例:\(f(u) = u\log u\)。\(\frac{d}{du}(ut - u\log u) = t - \log u - 1 = 0\Rightarrow u = e^{t-1}\),代回得 \(f^*(t) = te^{t-1} - e^{t-1}(t-1) = e^{t-1}\)。
Demo AConjugate 與支撐線
灰線是 \(f(u)\)。細線是一族支撐線 \(y = tu - f^*(t)\)(取不同斜率 \(t\)),它們全部在 \(f\) 下方,而它們的上包絡就是 \(f\)。拖動 \(u_0\):粗線是在 \(u_0\) 達到上確界的那條,斜率 \(t^* = f'(u_0)\)。
Total variation 的 \(f\) 在 \(u=1\) 有尖角,那裡的切線不唯一(斜率可以是 \([-\frac12,\frac12]\) 中任一個);而且它的 conjugate 定義域只有 \(|t|\le\frac12\),這就是為什麼 f-GAN 需要針對每個 \(f\) 設計 discriminator 的輸出範圍(見第 4 節的補充)。
04f-GAN:變分散度最小化(投影片 9–11)
把 \(f\) 換成 \(f^{**}\),再把它的定義展開:29:02
- 第一行:\(f\) 凸且下半連續,所以 \(f = f^{**}\);再代入 \(f^{**}\) 的定義。關鍵變化:密度比原本在 \(f\) 的裡面,現在變成和 \(t\) 線性相乘。29:37
- 第二行:每個 \(\mathbf x\) 有不同的密度比,因此有不同的最佳 \(t\),記為 \(T^*(\mathbf x)\)。把期望寫成積分,\(q(\mathbf x)\) 和分母的 \(q(\mathbf x)\) 約掉。30:37
- 第三行,等號:「對每個 \(\mathbf x\) 各自選最佳的 \(t\)」等價於「選一個函數 \(T:\mathcal X\to\mathbb R\)」,只要函數可以任意複雜(把每個 \(\mathbf x\) 的答案存進一張表就行)。這和 VAE 的 amortized inference 是同一個味道。34:16
- 第三行,不等號:只在一族函數 \(\mathcal T\)(例如某種架構的神經網路)中最佳化,可能達不到最佳,所以得到下界。\(\mathcal T\) 越有彈性,下界越緊。35:19
投影片 11 的總結:KL 對應 autoregressive 與 flow;JSD(縮放平移後、近似地)對應原始 GAN;任何其他 f-divergence(近似地)對應 f-GAN。48:22
f-GAN 原論文的 MNIST 實驗(Table 4,用 16,384 個樣本做 kernel density 估計 test log-likelihood):KL 416、Pearson χ² 429、Jensen–Shannon 367、GAN 305 nats。作者自己提醒這個估計在 784 維很不可靠,重複實驗的差異可達 50 nats,結論「並不完全確定」;他們只說 KL 訓練的模型比 GAN 有較高的 holdout likelihood「令人安心」。出處:Nowozin et al. (2016) §4「MNIST Digits」段落與 Table 4,已對照 TeX。
最佳的 T 是什麼?為什麼原始 GAN 是特例?
由上一節的支撐線觀點,對每個 \(\mathbf x\),達到上確界的 \(t\) 是在 \(u = p(\mathbf x)/q(\mathbf x)\) 的切線斜率:
所以 discriminator 其實在學密度比的某個函數。例:KL 的 \(T^* = 1 + \log\frac pq\);Pearson 的 \(T^* = 2(\frac pq - 1)\)。
原始 GAN:取 \(f(u) = u\log u - (u+1)\log(u+1)\),它的 conjugate 是 \(f^*(t) = -\log(1-e^t)\)(定義域 \(t<0\))。令 \(T = \log D\),\(D\in(0,1)\):
正是第 9 講的 \(V(G,D)\)。最佳的 \(T^* = f'(u) = \log\frac{u}{1+u}\),所以 \(D^* = e^{T^*} = \frac{u}{1+u} = \frac{p}{p+q}\),和第 9 講推出的最佳 discriminator 一樣。44:44
輸出活化函數:\(T\) 的值必須落在 \(f^*\) 的定義域。f-GAN 把 \(T_\phi(\mathbf x) = g_f(V_\phi(\mathbf x))\) 寫成「無限制的網路輸出 \(V_\phi\) 再接一個活化函數 \(g_f\)」,例如 KL 用 \(g_f(v) = v\),reverse KL 用 \(-e^{-v}\)(必須為負),GAN 用 \(-\log(1+e^{-v})\)(必須為負),squared Hellinger 用 \(1-e^{-v}\)(必須小於 1)。Demo B 就照這張表實作。
出處:Nowozin, Cseke & Tomioka (2016), "f-GAN", arXiv 1606.00709(TeX 原始檔的 Table 1、Table 2 與 §2.4「Representation for the Variational Function」);Lai et al. (2026) §1.1.1 "Beyond KL"。
Demo B訓練 T,估計 f-divergence 的下界
固定 \(p = \mathcal N(0,1)\)(資料,橘)和 \(q = \mathcal N(1,1.2^2)\)(模型,綠),各 2,000 個訓練樣本。訓練一個 1→16→16→1 的網路 \(V_\phi\),接上對應的 \(g_f\),最大化 \(\mathbb E_p[T] - \mathbb E_q[f^*(T)]\)。藍線是學到的 \(T(x)\),虛線是理論最佳 \(T^*(x) = f'(p/q)\)。下界有兩種算法:用數值積分算 \(\mathbb E_p[T]\) 和 \(\mathbb E_q[f^*(T)]\)(精確的期望,所以一定是下界),以及用 4,000 + 4,000 個 held-out 樣本估計。真值也用數值積分。
- 五種 \(f\) 用數值積分算出的下界都在真值下方,差距約 0.2%–2%(實測:GAN 0.2%、reverse KL 0.9%、Pearson 1.6%、squared Hellinger 1.7%、KL 1.8%):學到的 \(T\) 不是 \(T^*\),所以只能得到下界,這裡的小網路已經很接近。
- 但同一個 \(T\) 用 held-out 樣本估計時,五種 \(f\) 的估計值反而都比真值高 1%–12%(這組 held-out 樣本恰好偏向一邊,五種 \(f\) 共用同一組樣本,所以一起偏高)。「下界」是對期望而言;實際訓練時只有有限樣本,估計值帶著抽樣誤差,可能落在真值兩側。f-GAN 的 discriminator 也同樣只看得到有限樣本。
- 在 \(p\) 和 \(q\) 都有很多樣本的區域,藍線貼近虛線;在兩側的尾巴,樣本很少,\(T\) 和 \(T^*\) 可能差很多。Reverse KL 的 \(T^* = -q/p\) 在右側尾巴(\(p\) 很小)會急遽往負無窮走,最難學。
- GAN 那一項的真值是 \(2D_{\mathrm{JSD}}-\log 4\approx -1.19\),所以 \(D_{\mathrm{JSD}}\approx 0.098\)。
05支撐集不重疊的問題,與 Wasserstein 距離(投影片 12–13)
f-divergence 很強大,但當 \(p\) 和 \(q\) 的支撐集(機率非零的點的集合)不重疊時會出問題。這在訓練初期很常見:generator 的樣本可能和訓練集差非常遠。48:54
定義 \(D_f(p,q) = \mathbb E_q[f(p/q)]\) 要求 \(q\) 的支撐集涵蓋 \(p\) 的,否則會出現不連續。最簡單的例子:\(p\) 是 0 點上的點質量,\(q_\theta\) 是 \(\theta\) 點上的點質量。49:56
對 \(\theta\) 而言兩者都沒有梯度:沒有任何訊號告訴你 \(\theta = 0.5\) 比 \(\theta = 10\) 好。我們需要一個在支撐集不重疊時仍有定義、而且會隨 \(\theta\) 平滑變化的距離。51:00
Earth mover(Wasserstein)距離
把機率質量想成一堆堆的土。把 \(p\) 的土堆形狀搬成 \(q\) 的形狀,最少要做多少功?搬得越遠越費力。兩個分佈都歸一化,所以土的總量一樣。51:36
投影片 13 的圖:左邊 \(p\) 是 x 軸上幾座高低不同的棕色土堆,右邊 \(q\) 是另一種排列的土堆,中間一把鏟子,示意把左邊的土搬成右邊的形狀。
- \(\gamma(\mathbf x,\mathbf y)\):從 \(\mathbf x\) 搬到 \(\mathbf y\) 的土量。\(\gamma(\mathbf y\mid\mathbf x)\):位置 \(\mathbf x\) 的土要分給哪些 \(\mathbf y\),是一個機率化的搬運計畫。
- 邊際 \(\int\gamma\,d\mathbf y = p(\mathbf x)\):不能搬走比原本更多的土(起始條件)。邊際 \(\int\gamma\,d\mathbf x = q(\mathbf y)\):搬完之後要剛好是目標形狀(終止條件)。55:49
- \(\Vert\mathbf x-\mathbf y\Vert_1\) 是搬一單位土的成本(一維就是 \(|x-y|\)):從這裡搬到 Palo Alto 比搬到舊金山便宜。61:05
- 點質量的例子:所有土都要從 0 搬到 \(\theta\),所以 \(D_w(p,q_\theta) = |\theta|\),隨 \(\theta\) 線性變化,處處有有用的梯度。57:53
一維的 Wasserstein 距離有封閉解
在一維,最佳搬運計畫是「按順序配對」:\(p\) 的第 \(\alpha\) 分位數搬到 \(q\) 的第 \(\alpha\) 分位數,不交叉。因此
兩組各 \(n\) 個樣本時,就是把兩組都排序,再對應相減取絕對值平均。高維度就沒有這麼簡單了,一般要解一個線性規劃,這也是為什麼要用下一節的對偶形式。Lai et al. 的書第 7 章從 OT 的觀點連到 diffusion 與 flow matching(Monge–Kantorovich 形式、\(W_2\)、Schrödinger bridge)。
出處:Lai et al. (2026) §7.2.1 "Optimal Transport"(coupling 的定義與離散情況的矩陣表示);Lilian Weng〈From GAN to WGAN〉"What is Wasserstein distance?"(離散土堆的例子)。
Demo CKL、JS、W 隨位移的變化
投影片的點質量例子的平滑版:\(p = U[-w,w]\)、\(q_\theta = U[\theta-w,\theta+w]\),兩個寬度相同的均勻分佈。只要 \(\theta\ne0\),\(p\) 就有一部分落在 \(q\) 為 0 的地方,所以 \(D_{\mathrm{KL}}(p\Vert q_\theta) = \infty\)。JSD 等於 \((1-o)\log 2\),\(o\) 是重疊比例;\(W_1 = |\theta|\)。
把 \(w\) 調小(例如 0.05),就逼近投影片的點質量:JSD 在 \(|\theta|>2w\) 的地方完全平坦(梯度 0),只有在 \(\theta\) 非常靠近 0 的窄窄一段才有斜率;W 則不管 \(w\) 多小都是一個 V 字形,任何位置都指向正確方向。
06Wasserstein GAN(投影片 14–15)
和 f-divergence 一樣,定義本身用到 \(p\)、\(q\) 的密度,沒辦法直接算。但有一個變分(對偶)形式:64:15
- 這裡沒有 \(f^*\),就只是兩個期望之差。64:46
- 如果沒有 Lipschitz 限制,只要找一個 \(p\ne q\) 的點,把 \(f\) 在那裡無限拉高,目標就會發散。限制讓 \(f\) 只能「平緩地」在 \(p\) 多的地方高、\(q\) 多的地方低。這個 \(f\) 叫 critic 或 witness function。65:16
和 f-GAN 不同,這不保證是下界:Lipschitz 限制只是近似地強制,只能說是一個近似。69:25
投影片 15 的圖(Arjovsky et al. 2017 Figure 2):x 軸從 −8 到 8。藍色是真實資料的高斯(中心約 −5),綠色是假樣本的高斯(中心約 +5),兩者幾乎不重疊。紅色是一般 GAN 的 discriminator:在 0 附近從 1 陡降到 0,在兩團樣本所在處都完全平坦,標註「regular GAN 的梯度消失」。青色是 WGAN 的 critic:一條幾乎是直線的斜線,標註「WGAN 的線性梯度」。結論:訓練更穩定、mode collapse 較少。70:59
老師的解釋:discriminator 很容易分開這兩團,結果是一條極陡的 sigmoid,在假樣本附近幾乎是平的,generator 不知道該把樣本往哪移。WGAN 的 critic 幾乎是線性的,在假樣本處有清楚的斜率,generator 知道往左移就會更好,而且知道「這裡的點比那裡的點好」。71:29
怎麼強制 Lipschitz?weight clipping、gradient penalty、spectral normalization
- Weight clipping(原始 WGAN):每次更新 critic 之後,把所有權重截斷到 \([-c,c]\)(例如 \(c = 0.01\)),讓函數的斜率有上界。原論文自己承認這是「強制 Lipschitz 的糟糕方法」:\(c\) 太大收斂慢,\(c\) 太小梯度消失。
- Gradient penalty(WGAN-GP):在真假樣本之間隨機內插的點 \(\hat{\mathbf x}\) 上,加 \(\lambda(\Vert\nabla_{\hat{\mathbf x}}D(\hat{\mathbf x})\Vert_2 - 1)^2\),常用 \(\lambda = 10\)。理由:最佳 critic 在最佳搬運路徑上的梯度範數恰好是 1。Petzka et al. (2018) 建議只懲罰「大於 1」的部分(one-sided)。
- Spectral normalization(Miyato et al. 2018):把每層權重矩陣除以它的最大奇異值,讓每層都 1-Lipschitz,整個網路也就 1-Lipschitz(leaky ReLU 本身是 1-Lipschitz)。
Gradient penalty 的梯度要對「\(\nabla_{\mathbf x}D\)」再對參數微分(二階導數),本頁 demo 手寫的小網路沒有這個功能,所以改用差分商近似:在內插點 \(\mathbf a\) 和 \(\mathbf a + h\mathbf u\)(\(\mathbf u\) 是隨機單位向量,\(h = 0.05\))上算 \(D\),懲罰 \(\lambda\max(0,|D(\mathbf a+h\mathbf u)-D(\mathbf a)|/h - 1)^2\)。這是 one-sided penalty 的有限差分版本,只需要一階梯度。
出處:Arjovsky, Chintala & Bottou (2017), "Wasserstein GAN";Gulrajani et al. (2017), "Improved Training of Wasserstein GANs";Petzka, Fischer & Lukovnicov (2018), "On the regularization of Wasserstein GANs";Miyato et al. (2018), "Spectral Normalization";Lilian Weng〈From GAN to WGAN〉。
Demo D重現投影片 15:誰給 generator 有用的梯度?
真實樣本 \(\mathcal N(-5,1)\)(橘),假樣本 \(\mathcal N(5,0.7^2)\)(綠),兩者都固定。同時訓練兩個 1→32→32→1 的網路:一個用 cross-entropy 當 discriminator(藍,畫 \(D(x)\)),一個用 WGAN 目標加 Lipschitz 懲罰當 critic(紫,畫 \(f(x)\),縮放後畫在同一張圖)。下方小箭頭是每個假樣本收到的梯度方向與大小。
- 原始(saturating)generator loss \(\log(1-D(G(\mathbf z)))\):在假樣本處 \(D\approx 0\),梯度是 \(D\cdot|\partial_x s|\),實測約 \(10^{-5}\),箭頭小到看不見,就是投影片說的梯度消失。
- Non-saturating loss(第 9 講補充):梯度是 \((1-D)\cdot|\partial_x s|\),比原始 loss 大好幾個數量級(實測約 0.09),但仍比 WGAN 小。它的大小取決於 discriminator 的 logit \(s\) 在假樣本處有多陡:logit 在遠離決策邊界處常常變平,不同初始化差異很大(另一次離線實驗是 2.7)。所以「梯度消失」最嚴重的是原始 minimax loss;non-saturating 能緩解,但不保證,而且 Arjovsky & Bottou (2017) 指出它有另外的不穩定問題。
- WGAN critic:在整個範圍幾乎是一條直線,斜率約 1.5(懲罰是軟性的,所以會略超過 1),每個假樣本都收到大小相近、指向真實資料的梯度。它的另一個好處在 Demo C:critic 的值本身就是距離的估計,會隨著兩團靠近而變小。
Demo EGAN vs WGAN:8 個高斯排成一圈
第 9 講 Demo D 的同一個資料(半徑 2、標準差 0.05 的 8 個高斯)。兩個模型用相同的架構(2 層 32 個隱藏單元)、相同的初始化種子,各訓練 4,800 步:左邊是 GAN(non-saturating loss),右邊是 WGAN(critic 每步更新 1 次,Lipschitz 懲罰 \(\lambda = 10\))。
我用同一份程式和設定在 Node.js 上跑了種子 1–6。GAN 訓練對極小的數值差異很敏感,瀏覽器和 Node.js 的浮點運算細節不同,所以同一個種子在這個頁面上的結果不會完全一樣(例如種子 1:頁面上 WGAN 的「最少/最多」是 81%,Node.js 上是 51%;GAN 兩邊都是 22%),但整體趨勢相同。到 4,800 步:
| 涵蓋的 mode 數 | 最少的 mode 是最多的 | 落在 mode 附近 | |
|---|---|---|---|
| GAN | 7–8(兩個種子漏掉 1 個) | 2%–73%,中位數約 17% | 69%–78% |
| WGAN | 6 個種子都是 8 | 20%–86%,中位數約 75% | 48%–76% |
- WGAN 的主要差別是分配均勻:GAN 常把大部分樣本放在幾個 mode,冷落其他的。這和投影片說的「較少 mode collapse」一致。
- WGAN 前期比較慢:1,600 步時常常只涵蓋 1–6 個 mode,GAN 已經有 5–8 個。到 4,800 步時,落在 mode 附近的比例兩者差不多(GAN 69%–78%、WGAN 48%–76%),WGAN 沒有比較「銳利」。
- 下方曲線是 WGAN critic 的估計 \(\mathbb E_{\text{data}}[f]-\mathbb E_G[f]\)。它先上升(critic 還在學),之後隨著樣本變好而下降;結果最差的種子 2,最後的估計值也最高(0.27,其他種子約 0.13–0.16)。這是 WGAN 的實際好處:loss 本身可以用來監看訓練,原始 GAN 的 loss 做不到。
- 這只是一個小玩具,不要過度解讀。
07從 GAN 推回潛在表示:BiGAN(投影片 16–19)
GAN 的 generator 是有向的潛在變數模型 \(\mathbf z\to\mathbf x\)。給一個 \(\mathbf x\),能不能找回它的 \(\mathbf z\),當成特徵拿去做半監督學習、分群等下游任務?77:09
- 不像 flow:\(G\) 不需要可逆,沒辦法直接反解。
- 不像 VAE:沒有 inference network \(q(\mathbf z\mid\mathbf x)\)。
- 解法 1:拿 discriminator 倒數第二層的 activation 當特徵。直覺:要分辨真假,它必須學到資料中有用的特徵,就像監督式學習的網路一樣,可以 fine-tune 到其他任務。78:12
- 解法 2:要直接推出 generator 的 \(\mathbf z\),需要不同的學習演算法。改成比較 \((\mathbf x,\mathbf z)\) 的聯合分佈,而不只是 \(\mathbf x\)。模型生成的 \(\mathbf x\) 有對應的 \(\mathbf z\)(自己抽的),但資料的 \(\mathbf x\) 沒有,所以需要一個 encoder。79:15
投影片 18–19 的圖(Donahue et al. 2017):左上紫色框標 features,裡面的 \(\mathbf z\) 經過三角形 \(G\) 變成 \(G(\mathbf z)\),放在藍綠色 data 框中;左下 data 框裡的 \(\mathbf x\) 經過反向的三角形 \(E\) 變成 \(E(\mathbf x)\),放在 features 框中。兩個配對 \((G(\mathbf z),\mathbf z)\) 和 \((\mathbf x,E(\mathbf x))\) 都送進右邊的三角形 \(D\),輸出 \(P(y)\):這一對是來自 generator 還是 encoder?
- Encoder \(E:\mathbf x\mapsto\mathbf z\):訓練時只看真實資料 \(\mathbf x\sim p_{\text{data}}\)。
- Generator \(G:\mathbf z\mapsto\mathbf x\):訓練時只看先驗樣本 \(\mathbf z\sim p(\mathbf z)\)。
- Discriminator 看配對(拼接起來):分辨 \((\mathbf z, G(\mathbf z))\) 和 \((E(\mathbf x),\mathbf x)\)。
- 訓練完:用 \(G\) 生成新樣本,用 \(E\) 推斷真實資料的潛在表示。
如果 discriminator 分不出這兩種配對,代表 encoder 產生的 \(\mathbf z\) 和 generator 用來生成那個 \(\mathbf x\) 的 \(\mathbf z\) 很像:encoder 實際上在反轉 generator。這和 VAE 很像,但 \(E\) 是確定性的,而且不是用 ELBO 裡的 KL 訓練,而是用 discriminator 做的 two-sample test。82:15
BiGAN 的理論保證
同一時間還有一篇幾乎一樣的工作 ALI(Dumoulin et al. 2017),差別是允許 encoder 和 generator 是隨機的。BiGAN 論文證明:在最佳 discriminator 下,目標等於兩個聯合分佈 \(p_E(\mathbf x,\mathbf z) = p_{\text{data}}(\mathbf x)\delta(\mathbf z - E(\mathbf x))\) 和 \(p_G(\mathbf x,\mathbf z) = p(\mathbf z)\delta(\mathbf x - G(\mathbf z))\) 之間的 JSD;全域最佳時兩個聯合分佈相同,此時 \(E = G^{-1}\)(在幾乎所有點上)。也就是說,理想情況下 encoder 恰好是 generator 的反函數,即使訓練時從沒直接要求過。
出處:Donahue, Krähenbühl & Darrell (2017), "Adversarial Feature Learning", arXiv 1605.09782(Theorem 1–2);Dumoulin et al. (2017), "Adversarially Learned Inference", arXiv 1606.00704。
08時間不夠沒講到的投影片:CycleGAN、AlignFlow、StarGAN(投影片 20–28)
影片在 BiGAN 的問答後結束;第 11 講直接開始講 energy-based model,沒有回頭講這部分。以下是投影片內容的整理。
跨領域的影像轉換(投影片 20)
給兩個領域 \(\mathcal X\)、\(\mathcal Y\) 的影像(例如照片和莫內的畫)。成對的例子(同一場景的照片與畫)很難取得;能不能只用不成對的兩堆圖,非監督地學 \(\mathcal X\leftrightarrow\mathcal Y\)?
投影片 20 的圖(Zhu et al. 2017):左邊「Paired」是一列列的配對,例如鞋子的線稿對應實拍照片;右邊「Unpaired」是兩欄互不對應的圖,一欄是風景照片、一欄是畫作。
CycleGAN(投影片 21–23)
- 學兩個條件生成模型 \(G:\mathcal X\to\mathcal Y\) 與 \(F:\mathcal Y\to\mathcal X\)。
- discriminator \(D_{\mathcal Y}\) 比較真實的 \(\mathcal Y\) 和 \(\hat{\mathcal Y} = G(\mathcal X)\);\(D_{\mathcal X}\) 比較真實的 \(\mathcal X\) 和 \(\hat{\mathcal X} = F(\mathcal Y)\)。
- Cycle consistency:從 \(\mathcal X\) 經 \(G\) 到 \(\hat{\mathcal Y}\),應該能經 \(F\) 回到原圖:\(F(G(X))\approx X\);反之 \(G(F(Y))\approx Y\)。
(投影片把 discriminator 寫在 min 下面,實際上 \(D_{\mathcal X},D_{\mathcal Y}\) 要對 GAN 項取 max,和第 9 講一樣是 minimax。)
投影片 22–23 的圖(Zhu et al. 2017):(a) 兩個圓 \(X\)、\(Y\) 之間有 \(G\) 和 \(F\) 兩個方向的箭頭,各有一個 discriminator;(b)(c) 示意 \(x\to\hat y\to\hat x\) 和 \(y\to\hat x\to\hat y\) 兩個循環,回到原點的誤差就是 cycle-consistency loss。投影片 23 是結果:莫內的畫 ↔ 照片、斑馬 ↔ 馬、夏天 ↔ 冬天的優勝美地,以及同一張風景照轉成莫內、梵谷、塞尚、浮世繪風格。
為什麼需要 cycle consistency?
只有 GAN 項的話,\(G\) 只被要求「輸出看起來像 \(\mathcal Y\) 領域的圖」,它完全可以忽略輸入,把每張照片都變成同一張好看的畫,或者把照片對應到內容無關的畫(這也是一種 mode collapse)。分佈層級的對齊有無限多種 \(\mathcal X\to\mathcal Y\) 的對應方式都能達成。cycle consistency 要求轉換可以被逆轉,等於要求 \(G\) 保留足夠的輸入資訊,大幅縮小可行的對應方式。
出處:Zhu, Park, Isola & Efros (2017), "Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks", arXiv 1703.10593。
AlignFlow(投影片 24)
如果 \(G\) 是 flow 模型呢?那就不用另外參數化 \(F\):\(F = G^{-1}\)。可以用 MLE 和/或對抗學習訓練,而且精確地 cycle-consistent:\(F(G(X)) = X\)、\(G(F(Y)) = Y\)。
投影片 24 的圖(Grover et al. 2020):左邊是 CycleGAN 的圖示,\(X\)、\(Y\) 之間有兩個獨立的映射;右邊是 AlignFlow:\(X\) 和 \(Y\) 各有一個 flow 映射到共享的潛在空間 \(Z\),\(G_{X\to Y} = G_{Z\to Y}\circ G_{X\to Z}\),反方向就是它的反函數。(AlignFlow 是 Ermon 實驗室的工作。)
StarGAN(投影片 25–27)
如果有很多個領域呢?CycleGAN 對 \(k\) 個領域需要 \(k(k-1)\) 個生成器(每對兩個方向)。StarGAN 只用一個生成器,把目標領域的標籤當條件輸入。
投影片 25–27 的圖(Choi et al. 2018):(a) cross-domain models:4 個領域兩兩之間有 12 個生成器 \(G_{12},G_{21},\dots\);(b) StarGAN:5 個領域圍著中間一個生成器 \(G\),呈星形。投影片 26 是訓練流程:discriminator 同時判斷真假和領域分類;generator 吃「輸入圖+目標領域」產生假圖,再吃「假圖+原領域」重建原圖(也是 cycle consistency)。投影片 27 是 CelebA 人臉的結果:同一張臉改成金髮、改變性別、變老、蒼白膚色,以及 RaFD 資料集的生氣、開心、害怕等表情。
總結(投影片 28)
- 關鍵觀察:實務上,樣本品質和 likelihood 不相關。
- two-sample test 目標讓我們只靠樣本學生成模型(likelihood-free)。
- two-sample test 目標的範圍很廣,涵蓋 f-divergence、Wasserstein 距離等等。
- 可以用 BiGAN 推斷潛在表示。
- 可以用 CycleGAN、AlignFlow、StarGAN 做 cycle-consistent 的領域轉換。
與其他講的關聯
- 第 4 講:KL 非負的 Jensen 證明,直接推廣成 f-divergence 非負。
- 第 5–6 講:f-GAN 的下界和 ELBO 同一個思路(把目標寫成最佳化、做不完全就得到下界);「對每個 x 選最佳 t」換成「學一個函數 T」就是 amortization。BiGAN 的 encoder 對應 VAE 的 encoder。
- 第 7–8 講:flow 可逆,所以 AlignFlow 的 cycle consistency 是精確的。
- 第 9 講:原始 GAN 是 f-GAN 取特定 \(f\) 的特例;最佳 \(D^* = p/(p+q)\) 就是 \(T^* = f'(p/q)\)。
- 第 11–14 講:noise contrastive estimation 也是「用分類器估計密度比」;score matching 改用 Fisher divergence。
- 第 16 講之後:optimal transport 的觀點(coupling、Wasserstein)在 flow matching 與 diffusion 中再次出現(Lai et al. 第 7 章)。
常見誤解
自我測驗
1. 用 Jensen 不等式證明 f-divergence 非負。
2. 為什麼 KL 的生成函數是 \(u\log u\),reverse KL 是 \(-\log u\)?
3. 求 \(f(u) = u\log u\) 的 conjugate。
4. 證明 \(f^{**}\le f\)。
5. f-GAN 的推導中,哪一步產生了「≥」?為什麼?
6. 最佳的 T 是什麼?它和第 9 講的 \(D^*\) 有什麼關係?
7. 兩個點質量 \(\delta_0\)、\(\delta_\theta\) 的 KL、JS、W 各是多少?哪個能用來訓練 θ?
8. Wasserstein 距離定義中的兩個邊際條件各代表什麼?
9. 為什麼 Kantorovich–Rubinstein 對偶需要 Lipschitz 限制?
10. 列出兩種實作 Lipschitz 限制的方法和各自的缺點。
11. 在投影片 15 的設定,為什麼一般 GAN 的 generator 收不到梯度?
12. BiGAN 的 discriminator 看什麼?訓練後 encoder 怎麼用?
13. CycleGAN 為什麼需要 cycle-consistency loss?AlignFlow 為什麼不需要另外加?
延伸閱讀
- Nowozin, Cseke & Tomioka (2016), f-GAN(本頁參考,TeX 原始檔):conjugate 表、輸出活化函數、不同 f 的實驗。
- Lilian Weng, From GAN to WGAN(本頁參考):支撐集不重疊、Wasserstein 距離、weight clipping。
- Arjovsky, Chintala & Bottou (2017), Wasserstein GAN(投影片 15 的圖)。
- Gulrajani et al. (2017), WGAN-GP;Petzka et al. (2018), one-sided penalty;Miyato et al. (2018), Spectral Normalization。
- Donahue et al. (2017), BiGAN;Dumoulin et al. (2017), ALI。
- Zhu et al. (2017), CycleGAN;Grover et al. (2020), AlignFlow;Choi et al. (2018), StarGAN。
- Lai et al. (2026)(v3)(本頁參考)§1.1.1 f-divergence、第 7 章 optimal transport。
- The GAN Zoo。