# [GAN] GAN&CGAN 理念與架構 ###### tags: `GAN` ## GAN 偽造者(counterfeiter)就稱為『生成模型』(generative model), 警察稱為『鑑別模型』(discriminative model),簡單架構如下圖: ![](https://i.imgur.com/AEncCeJ.png) :::info Generator跟Discriminator都是NN架構 * 產生**圖**的NN架構:通常是CNN * 產生**文字、句子**的NN架構:通常是RNN、LSTM等 ::: Generator * 輸入:z(隨機向量 or 動畫人物的頭像轉成的低維向量) * 輸出:圖片(高維向量) > ![](https://i.imgur.com/cd1Je79.png =400x) > 輸入向量中的每一個 dimension ,對應到影像中某些特徵(例如某pixel 的顏色)。如果改變了其中一個dimension的數值,輸出的圖片某種特徵會改變。 > Discriminator * 輸入:圖片(高維向量) * 輸出:分數 ## Basic Idea of GAN ![](https://i.imgur.com/Bqo2i1W.png =500x) GAN的基本想法是 * $Pdata(x)$:我們已有一個目標資料集 * $x$:可以是任何目標,這裡$x$指照片 這也是我們希望機器可以生成的資料分佈(distribution)。 圖上藍色區域是**高機率**的部份,其它部份是低的部份,只要從藍色區域中生成的圖像都可以是**完美的**,而從藍色外區域生成的圖像就會是模糊的。 ## Structure Learning :::info * Regreassion:輸出數值 * Classification:輸出class * Structure Learning:輸出sequence,matrix, graph, tree… GAN 是一種類似 Structure Learning 的學習過程,藉由 D 的對抗,讓 G 生成一個足具結構性的結果 ( 可以是一張圖片、一段摘要、… ) ![](https://i.imgur.com/d6R5DMw.png =450x) ::: * 傳統Structure learning有兩種方法:Bottom up, Top down * Bottom up:一個個component 分開產生物件,容易失去大局觀,可視為 G 的方法 * Top down:產生一個完整的物件後,再從整體去看這個物件好不好,可視為 D 的方法 | | Generator | Discriminator | | -------- | -------- | -------- | | Pros | 便於產生圖片 | 可以考量到全局 | | Cons | 僅學習到整個結構的表象,並沒有學習到其內涵,因此每個 pixel 間都是個別獨立的。 | argmax 問題通常不易解,而且反例圖片不容易取得 | * Generator + Discriminator GAN 就是結合上述的優點所形成的方法,利用 Generator 來克服 Discriminator 不易產生圖片的難處,也利用 Discriminator 來幫 Generator 做到全局的掌控。 ## 訓練 1. 固G,訓D ![](https://i.imgur.com/rfFjOrR.png =500x) 2. 固D,訓G ![](https://i.imgur.com/4WeIr8A.png =500x) 3. D和G交替訓練 ![](https://i.imgur.com/wecQJS6.png =500x) 4. 更新參數 ![](https://i.imgur.com/pDSOFQ3.png) ![](https://i.imgur.com/gjt07ss.png) 1. G:生成G1 2. D:由G1產生的照片經過D1輸出之後,D1知道它是假照片,輸出score非常小。 3. G1更新參數,升級為G2,也就是G2的輸出照片經過D1的輸出應該是1.0 :::info 1. 固定住G,只訓練D:==真圖給高score,假圖給低score== * 只訓練D:鑑別能力提升 * 偏假圖:第一次G產生的圖片很大機率是不好的,因為參數隨機初始化,還沒訓練過,這些圖片對D來說就是不好的圖片 2. 固定住D,只訓練G: * 固定住D:無法鑑別G生成的假圖(==D給假圖的score變高==) * 只訓練G:G學習騙過D * 過程: * 讓G產生的圖片丟進D中,讓固定住的D打分數,然後把G和D串在一起,視為兩個NN組成的巨大NN * 巨大NN的目標: 最終輸出的score越高越好:用Backpropagation去找,只是會固定住D中對應的幾個維度,只調整G中對應的幾個維度 所以Generator-V1會更新參數,升級為Generator-V2,讓它的輸出照片可以更Realistic,最基本就是要可以騙過Discriminator-V1,也就是Generator-V2的輸出照片經過Discriminator-V1的輸出應該是1.0 3. 總結:實際在訓練的時候,是D和G交替訓練 4. 新的GAN方法:WGAN、improved WGAN、WGAN-GP ::: ## 演算法 ref: https://medium.com/hoskiss-stand/gan-note-791358c3b10b ### **訓練D**: 最大化 ![](https://i.imgur.com/5Aby10E.png =300x) * 前面項:表示要判斷真實 data 越接近 1 越好,後面項:fake 越接近 0 越好 * 理論上 discriminator 參數最好要多 update 幾次 ![](https://i.imgur.com/OSgdLVz.png) ### **訓練G**: 這時候我們的 discriminator 已經(接近)讓上面的式子最大化了,G 要開始試圖讓後面項最小化 最大化![](https://i.imgur.com/tmwkUgi.png =120x)![](https://i.imgur.com/qkCnr2K.png =55x), or 最小化 ![](https://i.imgur.com/rTtjC8I.png =180x) = ![](https://i.imgur.com/0SzgC5I.png =160x) ![](https://i.imgur.com/QsfIkov.png) ## Conditional GAN * 輸入:CGAN 與一般的 Normal GAN 不同的地方在於餵給 Generator 與 Discriminator 的輸入不同 * 輸出:不僅僅是接近真實的圖像(x~=1),同時還要滿足輸入文字的條件(match: c&x) ### Text to Image 輸入條件$c$:**文字** ![](https://i.imgur.com/rluJX2Y.png) **G:生成器** * 輸入: ==文字train-$c$== 與 ==Prior distribution-$z$==,經過Generator之後得到照片$x$ * $c$(條件):==文字train-$c$== * $z$(Noise 噪聲向量-from常態分佈值): 這些火車的==常態分佈值==給G * 原因:火車有正面或側面照,若最後機器輸出這些照片的平均,圖片會非常模糊 > 1. 噪聲:從分佈中提取隨機樣本(噪聲)當輸入,通過G來單純生成假圖 > 2. 目的:生成一張符合我們要求的隨機圖片 > 3. 隨機: > (1) 原因:GAN 就不會每次生成相同的結果 > (2) 問題:若完全隨機,是不負責任的,因結果不可控,你不知道生成的圖像有什麼特徵,只能保證是要訓練出的圖片類型。 > (3) 解法:加入c去控制必須生成的條件=train ```python=1 # 宣告函式:noise_sample,隨機產生噪音樣本,介於[-1,1]之間的常態分佈數值。 np.random.seed(123) def noise_sample(num_samples): return np.random.uniform( low = -1.0, high = 1.0, size = [num_samples, g_input_dim] # 使用訓練完成的模型,輸入隨機噪音,並生成圖像。 noise = noise_sample(36) images = G_output.eval({G_input: noise}) plot_images(images, subplot_shape =[6, 6]) ``` * 輸出:$x=G(c,z)$ * 希望輸出的 ==假圖$x$== 分佈是可以接近實際資料中屬train的分佈 ![](https://i.imgur.com/UTLXX3r.png) **D:鑑別器** * 輸入:輸入 **paired data(==文字train-$c$==, ==假圖$x$==)** 的對應關係,所以是supervised * $c$(條件):文字train:與G輸入同樣的條件 * $x$(G生成的圖片):1:實際~0:虛假 如果只有輸入$x$,G學到只要生成一個品質好的照片即可,不管條件c(與文字無關的照片,此張圖是不是火車) * 輸出:score * 架構: 1. 較差:當score低時,機器不知道到是低分原因是以下哪個造成 * $x$ 生成的假圖很模糊 : (train, **模糊train圖**) → 0 * $c$ 條件不符 : (**dog**, 真實train圖) → 0 2. 較優:當score低時,可以知道低分原因是哪個造成 (train, 模糊train圖)→ 0:造成原因為 假圖$x$模糊 * 假圖 $x$ 是否真實:( _, **模糊train圖** ) → no * $c$ 判斷條件符不符合 : (train,____) → yes ![](https://i.imgur.com/k1x53U0.png) ## 演算法 ### **訓練D**: D的分數由3組paired data(==文字train-$c$==, ==圖$x$==)而來 * 3種x * 事先準備:從database抓出的 * $𝑥$:真圖(且與條件c相關) → $(c^1,𝑥)=1$ * $𝑥 ̂^i$:真圖(與條件c不相關)→ $(c^1,𝑥 ̂^i)=0$ * 過程中生成: * $𝑥 ̃^𝑖$:G生成的假圖    → $(c^1,𝑥 ̃^𝑖)=0$ ![](https://i.imgur.com/UNgwQFV.png) ### **訓練G**: ![](https://i.imgur.com/YAHQqDZ.png) ## 參考資料 :::success ### GAN 1. 不要慫,就是GAN:什麼是z(隨機噪聲) https://www.jianshu.com/p/f31d9fc1d677 2. [機器學習] GAN 筆記:演算法 https://medium.com/hoskiss-stand/gan-note-791358c3b10b ### CGAN 1. Generative Adversarial Network (2) --- Conditional GAN:演算法 https://allen108108.github.io/blog/2019/10/29/Generative%20Adversarial%20Network%20(2)%20%E2%80%94%20Conditional%20GAN/ 2. Conditional Generation GAN L2:演算法 https://medium.com/@balanced_salmon_turtle_423/conditional-generation-gan-l2-c785efc9dce 3. 李弘毅老師GAN筆記(二),Conditional GAN:原理 https://blog.csdn.net/taoyafan/article/details/81229466?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.channel_param :::