The basic idea about GAN
給我五分鐘,你可以了解 GAN 概念。This article demonstrates the basic idea about GAN(Generative Adversarial Network)
Overview
這篇是基於 2019/5/23 號回到政大數理資訊社分享的演講內容,同時將它寫成文章。
- GANs introduction
- How GANs works
- Application of GANs
- Conclusion
- Reference
Difficulty: ★ ☆ ☆ ☆ ☆
1. GANs introduction
GAN 的全名為 generative adversarial network,中文叫做生成式對抗網路,GAN 的變形有很多種,故他就加了 s 變成了 GANs。這篇文章主要在介紹最最最基本的 GAN 的原理。
GAN 可說是 deep learning 界的新寵兒,在各個應用領域無論是文字,影像,還是音訊,都少不了 GAN 的身影。而各大頂級論文也都被 GAN 的更複雜架構給佔據了。原因是 GAN 可以說是一種新型態的網路架構,他藉由兩個網路互相拮抗而成,擁有更好的效果,聽不懂什麼是 ”互相拮抗”? 沒關係,後面我們會細細地把這句話講清楚 。
GAN 是屬於 deep generative models 的一類,以 unsupervised 的方法去試著學到 data 的 distribution,也在近幾年取得了很大的成功。Generative model 旨在嘗試著去學習 training data 的真實分佈,並去產生屬於這個 distribution 的新資料點(maybe 帶有一些variation)。常見的生成模型還有 VAE。VAE 嘗試去極大化 data log-likelihood 的 lower bound,跟 GAN 有些不同。
深度學習的大神之一,過去為臉書AI研究院院長,於2016.07在知名論壇 quora 回覆說,他覺得最近的 deep learning 發展,讓他最感興趣的就是 GAN了,這個新的概念很有趣。而我想大家再多深入了解 GAN 之後,也會深深地同意他的說法。
2. How GANs works
首先,我們就來看看到底 GAN 是啥咪小東西好了。GAN的出現,大大改變了我們針對於神經網路的訓練,上面有說到 GAN 是由兩個網路互相拮抗而成的。我們這邊舉一個例子,我們可以先想像有一台很會製作人偶面孔的製偶師(G),還有一個專門分辨人偶做得好不好的檢驗師(D)。
製偶師的目標是製作出一個帥氣臉孔的人偶,儘管製偶師(G)雖然不知道世俗對於”帥”的定義是什麼,但是檢驗師(D),卻很瞭解什麼叫做有帥氣臉孔的人偶。因此在製偶師(G)一個一個製作出人偶,檢驗師(D)也針對每個人偶,給出評論: 「喔!這個蠻帥的」;「 喔,這個不行拉….」。如此的循環過程,製偶師(G)雖然一開始不知道什麼叫做帥氣,但逐漸的他對於”帥”的理解也會慢慢變成檢驗師(D)的形狀。
像如此的關係,其實就與 Game theory 裡的 minimax theorem 十分雷同。(GAN數值上的求解也就是在解 MiniMax 問題。)
那麼在這個示意圖中,我們想要製作一個帥氣的臉孔,G 負責產生圖片,D 則負責給予生出來的圖片分數。我們生出了一張金城武的頭像,D 自然而然會給予一個好的評論,因為我們的目標是製造一個帥氣的臉孔。但如果生出了一個 How 哥的頭像,D 則會給予一個不好的評價。
再回到我們的架構裡頭,基本上在 GAN 裡頭,會有兩個神經網路,Generator (G) & Discriminator (D)。
G 是一個 upsampling 的 Neural Network(NN),它的作用是,輸入一串 tensor 後,可以經過 NN 變成一串維度更高的 tensor (e.g., 輸入100*1的 tensor,輸出 256*256*3 的 tensor(RGB 影像)。)
D 則是一個 regressor,他會給予輸入進來的 tensor 一個連續的分數(或者離散的 0/1,端看模型設計。),根據 task 的目標,如果輸入進來的 tensor 越像你的目標的話,就給1分。假使 D 很明確的知道你輸入進來的 tensor 爛透了,那麼就給予0分。理論上,訓練到最後 D 輸出的結果會收斂到 0.5,代表著目前的 D 沒辦法去判斷這個筆進來的 tensor 到底是不是符合 task 的目標。
About Generator:
Generator 一開始只能生成一坨糊在一起的爛爛的圖片,但他會根據每次生成完丟入 Discriminator 的結果,慢慢的更新 Generator,那麼 Generator 就會有越來越好的生成品質。另外輸入進去給 Generator 的 random noise 其實都控制了圖片生成的某些元素,或許有些能夠解釋,有些則難以洞見。
About Discriminator:
一樣以下圖為例,當一開始 G 出來的圖片很爛時,D 給的分數就會很低。再來如果生成的品質很高,讓 D 認為他與真實圖片的 distribution 很接近時,就會給予相對高的分數。
Adversarial Training
那 GAN 的訓練過程又是如何呢?為了先給大家一個基本的概念。我們再請 How 哥出來與我們講解一番!首先,我們要收集一批真實的圖片,以這個 GIF 的示意圖來說,目標為試著製造一個 HowHow的頭像。首先Generator Version 1 (G1),不會知道這個 Task 的目的,所以他生成了一批藍先生的圖片。想當然爾,這些都是錯的,不過沒關係,才剛開始訓練而已。這批藍先生的圖片會進入 Discriminator Version 1 (D1),D1相對的會給現在的 G1 不好的分數,畢竟他生出來的藍先生,而不是 How 先生。同時我們給了 real 的 How 先生,並給與很高的分數。由此 D & G 會分別根據 D 來計算 Loss 並更新 weights。接著進入 G2 & D2 階段,這次 G2 可以生成了疑似 howhow 的圖片,但仔細定睛一瞧,咦!怎麼是古人們+影分身的 howhow。OK這次的圖片可能的確有變好,但因為 D2 也變得更嚴格了,所以一樣給了很低的分數,同時我們一樣餵入真實的圖片並給他1分。再次計算 Loss ,計算 gradient 並且更新權重參數。就這樣接著不斷循環去分別更新 G& D。我們最後就會得到一個可以生成很棒的照片的 G!
簡單地看過了training的流程,現在就來看看實際上運作是怎麼運作的吧!
Training Discriminator
首先是 Discriminator,training D的時候,會把 G 鎖起來,鎖起來的意思就是 G 是固定的,更新參數時,並不會更新到 G。生成的圖片即是以目前的 G 去生成 data,這個生成的 data 的 ground truth 會給予0,real 的 data 會給予1的 ground truth。再由此 ground truth 去跟目前的 D 的 output 去計算 loss。接著藉由 BP 去更新權重,更新時會忽略掉 G 的影響,因為此階段為 D 的權重更新階段。
Training Generator
再來是 Generator ,在 training G 的時候會將 D 鎖起來。這次的 Task 的任務為,我要盡可能地讓 G 所生成的 fake data 騙過 D。意思就是將 fake data 輸入進 D 後得到的分數越高越好,這樣就表示此時我的 G 可以讓現在未進化的 D 認為 G 生的圖片的品質很好,很像真的,並給予很高的分數。接著 update 參數,讓 G 進化。如此一來,G就會持續的更新,試著生成更真實的圖片。
Algorithm of GAN
這邊我們就直接來看 GAN 的演算法。
首先,隨機從真實資料抽選 m 筆 data,也隨機產生 m 筆的 noise。將 noise 輸入 G 後,我們會得到 m 筆的 generated data。在 D 的 Learning 階段我們會看到 loss 的計算方式為下:
第一項,Xi 為真實資料,故丟進 D 之後,照理來說要獲得大的值。而後面那項 X̃,則是生成的 data,丟進 D 之後我們預期他要是一個很爛的數字,因此第二項就會越高越好。因此整體而言,我們會希望 D_loss 越高越好。
更新完 D 的參數後,我們接著訓練 G,G 的 loss function 跟 D 很像,首先我們先 random sample m 個 noise 出來,這個 noise sample 出來的值丟進 G 之後應該要越高越好,越高表示我的 G 越好。因此 Optimizer 的任務就是去maximize loss,並隨之更新參數。
3. Application of GANs
現在 GANs 的應用已經無所不在了。無論是影像,文字,亦或是聲音。
這陣子爆紅的 FaceApp,即有很大的機會在背後使用了 GAN 的技術去生成老化圖片。雖然不得而知他們是使用哪種 stat-of-the-art 的 生成網路去做生成,不過根據報導,他們的確是一間 AI 公司。從這我們就可以看到 GAN 有多大的能耐能夠讓整個世界為之瘋狂了!
除了這個以外,我們還可以舉出許多 GAN 的應用,讓大家能夠對於 GAN 有更多的想像與理解。以下便舉了幾個比較著名的 GAN 種類,給大家參考!
Pix2Pix
看看這些圖片,這些都是 Pix2Pix 生成的影像,pix2pix 便是使用了 GAN 的概念,只是他沒有跟著叫 xxxGAN。
- 原始的 input 為一張街景的 segmentation map,經過 pix2pix 後生成真的街景
- 原始的 input 為隨手的塗鴉照,經過 pix2pix 後產生一幢房子的照片。
- 原始的 input 為黑白照片,經過 pix2pix 後為照片增添了色彩
- 原始的 input 為 google 衛星圖,經過 pix2pix 之後即變成地圖了
以上就是 pix2pix 能夠做到的事情。如果得手邊的 project 有類似的影像 domain 互轉,不仿也是可以試試 pix2pix,只是它已經是 3 年前的技術了。現在或許有些更 STOA(State of the art) 的演算法可以使用了。諸如 Cycle GAN, StarGAN 都是類似的概念!但 pix2pix 確實為這樣 domain 轉換的先河。這邊有個 Demo 網頁,可以來大家來玩玩 pix2pix。
GauGAN
GauGAN: Changing Sketches into Photorealistic Masterpieces
在開始之前,我們不仿先看一下 demo video.
這篇 2019/3 的論文,確確實實的讓 Nvidia 好好的火力展示了一番。看起來真的是很強大。你可以任意著色,便會生成超級真實的風景畫。相較於人臉圖通常有著固定的 pattern,我認為風景畫的生成會是更困難的 Task。而 GauGAN training 的條件也很嚴苛,需要非常好的硬體設備,但Nvidia真的是在賣 GPU 的 XD。想一想能有如此的火力展示,也是挺合理的。
Seq GAN
Seq GAN 專注於文字生成。 seq GAN 用了 RNN-based generator + CNN-based discriminator,並且使用了 MLE 去做 pre-train 並得到相當不錯的效果!再來使用 Monte-Carlo 來獲得 reward, 在經過 policy gradient 來指導 generator 做更好的生成! Seq GAN 這步導入 Reinforcement learning 算是當時十足的的創新點。成為了當時的文字生成領域的標竿。
4. Conclusion
目前在 deep generative models 方面有很多侷限,相對於 supervised learning,做的還是沒有那麼好。不過聽到李宏毅老師的演講,老師說 GAN 做大的淺力是在 semi-supervised learning 身上,使用 GAN 的架構,我們可以只使用少量的 labeled data,但卻可以達到相同的準確率。並且在 structure learning 尚有特別好的效果。
5. Reference
- 李宏毅老師課程網頁: http://speech.ee.ntu.edu.tw/~tlkagk/courses.html
- howhow 的肖像
- pix2pix: https://arxiv.org/pdf/1611.07004.pdf
- seqGAN: https://arxiv.org/abs/1609.05473
- GAUGAN Demo: http://nvidia-research-mingyuliu.com/gaugan