iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 28
4
AI & Machine Learning

以100張圖理解 Neural Network -- 觀念與實踐系列 第 28

Day 28:小學生談『生成對抗網路』(Generative Adversarial Network,GAN)

前言

Facebook AI 大師 Yann LeCun 在接受Quora專訪時說『GAN及其變形是近十年最有趣的想法(This, and the variations that are now being proposed is the most interesting idea in the last 10 years in ML, in my opinion.)』,我就忍不住想知道它是甚麼東東? 一探究竟,滿篇數學,應用領域又廣,請參閱 gan-zoo,苦讀多日,只懂一點皮毛,還不到小學程度,厚顏僅就所知,作一概念性的介紹。
https://ithelp.ithome.com.tw/upload/images/20180107/20001976ZfnRQb7e20.png
圖. GAN 論文成長量,圖片來源:gan-zoo

概念

GAN 是2014年蒙特婁大學博士生 Ian Goodfellow 提出來的(真的是好傢伙!),主要概念很簡單,好比一個遊戲有兩個角色,一個是偽造者(counterfeiter),他不斷製造假鈔,另一個角色是警察,不斷從偽造者那邊拿到假鈔,判斷是真或假,然後,偽造者就根據警察判斷結果的回饋,不斷改良,最後假鈔變成真假難辨(天啊! 這是甚麼電影情節啊!),這就是GAN的概念。

在GAN架構下,偽造者(counterfeiter)就稱為『生成模型』(generative model),警察稱為『判别模型』(discriminative model),簡單架構如下圖:
https://ithelp.ithome.com.tw/upload/images/20180107/200019767LaUM9BFGc.png
圖. GAN Architecture,圖片來源:generative-adversarial-networks

如上圖,生成模型利用已知的真鈔加上雜訊(Noise)來製造假鈔,交給判别模型辨識,它是二元分類模型,只會判斷真或偽,再將結果回饋給生成模型,經過不斷的訓練,就生成越越像的樣本了,這有甚麼貢獻值得 Yann LeCun 大師大力讚許呢? 列舉如下:

  1. 不用再花大量人力標註資料了,直接利用GAN模型生成即可,『監督式學習』(Supervised)就變成『非監督式學習』(Unsupervised)。
    https://ithelp.ithome.com.tw/upload/images/20180107/200019763yAUV33659.png
    圖. DCGAN 逐步訓練生成的圖像

  2. 風格轉換(Style Transfer):透過生成,就可以輕易把梵谷畫風轉移到另一張照片上了。更厲害的是,也可以反過來,把梵谷畫作轉換成照片。
    https://ithelp.ithome.com.tw/upload/images/20180107/20001976sACmaSoOc9.png
    圖. 照片轉換為大師畫作,圖片來源:Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
    https://ithelp.ithome.com.tw/upload/images/20180107/2000197698d7FWLnbq.png
    圖. 大師畫作轉換為照片,圖片來源:Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks

  3. 高解析度影像生成:透過不斷的生成與判別,模型最後可以訓練出比原圖更高解析度的圖像。
    https://ithelp.ithome.com.tw/upload/images/20180107/20001976645LG4mSXy.png
    圖. 高解析度影像生成,圖片來源:Tutorial on Deep Generative Models

  4. 壓縮圖像:在網路傳輸大量圖像時,為節省頻寬,常需要壓縮圖像,我們也可以利用GAN生成。
    https://ithelp.ithome.com.tw/upload/images/20180107/20001976MVSPath6z9.png
    圖. 壓縮圖像,圖片來源:Tutorial on Deep Generative Models

  5. 其他還有醫學、天文、...等應用,簡直無所不能(有點過頭了)。
    https://ithelp.ithome.com.tw/upload/images/20180107/20001976hxhZ1i6xtH.png
    圖. GAN 應用,圖片來源:Tutorial on Deep Generative Models

演算法說明

