# 對抗生成網路 GAN介紹 李宏毅深度學習 ###### tags: `GAN`,`Deep Learning` 筆記內容參考於:https://youtu.be/ufcKFjdpT98 ## GAN的分類 ![](https://i.imgur.com/MKYcvIq.jpg) 1. Typical GAN 找一個generator(即一個function),輸入隨機向量,輸出為向量轉換**生成**的結果。例:收集很多動畫人物的頭像,把這些頭像餵給generator,generator學會產生出新的動畫人物頭像。 3. Conditional GAN 4. Unsupervised Conditional GAN ## Typical GAN:以產生動畫人物圖片為例 ![](https://i.imgur.com/RCQM6Nd.png) ### 訓練兩個NN - 架構取決於任務。例如:產生圖片的話NN架構通常會是CNN,產生文字、句子的NN架構通常會是RNN、LSTM等等 - 參數隨機初始化 - Generator:將低維向量轉換成高維向量 - Discriminator:輸入高維向量(圖片),輸出分數,代表現在輸入的這張圖片是否人為產生(real or fake) ### 訓練方法: ![](https://i.imgur.com/fqlZLjV.png) 1. 固定住Generator(以下簡稱G),只訓練Discriminator(以下簡稱D),讓他看到偏真實的圖片就給高分,看到偏向不真實的圖片給低分。 - 好圖片:將DB中的真實圖片隨機取樣餵給D,D對這些真實圖片打高分, - 不好的圖片:第一次G產生的圖片很大機率是不好的,因為參數隨機初始化,還沒訓練過,這些圖片對D來說就是不好的圖片 - D的學習目標就是:將好圖片給高分,將不好圖片給低分。 - 訓練方式跟訓練NN方式一樣,也可以當作回歸問題或是分類(binary classifier)問題來做。 - 跟傳統二元分類不同的地方只在於label是機器標註而不是人工標註 ![](https://i.imgur.com/3PKhqjB.png) 2. 固定住D,只訓練G - Generator學習騙過Discriminator,而不是人訂出來的objective function(目標函數) - 讓G產生的圖片丟進D中,讓固定住的D打分數,然後把G和D串在一起,視為兩個NN組成的巨大NN - 將巨大NN輸入視為一個向量,輸出為一個分數 - 在這個NN的中間某一維,把他的的hidden layer的output拿出來看作是一張圖片(也就是G產生的結果) - 巨大NN的目標:讓最終輸出的score越高越好:用==Backpropagation==去找,只是會==固定住D中對應的幾個維度,只調整G中對應的幾個維度== - 調整完Generator後,G的新輸出會有變化,會使D給這個新的圖片比原先舊的比較不好的圖片還高的分數。 ![](https://i.imgur.com/vZotYgn.png) 3. 總結:實際在訓練的時候,是D和G交替訓練 4. 新的GAN方法:WGAN、improved WGAN... ## Conditional GAN ![](https://i.imgur.com/Wo5YKIi.png) 根據輸入產生對應的輸出的generator 一開始的想法:想要輸入一些情境文字,讓G產生對應情景的輸出e.g. 輸入"紅髮女生",G會產生一個紅髮女生圖片 ![](https://i.imgur.com/hhj0d9A.png) ### 直覺的方法:Traditional supervised approach - 發現效果並不如想像中好。 - 比如說輸入文字:"train"代表火車,訓練的已標註圖片可能有正面的火車、側面的火車,但都屬於火車,如果對Network來說正確答案有很多個,他會採取正確答案的平均,這樣子輸出結果就會很模糊,是一個四不像 ### Conditional GAN - 一般來說也需要paired data(輸入文字和圖片的對應關係),所以是supervised,也可以是unsupervised,但也跟傳統方法不太一樣。 - G不去看ground truth,看的是D,根據Discriminator學的=> - 所以D需要輸入一組Condition c和一組高維向量x,輸出的是一個scalar,判斷x是否為真實圖片以及c、x是否情境匹配 #### D訓練的方法: ![](https://i.imgur.com/LojYAQ3.png) 1. Positive sample 給高分的情況:Good pair(DB中有label的data),告訴D要給他們高分。即: - case1:好的圖片+正確文字 3. Negative sample 給低分的情況: - 一般GAN的想法:把一段文字輸入給G,產生圖片,這次產生出來的pair給低分=>會造成問題,D就會傾向於只判斷圖片的好壞,所以還要引入**好圖片+錯誤情境文字**的sample - case2:不好的圖片+正確文字 - case3:好的圖片+錯誤文字 ### Conditional GAN的應用 1. 聲音轉換為影像 - 自己實作的效果不太好 2. 影像轉換為文字 - 把多分類問題”一張圖片可以同時屬於多個不同的類別“用Conditional - 發現各種模型(VGG、Resnet等)加上GAN的話效果都有提升 - 因為GAN可以幫助發現label和label之間的依賴關係 3. Samsung做的Talking Head,讓蒙娜麗莎互動蒙娜麗莎會動 ## Unsupervised Conditional GAN ### 想法: - 使用unpaired data,最常看到的應用是圖片風格的轉換。圖片DB有屬於不同domain的圖片,領域x的跟領域y沒有任何對應關係。 - 訓練一個Generator,目標:以將真實照片風格轉換為梵谷畫風格的圖片為例子 ### Cycle GAN ![](https://i.imgur.com/wVAIDmB.png) 1. Domain X代表的是屬於真實照片的圖片 2. Domain Y代表的是屬於梵谷畫的畫作圖片 3. 用Domain Y訓練$D_Y$,為屬於Domain Y的圖片打分數 4. 用Domain X訓練$G_{X \rightarrow Y}$,學習騙過Discriminator, 讓他產生出來的畫作要能讓D以為是Domain Y的圖=>有個問題:Generator可能很快就會發現可能很快就會發現D判斷只是G的輸出,可能會只產生單一梵谷風格圖片就無視輸入,不再轉換其他照片為梵谷風格圖片了=>==再加上一個Generator $G_{Y\rightarrow X}$== ![](https://i.imgur.com/MexiWyv.png) ![](https://i.imgur.com/nu867kj.png) 5. 第二個Generator將第一個G的輸出還原為原本的照片,希望輸入輸出越接近越好=>第一個Generator有了約束,就會想辦法改成梵谷畫風 ### 雙向 Cycle GAN ![](https://i.imgur.com/RqDWHHe.png) 除了把真實照片轉換為有風格的圖片,再加上一個反向的Generator,把梵谷風格圖片轉換越像真實照片越好,再把這個像真實照片的梵谷圖片轉換成原本的梵谷畫作圖片 還可以應用在文字或語音上,轉換文字風格(配合seq2seq+BP)或是讓機器說話、unsupervised語音辨識