---
# System prepended metadata

title: 【機器學習2021】 14~17 GAN
tags: [機器學習]

---

20250930 筆記，內容可能有錯，請參考來源影片。

[李宏毅機器學習2021影片](https://www.youtube.com/playlist?list=PLJV_el3uVTsMhtt7_Y6sgTHGHp1Vb2P2J)


今天影片內容

[【機器學習2021】生成式對抗網路 (Generative Adversarial Network, GAN) (一) – 基本概念介紹](https://youtu.be/4OWp0wDu6Xw?si=eT8vS0BCkHfI787Vhttps://youtu.be/4OWp0wDu6Xw?si=eT8vS0BCkHfI787V)


[【機器學習2021】生成式對抗網路 (Generative Adversarial Network, GAN) (二) – 理論介紹與WGAN](https://youtu.be/jNY1WBb8l4U?si=ofBkoYF6unUa2UrC)

[【機器學習2021】生成式對抗網路 (Generative Adversarial Network, GAN) (三) – 生成器效能評估與條件式生成](https://youtu.be/MP0BnVH2yOo?si=ZBcSRYIhMIpeL56A)

[【機器學習2021】生成式對抗網路 (Generative Adversarial Network, GAN) (四) – Cycle GAN](https://youtu.be/wulqhgnDr7E?si=ZNfbr0trv0CVd1dr)



### 【機器學習2021】生成式對抗網路 (Generative Adversarial Network, GAN) (一) – 基本概念介紹 大綱

**一、 概論：將神經網路作為生成器 (Generator) 使用**
    A. 傳統神經網路的功能
    B. 生成器的特殊之處：輸入隨機變數 $z$
        1. $z$ 的特性
        2. 輸出為分佈 (Distribution)

**二、 為何需要生成器：處理非固定輸出的任務**
    A. 輸出需要是分佈的原因
    B. 應用實例一：影片預測 (Video Prediction)
        1. 傳統方法的失敗：模糊與分裂 (兩面討好)
        2. 生成器解決方案
    C. 應用實例二：需要創造力的任務
        1. 圖像生成 (畫紅眼睛的角色)
        2. 對話生成 (聊天機器人)

**三、 生成對抗網路 (Generative Adversarial Network, GAN) 簡介**
    A. GAN 的背景與命名
    B. GAN 的構成要素
        1. Generator (G)
        2. Discriminator (D)
    C. GAN 運作原理的類比：演化與對抗關係

**四、 GAN 的演算法與訓練流程 (以無條件生成為例)**
    A. 無條件生成 (Unconditional Generation) 設置
    B. 訓練步驟一：訓練鑑別器 (D)
    C. 訓練步驟二：訓練生成器 (G)
    D. 訓練循環

**五、 GAN 的成果與應用**
    A. 早期訓練成果 (2017 年的動畫人臉生成)
    B. 近期與高級應用
    C. 潛在空間的內差 (Interpolation)


### 一、 概論：將神經網路作為生成器 (Generator) 使用

1.  **傳統神經網路的功能**
    *   到目前為止所學到的神經網路 (NN) 通常都是一個函數 (function)，給定一個輸入 $x$，就可以輸出一個 $y$。
    *   NN 架構可以處理不同的 $x$（例如圖片或序列）和不同的 $Y$（例如數值、類別或序列）。

2.  **生成器的特殊之處**
    *   生成器 (Generator) 是將神經網路當作生成工具來使用。
    *   生成網路的輸入會**加上一個隨機變數 $z$**。
    *   $z$ 是從某一個分佈 (distribution) 中採樣 (sample) 出來的。
    *   NN 會同時看 $x$ 和 $z$ 來得到輸出。
    *   **結合 $x$ 和 $z$ 的方法**：可以將 $x$ 和 $z$ 向量直接接起來變成一個更長的向量，或是在 $x$ 和 $z$ 長度相同時，將它們相加後作為 NN 的輸入。
    *   $z$ 必須是**不固定**的；每次使用這個 NN 時都會隨機生成一個 $z$。
    *   **$z$ 的分佈限制**：這個分佈必須夠簡單，意思是我們知道它的公式，並且能夠從中進行採樣。例如，它可以是高斯分佈 (Gaussian distribution) 或均勻分佈 (uniform distribution)。

3.  **輸出為分佈 (Distribution)**
    *   由於每次採樣到的 $z$ 不同，輸出的 $y$ 也會不一樣。
    *   相同的 $x$ 輸入，通過複雜的 NN 轉換後，輸出的 $y$ 不再是一個單一固定的東西，而是**變成了**一個複雜的**分佈** (distribution)。
    *   這種可以輸出一個分佈的 NN，我們就稱它為 **Generator**。

### 二、 為何需要生成器：處理非固定輸出的任務

1.  **輸出需要是分佈的原因**
    *   有時候任務要求輸出的結果不應是固定單一的。
    *   更具體的說法是，當我們想找到一個函數，但**同樣的輸入有多種可能的輸出，且這些不同的輸出都是對的**，這時就需要生成模型。

2.  **應用實例一：影片預測 (Video Prediction)**
    *   任務：給機器一段影片，預測接下來會發生什麼事。
    *   訓練資料來源：錄製人玩小精靈遊戲的畫面，可以知道給定過去的資訊，接下來會發生什麼事。
    *   **傳統監督式學習的問題**：如果使用傳統的 NN 方法訓練，機器預測出來的結果可能會是模糊的，而且會發生「小精靈分裂」或「消失」的錯誤現象。
    *   問題根源：在訓練資料中，遇到轉角時，小精靈有時往左轉，有時往右轉，這兩種可能性同時存在。
    *   NN 為了減少損失，會學到「**兩面討好**」，它會找到一個輸出，這個輸出同時距離向左轉和向右轉最近，結果就是同時向左也向右轉（例如分裂），這是錯誤的。
    *   生成器解決方案：讓機器的輸出是**有機率的分佈**。通過輸入 $z$，NN 輸出的分佈可以包含向左轉和向右轉的可能性。例如，如果 $z$ 是一個 50/50 的二元隨機變數，NN 可能學到 $z=1$ 時向左轉，$z=0$ 時向右轉。

3.  **應用實例二：需要創造力的任務**
    *   當任務需要一點「創造力」時，就需要生成模型。
    *   **圖像生成**：例如，要求畫一個「紅眼睛的角色」，每個人心裡想的動畫人物可能都不同（例如酷拉皮卡、輝夜），因此這時 Model 需要能輸出一個分佈。
    *   **對話生成**：例如，詢問聊天機器人「你知道輝夜是誰嗎？」，可能有很多種不同的答案，這也需要生成模型。

### 三、 生成對抗網路 (Generative Adversarial Network, GAN) 簡介

1.  **GAN 的背景與命名**
    *   生成對抗網路 (Generative Adversarial Network, GAN) 是一個非常知名的生成模型。
    *   GAN 於 2014 年在 NIPS 上發表。
    *   GAN 發展出許多變形 (GAN Zoo 收集了 500 種以上)。由於名稱眾多，甚至出現了不同技術卻使用相同縮寫字母的狀況 (例如至少有六種 SCAP)。
    *   名稱的由來：「Adversarial」是對抗的意思。在最早的論文中，Generator 和 Discriminator 被視為敵人（例如假鈔製造者與警察）。儘管關係是對抗的，但也可以被視為一種合作關係。

2.  **GAN 的構成要素**
    *   **Generator (G)**：生成器。
        *   功能：產生一個高維的向量（例如 $64 \times 64 \times 3$ 的向量，整理後即為一張圖片）。
        *   Generator 本身是一個 Neural Network。
        *   **輸入**：在非條件生成 (unconditional generation) 設置下，輸入是隨機變數 $z$。
        *   **$z$ 的設定**：通常假設 $z$ 是從 Normal Distribution (高斯分佈) 中採樣出來的低維向量（例如 50 或 100 維）。雖然 $z$ 可以是其他簡單分佈，但選擇簡單分佈即可，因為 Generator 會將此簡單分佈對應到一個複雜分佈。
    *   **Discriminator (D)**：鑑別器。
        *   功能：輸入一張圖片，輸出一個**數值**。
        *   這個數值越大，代表輸入的圖片越像真實的二次元人物頭像。例如，真實圖片輸出 1，亂畫的圖片輸出 0.1 或 0.2。
        *   Discriminator 本身也是一個 Neural Network，架構完全由設計者決定 (例如圖片輸入通常會選擇 CNN)。

3.  **GAN 運作原理的類比：演化與對抗關係**
    *   **生物演化類比**：Generator 就像枯葉蝶 (會偽裝成枯葉躲避天敵)。Discriminator 就像天敵（波波、比比鳥、大比鳥），會演化以識別枯葉蝶的偽裝。
    *   **訓練過程的演化**：
        1.  初始 Generator (G1) 參數隨機，輸出雜訊。
        2.  初始 Discriminator (D1) 學習分辨雜訊和真實圖片 (例如看有沒有眼睛)。
        3.  G2 調整參數，進化以「騙過 D1」(例如產出眼睛)。
        4.  D2 再次進化，試圖找出 G2 圖片與真實圖片的差異 (例如 G2 圖片沒有頭髮或嘴巴)。
        5.  G3 調整參數，試圖「騙過 D2」(例如加上嘴巴)。
    *   透過 Discriminator 越來越嚴苛，Generator 產生的圖片就會越來越像真實的二次元人物。

### 四、 GAN 的演算法與訓練流程

此處以**無條件生成 (unconditional generation)** 為例，即輸入只有 $z$，沒有 $x$。

1.  **初始化**
    *   Generator (G) 和 Discriminator (D) 都是 NN，參數需先進行初始化。

2.  **訓練步驟一：訓練鑑別器 (D)**
    *   **固定 Generator** (G) 的參數。
    *   從高斯分佈 (Gaussian distribution) 中隨機採樣一堆 $z$。
    *   將 $z$ 丟給 G，G 吐出一些**假圖片** (一開始會很不像正常圖片)。
    *   從真實二次元人物頭像的資料庫中採樣**真圖片**。
    *   **D 的訓練目標**：學習分辨真圖片與 G 產生的假圖片之間的差異。
    *   **實際操作**：可以將真圖片標記為 1，假圖片標記為 0。這可以當作一個分類 (Classification) 或回歸 (Regression) 問題來訓練 D。

3.  **訓練步驟二：訓練生成器 (G)**
    *   **固定 Discriminator** (D) 的參數。
    *   **G 的訓練目標**：讓 G 想辦法去**騙過 D**。
    *   **實際操作**：
        *   將 $z$ 丟給 G 產生假圖片，再將假圖片丟給 D，D 會給圖片一個分數。
        *   G 訓練的目標是調整 G 的參數，讓 **Discriminator 的輸出值越**大越好。
        *   **網路結構**：將 G 和 D 連接起來，當作一個更大的 NN 來處理。
        *   **參數調整**：只調整 G 的參數，**不調整**對應到 D 的部分。若調整 D 的參數（例如最後一層的 bias），整個遊戲就像被駭客攻擊，使輸出分數變得非常大。
        *   **訓練方法**：G 的訓練方法與訓練一般 NN 相同，使用梯度上升 (gradient ascent) 的方法，讓 G 的目標函數 (D 的輸出值) 越大越好。

4.  **訓練循環**
    *   反覆執行：訓練一陣子 D，然後固定 D 訓練一陣子 G。
    *   每次訓練 G 之後，G 會產生更多新的圖片，再用這些圖片來訓練 D。
    *   如此反覆進行，期望 D 和 G 都能做得越來越好。

### 五、 GAN 的成果與應用

1.  **早期訓練成果 (以動畫人臉生成為例)**
    *   訓練過程的進化紀錄 (2017 年的實驗結果)：
        *   更新 100 次：亂七八糟的雜訊。
        *   更新 1000 次：產生了眼睛。
        *   更新 2000 次：嘴巴出現。
        *   更新 5000 次：開始有臉的樣子，機器學到了動畫人物要有水汪汪的大眼睛。
        *   更新 1 萬次：形狀出來了，但有點模糊暈開，像水彩畫。
        *   更新 2 萬次/5 萬次：逐漸細緻化。

2.  **近期與高級應用**
    *   **StyleGAN**：可以產生非常逼真且高品質的動畫人物，甚至生成異色瞳。
    *   **Progressive GAN**：可以產生非常高清的真實人臉，甚至可以產生以假亂真的人臉。
    *   應用實例：有新創公司被懷疑用 GAN 生成假員工照片作為頭像。
    *   GAN 的優勢：可以產生**沒有看過的人**。

3.  **潛在空間的內插 (Interpolation)**
    *   GAN Generator 的輸入 $z$ 是一個向量。
    *   如果對輸入的 $z$ 向量做內插 (interpolation)，輸出圖片會發生**連續的變化**。
    *   實例：
        *   在兩個 $z$ 向量之間內插，可以讓嚴肅的男人臉部逐漸變化成笑容展開的女人。
        *   將一個 $z$ 產生往左看的人臉，與另一個 $z$ 產生往右看的人臉進行內插，中間的結果不是將兩張臉疊在一起，而是得到一個**往正面看**的人。這代表機器在訓練過程中自學到了人臉旋轉的概念。



### 【機器學習2021】生成式對抗網路 (Generative Adversarial Network, GAN) (二) – 理論介紹與WGAN 大綱

### 一、 生成對抗網路 (GAN) 的訓練目標與理論基礎
A. 訓練目標：最小化或最大化 L 函數。
B. 核心概念：讓生成的資料分佈 ($P_G$) 盡可能接近真實資料分佈 ($P_{data}$)。
C. 衡量標準：兩分佈之間的 **Divergence (差異度/距離)**。
D. GAN 遇到的困難：Divergence 難以計算。
E. GAN 的解決方案：透過 **取樣 (Sampling)** 替代直接計算。

### 二、 判別器 (Discriminator, D) 的訓練與客觀函數
A. 判別器的功能：分辨真實資料 ($P_{data}$) 與生成資料 ($P_G$)。
B. 判別器的目標：**最大化 (Maximize)** 客觀函數 (Objective Function, $B$)。
C. $B$ 函數的意義：與 **Cross Entropy** 相關，等同於訓練一個二元分類器 (Binary Classifier)。
D. 客觀函數最大值與 JS 散度 (JS Divergence) 的關係：$B$ 的最大值與 $P_G$ 和 $P_{data}$ 之間的 JS 散度有關。
E. 整體優化目標：尋找一個 Generator (G) 來 **最小化** 判別器 $D$ 能達到的最大客觀函數值（即 **Minimax** 問題）。

### 三、 傳統 GAN (基於 JS Divergence) 的問題
A. 分佈重疊性低的問題：真實資料和生成資料通常處於高維空間中的 **low dimension manifold** 上，導致 $P_G$ 與 $P_{data}$ 重疊部分極少。
B. 取樣不足的問題：即使分佈理論上重疊，取樣點不夠密也使其在實際操作中看似沒有重疊。
C. JS 散度的局限：對於兩個沒有重疊的分佈，JS 散度算出來永遠是定值 $\log 2$。
D. 訓練缺乏梯度：當 JS 散度固定為 $\log 2$ 時，Generator 無法得到有效的梯度資訊來改善生成品質。
E. 實務操作困難：判別器 $D$ 的訓練正確率很快達到 100%，導致其 Loss 失去參考意義，使訓練過程不穩定且難以監測進度。

### 四、 Wasserstein Distance 與 WGAN
A. 解決方案：替換衡量分佈相似度的方式，改用 **Wasserstein Distance (W-Distance)**。
B. W-Distance 概念：**推土機距離**。想像將分佈 P 塑造成分佈 Q 所需移動的平均最短距離。
C. W-Distance 的優勢：即使 $P_G$ 與 $P_{data}$ 沒有重疊，W-Distance 仍能提供有方向性的距離值（越近值越小），從而為 Generator 提供連續的梯度。
D. 演化類比：W-Distance 允許 Generator 採取連續的小步驟改進，而 JS Divergence則需要一步到位。

### 五、 WGAN 的公式與 1-Lipschitz 限制
A. W-Distance 的計算：計算 W-Distance 需要解一個優化問題。
B. 關鍵限制：用於計算 W-Distance 的函數 $D$（在此處是判別器/Critic）**必須是一個 1-Lipschitz 函數 (足夠平滑的函數)**。
C. 1-Lipschitz 的目的：防止判別器給予無重疊的資料無限大的分數，導致訓練無法收斂。此限制確保 $D$ 不會變化過於劇烈。
D. 實作 1-Lipschitz 限制的方法：
    1. 早期方法：**權重裁剪 (Weight Clipping)**，將 $D$ 的參數限制在 $[-C, C]$ 之間。
    2. 後期改進：使用 **Gradient Penalty (梯度懲罰)** 等方法來更有效地符合 1-Lipschitz 限制。


### 一、 生成對抗網路 (GAN) 的訓練目標與理論基礎

*   在訓練生成問題時，我們需要定義一個 L 函數 (Loss function)，並透過梯度下降來調整參數以最小化 L 函數。
*   在生成 (Generation) 問題中，我們的目標是讓 Generator ($G$) 產生的複雜分佈 $P_G$ 盡可能接近真實資料的分佈 $P_{data}$。
*   若要衡量 $P_G$ 與 $P_{data}$ 之間的相似度，我們需要計算它們之間的 **Divergence (差異度)**。Divergence 越小，代表這兩個分佈越相近、越相似。
*   我們的目標是找到一組 Generator 參數，使 $P_G$ 與 $P_{data}$ 之間的 Divergence 越小越好。在生成問題中，L 函數就是 $P_G$ 與 $P_{data}$ 的 Divergence。
*   **GAN 遇到的核心困難** 在於，對於連續分佈 (Continuous Distribution) 而言，計算像是 KL divergence 或 JS divergence 這類 Divergence 是極為複雜且難以計算的。
*   GAN 採用了一個神奇的做法來繞過不知道如何計算 Divergence 的問題。它指出，即使不知道 $P_G$ 和 $P_{data}$ 實際的完整公式，**只要能夠從這兩個分佈中取樣 (sample) 出資料**，就有辦法進行計算。
    *   從真實資料 ($P_{data}$) 取樣：直接隨機取出圖片即可。
    *   從 Generator ($P_G$) 取樣：將簡單分佈（如常態分佈 Normal Distribution）的輸入丟入 Generator，其輸出就是從 $P_G$ 取樣出來的圖片或點。

### 二、 判別器 (Discriminator, D) 的訓練與客觀函數

*   判別器 ($D$) 是根據真實資料 (Real Data) 和生成資料 (Generated Data) 訓練出來的。
*   判別器的訓練目標是：看到真實資料就給予**較高的分數**，看到生成資料就給予**較低的分數**。
*   判別器優化過程是 **最大化 (Maximize)** 一個客觀函數 (Objective Function, $B$)。
    *   $B$ 的公式涉及對從 $P_{data}$ 取樣的 $Y$ 求 $D(Y)$ 的對數，以及對從 $P_G$ 取樣的 $Y$ 求 $(1-D(Y))$ 的對數。
    *   希望 $B$ 越大越好，這意味著如果 $Y$ 來自 $P_{data}$，則 $D(Y)$ 應越大越好；如果 $Y$ 來自 $P_G$，則 $D(Y)$ 應越小越好。
*   這個客觀函數 (Objective Function) 實際上就是一個 **二元分類器 (Binary Classifier)** 的 Cross Entropy 的等同形式。當我們最大化這個客觀函數時，等同於最小化 Cross Entropy，就是在訓練一個分類器。
*   **JS Divergence的關聯性：** 原始 GAN 論文中設計的客觀函數，經過推導後發現，當這個客觀函數達到其最大值時，這個最大值與 $P_G$ 和 $P_{data}$ 之間的 **JS Divergence** 是有關聯的。
*   **直觀理解：**
    *   如果 $P_G$ 與 $P_{data}$ **很相似** (Divergence 很小)，資料混在一起，判別器很難區分，因此 $D$ 無法讓客觀函數達到非常大的值，最大值會比較小。
    *   如果 $P_G$ 與 $P_{data}$ **很不相似** (Divergence 很大)，判別器可以輕易分開兩組資料，因此 $D$ 可以將客觀函數最大值衝得很大。
*   **Minimax 目標：** 既然 $D$ 最大化的 $B$ 值與 Divergence 有關，我們就可以將最小化 Divergence 的目標替換為：找到 $G$ 來 **最小化** $D$ 能達到的最大客觀函數值。
    *   $\min_G \max_D B(D, G)$。

### 三、 傳統 GAN (基於 JS Divergence) 的問題

*   **分佈的特性：** $P_G$ 與 $P_{data}$ 在高維空間中重疊的機率極低。
    *   圖像資料的分佈在高維空間中其實是極為狹窄的 Low Dimension Manifold。例如，在 2D 空間中，它們可能只是兩條線。兩條線除非重合，否則交集範圍幾乎為零。
    *   即使實際上有重疊，如果取樣點不夠多、不夠密，對於判別器來說，兩組分佈也會被視為沒有重疊。
*   **JS Divergence 的問題：** JS Divergence 有一個特性，對於兩個**沒有重疊**的分佈，無論它們距離多遠或多近，算出來的 Divergence 永遠都是 $\log 2$。
    *   這意味著，即使 Generator 已經產生了比前一步驟更好的結果（例如 $P_G$ 離 $P_{data}$ 更近了），JS Divergence 仍然是 $\log 2$。
    *   **結果：** Generator 在訓練時無法感知到這些細微的進步，因為 L 函數沒有變化，導致它沒有梯度 (Gradient) 進行優化。
*   **實務操作的問題：**
    *   由於兩組資料（真實和生成）重疊範圍極小，判別器通常可以在訓練完後達到幾乎 **100% 的正確率**。
    *   當判別器正確率總是 100% 時，其 Loss 函數提供的資訊就失去意義，無法判斷 Generator 是否有越變越好。這使得早期的 GAN 訓練被認為像是黑魔法。

### 四、 Wasserstein 距離 (W-Distance) 與 WGAN

*   為了解決 JS 散度的問題，有人提出改用其他方式來衡量兩個分佈的相似程度，例如 **Wasserstein Distance**。
*   W-Distance 的概念（又稱 **Earth Mover's Distance**）：想像有一台推土機 (Earth Mover)，將 $P$ 這堆土挪動到 $Q$ 堆土的位置。W-Distance 即是將 $P$ 重塑成 $Q$ 所需移動的**最小平均距離**。
    *   對於複雜分佈，將 $P$ 變成 $Q$ 的方法有很多種 (moving plans)，W-Distance 要求找到能讓平均距離最小的那種移動方法。
*   **W-Distance 的優勢：**
    *   即使兩個分佈沒有重疊，W-Distance 也能提供一個連續且有方向性的距離值。
    *   當 $P_G$ 稍微靠近 $P_{data}$ 時，W-Distance 就會稍微變小，這提供了 Generator 所需要的 **連續變化的梯度**。
*   **演化類比：** W-Distance 就像是生物演化中的連續步驟。從最簡單的感光細胞到複雜的眼睛，中間有許多連貫的步驟。同樣地，W-Distance 允許 $P_G$ 慢慢挪動靠近 $P_{data}$，每一步的微小變化都能被衡量。
*   當使用 W-Distance 取代 Divergence 時，這種方法就稱為 **WGAN (Wasserstein GAN)**。

### 五、 WGAN 的公式與 1-Lipschitz 限制

*   W-Distance 的計算涉及到一個優化問題。解這個優化問題得出的值，就是 $P_G$ 與 $P_{data}$ 的 W-Distance。
*   W-Distance 的目標函數需要找到一個 $D$ 函數來最大化某一項：
    *   對於從 $P_{data}$ 取樣的 $X$，其 $D(X)$ 應越大越好。
    *   對於從 $P_G$ 取樣的 $X$，其 $D(X)$ 應越小越好。
*   **1-Lipschitz 限制 (關鍵)：** 這個 $D$ 函數不能是任意函數，它必須是一個 **1-Lipschitz 函數**。這要求 $D$ 必須是**足夠平滑的函數**，不可變化得過於劇烈。
*   **為何需要 1-Lipschitz？**
    *   如果沒有這個限制，當 $P_{data}$ 和 $P_G$ 沒有重疊時，判別器可以無限制地給予真實資料極大的分數，給予生成資料極小的分數。
    *   加上 1-Lipschitz 限制，要求 $D$ 必須平滑。如果 $P_{data}$ 和 $P_G$ 距離很近（即使沒有重合），$D$ 的值就不能相差太多，這樣才能確保計算出來的結果是真實的 W-Distance。
*   **實作 1-Lipschitz 的方法：**
    *   早期 WGAN 採取了相對粗糙的 **權重裁剪 (Weight Clipping)**：如果訓練後的參數超過 $C$ 就設為 $C$，小於 $-C$ 就設為 $-C$。
    *   後續有改進方法，例如 **Gradient Penalty (梯度懲罰)** (WGAN-GP)，以及其他方法如 Orthogonal Regularization。




### 【機器學習2021】生成式對抗網路 (Generative Adversarial Network, GAN) (三) – 生成器效能評估與條件式生成 大綱

**一、 GAN 訓練的本質挑戰與穩定性**
    A. G 與 D 之間的相互依賴性
    B. 訓練的脆弱性與 Hyperparameter 調整
    
**二、 GAN 在序列生成上的特例：文字生成 (Sequence GANs)**
    A. 文字生成難度高的原因 (梯度消失問題)
    B. 處理方法：轉為強化學習 (RL)
    C. SeqGAN 的突破與訓練要素

**三、 GAN 的評估方法與核心問題**
    A. 早期與特定任務評估 (人眼判斷、物體偵測)
    B. 質量與多樣性的量化指標
        1. Inception Score (IS)
        2. Fréchet Inception Distance (FID)
    C. 訓練中的核心失敗模式
        1. Mode Collapse 
        2. Mode Dropping 
        3. 記憶化問題 (Memorization)

**四、 條件式生成對抗網路 (Conditional GAN)**
    A. CGAN 的定義與輸入
    B. CGAN 鑑別器的設計與訓練要求
    C. 條件式生成的應用實例
        1. 文生圖 (Text-to-Image)
        2. 圖生圖 (Image-to-Image Translation, Pix2Pix)
        3. 聲音轉圖像 (Sound-to-Image)



### 一、 GAN 訓練的本質挑戰與穩定性

1.  **G 與 D 之間的相互依賴性**
    *   GAN 的訓練是自發性的、互惠的過程；G 和 D **必須互相進步才能共同成長**。
    *   只要其中一者發生問題或停止訓練，另一者也會跟著停滯或變差。
    *   例如，如果 Discriminator 訓練不好，無法分辨真假圖片的差異，Generator 就會失去進步的目標。反之，如果 Generator 無法產生更真實的圖片，Discriminator 也無法再進步。

2.  **訓練的脆弱性**
    *   GAN 的互動過程是脆弱的，如果訓練過程中某一步驟的 $L$ (Loss) 沒有下降，整個訓練就有失敗的可能性。
    *   訓練 GAN 仍是一個困難的任務。


### 二、 GAN 在序列生成上的特例：文字生成 (Sequence GANs)

1.  **文字生成難度高的原因**
    *   將 GAN 用於生成一段文字 (sequence) 是**困難**的應用。
    *   Generator (Decoder) 產生文字序列，Discriminator 判斷這段文字是真實的還是 G 產生的。
    *   **No Gradient 問題**：G 想調整參數讓 D 的輸出分數最大化，但在文字生成中做不到。
    *   原因：當 Decoder 參數只有微小變化時，輸出的機率分佈 (distribution) 雖然也微小變化，但在取分數最大的 Token（例如中文字/英文字母/詞）時，**分數最大的那個 Token 並沒有改變**。
    *   如果輸出 Token 不變，Discriminator 的輸出分數也就不變，導致**無法計算梯度 (gradient)**。

2.  **處理方法：轉為強化學習 (RL)**
    *   遇到不能使用微分的問題時，可以將其視為**強化學習 (Reinforcement Learning)** 的問題來運作。
    *   *新的問題*：強化學習本身就是以難訓練而聞名，GAN 也是以難訓練而聞名，兩者結合使訓練變得**極度困難**。
    *   在過去很長一段時間，沒有人能用正常方法（RL 方式）成功訓練文字 GAN，通常需要先進行預訓練 (pre-training)。

3.  **ScrachGAN 的突破與訓練要素**
    *   一篇名為 **ScrachGAN** 的論文聲稱可以**直接從隨機的初參數**開始訓練 Generator 產生文字。
    *   關鍵成功因素：
        *   **Hyperparameter** 的仔細調整（例如 Google 的資源）。
        *   需要一個叫做 **sequence step** 的技術，沒有它則無法啟動。
        *   需要非常大的 **Batch Size**，通常是上千。
        *   Discriminator 訓練時需要加上 **regularization**。

### 三、 GAN 的評估方法與核心問題

1.  **早期與特定任務評估**
    *   評估 Generator 的好壞並不容易。
    *   **最直覺但不可靠的方法**：依靠人眼判斷。早期的論文甚至缺乏數字評估，主要靠放幾張圖片讓人覺得結果不錯。
    *   **針對特定任務**：例如在作業六中，透過運行動畫人物偵測系統，看 1000 張圖片中抓到多少個人頭像來評估 Generator 的好壞。

2.  **質量與多樣性的量化指標**
    *   評估通常借助一個預訓練好的**圖像分類系統** C(y)。

    *   **品質 (Quality) 評估**：
        *   將 Generator 產生的圖片丟給 C(y)，C(y) 輸出一個機率分佈。
        *   如果輸出的分佈**越集中**，代表 C(y) 系統越肯定它看到了什麼（例如狗或斑馬），這意味著圖片越接近真實，**品質越高**。
    *   **多樣性 (Diversity) 評估**：
        *   丟入一堆圖片 (例如 1000 張)，將 C(y) 輸出的所有分佈**平均**起來。
        *   如果平均的分佈**越平坦/平均**，代表 Generator 產生的圖片多樣性 (diversity) 越高。
    *   **Inception Score (IS)**：結合了 Quality (集中分佈) 和 Diversity (平坦平均分佈) 的分數。但在特定任務（如動畫人臉生成）中可能不適用，因為分類器可能將所有動畫臉都判為人臉。
    *   **Fréchet Inception Distance (FID)**：
        *   目前較常用的評估指標。
        *   方法：將真實圖片與生成圖片丟入 Inception 網路，取得 **Softmax 之前的那個高維向量**（上千維）作為圖片的表示。
        *   假設：假設這兩組高維向量都遵循**高斯分佈 (Gaussian distribution)**。
        *   計算：計算這兩個高斯分佈之間的 **Distance**。
        *   結論：**FID 越小越好**（距離越小，表示生成圖片的品質越高）。
        *   限制：計算準確的 FID 需產生**大量樣本**，且高斯分佈假設不一定準確。

3.  **訓練中的核心失敗模式**
    *   **Mode Collapse**：Generator 產生的圖片來來去去只有那幾張。
        *   原因：Discriminator 存在**盲點**，Generator 學會產生某類圖片後，就永遠可以騙過 D。
    *   **Mode Dropping**：Generator 產生的資料分佈只涵蓋真實資料的**子集**。
        *   問題：單看產生的資料，多樣性可能看起來足夠，但它缺少了真實資料中存在的其他類型（例如臉部多樣性足夠，但膚色只有偏白和偏黃）。
        *   Mode Dropping 比 Mode Collapse 更難被偵測。
    *   **記憶化問題 (Memorization)**：
        *   Generator 產生的圖片與訓練資料**一模一樣**。
        *   雖然 FID 可能很低、分數很高，但這種模型是沒有價值的，因為它沒有產生**新的**、資料庫中沒有的圖片。
        *   難點：在向量空間中比較圖片的相似度以偵測記憶化是困難的。

### 四、 條件式生成對抗網路 (Conditional GAN)

1.  **Conditional GAN 的定義與輸入**
    *   目標：希望能夠**操縱** Generator 的輸出。
    *   輸入：Generator 接收一個 **condition $x$** 和一個**隨機變數 $z$**。

2.  **Conditional GAN 鑑別器的設計與訓練要求**
    *   **簡單設計的失敗**：若 Discriminator 只吃 $y$ (圖片)，G 會學會產生清晰的圖片，但會**完全忽略 $x$**，因為 D 根本不看 $x$。
    *   **Conditional GAN 的 D 設計**：Discriminator 必須同時吃 $y$ (圖片) 和 **condition $x$** 作為輸入。
    *   D 判斷高分的條件：圖片 $y$ 必須**品質好**，且 $y$ 必須與文字敘述 $x$ **匹配 (pair up)**。
    *   **訓練資料要求**：Conditional GAN 的訓練通常需要**標註的成對資料** (labeled data)，例如圖片搭配文字描述。
    *   **D 的訓練樣本**：為了訓練好 D，除了使用真實配對 (real $y$, real $x$) 和機器生成 (fake $y$, real $x$) 外，還需要加入**故意搭配錯誤的樣本** (real $y$, *wrong* $x$)。

3.  **條件式生成的應用實例**
    *   **文生圖 (Text-to-Image)**：輸入文字 $x$（如「紅頭髪，藍眼睛」），輸出符合條件的圖片 $y$。
    *   **圖生圖 (Image-to-Image Translation)**：輸入一張圖片 $x$ 產生另一張圖片 $y$。
        *   應用：設計圖轉實景圖、黑白圖上色。
        *   這種應用常被稱為 **Pix2Pix** (pixel-to-pixel)。
        *   優勢：若單用監督式方法，結果會模糊（因為平均了多種可能性），因此需要 GAN 來產生清晰且符合條件的圖片。
    *   **聲音轉圖像 (Sound-to-Image)**：輸入一段聲音，Generator 想像並畫出聽到的場景。
        *   資料來源：成對資料來自於網路上的大量影片（將某個畫面與對應的聲頻片段配對）。
    

### 五、 與其他模型的比較與監督式學習的替代方案

1.  **與 VAE/Flow-based 模型的比較**
    *   如果要產生**品質極高**的圖片，今天仍需要使用 **GAN**。
    *   VAE 或 Flow-based 模型產生的結果通常與 GAN 存在巨大差距。
    *   雖然 VAE/Flow 模型在訓練難度上與 GAN **不遑多讓**（也需要平衡許多超參數），但 GAN 仍然是 2021年圖像生成領域的首選。

2.  **純監督式生成 (Supervised Generation)**
    *   是否能使用監督式方法，將隨機的高斯變數 $z$ 配對到圖片 $y$ 來訓練 Generator？
    *   理論上可以，但如果純粹使用隨機向量訓練，結果會很差，甚至退不起來。
    *   需要特殊的方法來安排這些向量，例如 **Gradient Original Network** (2017 年 7 月的論文)。


### 【機器學習2021】生成式對抗網路 (Generative Adversarial Network, GAN) (四) – Cycle GAN 大綱



**一、 非成對 (Unpaired) 影像生成與 CycleGAN**
    A. 成對與非成對資料的困境
    B. 影像風格轉換 (Image Style Transfer) 的應用需求
    C. 簡單 GAN 模型的不足：忽略輸入與輸出關係
    D. CycleGAN 的核心機制：循環一致性 (Cycle Consistency)
    E. CycleGAN 的雙向訓練與其他同類模型 (DiscoGAN, DualGAN)

**二、 序列生成 GAN (Sequence GANs) 與非監督式應用**
    A. 文本生成的特殊難題：梯度消失與強化學習需求 
    B. 非成對文本風格轉換 (Text Style Transfer)
    C. 其他非監督式序列應用 (翻譯、摘要、語音辨識)



### 一、 非成對 (Unpaired) 影像生成與 CycleGAN

1.  **成對與非成對資料的困境**
    *   傳統的監督式學習 (supervised learning) 需要成對的資料 (paired data) 才能訓練，即輸入 $X$ 與輸出 $Y$ 必須配對。
    *   但有時候我們會有一堆 $X$ 和一堆 $Y$，但 $X$ 跟 $Y$ 是**不成對**的 (unpaired data)，這也稱為 unlabeled data (沒有標註的資料)。
    *   即使是像作業三或作業五提到的方法，多少還是需要**一些**成對的資料才能訓練模型。
    *   在一些極端狀況下，如**影像風格轉換 (Image Style Transfer)** (將真實照片 $X$ 轉成二次元頭像 $Y$)，可能**完全沒有任何成對的資料**。

2.  **簡單 GAN 模型的不足**
    *   假設我們想訓練一個 Generator，讓它將 $X$ domain 的圖片分佈轉為 $Y$ domain 的圖片分佈。
    *   如果只套用原來的 GAN 訓練方法（輸入 $X$ 圖片，G 產生 $Y$ 圖片，D 判斷 $Y$ 圖片是否像真實 $Y$ domain 的圖片）。
    *   **問題**：Generator 可能學會輸出像 $Y$ domain 的圖片，但它會**將輸入的 $X$ 圖當作高維的雜訊** (noise)，結果是輸出的 $Y$ 圖片與輸入的 $X$ 圖片**沒有任何特別的關係**。

3.  **CycleGAN 的核心機制：循環一致性 (Cycle Consistency)**
    *   為了解決 G 忽略輸入 $X$ 的問題，CycleGAN 採用一種想法，稱為 **CycleGAN**。
    *   **構成**：訓練**兩個 Generator**：
        *   $G_{X \to Y}$：將 $X$ 域的圖轉為 $Y$ 域的圖。
        *   $G_{Y \to X}$：將 $Y$ 域的圖還原回 $X$ 域的圖。
    *   **循環一致性 (Cycle Consistency)**：引入一個額外的目標。
    *   要求輸入 $X$ 經過 $X \to Y \to X'$ 兩次轉換後，輸出的 $X'$ 要與原來的 $X$ **越接近越好**。
    *   兩張圖片 (兩個向量) 之間的距離越小，即越像，則滿足一致性。
    *   **效果**：這種循環約束能**強迫** $G_{X \to Y}$ 產生的 $Y$ 圖與輸入的 $X$ 圖**至少保有一些關係**。
    *   CycleGAN 必須訓練雙向的循環 ($X \to Y \to X$ 以及 $Y \to X \to Y$)，同時也需要訓練一個 $X$ domain 的 Discriminator ($D_X$) 和一個 $Y$ domain 的 Discriminator ($D_Y$)。

4.  **CycleGAN 的理論與實務**
    *   **理論限制**：循環一致性似乎**無法保證**轉換後的圖片與輸入圖片看起來真的很像，因為機器可能學到一些奇怪的轉換（如左右反轉或移除眼鏡），只要能轉回原圖即可。
    *   **實務經驗**：在實際使用 CycleGAN 時，這樣的極端情況**沒有那麼容易出現**。實際發現，輸入跟輸出往往看起來**非常像**，只是改變了風格。
    *   **同類模型**：**DiscoGAN** 和 **DualGAN** 的想法與 CycleGAN 幾乎是**一模一樣**的，且由不同團隊在相近的時間 (2017 年 3 月/4 月) 提出。

### 二、 序列生成 GAN (Sequence GANs) 與非監督式應用

1.  **文本生成的特殊難題**
    *   GAN 用於生成文字序列是**最困難**的應用 。
    *   **No Gradient問題**：在 Generator 產生文字時，由於參數微小變化不會改變輸出的 Token ，導致 Discriminator 的輸出分數不變，**無法計算梯度** [CH, 11]。
    *   **解決**：將問題視為**強化學習 (RL)** 來運作 [CH, 11]。

2.  **非成對文本風格轉換 (Text Style Transfer)**
    *   Text Style Transfer (例如把負面句子轉成正面句子) 的做法與 CycleGAN **一模一樣**。
    *   需要收集一大堆非成對的負面句子和正面句子（例如從 ptt 爬取的推文）。
    *   訓練同樣需要兩個 Generator 互相轉譯，並使用 **cycle consistency** (例如負面轉正面後再轉回原來的負面)。
    *   **挑戰**：兩個句子之間的相似度 (距離) 怎麼計算，是一個需要研究的問題。

3.  **其他非監督式序列應用**
    *   **文本摘要 (Summarization)**：通過非成對的長文章和摘要，讓機器學習把長的文章變成簡短的摘要。
    *   **非監督式翻譯 (Unsupervised Translation)**：只收集一堆英文句子和一堆中文句子，**沒有任何成對資料**，使用 Cycle 的做法，機器就可以學會翻譯。
    *   **非監督式語音辨識**：讓機器聽一堆聲音（沒有文字對應）和爬一堆文字（沒有聲音對應），然後用 Cycle 運作，將聲音轉成文字。


[【機器學習2021】01~02 機器學習和深度學習基本概念簡介](https://hackmd.io/@JuitingChen/SyoNXkdslx)
[【機器學習2021】03~08 機器學習任務攻略和最佳化技巧](https://hackmd.io/@JuitingChen/BJ6mXy_slg)
[【機器學習2021】09~11 CNN 和 Self attention](https://hackmd.io/@JuitingChen/r1ahLgUngl)
[【機器學習2021】12~13 Transformer](https://hackmd.io/@JuitingChen/H1tfXy_ige)
[【機器學習2021】14~17 GAN](https://hackmd.io/@JuitingChen/S1adiwvhxg)
[【機器學習2021】18~21 自監督式學習](https://hackmd.io/@JuitingChen/ryQG7J_sgl)
[【機器學習2021】22~23 Auto-encoder](https://hackmd.io/@JuitingChen/r1sLPr92ge)
[【機器學習2021】24~25 Adversarial Attack ](https://hackmd.io/@JuitingChen/HJ6jJIq3ge)
[【機器學習2021】26~28 Explainable ML 和 Domain Adaptation](https://hackmd.io/@JuitingChen/SJZzQkdslg)
[【機器學習2021】29-30 強化學習-1](https://hackmd.io/@JuitingChen/HJYziZR3gx)
[【機器學習2021】31~33 強化學習-2](https://hackmd.io/@JuitingChen/Sy5DoWA3xl)
[【機器學習2021】34~35 機器終身學習](https://hackmd.io/@JuitingChen/BytWmyuilg)
[【機器學習2021】36~37 神經網路壓縮 ](https://hackmd.io/@JuitingChen/Bk7-m1_jlx)
[【機器學習2021】37~40 Meta Learning](https://hackmd.io/@JuitingChen/SkkC6rT2gl)