上述的遊戲概念實作成演算法的方式如下列圖說,資料及圖 大部分節錄自『NIPS 2016 tutorial』:

  1. 參考下圖,GAN的目標函數(即損失函數)就是紅色框框的數學式,是G與D的目標函數加總,其中G是生成模型(偽造者),D是判別模型(警察),兩者是零和遊戲,D要從生成的圖像判斷真偽,G是想盡辦法要呼巄 D,所以,G、D目標函數是反向(log(D(x))、log(1 - D(G(z))),z 是噪音(Noise),假設 z 是服從『均勻分配』(Uniform distribution) 或是『常態分配』(Normal distribution or Gaussian distribution),優化目標是使 G 的機率分配趨近於 D 的機率分配,也就是生成的圖像接近真實的圖像,求解的方法是用『最大似然估計』(Maximum likelihood Estimation,MLE)。
    https://ithelp.ithome.com.tw/upload/images/20180108/20001976JAHMmI2cT0.png
    圖. GAN 概念,圖片來源:Conditional GANs, StackGAN

  2. 生成模型(Generative Models)有很多種演算法,GAN是屬於其中的一種。
    https://ithelp.ithome.com.tw/upload/images/20180108/20001976IZxwBLVUMA.png

  3. 下圖左方是判別函數D,優化D(X),求逼近1的最佳解,右方是生成函數G,取亂數z(噪音)加到訓練資料中,優化D(G(z)),求逼近1的最佳解。

D(x)表示D網路判斷真實圖片是否真實的概率,對於D來說,這個值越接近1越好。
D(G(z))是D網路判斷G生成的圖片的是否真實的概率,對於D來說,這個值越接近0越好,對於G來說,這個值越接近1越好。

https://ithelp.ithome.com.tw/upload/images/20180107/20001976G3776GNbPr.png
圖. GAN Adversarial Nets Framework

  1. 演算法 psuedocode 如下圖,D(x)越高越好,D(G(z))越低越好。
    https://ithelp.ithome.com.tw/upload/images/20180108/20001976K65rVAuZqc.png
    圖. GAN 演算法 psuedocode,圖片來源:Generative Adversarial Nets

DCGAN 介紹

講了一大堆,接下來介紹一個簡單的範例 DCGAN,它是一個 GAN 變形,我們知道深度學習中對影像處理應用最好的模型是CNN(卷積神經網路),DCGAN 就是結合 CNN、GAN 的一種模型,可以做到以下效果:
輸入 『戴眼鏡的男人』- 『不戴眼鏡的男人』+ 『不戴眼鏡的女人』,可產生 『戴眼鏡的女人』,好像

  1. 『戴眼鏡的男人』- 『不戴眼鏡的男人』= 『眼鏡』
  2. 『眼鏡』+ 『不戴眼鏡的女人』= 『戴眼鏡的女人』
    當然沒有那麼神,它只是影像處理的效果而已。
    https://ithelp.ithome.com.tw/upload/images/20180107/20001976xJuP2YGjg4.png
    圖. DCGAN 演算法展示圖片,圖片來源:Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks

DCGAN主要是利用反卷積網路(Deconvolution network)反覆生成圖像,再將生成圖像放入 GAN 模型中執行,不斷訓練,最後產出真偽難辨的圖像。
https://ithelp.ithome.com.tw/upload/images/20180107/20001976ATQbQdv6cv.png
圖. 反卷積網路(Deconvolution network),圖片來源:NIPS 2016 tutorial

在『Day 06:卷積神經網路』,我們曾經介紹過,卷積網路(Convolution network)是逐步萃取圖形特徵,愈多層處理特徵會愈具體,反之,反卷積網路(Deconvolution network)會從特徵及權重反推回去,會得到具有特徵的圖像,請參考下圖。

https://ithelp.ithome.com.tw/upload/images/20180107/20001976cCKrjictAj.png
圖. 卷積網路(Convolution network)與反卷積網路(Deconvolution network),圖片來源:Image Segmentation

DCGAN 範例

GAN 需要運用大量的運算,執行都要非常久,以下範例我以 i7 加 GPU 執行,花了一個早上才跑完,結果只是執行一個『手寫阿拉伯數字的生成』而已,範例程式來自『DCGAN-tensorflow』,是以 TensorFlow 語言撰寫而成的,程式很長,我就不貼上了,只說明執行步驟及重要程式環節。

  1. 在 DOS 內執行下列指令,下載 MNIST 資料集,注意,在Windows環境執行會有錯,因為 DOS 沒有 gzip 指令,所以我把 download.py 第 165 行註解掉,自行解壓縮,放置到 .\data\mnist 資料夾下,檔名應為『t10k-images-idx3-ubyte、t10k-labels-idx1-ubyte、train-images-idx3-ubyte、train-labels-idx1-ubyte』,無附檔名。
    python download.py mnist

  2. 在 DOS 內執行下列指令,訓練模型:
    python main.py --dataset mnist --input_height=28 --output_height=28 --train

  3. 最終結果,產生的圖像檔在 samples 資料夾下,可以挑幾張看看成果,其實執行到第2輪就已經夠好了,第2輪的1067張比第25輪的效果還好。
    https://ithelp.ithome.com.tw/upload/images/20180107/200019765HFQxDSDIT.png
    圖. DCGAN-tensorflow 生成圖像,train_01_1006.png 表示 第2輪的1067張

  4. 主要的程式邏輯在 model.py 內,包括『判別函數』(discriminator)、『生成函數』(generator)、『雜訊取樣』(sampler,內含反卷積(deconv2d))、『模型建置』(build_model)等。

結語

『生成對抗網路』(Generative Adversarial Network,GAN)經由小量真實資料,產生大量的訓練資料,儼然是一個『非監督式』(Unsupervised)的模型,對照之前的CNN/RNN都是『監督式』(Supervised)的模型,必須仰賴大量的標註資料,是 Neural Network 的一大進展,另外,對於沒有資源可以投入標註資料的小公司,應該是一大福音,GAN 透過金庸小說『老頑童周伯通雙手互搏』類似的理念,雙手互相切磋(AlphaGo 好像也是這樣),一方面改善模型的準確度,另一方面也可以產生高品質的訓練資料,難怪相關論文成長量一飛沖天,期待未來能花更多的時間,徹底搞懂它。


上一篇
Day 27:音樂資訊檢索(Music Information Retrieval,MIR)
下一篇
Day 29:機器學習的資料處理生命週期
系列文
以100張圖理解 Neural Network -- 觀念與實踐31

尚未有邦友留言

立即登入留言