# 第七章:生成式對抗網路 (Generative Adversarial Network, GAN) >上課筆記 * 上課影片連結 * ==[**生成式對抗網路(一):基本概念介紹**](https://youtu.be/4OWp0wDu6Xw)== * ==[**生成式對抗網路(二):理論介紹與WGAN**](https://youtu.be/jNY1WBb8l4U)== * ==[**生成式對抗網路(三):生成器效能評估與條件式生成**](https://youtu.be/MP0BnVH2yOo)== * ==[**生成式對抗網路(四):Cycle GAN**](https://youtu.be/wulqhgnDr7E)== --- ## 簡介與生成模型 ### Network 作為生成器 * **傳統的網路模型**多為判別式模型,接收輸入 $X$ 並輸出一個確定的 $Y$。 * **生成模型**則將網路視為一個**生成器 (Generator)**,其輸入包含一個**隨機變數 $Z$**,這個 $Z$ 是從一個**簡單的分布**中抽樣而來。 * 網路的輸出不再是單一固定的 $Y$,而是與輸入的 $X$ 和隨機抽樣的 $Z$ 共同決定,因此對於相同的 $X$,每次的輸出 $Y$ 可能不同。 ![image](https://hackmd.io/_uploads/BJJpfjyp1l.png) ### 為什麼需要輸出分布? * 對於需要**創造力**的任務,例如影像生成、繪圖、聊天機器人等,同樣的輸入可能有多種合理的輸出。 * **繪圖:** 給定「紅眼睛的角色」的條件,不同人會畫出不同的結果。 * **聊天機器人:** 回應「你知道輝夜是誰嗎?」可以有多種不同的答案。 * **影片預測 (Video Prediction):** 給定過去的影格,預測下一影格時,可能有多種合理的發展。 * 例如,在小精靈遊戲中,給定前幾個影格,小精靈下一步可能向左轉或向右轉,若模型只輸出單一預測,則可能產生模糊不清的結果。 * 透過讓網路輸出一個**機率分布**,可以涵蓋多種可能性,例如同時包含向左轉和向右轉的可能性。 --- ## 生成式對抗網路 (Generative Adversarial Network, [GAN](https://arxiv.org/abs/1406.2661)) ### GAN 的基本概念 * GAN 包含兩個主要的網路: * **生成器 (Generator, $G$ ):** 接收一個從**簡單分布 (通常是常態分布)** 中抽樣的**低維度向量 $z$** 作為輸入,並將其轉換為一個**高維度的輸出**,例如一張圖片。 生成器的目標是產生看起來像是真實資料的假資料,試圖**欺騙**鑑別器。 ![image](https://hackmd.io/_uploads/Byd59jk61l.png) * **鑑別器 (Discriminator, $D$ ):** 接收一個輸入(可能是真實資料或生成器產生的假資料),並輸**出一個介於 0 到 1 之間的純量**,表示輸入**是真實資料的可能性**。 鑑別器的目標是**正確區分**真實資料和生成器產生的假資料。 ![image](https://hackmd.io/_uploads/BkbA5i1pkx.png) * GAN 的訓練過程是一個**對抗 (Adversarial)** 的過程,生成器試圖產生更逼真的假資料來騙過鑑別器,而鑑別器則不斷學習提高區分真假資料的能力。 這個對抗的過程可以比喻為**寫作敵人,唸做朋友**。 ### GAN 的訓練演算法 1. **初始化 (Initialize)** 生成器 $G$ 和鑑別器 $D$ 的參數。 2. **在每個訓練迭代 (Training Iteration) 中:** * **步驟一:固定生成器 $G$,更新鑑別器 $D$**。 * 從真實資料庫中抽樣一批真實資料。 * 從簡單分布中抽樣一批向量,並透過生成器 $G$ 產生一批假資料 $z$。 * 訓練鑑別器 $D$,使其對真實資料輸出高分(接近 1),對假資料輸出低分(接近 0)。 這可以視為訓練一個二元分類器,目標是**最大化**以下 Objective Function:$$D^* = arg\max_D V(D, G)$$$$\begin{array}{ll}其中 \ {\rm Objective \ Function} & = \ V(D, G)\\ & = \ E_{y \sim P_{data}} [\log D(y)] + E_{z \sim P_G} [\log (1 - D(z))] \\ \end{array}$$$$其中 \begin{cases} P_{data}(y) \ 是真實資料的分布,P_G(z) \ 是輸入雜訊的分布。 \\[2ex] D(y) \ 是 \ {\rm Discriminator} \ 判斷真實資料的機率,D(z) \ 是 \ {\rm Discriminator} \ 判斷生成資料為真實的機率。\end{cases}$$![image](https://hackmd.io/_uploads/H13CV3kTkx.png) ![image](https://hackmd.io/_uploads/SyEUVhy6Je.png) * **步驟二:固定鑑別器 $D$,更新生成器 $G$**。 * 從簡單分布中抽樣一批向量。 * 透過生成器 $G$ 產生一批假資料 $z$。 * 訓練生成器 $G$,使其產生的假資料 $z$ **能夠騙過**鑑別器 $D$,即讓 $D(z)$ 的輸出盡可能接近 1。這相當於**最小化**以下目標函數:$$G^* = arg\min_G Div(P_{data}, P_G)$$其中 $P_{data}$ 與 $P_G$ 的[散度 (Divergence)](###目標函數與分布的散度-(Divergence)) $=Div(P_{data}, P_G) \ = \ \max_D V(D, G)$,因此:$$G^* = arg\min_G \{\max_D V(D, G)\}$$![image](https://hackmd.io/_uploads/S1t8B3k61e.png) 3. **重複步驟一和步驟二,直到生成器產生的假資料難以被鑑別器區分為止。**![image](https://hackmd.io/_uploads/SJAEB21T1e.png) ### GAN 的訓練過程 生成器和鑑別器在訓練過程中不斷**交替更新**。 * 初期,生成器產生的假資料品質較差,鑑別器能以**顯著特徵**區分真假。 * 隨著訓練的進行,生成器逐漸學習產生更逼真的假資料,使得鑑別器難以判斷。 理想情況下,最終生成器可以產生與真實資料分布**無法區分**的假資料,此時鑑別器的輸出將接近 0.5 (真或假的機會各佔一半)。 ### 動畫人臉生成範例 透過 GAN 可以訓練生成動畫人物的臉部圖像。 * 訓練初期,生成器可能只產生雜訊。 * 隨著訓練次數的增加(例如 1000 次更新),生成器開始學習到人臉的基本特徵,例如眼睛。 * 持續訓練(例如 2000 次更新),會逐漸產生更精細的特徵,例如嘴巴。 * 經過數萬次更新後,可以生成較為逼真的動畫人臉圖像。 * **StyleGAN** 和 **Progressive GAN** 等更進階的 GAN 模型可以產生更高品質的人臉圖像。 --- ## GAN 的理論基礎 ### 目標函數與分布的散度 (Divergence) 生成器的最終目標是使其產生的資料分布 $P_G$ 盡可能接近真實資料的分布 $P_{data}$。 * 可以透過**最小化** $P_G$ 和 $P_{data}$ 之間的**散度 (Divergence)** 來實現,常見的散度包括 KL 散度 (KL Divergence) 和 JS 散度 (Jensen-Shannon Divergence)。 然而,直接計算連續分布之間的散度在實務上往往非常困難,因為我們通常不知道 $P_G$ 和 $P_{data}$ 的具體形式,只能從中抽樣。 ### 鑑別器與 JS 散度的關係 GAN 的巧妙之處在於,它透過訓練鑑別器來間接地衡量 $P_G$ 和 $P_{data}$ 之間的散度。 * 鑑別器 $D$ 的目標函數與 $P_G$ 和 $P_{data}$ 之間的 **JS 散度** 有關。 * 當鑑別器 $D$ 被訓練到最佳狀態 $D^*$ 時,其目標函數的最大值與 $P_G$ 和 $P_{data}$ 之間的 JS 散度存在一定的關係。 因此,我們可以透過訓練鑑別器並觀察其目標函數的值,來了解生成器產生資料的分布與真實資料分布的接近程度。 ### 使用其他散度 * 除了 JS 散度,GAN 的框架也允許使用[其他的散度](https://arxiv.org/abs/1606.00709)來定義目標函數。 --- ## GAN 的訓練技巧與挑戰 ### GAN 訓練的困難 GAN 的訓練非常**困難且不穩定**。 有一句話說 **No Pain No GAN**,形容 GAN 的訓練不易。 * 生成器和鑑別器需要**相互匹配 (棋逢敵手)** 才能共同進步。 * 如果鑑別器太強,生成器無法產生足夠逼真的假資料來騙過它,導致生成器無法進步。 * 如果鑑別器太弱,生成器很容易就能產生假資料騙過它,但產生的假資料可能品質不高,且鑑別器無法提供有效的梯度資訊給生成器。 * 訓練過程中可能出現**梯度消失 (Vanishing Gradients)** 等問題。 ### JS 散度的問題 :dizzy_face: * 在許多情況下,$P_{data}$ 和 $P_G$ 的**重疊部分非常少**。 * 真實資料和生成資料通常位於高維空間中的**低維流形 (Low-dim Manifold)** 上,它們之間的交集可能可以忽略不計。 * 即使 $P_{data}$ 和 $P_G$ 有重疊,如果**抽樣不夠**,鑑別器也可能認為它們沒有重疊。 ![image](https://hackmd.io/_uploads/SJIz2nJT1x.png) * 對於**沒有重疊**的兩個分布,**JS 散度** 的值恆為 $\log 2$,無法提供有效的梯度資訊來引導生成器學習,這導致即使生成器產生的分布與真實分布的距離有所縮短,JS 散度也可能沒有顯著變化,使得訓練停滯不前。 * 實際訓練中,基於 JS 散度的 GAN 的鑑別器很容易達到接近 100% 的分類準確率,但這個 Loss 並不能有效地反映生成器的品質。 ![image](https://hackmd.io/_uploads/rJpN22Jakl.png) ### WGAN (Wasserstein GAN) :flushed: **[WGAN](https://arxiv.org/abs/1701.07875)** 是一種使用 **Wasserstein 距離 (Wasserstein Distance)** 來取代 JS 散度的 GAN 變體。 * Wasserstein 距離(也稱為 Earth Mover's Distance, EMD)能夠更有效地衡量兩個分布之間的距離,即使它們沒有重疊。 * **直觀理解**:有許多可能的 moving plans,能使平均移動距離最小的 moving plan 定義了 Wasserstein 距離。 ![image](https://hackmd.io/_uploads/rkGsa2y6Jl.png) * WGAN 的鑑別器(通常稱為 Critic)的目標是以下目標函數的值:$${\rm Wasserstein \ Distance} = \max_{D\in 1-Lipschitz} \{E_{y \sim P_{data}(y)} [D(y)] - E_{z \sim P_G(z)} [D(z)]\}$$其中 $D$ 需要滿足 **1-Lipschitz 連續性 (1-Lipschitz Continuity)** 的限制。 這個限制要求 $D$ 必須是一個足夠平滑的函數,其變動不能太劇烈,否則必可100%區分真假。![image](https://hackmd.io/_uploads/SJ7P1ayTJe.png) * 滿足 1-Lipschitz 限制的鑑別器可以提供更有意義的梯度資訊,即使在 $P_{data}$ 和 $P_G$ 沒有明顯重疊時也能引導生成器學習。 ![image](https://hackmd.io/_uploads/Syv5R2kTyx.png) * **實作 WGAN 的技巧:** * **權重裁剪 (Weight Clipping):** [最早的 WGAN 論文](https://arxiv.org/abs/1701.07875)中,透過將鑑別器的權重限制在一個範圍 $[-c, c]$ 內來近似 1-Lipschitz 限制。 但這種方法並不能嚴格保證 1-Lipschitz 連續性。 * **梯度懲罰 (Gradient Penalty):** [Improved WGAN](https://arxiv.org/abs/1704.00028) 提出在鑑別器的目標函數中加入一個梯度懲罰項,鼓勵鑑別器的梯度接近 1,更有效地實現 1-Lipschitz 限制。 * **譜歸一化 (Spectral Normalization, SN):** 一種更先進的技術,可以直接約束鑑別器的 Lipschitz 常數,效果更好。 [SNGAN (Spectral Normalized GAN)](https://arxiv.org/abs/1802.05957) 通常能取得更好的效果。 ### GAN 的其他訓練技巧 許多研究致力於尋找更好的 GAN 訓練技巧,例如調整網路架構、使用不同的激活函數、加入批次歸一化 (Batch Normalization) 等。 * [Soumith 的 GAN Hacks](https://github.com/soumith/ganhacks) 和 [DCGAN](https://arxiv.org/abs/1511.06434) 的建議 是常見的參考。 * [BigGAN](https://arxiv.org/abs/1809.11096) 也提出了許多有效的訓練技巧。 --- ## GAN 用於序列生成 將 GAN 用於生成序列資料(例如文字)比生成圖像更具挑戰性。 * 生成器通常是一個 **Decoder (例如 Transformer 的 [Decoder](https://hackmd.io/@Jaychao2099/imrobot6#Decoder))**,接收輸入並產生序列。 * 鑑別器則接收一個序列,判斷它是真實序列還是生成序列。 ### 主要的難點:梯度傳播 (Gradient Descent) 的問題 * Decoder 在生成序列時通常會使用 **取樣 (Sampling)** 或 $arg\max$ 操作來選擇下一個 token。 這些操作是**不可微分 (Non-differentiable)** 的,導致梯度無法有效地從鑑別器傳播回生成器。 * 即使 Decoder 的參數發生微小變化,$arg\max$ 選擇的下一個 token 也可能不變,導致鑑別器的輸出沒有變化,梯度為零。 ![image](https://hackmd.io/_uploads/HkVg2AJayl.png) ### 解決方案: * **強化學習 ([Reinforcement Learning](https://hackmd.io/@Jaychao2099/imrobot13), RL):** 可以將序列生成視為一個強化學習任務,生成器作為 Agent,其目標是最大化鑑別器給出的獎勵(判斷為真實的機率)。 但 RL 的訓練通常也很困難。 * **SeqGAN:** 結合 RL 和 GAN 的方法。 * **ScratchGAN:** 一篇宣稱可以**從頭開始 (from scratch)** 訓練語言 GAN 的[論文](https://arxiv.org/abs/1905.09922),關鍵在於仔細調整超參數和使用多種技巧。 --- ## 其他生成模型 除了 GAN,還有其他重要的生成模型,例如: * **變分自編碼器 (Variational Autoencoder, VAE)**。[[2016上課]](https://youtu.be/8zomhgKrsmQ)[[第九章]](https://hackmd.io/@Jaychao2099/imrobot9#Generator-%E7%94%9F%E6%88%90%E6%A8%A1%E5%9E%8B) * **基於流的模型 (FLOW-based Model)**。[[2019上課]](https://youtu.be/uXY18nzdSsM) GAN 通常在生成高品質圖像方面表現更優越,但訓練更困難。 VAE 和 FLOW-based 模型在訓練上可能更穩定,但在生成品質上通常與 GAN 有差距。 > 延伸閱讀:[【生成式AI導論 2024】有關影像的生成式AI - 經典影像生成方法介紹](https://hackmd.io/@Jaychao2099/gen-ai-11#%E7%B6%93%E5%85%B8%E5%BD%B1%E5%83%8F%E7%94%9F%E6%88%90%E6%96%B9%E6%B3%95%E4%BB%8B%E7%B4%B9) --- ## 另一可能的解決方案:直接使用傳統的監督式學習? 是否可以直接使用**監督式學習 (Supervised Learning)** 的方法,將從簡單分布抽樣的向量直接對應到真實資料? * 可以訓練一個網路,其輸入是一個向量,輸出是它對應的圖片,將真實圖片與隨機向量配對作為訓練資料。 * **難點在於如何有效地安排這些向量與圖片的對應關係**,如果只是隨機配對,訓練效果會很差。 * **生成潛在優化 ([Generative Latent Optimization, GLO](https://arxiv.org/abs/1707.05776Gradient))** 和 **梯度原點網路 ([Gradient Origin Networks, GON](https://arxiv.org/abs/2007.02798))** 等方法嘗試解決這個問題。 ![image](https://hackmd.io/_uploads/HkbwlyepJg.png) --- ## GAN 的評估 ### 評估生成模型的困難 評估生成器產生的資料品質和多樣性是一個具有挑戰性的問題。早期的研究主要依靠**人工觀察 (Human Inspection)** 來判斷生成結果的好壞。 ### 自動評估指標 * **基於分類器的評估:** 將生成器產生的圖像輸入到一個預先訓練好的**影像分類系統 (Image Classifier)** 中,觀察分類結果的分布。 * 如果分類結果的**機率分布越集中**,可能表示生成的圖像品質較高,因為分類器對其類別更有信心。![image](https://hackmd.io/_uploads/Hym8ZJe6yl.png) * 然而,這種方法容易被 **模式塌縮 (Mode Collapse)** 的問題誤導。 * **模式塌縮 (Mode Collapse):** 生成器只產生少數幾種高度逼真的假資料,而忽略了真實資料分布的其他模式,導致生成結果缺乏多樣性。 分類器可能對這幾種假資料給予高置信度,但整體生成效果不佳。 ![未命名](https://hackmd.io/_uploads/r1LW71gTkx.jpg) * **模式丟失 (Mode Dropping):** 生成器只學習到真實資料分布的一部分模式,導致生成結果的多樣性不足,但單看生成結果可能難以察覺。![image](https://hackmd.io/_uploads/BJr771lTyx.png) * **Inception Score (IS):** 一種評估生成圖像品質和多樣性的指標。 * 計算生成圖像在 Inception Network 中的分類結果的機率分布。 * **高品質:** 分類結果的條件機率分布 $P(c|y)$ 應具有較低的熵(**單一圖像**更集中於某一類別)。 * **高多樣性:** 生成圖像的邊際機率分布 $P(c) = \frac{1}{n}\sum _n P(c|y^n)$ 應具有較高的熵(**所有圖像**覆蓋多個類別)。 * **IS 的計算公式:** $\text{IS} = \exp(E_{y\sim P_G} D_{KL}(P(c|y) || P(c)))$,**IS 值越高**通常表示生成品質和多樣性越好。 * **局限性:** IS 主要依賴於 Inception Network 的預訓練任務,可能無法很好地評估與預訓練任務無關的生成結果,且容易受到模式塌縮(Mode Collapse)的影響。![image](https://hackmd.io/_uploads/SJxsQ1g6Jg.png) * **Fréchet Inception Distance ([FID](https://arxiv.org/pdf/1706.08500.pdf)):** 一種更可靠的評估指標,比較真實圖像和生成圖像在 Inception Network 的**最後一個池化層 (Pooling Layer) 輸出的特徵向量**的分布。 * 假設真實圖像和生成圖像的特徵向量都服從**高斯分布 (Gaussian Distribution)**,然後計算這兩個高斯分布之間的 **Fréchet 距離 (Fréchet Distance)**。 * **FID 值越小**,表示生成圖像的分布與真實圖像的分布越接近,生成品質越高。 * FID 相較於 IS 更能捕捉生成結果的真實性和多樣性,且對模式塌縮更敏感。 * **局限性:** 假設分布為高斯分布可能並不完全準確,且需要生成大量樣本才能較好地估計分布。 ![image](https://hackmd.io/_uploads/BJNGIyxT1l.png) ### 我們不想要 記憶 GAN (We don't want memory GAN) 理想的 GAN 應該產生**新的、不在訓練資料中的**樣本。 * 如果生成器只是簡單地**複製(copy)** 或 **翻轉(flip)** 訓練資料,即使 FID 值可能很低,也不是一個好的生成模型。 * 評估 GAN 是否只是記憶訓練資料是一個重要的研究方向。 --- ## 條件生成 (Conditional Generation) ### 概念 * **條件生成模型** 的生成器 $G$ 除了接收隨機向量 $z$ 作為輸入外,還接收一個**條件 $x$**,根據 $x$ 和 $z$ 來產生輸出 $y = G(z, x)$。 * 透過控制輸入條件 $x$,我們可以**操控生成器的輸出**。 ### 應用 * **文字轉圖像 ([Text-to-image](https://arxiv.org/abs/1605.05396)):** 輸入一段文字描述 $x$,生成符合該描述的圖像 $y$。 * 需要**文字和圖像的成對標註資料** 來訓練。 * 生成器接收文字描述(通常需要經過編碼轉換為向量)和隨機向量 $z$,輸出圖像。 * 鑑別器不僅判斷圖像 $y$ 的真實性,還判斷圖像 $y$ 和輸入文字描述 $x$ 的**匹配程度**。 * 訓練鑑別器時,需要提供"真實的文字-圖像配對"、"生成的圖像和對應的文字"、以及"不匹配的文字-圖像組合"。![image](https://hackmd.io/_uploads/ByVCw1eTkg.png) * **圖像轉圖像 ([Image-to-image translation](https://arxiv.org/abs/1611.07004)):** 輸入一張圖像 $x$,生成具有不同風格或內容的相關圖像 $y$。 * 例如:房屋設計圖轉圖像、黑白圖像上色、素描圖轉實景圖、白天圖像轉夜晚圖像、去除圖像霧霾等。 * 可以使用**監督式學習**方法訓練,但通常效果不佳,生成結果容易模糊,因為相同的輸入圖像可能對應多種合理的輸出。 * 使用**條件 GAN** 可以生成更清晰和多樣的結果,鑑別器判斷生成圖像的真實性以及與輸入圖像的相關性。 * 結合 GAN + 監督式學習(Supervised Learning)通常能取得最佳效果。![image](https://hackmd.io/_uploads/SyM_Oyl6ke.png) * **聲音轉圖像 ([Sound-to-image](https://arxiv.org/abs/1808.04108)):** 輸入一段聲音訊號 $x$,生成與該聲音相關的圖像 $y$。 * 需要**聲音和影像的成對資料**,可以從影片中蒐集。![image](https://hackmd.io/_uploads/HkdxKJxTke.png) * **說話頭像生成 ([Talking Head Generation](https://arxiv.org/abs/1905.08233)):** 給定人物圖像和語音訊號,生成人物說話的動畫。 * **多標籤圖像分類器 ([Multi-label Image Classifier](https://arxiv.org/abs/1811.04689))**:利用標籤之間的關係可以改善多標籤分類的效能。 ![image](https://hackmd.io/_uploads/rJvxn1lpJg.png) ![image](https://hackmd.io/_uploads/ByIUcyg61g.png) --- ## 從不成對資料中學習 (Learning from Unpaired Data) ### 問題 * 在許多實際應用中,我們可能擁有一堆屬於不同領域 (Domain) 的資料 $X$ 和 $Y$,但 $X$ 中的樣本與 $Y$ 中的樣本之間**沒有任何明確的對應關係 (不成對)**。 * 例如,我們可能有很多真實世界的人臉照片 (X domain) 和很多二次元動漫人物頭像 (Y domain),但我們不知道哪張真實人臉應該對應到哪個二次元頭像。 * 目標是學習一個**映射 (Mapping)**,將 X domain 的資料轉換為 Y domain 的資料,即使沒有成對的訓練資料。 這稱為**無監督條件生成 (Unsupervised Conditional Generation)**。 ![image](https://hackmd.io/_uploads/HykOJxlTJx.png) ### Cycle GAN * **[Cycle GAN](https://arxiv.org/abs/1703.10593)** 是一種利用不成對資料進行圖像風格轉換的 GAN 模型。 * 它訓練**兩個生成器**和**兩個鑑別器**。 * **生成器 $\color{blue}{G_{X \rightarrow Y}}$:** 將 X domain 的圖像轉換為 Y domain 的圖像。 * **生成器 $\color{#F80}{G_{Y \rightarrow X}}$:** 將 Y domain 的圖像轉換回 X domain 的圖像。 * **鑑別器 $\color{#085}{D_Y}$:** 判斷輸入圖像是否屬於真實的 Y domain。 * **鑑別器 $\color{#085}{D_X}$:** 判斷輸入圖像是否屬於真實的 X domain。 * **核心思想:引入** **循環一致性 (Cycle Consistency)**: * 步驟: 1. 給定一個 X domain 的圖像 $x$,先轉換為 $y = \color{blue}{G_{X \rightarrow Y}(}x\color{blue}{)}$。 2. 再將 $y$ 轉換回 $x' = \color{#F80}{G_{Y \rightarrow X}(}y\color{#F80}{)}$。 $\implies x' = \color{#F80}{G_{Y \rightarrow X}(}\color{blue}{G_{X \rightarrow Y}(}x\color{blue}{)}\color{#F80}{)}$。我們希望 $x'$ 盡可能接近原始的 $x$。 ![image](https://hackmd.io/_uploads/Bkn6xlgT1g.png) ![image](https://hackmd.io/_uploads/r1g1bgxTkx.png) * 類似地,對於 Y domain 的圖像 $y$,先轉換為 $x = \color{#F80}{G_{Y \rightarrow X}(}y\color{#F80}{)}$,再轉換回 $y' = \color{blue}{G_{X \rightarrow Y}(}x\color{blue}{)}$ $\implies y' = \color{blue}{G_{X \rightarrow Y}(}\color{#F80}{G_{Y \rightarrow X}(}y\color{#F80}{)}\color{blue}{)}$。我們希望 $y'$ 盡可能接近原始的 $y$。 ![image](https://hackmd.io/_uploads/Hk0gXgepkx.png) * **訓練目標:** * $\color{blue}{G_{X \rightarrow Y}}$ 學習產生可以騙過 $\color{#085}{D_Y}$ 的 Y domain 圖像。 * $\color{#F80}{G_{Y \rightarrow X}}$ 學習產生可以騙過 $\color{#085}{D_X}$ 的 X domain 圖像。 * 同時最小化循環一致性損失,即 $|\color{#F80}{G_{Y \rightarrow X}(}\color{blue}{G_{X \rightarrow Y}(}x\color{blue}{)}\color{#F80}{)} - x|$ 和 $|\color{blue}{G_{X \rightarrow Y}(}\color{#F80}{G_{Y \rightarrow X}(}y\color{#F80}{)}\color{blue}{)} - y|$。 * **其他相關模型:** [Disco GAN](https://arxiv.org/abs/1703.05192) 和 [Dual GAN](https://arxiv.org/abs/1704.02510) 與 Cycle GAN 的思想基本一致。 * [StarGAN](https://arxiv.org/abs/1711.09020): 一種更進階的模型,可以實現多種風格之間的轉換。 ### 文字風格轉換 Cycle GAN 的思想也可以應用於**文字風格轉換**。 * 例如,將負面語句轉換為正面語句。 * 需要收集大量不同風格的文字資料(例如正面語句和負面語句),但不需要成對的標註。 生成器通常是 **序列到序列 (Sequence-to-sequence) 模型 (例如 [Transformer](https://hackmd.io/@Jaychao2099/imrobot6))**,訓練過程中需要使用 **[強化學習 (RL)](https://hackmd.io/@Jaychao2099/imrobot13)** 等方法來處理文字生成中的不可微分性問題。 ### 更多無監督應用 Cycle GAN 的思想甚至可以應用於更複雜的無監督學習任務,例如 * **無監督摘要**[[1]](https://arxiv.org/abs/1810.02851):長篇文章轉換為簡短摘要。 * **無監督翻譯**[[1]](https://arxiv.org/abs/1710.04087)[[2]](https://arxiv.org/abs/1710.11041):不同語言之間進行翻譯,而無需任何成對的翻譯資料。 * **無監督語音辨識 (Unsupervised ASR)**[[1]](https://arxiv.org/abs/1804.00316)[[2]](https://arxiv.org/abs/1812.09323)[[3]](https://arxiv.org/abs/1904.04100):在只有未標註的語音資料和未標註的文本資料的情況下訓練語音辨識系統。 --- ## 總結 * 生成式對抗網路 (GAN) 是一種強大的生成模型,透過生成器和鑑別器的對抗訓練,學習產生逼真的假資料。 * GAN 的應用非常廣泛,包括圖像生成、影片預測、聊天機器人、條件生成(例如文字轉圖像、圖像轉圖像)、以及從不成對資料中學習等。 * GAN 的訓練具有挑戰性,需要仔細的技巧和超參數調整。 * 評估生成模型的品質和多樣性仍然是一個活躍的研究領域,常用的指標包括 Inception Score (IS) 和 Fréchet Inception Distance (FID)。 * Cycle GAN 等模型展示了 GAN 在無監督學習領域的巨大潛力。 > 詳細學習:[[2018 GAN 上課影片系列]](https://www.youtube.com/watch?v=DQNNMiAP5lw&list=PLJV_el3uVTsMq6JEFPW35BCiOQTsoqwNw) --- 回[主目錄](https://hackmd.io/@Jaychao2099/aitothemoon/)