Generative Adversarial Networks:不用 likelihood,改用分類器比較分佈
到目前為止的三種模型(autoregressive、VAE、flow)都在最小化 \(D_{\mathrm{KL}}(p_{\text{data}}\Vert p_\theta)\),為此要費心設計能算 likelihood 的架構。這講換掉「怎麼比較兩個分佈」這一環:用 two-sample test 的想法,訓練一個分類器(discriminator)分辨真假樣本,再讓 generator 去騙它。只要能從模型取樣就能訓練,生成網路沒有任何架構限制。在理想條件下,這等於最小化 Jensen–Shannon divergence。代價是一個不穩定的 minimax 最佳化問題。
讀完這頁你應該能夠
- 說出 MLE 的兩個優點(統計效率、壓縮),並舉例說明 likelihood 高不代表樣本好、樣本好也不代表 likelihood 高。
- 解釋 two-sample test 的設定,以及為什麼手工設計的統計量在高維度不夠用。
- 寫出 discriminator 的訓練目標,推導最佳 discriminator \(D^*(\mathbf x) = p_{\text{data}}/(p_{\text{data}}+p_\theta)\)。
- 寫出 GAN 的 minimax 目標,推導在 \(D^*\) 之下它等於 \(2D_{\mathrm{JSD}} - \log 4\)。
- 寫出交替更新的訓練演算法,說明 generator 的梯度只經過第二項。
- 說明 GAN 的三個實務問題:最佳化不穩定、沒有停止準則、mode collapse。
前置知識檢查
- 第 4 講:MLE 等價於最小化 \(D_{\mathrm{KL}}(p_{\text{data}}\Vert p_\theta)\);KL 非負;forward KL 是 mode-covering。
- 二元分類與 cross-entropy loss(logistic regression)、sigmoid。
- 第 6 講:reparameterization(generator 的梯度要穿過取樣過程)。
- 第 7–8 講:flow 模型 \(\mathbf x = f_\theta(\mathbf z)\);GAN 的 generator 長得一樣,但不需要可逆。
本頁對照過投影片圖片;標「出處」的補充來自 Lilian Weng〈From GAN to WGAN〉、Goodfellow et al. (2014)、Theis et al. (2016)、Lai et al. (2026)(arXiv 2510.21890v3)§1.1.1 與 §1.2。
01為什麼一直用 MLE?(投影片 2–3)
課程的大圖:資料是從未知的 \(p_{\text{data}}\) 抽出的 iid 樣本;模型族是用神經網路參數化的一組分佈;定義某種「相似度」,在模型族中找最接近 \(p_{\text{data}}\) 的那個。到目前為止三種模型族都選了同一個相似度:00:06
投影片 2 的圖:左邊幾張狗和貓的照片標著 \(\mathbf x_i\sim p_{\text{data}}\),右邊一團綠色區域代表模型族 \(\mathcal M\),裡面有一點 \(p_\theta\),兩者之間的虛線標著 \(d(p_{\text{data}},p_\theta)\)。這講要換掉的就是這條虛線。
這樣做的好理由有兩個:
- 統計效率最佳:在一些理想條件下(模型夠強、存在唯一的 \(\theta^*\) 使 \(p_{\theta^*} = p_{\text{data}}\)),當樣本數 \(M\to\infty\) 時,MLE 收斂到 \(\theta^*\) 的速度是所有統計方法中最快的。也就是說,用同樣多的資料,它能給出最準的答案。04:12
- Likelihood 越高 = 無損壓縮越好(第 4 講)。能把資料壓得很好,代表你能預測資料中會發生什麼,這通常是個好的學習目標。05:46
但如果我們在意的是「生成的圖好不好看」,likelihood 是個好指標嗎?06:47
「統計效率」是什麼意思?
估計量 \(\hat\theta\) 是資料的函數,所以本身是隨機的。在所有不偏估計量中,變異數有一個下界,叫 Cramér–Rao bound:\(\mathrm{Var}(\hat\theta)\ge 1/(M\,I(\theta))\),其中 \(I(\theta)\) 是 Fisher information。在正則條件下,MLE 是漸近有效的:\(M\) 很大時,它的變異數會達到這個下界。所以老師說「收斂最快」,意思是固定樣本數時誤差最小、不浪費資料。
這是漸近、而且要求模型設定正確(\(p_{\text{data}}\) 真的在模型族裡)的結論。實際的深度生成模型兩者都不滿足,所以老師說這些假設「在實務上不一定成立」。
02Likelihood 和樣本品質可以脫鉤(投影片 4–6)
情況 1:如果真的找到全域最佳解 \(p_\theta = p_{\text{data}}\),那 likelihood 最高、樣本也完美,兩者一致。但只要差一點點(實務上一定如此),「KL 很小」就不保證「樣本好看」,反之亦然(Theis et al., 2016)。07:50
情況 2:likelihood 很好、樣本很爛
考慮一個混合模型:99% 的時間輸出純雜訊,1% 的時間輸出真正的資料樣本。09:56
它 99% 的樣本都是垃圾。但它的 log-likelihood 有下界:兩項都非負,丟掉第二項只會讓值變小,
對 \(p_{\text{data}}\) 取期望,再加上 KL 非負給的上界:11:58
這個模型和最佳可能值之間只差一個常數 \(\log 100\approx 4.61\) nats。關鍵是維度:由鏈式法則,\(\log p_{\text{data}}(\mathbf x) = \sum_{i=1}^n\log p_{\text{data}}(x_i\mid\mathbf x_{<i})\) 的絕對值隨維度 \(n\) 線性成長,而 \(\log 100\) 固定不變。所以在高維度,這個 99% 垃圾的模型的 likelihood 幾乎是最佳的。14:01(投影片 5 最後一行的 \(p_\theta(x_i\mid\mathbf x_{<i})\) 是筆誤,老師在課堂上更正為 \(p_{\text{data}}\)。)
情況 3:樣本很好、likelihood 很爛
學生答對了:overfitting,把訓練集背下來。模型是訓練集上的均勻分佈,取樣出來的就是訓練圖,品質不可能更好;但它給任何沒看過的測試點機率 0,test log-likelihood 是 \(-\infty\),不可能更差。18:46
Theis et al. (2016) 的原始論點
這個 99% 雜訊的例子來自 Theis、van den Oord 與 Bethge 的〈A note on the evaluation of generative models〉。他們的重點是:對高維影像,log-likelihood、樣本品質、以及其他評估方式(例如 Parzen window)彼此可以相當獨立,用其中一個指標評估的結論不能直接推廣到另一個用途。這個議題在第 15 講(Evaluation)會再談。
出處:Theis, van den Oord & Bethge (2016), arXiv 1511.01844。
Demo A99% 雜訊的模型,likelihood 差多少?
左邊是從 \(\lambda\,p_{\text{data}} + (1-\lambda)\,p_{\text{noise}}\) 抽的 32 個樣本,資料是 8×8 二值手寫數字,雜訊是每個像素獨立擲硬幣。右邊是 likelihood 的差距 \(\log(1/\lambda)\) 平攤到每個維度後,換算成 bits/dim。
以 CIFAR-10(n = 3072)為例,99% 雜訊的模型最多只比完美模型差約 0.002 bits/dim。作為對照,當年 PixelCNN++ 是 2.92 bits/dim,Glow 是 3.35 bits/dim,兩個真實模型之間的差距(0.43)大了 200 倍。所以「bits/dim 只差 0.002」和「99% 的樣本是垃圾」可以同時成立。
數字出處:PixelCNN++(Salimans et al., 2017)CIFAR-10 test 2.92 bits/dim;Glow(Kingma & Dhariwal, 2018)3.35 bits/dim。
03用樣本比較兩個分佈:two-sample test(投影片 7–11)
新問題:給你兩組樣本 \(S_1 = \{\mathbf x\sim P\}\)、\(S_2 = \{\mathbf x\sim Q\}\),怎麼判斷它們是不是來自同一個分佈?如果怎麼都分辨不出來,大概就代表兩個分佈很接近。21:25
投影片 8 的圖:左右各一格 4×4 的小圖片拼貼(動物、風景、物體),左邊標 \(S_1 = \{\mathbf x\sim P\}\),右邊標 \(S_2 = \{\mathbf x\sim Q\}\),中間寫 vs.。光看兩堆圖,要怎麼判斷 P = Q?
這是統計上的假設檢定問題:22:31
- 虛無假設 \(H_0: P = Q\);對立假設 \(H_1: P\ne Q\)。
- 檢定統計量 \(T\) 比較 \(S_1\) 和 \(S_2\),例如平均值的差:\(T(S_1,S_2) = \Big|\frac{1}{|S_1|}\sum_{\mathbf x\in S_1}\mathbf x - \frac{1}{|S_2|}\sum_{\mathbf x\in S_2}\mathbf x\Big|\)。
- 如果 \(T\) 大於門檻 \(\alpha\) 就拒絕 \(H_0\);否則說 \(H_0\) 和觀察一致。25:06
接到生成模型
\(S_1 = \mathcal D\) 是訓練集(來自 \(p_{\text{data}}\))。只要模型能有效取樣(反正生成模型本來就要能取樣),就能產生 \(S_2 = \{\mathbf x\sim p_\theta\}\)。於是新的訓練目標是:調整模型,最小化 \(S_1\) 和 \(S_2\) 之間的 two-sample test 統計量。29:48
困難:高維度很難找到好的統計量
如果只比平均值,generator 只要生成平均值正確的樣本就能騙過它,這是必要條件,但遠遠不夠。31:59
投影片 11 的圖:三個並排的一維密度圖,綠色實線和紅色虛線。(1) 兩個平均值不同的高斯:比平均值就能分辨。(2) 平均值相同、變異數不同的兩個高斯:比平均值分不出來,要再比變異數。(3) 一個高斯和一個 Laplace 分佈,平均值和變異數都相同,但形狀不同(Laplace 尖峰更尖、尾巴更厚):比前兩階動差都分不出來。32:29
維度越高,兩個分佈可能不同的方式就越多。手工挑一個統計量去訓練模型,模型會把那個統計量對齊,但在你沒想到的地方仍然不同。
假設檢定的兩種錯誤
因為 \(S_1,S_2\) 是隨機的,\(T\) 也是隨機的。即使 \(P = Q\),樣本平均值也可能因為運氣而相差很多,導致錯誤地拒絕 \(H_0\)(type I error,偽陽性);反之 \(P\ne Q\) 時也可能沒偵測到(type II error,偽陰性)。好的統計量要在兩者之間取得平衡。學生在課堂上問到這點,老師說這對接下來的內容不重要,因為我們不是真的要做檢定,而是要拿統計量當作訓練目標。26:10
04學一個統計量:discriminator(投影片 11–13)
關鍵想法:不要手工挑統計量,而是學一個,讓它自動找出兩組樣本在哪裡不一樣。怎麼學?訓練一個分類器!在 GAN 的語言裡,它叫 discriminator。找出能區分正類和負類的特徵,正是分類器(例如深度神經網路)擅長的事。34:34
- \(D_\phi\) 是任意二元分類器,例如神經網路,分辨「真」(\(y=1\),來自資料集)和「假」(\(y=0\),模型生成)。
- 檢定統計量 = 分類器的負 loss。loss 低:真假很好分,兩個分佈不同;loss 高:真假難分,兩個分佈相似。35:34
- discriminator 的目標:最大化這個統計量(支持 \(p_{\text{data}}\ne p_\theta\)),等價於最小化分類 loss。
最佳 discriminator
直覺就是 Bayes 法則:真假各半時,「\(\mathbf x\) 是真的」的後驗機率。47:41
- 只有資料會出現的點:\(D^* = 1/(1+0) = 1\)。
- 兩邊一樣可能的點:\(D^* = 1/2\)。
- Sanity check:如果 \(p_\theta = p_{\text{data}}\),處處 \(D^* = 1/2\),分類器不可能比亂猜好。這是 discriminator 「最困惑」的狀態。
推導:逐點最大化
把期望寫成積分:\(V = \int\big[p_{\text{data}}(\mathbf x)\log D(\mathbf x) + p_\theta(\mathbf x)\log(1-D(\mathbf x))\big]d\mathbf x\)。如果 \(D\) 可以是任意函數,就能對每個 \(\mathbf x\) 分別最大化被積函數。令 \(a = p_{\text{data}}(\mathbf x)\)、\(b = p_\theta(\mathbf x)\)、\(y = D(\mathbf x)\in(0,1)\):
二階導數 \(-a/y^2 - b/(1-y)^2 < 0\),所以是最大值。注意前提「D 可以是任意函數」:實際的神經網路容量有限、也只訓練有限步,所以學到的 \(D_\phi\) 只是近似 \(D^*\)。
出處:Goodfellow et al. (2014), Proposition 1;Lilian Weng〈From GAN to WGAN〉"What is the optimal value for D?"。
這個想法有名字:classifier two-sample test
「訓練分類器,用它在 held-out 資料上的表現當作檢定統計量」在統計文獻中叫 classifier two-sample test(C2ST)。如果 \(P = Q\),held-out 準確率應該在 50% 附近;顯著高於 50% 就拒絕 \(H_0\)。Lopez-Paz & Oquab (2017) 也用它來評估 GAN 的樣本。
出處:Lopez-Paz & Oquab (2017), "Revisiting Classifier Two-Sample Tests", arXiv 1610.06545。
Demo B分類器 two-sample test
選一對一維分佈 P(資料,橘)、Q(模型,綠),各抽 2,000 個訓練樣本。比較手工統計量(平均值差、變異數差)和訓練出來的 discriminator(藍線)。虛線是理論上的 \(D^*(x) = p(x)/(p(x)+q(x))\)。discriminator 是 1→16→16→1 的小網路。
- 「高斯 vs Laplace」:平均值差和變異數差都接近 0,手工統計量看不出差異;discriminator 學到「中間尖峰和兩側尾巴比較可能是 Q」,held-out 準確率約 55%。4,000 個 held-out 樣本的準確率抽樣誤差只有約 ±0.8%,所以這已經是很確定的差異。
- 「完全相同」:discriminator 學不到東西,\(D\approx 1/2\),準確率約 50%,JSD 估計接近 0(可能因為抽樣誤差而略為正或負)。
- 最後一行用 held-out 樣本算 \(V\),再用下一節的公式 \(D_{\mathrm{JSD}} \approx (V+\log 4)/2\) 估計 JSD,並和數值積分的真值比較。理論上任何 \(D\) 的期望 \(V\) 都不超過 \(D^*\) 的,所以估計值平均而言偏低(例如 Laplace 那組約 0.009 vs 真值 0.015:小網路沒學全)。但 held-out 只有 4,000 點,抽樣誤差約 ±0.007,所以有時會略高於真值(平均值那組約 0.121 vs 0.111)。
05Generator 與 minimax 遊戲(投影片 14)
現在讓模型和 discriminator 對抗。Generator \(G_\theta\) 是一個有向的潛在變數模型,\(\mathbf z\) 到 \(\mathbf x\) 的映射是確定性的:52:26
- 從簡單先驗抽 \(\mathbf z\sim p(\mathbf z)\),例如高斯。
- 令 \(\mathbf x = G_\theta(\mathbf z)\)。
投影片 14 的圖:兩個節點,上面是 \(\mathbf z\),下面是灰色的 \(\mathbf x\),中間向下的箭頭標 \(G_\theta\)。和第 8 講的 flow 圖相比,只剩下一個方向,沒有 \(f^{-1}\)。
- 和 flow 一樣的取樣方式,但 \(G_\theta\) 不需要可逆,\(\mathbf z\) 和 \(\mathbf x\) 也不需要同維度,可以是任意神經網路。53:30
- \(p_\theta(\mathbf x)\) 是隱式定義的(implicit model):它存在,但我們從不計算它。
- Generator 最小化 two-sample test 統計量,也就是支持虛無假設 \(p_{\text{data}} = p_\theta\):試圖讓最好的分類器也分不出來。
Generator 的梯度怎麼來?
\(V\) 的第一項不含 \(\theta\)。第二項寫成 \(\mathbb E_{\mathbf z}[\log(1-D(G_\theta(\mathbf z)))]\),期望是對固定的 \(p(\mathbf z)\) 取,\(\theta\) 只出現在確定性函數 \(G_\theta\) 裡。這正是第 6 講的 reparameterization:梯度可以直接搬進期望,鏈式法則穿過 \(D\) 再穿過 \(G\):
Generator 從頭到尾沒看過真實資料,它得到的唯一訊號是 \(\nabla_{\mathbf x}D\):「往哪個方向移動,discriminator 會覺得更像真的」。課堂最後學生也指出這一點:這是一個很窄的訊號。75:56
06最佳 D 之下:Jensen–Shannon divergence(投影片 15–16)
把最佳 discriminator \(D^*_G\) 代回 \(V\),看 generator 實際上在最小化什麼:57:39
第二行:分母 \(p_{\text{data}}+p_G\) 不是機率分佈(積分是 2),所以兩項各除以 2 讓它變成混合分佈 \(m = (p_{\text{data}}+p_G)/2\)。這樣每項多出 \(\log 2\),兩項共 \(\log 4\),要減回去。這樣就得到兩個標準的 KL。59:11
- \(D_{\mathrm{JSD}}\ge 0\),而且 \(=0\) 若且唯若 \(p = q\)
- 對稱:\(D_{\mathrm{JSD}}(p,q) = D_{\mathrm{JSD}}(q,p)\)
- \(\sqrt{D_{\mathrm{JSD}}}\) 滿足三角不等式,是一個距離(Jensen–Shannon distance)
所以最佳 generator 是 \(p_G = p_{\text{data}}\),此時 \(D^* = 1/2\)、\(V(G^*,D^*) = -\log 4\)。全域最佳解和 KL 一樣,差別在於「不完美時偏好誰」。60:45
JSD 的範圍,以及它和 KL 的關係
範圍:用自然對數時 \(0\le D_{\mathrm{JSD}}\le\log 2\approx 0.693\)(用 log₂ 就是 [0, 1],Lilian Weng 的文章用的是這個版本)。上界在兩個分佈的支撐集完全不重疊時達到。因此 \(V(G,D^*)\in[-\log 4, 0]\)。Demo C 的 discriminator loss \(-V\) 收斂到 \(\log 4\approx 1.386\),就是這個原因。
為什麼 JSD 不會爆掉:KL 的分母是 \(q\),只要某處 \(p>0\) 而 \(q=0\),KL 就是 \(\infty\)。JSD 的分母是混合 \(m=(p+q)/2\),只要 \(p>0\) 就有 \(m\ge p/2>0\),所以永遠有限。
f-divergence 家族:KL、JSD、total variation 都是 \(D_f(p\Vert q) = \mathbb E_q[f(p/q)]\) 的特例,只是凸函數 \(f\) 不同。Nowozin et al. (2016) 的 f-GAN 證明,換掉 GAN 的目標函數,就能最小化這個家族裡的任何一個,下一講會講到。
JSD 遇到不重疊的支撐集時是常數:兩個分佈完全不重疊時,不管離多遠,JSD 都等於 \(\log 2\),梯度是 0。高維影像的資料和模型很可能都落在低維流形上而幾乎不重疊,這是 WGAN 改用 Wasserstein 距離的動機(第 10 講)。
出處:Lai et al. (2026) §1.1.1(f-divergence、JS、TV 的定義)與 §1.2 GAN 段落;Lilian Weng〈From GAN to WGAN〉"Low dimensional supports";Arjovsky & Bottou (2017)。
07優缺點與訓練演算法(投影片 17–19)
- Loss 只需要 \(p_\theta\) 的樣本,不用 likelihood。
- Generator 架構完全自由,任何 \(G_\theta\) 都定義了合法的取樣程序。
- 取樣快:一次 forward pass,不像 autoregressive 要逐維。
實務上非常難訓練:minimax 最佳化不穩定。63:23
演算法(投影片 18)
- 從 \(\mathcal D\) 抽 \(m\) 個訓練點 \(\mathbf x^{(1)},\dots,\mathbf x^{(m)}\)。
- 從 \(p(\mathbf z)\) 抽 \(m\) 個雜訊向量 \(\mathbf z^{(1)},\dots,\mathbf z^{(m)}\)。
- 用隨機梯度上升更新 discriminator: $$\nabla_\phi V(G_\theta,D_\phi) = \frac1m\nabla_\phi\sum_{i=1}^m\Big[\log D_\phi(\mathbf x^{(i)}) + \log\big(1-D_\phi(G_\theta(\mathbf z^{(i)}))\big)\Big]$$
- 用隨機梯度下降更新 generator(第一項不含 \(\theta\)): $$\nabla_\theta V(G_\theta,D_\phi) = \frac1m\nabla_\theta\sum_{i=1}^m\log\big(1-D_\phi(G_\theta(\mathbf z^{(i)}))\big)$$
- 重複固定的 epoch 數。63:53
投影片 19 的圖(Goodfellow et al. 2014 Figure 1):四格,每格上方是 x 軸上的三條曲線:藍色虛線是 discriminator、綠色實線是 generator 分佈、黑色(投影片上為紅色)點線是資料分佈;下方是從 z 軸到 x 軸的一排箭頭,代表 \(G\) 怎麼把均勻的 z 映射到 x。(a) 一開始,綠色分佈偏右,藍線彎彎曲曲。(b) 更新 discriminator:藍線在資料多的左側高、在 generator 多的右側低。(c) 更新 generator:箭頭往左擠,綠色分佈向資料靠近。(d) 收斂:綠線和資料重合,藍線變成一條 1/2 的水平線。66:35
實務上常用的 non-saturating generator loss
課堂上和投影片用的 generator 目標是最小化 \(\log(1-D(G(\mathbf z)))\)。Goodfellow et al. (2014) §3 指出,這個形式在訓練初期有問題:generator 很爛時,discriminator 能高信心地判定樣本是假的,\(D(G(\mathbf z))\approx 0\),這時 \(\log(1-D)\) 在 0 附近很平,梯度幾乎為零(saturate)。他們建議改成最大化 \(\log D(G(\mathbf z))\)。兩者的固定點相同,但早期梯度大得多。
設 discriminator 輸出 logit \(s\),\(D = \sigma(s)\)。對 \(s\) 的梯度大小:
- 原始(saturating):\(\big|\partial_s\log(1-\sigma(s))\big| = \sigma(s) = D\),當 \(D\to 0\) 時趨近 0。
- Non-saturating:\(\big|\partial_s\log\sigma(s)\big| = 1-\sigma(s) = 1-D\),當 \(D\to 0\) 時趨近 1。
代價是理論上它不再精確對應 JSD。Demo C 可以切換兩種 loss;在這個簡單的一維例子裡,兩者都能收斂,差別不大。
出處:Goodfellow et al. (2014), §3("Rather than training G to minimize log(1 − D(G(z))) we can train G to maximize log D(G(z))");Goodfellow (2016) NIPS tutorial §3.2.3。
Demo C一維 GAN:重現投影片 19
資料(橘)預設是投影片 19 那樣的單峰高斯 \(\mathcal N(1.5, 0.5^2)\)。Generator(綠)是 1→16→16→1 的網路,輸入 \(z\sim\mathcal N(0,1)\),一開始的輸出不在資料上。Discriminator(藍)是 1→32→32→1 的網路。每一輪先更新 discriminator 3 次、再更新 generator 1 次(Goodfellow et al. 2014 的演算法也有這個超參數 \(k\)),Adam 的學習率 D 用 0.001、G 用 0.0003,batch 64。下方的箭頭畫出 \(G\) 把哪些 \(z\) 送到哪裡。
- 前幾百步就是投影片 19 的 (a)→(c):藍線在資料那側高、generator 那側低,綠色分佈被推向資料。
- 單峰的情況,2,400 步後兩個直方圖的 total variation 距離通常在 0.1 左右或更低,藍線在資料所在的區域貼近 0.5,discriminator loss 在 \(\log 4\) 附近:這就是 \(V(G^*,D^*) = -\log 4\)。在兩個分佈都沒有樣本的地方(圖的最左、最右),\(D\) 的值沒有意義,因為那裡沒有訓練訊號。
- 雙峰的情況困難得多:TV 距離常常停在 0.25–0.5,generator 會在兩峰之間留下一條「橋」,或讓兩峰的比例失衡,而且會隨訓練來回擺動。這時 discriminator loss 也已經接近 \(\log 4\)。這是一個重要的教訓:loss 接近平衡值,不代表 generator 已經學對,只代表這個 discriminator 目前分不出來。
- 兩個 loss 選項在這個小例子裡都能收斂,差別不大。
08實務上的困難(投影片 20–25)
投影片 20 的圖:兩張高解析度人臉(一男一女),問哪一張是真的。答案:兩張都是 GAN 生成的(Karras et al. 2018,StyleGAN;圖片來源為紐約時報)。投影片 21 是 2014 到 2018 年 GAN 人臉的演進:從模糊的灰階小圖,到幾乎無法和照片區分的彩色大圖。70:13
GAN 在許多領域和任務上都很成功,但實務上非常有挑戰性:最佳化不穩定、mode collapse、評估困難。要成功訓練需要一大堆技巧。70:43
最佳化:理論和實務的落差
- 定理(非正式):如果 generator 的更新是在函數空間中進行,而且每一步 discriminator 都是最佳的,那 generator 保證收斂到資料分佈(Goodfellow et al. 2014, Proposition 2)。
- 這些假設不切實際:我們更新的是神經網路參數而不是函數本身,discriminator 每次也只走一步梯度。72:21
- 實務上 generator 和 discriminator 的 loss 會一直震盪。
- 沒有穩健的停止準則(不像 MLE 看 validation likelihood 不再上升就停)。只能看樣本,覺得還不錯就停。72:51
投影片 22 的圖(來源:Mirantha Jayathilaka):橫軸是訓練迭代、縱軸是 loss 的折線圖。藍色和橘色(discriminator 對真、假樣本的 loss)在低處上下抖動,綠色(generator loss)一開始下降,之後劇烈震盪並出現許多尖峰,沒有收斂的跡象。
為什麼梯度下降找不到 minimax 的平衡點?最簡單的例子
考慮 \(\min_x\max_y\;xy\)。平衡點在 \((0,0)\)。用學習率 \(\eta\) 同時做梯度下降(對 x)和上升(對 y):\(x\leftarrow x-\eta y\)、\(y\leftarrow y+\eta x\)。這是一個旋轉再放大 \(\sqrt{1+\eta^2}\) 倍的線性映射,所以軌跡向外螺旋發散。如果像 GAN 演算法那樣交替更新(y 用更新後的 x),映射的行列式恰好是 1,軌跡會在橢圓上一直繞圈,永遠不會靠近平衡點。
兩個玩家各自用自己的梯度往有利的方向走,合起來的向量場是旋轉的,而不是像一般最小化那樣指向一個谷底。GAN 的 loss 震盪就是這種現象的高維版本。
出處:Lilian Weng〈From GAN to WGAN〉"Hard to achieve Nash equilibrium"(同時更新的例子);Salimans et al. (2016)。交替更新的分析為本頁補充。
Mode collapse
GAN 惡名昭彰的問題:generator 塌縮到只產生一種或少數幾種樣本(稱為 modes)。73:22
- MLE 用的 forward KL 是 mode-covering:只要某處 \(p_{\text{data}}>0\) 而模型給 0,懲罰就是無限大,所以模型會把機率鋪滿每個地方。
- GAN 在實務上更偏 mode-seeking:可能只專注在少數幾種資料點,完全停止生成訓練集裡的其他種類。71:14
投影片 23 的圖(Arjovsky et al. 2017):一大格 LSUN 臥室的生成樣本,其中幾個黑框圈出來的小圖幾乎一模一樣:generator 偏愛某一種臥室,一再重複。
投影片 24 的圖(Metz et al. 2017):上方的「Target」是 8 個小高斯排成一圈。下方五格是訓練到 step 0、5k、10k、15k、20k 時 generator 的分佈:每一格都只有一團,而且位置一直換。它在不同 mode 之間跳來跳去,從沒同時涵蓋全部。73:54
投影片 25 的圖(Metz et al. 2017):MNIST 上的四大格樣本,分別在訓練 1k、2k、10k、20k 步時。越到後面,格子裡越多是同一個數字(看起來都是同一種形狀),generator 塌縮到某一類並停止學習。74:24
修正方法大多是經驗性的:不同的架構、不同的 GAN loss、加正則化項等等。Soumith Chintala 整理的 ganhacks 列了一大堆技巧,但沒有一個保證有效,只能自己試。74:54
為什麼會在 mode 之間跳來跳去?
直覺版本:假設 generator 現在只生成 mode A。discriminator 很快學會「A 附近的都是假的」,於是 A 附近的 \(D\) 變低,其他 mode 附近的 \(D\) 相對高。generator 的梯度 \(\nabla_{\mathbf x}D\) 把所有樣本推向 discriminator 認為「最像真的」的地方,例如 mode B。到了 B 之後,discriminator 又更新,換 B 被判成假的……generator 一直在追 discriminator 的弱點,而 discriminator 一直在補洞,兩者都沒有誘因讓 generator 同時涵蓋全部 mode。
關鍵在於:如果每一步 discriminator 都是最佳的,它會「記得」每個 mode 都是真的;但實際上 discriminator 只對 generator目前的樣本做出反應。Metz et al. (2017) 的 unrolled GAN 就是讓 generator 更新時往前「預演」discriminator 的幾步反應,來減輕這個問題。
出處:Metz, Poole, Pfau & Sohl-Dickstein (2017), "Unrolled Generative Adversarial Networks"(投影片 24–25 的圖);Lilian Weng〈From GAN to WGAN〉"Mode collapse"。
Demo D8 個高斯排成一圈:mode collapse
資料是投影片 24 的 8 個小高斯(半徑 2,標準差 0.05)。Generator 和 discriminator 都是 2 層 32 個隱藏單元的網路,用 non-saturating loss、Adam(lr = 0.001),訓練 3,200 步。可以選兩種 generator:
- 一般 generator:\(\mathbf z\sim\mathcal N(0,I_2)\)。通常最後會涵蓋大部分 mode,但分配不均,有時會漏掉一兩個(mode dropping)。
- 幾乎確定性的 generator:\(z\sim\mathcal N(0,0.01^2)\) 是一維、變異極小,所以 generator 輸出的是一小團點。這是一個刻意誇張的設定,用來重現投影片 24 那種「一團點在 mode 之間跳來跳去」的現象。
下排五格是 step 0、800、1600、2400、3200 的快照,對照投影片 24 的五格。用「幾乎確定性的 generator」時,那團點會從一個 mode 跳到另一個 mode,中途常常停在兩個 mode 之間的空白處,任何時刻最多只覆蓋一個 mode。用「一般 generator」時,最後通常 8 個 mode 都有樣本,但分配很不均勻(例如種子 1 的結果,各 mode 從 52 到 342 個不等),而且只有約六成多(64%)的樣本落在 mode 附近,其餘散在 mode 之間。兩種情況下,discriminator 的背景顏色都會在 generator 目前所在的地方變淡:它只對 generator 現在的樣本做出反應。
09GAN 的現況(課堂結尾)
- 和其他模型結合:學生問能不能把 GAN 和標準生成模型結合。老師提到 ICML 2023 有論文用 discriminator 改善 diffusion model 的效能。常常加一點 discriminator 來比較樣本就會有幫助。76:56
- 從頭訓練:學生問要不要用預訓練的 VAE 初始化 generator,老師說通常從頭訓練。77:26
GAN 的想法今天出現在哪裡?
老師提到的 ICML 2023 論文很可能是 Kim et al. 的 Discriminator Guidance:訓練一個 discriminator 分辨「真實資料」和「diffusion model 的樣本」,再用它的梯度修正 diffusion 的取樣過程(Ermon 實驗室的 Dongjun Kim 是第一作者)。
Lai et al. 的書在講快速生成器(consistency trajectory model,CTM)時,也把 GAN loss 當成可選的輔助項:純粹的蒸餾目標容易產生過度平滑的輸出,discriminator 則像一個「可學的感知距離」,補回細節。
出處:Kim et al. (2023), "Refining Generative Process with Discriminator Guidance in Score-based Diffusion Models", arXiv 2211.17091;Lai et al. (2026) §11.4.3 "Auxiliary Losses in CTM"。
投影片 26 的圖(來源:Robbie Barrat、Obvious):一幅鍍金畫框裡的肖像畫,畫中是一位穿深色衣服的模糊人物,臉部五官溶在筆觸裡,右下角的簽名是 GAN 的目標函數公式。這幅〈Edmond de Belamy〉在 Christie's 拍賣,預估 7,000–10,000 美元,實際以 432,500 美元成交。老師說這比較像是「新奇」的價格。78:02
與其他講的關聯
- 第 4 講:MLE = 最小化 forward KL;這講換成 JSD。KL 的 mode-covering 對照 GAN 實務上的 mode-seeking。
- 第 6 講:generator 的梯度就是 reparameterization;IAF/Parallel WaveNet(第 8 講)的蒸餾也是「從學生取樣、用別人打分數」。
- 第 7–8 講:generator 和 flow 的取樣方式一樣(\(\mathbf x = G(\mathbf z)\)),差在不需要可逆,因此也算不出 likelihood。
- 第 10 講:f-GAN(換成其他 f-divergence)、Wasserstein GAN(處理 JSD 在不重疊支撐集時的梯度消失)、以及從 x 推回 z 的 BiGAN 等。
- 第 11–14 講:noise contrastive estimation 也是「訓練分類器分辨資料和雜訊」,但用來學能量函數。
- 第 15 講:評估生成模型。GAN 沒有 likelihood,要靠 FID、precision/recall 等樣本指標。
常見誤解
自我測驗
1. 為什麼 99% 雜訊的混合模型在高維度仍有很好的 likelihood?
2. 舉一個樣本很好但 test likelihood 很差的模型。
3. 為什麼比平均值、變異數的 two-sample test 不夠?
4. 推導最佳 discriminator。
5. 證明 \(V(G,D^*_G) = 2D_{\mathrm{JSD}}(p_{\text{data}},p_G) - \log 4\)。
6. 在全域最佳解,D* 和 V 各是多少?
7. 更新 generator 時,V 的哪一項有梯度?梯度怎麼傳到 θ?
8. GAN 的 generator 和 flow 模型有什麼相同和不同?
9. 為什麼原始的 generator loss 在訓練初期會 saturate?怎麼改?
10. 為什麼 GAN 沒有好的停止準則?
11. 用自己的話解釋 mode collapse 和 mode 之間的跳動。
12. 老師認為 GAN 被 diffusion model 取代的主要原因是什麼?
延伸閱讀
- Lilian Weng, From GAN to WGAN(本頁參考):最佳 D、JSD、不穩定的原因、改進技巧、WGAN。
- Goodfellow et al. (2014), Generative Adversarial Networks(本頁參考):Proposition 1–2、Figure 1(投影片 19)、§3 non-saturating loss。
- Goodfellow (2016), NIPS 2016 Tutorial: GANs:GAN 的完整入門。
- Theis, van den Oord & Bethge (2016), A note on the evaluation of generative models(本頁參考):likelihood 與樣本品質脫鉤。
- Lopez-Paz & Oquab (2017), Revisiting Classifier Two-Sample Tests。
- Metz et al. (2017), Unrolled GANs(投影片 24–25 的圖)。
- Arjovsky & Bottou (2017), Towards Principled Methods for Training GANs:支撐集不重疊與梯度消失。
- Sinha et al. (2021), Negative Data Augmentation(課堂問答提到的想法)。
- Kim et al. (2023), Discriminator Guidance:用 discriminator 改善 diffusion。
- Lai et al. (2026)(v3)(本頁參考)§1.1.1、§1.2、§11.4.3。
- ganhacks:訓練 GAN 的經驗技巧。