很長的一段時間,人們覺得電腦雖然可以解決複雜的邏輯問題,但是沒有創造力。但是直到2014年GAN被提出來之後,AI似乎已經開始有了創造力:模仿梵谷作畫、畫出二次元美少女、為黑白照片上色…等等都陸續實現。這些看似離譜的黑科技都是基於GAN的生成技術。
這篇文章會分為以下幾個段落基本簡述GAN網路,且不會涉及數學公式:
- GAN的基本架構
- GAN的問題
- 圖片生成器的原理與性質
- Image Translation: 從照片到繪畫
- 無監督的圖片翻譯:CycleGAN
GAN的基本架構
GAN全名為Generative Adversarial Network,直譯為生成對抗網路,屬於生成模型(Generative Models)中的一種。生成模型是機器學習裡面的一個領域,目標是用來生成目前不存在的新數據,而GAN正是生成模型中其中一個廣為人知的方法。
GAN的基本架構如下圖所示,至少包含兩部分:生成器(Generator)與辨別器(Discriminator)。以圖片生成的GAN為例,生成器會負責生成圖片,由生成器生成的圖片樣本被稱為Fake Sample。相反的,直接從訓練集裡面抽取的訓練圖片樣本被稱為Real Sample。
辨別器的目標是區分一張圖是Real Sample還是Fake Sample;而生成器的目標是要騙過辨識器,讓辨識器以為Fake Sample是Real Sample。因為生成器與辨識器的目標是彼此對抗的,因此稱為對抗生成網路。
因為GAN的架構非常簡單,所以可拓展性也很強。除了圖像生成之外,音樂生成、文本生成、甚至影片生成都可以應用GAN的思想進去。而且GAN屬於無監督學習方法,訓練GAN只需要準備訓練資料而不需要任何標註。
訓練GAN
剛開始訓練時,生成器會產出類似雜音的圖,而辨別器可以很好的區分。但是隨著訓練久了之後,生成器的圖會越來越擬真,而辨別器會慢慢地下降精準度。以生成手寫數字(MNIST數據集)為例,如果把每次GAN的生成圖都記錄下來,看起來會像這張圖:
想要動手玩一玩的同學,可以參考TensorFlow的教學:
GAN的問題
GAN雖然看似萬能,但是其實GAN的訓練比一般的神經網路模型訓練還要困難,要Debug起來也是需要更多的知識背景。
Mode Collapse 模式崩壞
模式崩壞的意思就是生成器產出的圖片只存在很小的變化。這很容易理解,因為生成器的目標只是騙過辨別器,所以理論上生成器可以每次都產出「一種圖片」來試著騙過生成器。
下圖是生成「8」的模式崩壞情況。生成器隨機生成了100種「8」,但是其中有大量的8是長的完全一樣的。這就是模式崩壞的基本現象。
收斂失敗 Convergence Failure
訓練GAN網路需要同時優化生成器與辨別器。通常辨別器會比生成器要優化得快,但是當辨別器比生成器強太多的時候,生成器就會停止優化。
造成收斂失敗的原因大概不外乎以下幾種:兩種網路的能力設計不平衡、優化器(Optimizer)設置過強、辨別器的學習率過高。
辨別收斂失敗很簡單:當你的辨別器Loss很早就收斂到幾乎為0的時候。辨別器Loss歸0意味著辨別器可以100%的區分Real Sample與Fake Sample。同時,當生成器連「偶然」騙過辨別器都沒辦法的時候,生成器的學習就會完全停止。
無法評估訓練狀況
上圖是典型的GAN收斂情況,藍色的是辨別器,而綠色的是生成器。觀察上圖,隨著GAN的訓練步數增加,Loss卻沒有持續下降的趨勢。
在大部分的機器學習任務中,Loss越小表示訓練效果越好;但是在訓練GAN的時候卻不是這樣,因為GAN的Loss是生成器與辨別器兩者對抗的結果。就好比我們無法透過球賽的比分來評估比賽水準高低,生成器與辨別器互相對抗所產生的Loss也沒辦法直接對應生成的效果好壞。
因此在實作上,我們往往會在Loss裡面加入其他的指標來計算產生的效果,例如計算影像平滑度等等。目前還沒有一個很客觀的方法來決定何時可以停止GAN的學習,目前最好的方法還是依賴肉眼評估生成結果。
圖片生成器的原理與性質
其實機器學習的生成方法除了GAN之外還有其他流派,例如AE、VAE、Flow-based Generative Models等等。但是所有的流派都會考慮到生成的隨機性。如果沒有隨機性,所有生成網路都會陷入前面所講的Mode Collapse問題。
為了保證隨機性。生成器會以一組隨機向量作為輸入,通常用符號 z 表示。生成器會將向量 z 透過一連串的Transposed Convolution(轉置卷積)一層一層的擴增維度,最後變成一張圖。
在大部分的論文或學術文章中,z 被稱為Latent Variable,而包含 z 的高維空間被稱為Latent Space。 z 裡面的內容是不可解釋的,只有機器能夠理解;人類必需仰賴生成器解碼才能間接理解其中的數字含意。
有趣的是,Latent Variable是具有連續性與代數性的,我們可以透過操控Latent Variable來得到我們想要的輸出結果。比如說,我們可以控制由圖片A慢慢漸變至圖片B,也可以透過圖片A+圖片B→圖片C
關於這部分的詳細介紹,可以參考DCGAN的論文:Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks,同時附上一個TensorFlow的DCGAN GitHub:
Image Translation 從照片到繪畫
Image Translation(圖像翻譯)屬於機器學習任務的其中一個分類,目標是把圖片從領域A轉譯成領域B。比方說:季節變換、晝夜變換、性別轉換。而AI產生梵谷風格畫作的方式就是屬於Image Translation的一種,稱為Style Transfer。
為什麼不直接用GAN無中生有成梵谷風格的畫作呢?這是因為GAN難以控制生成的細節,所有可控制的變數都在Latent Variable裡面。而用Style Transfer的話,就可以提供一張照片作為參考,生成器只需要稍微變更風格,降低了生成難度,也提高了人為控制能力。
順便一題,去年抖音推出的漫畫濾鏡也是屬於Image Translation的任務。
無監督的圖片翻譯:CycleGAN
原本Image Translation有一個很大的問題就是配對訓練資料。一般翻譯任務需要準備成對的訓練資料,例如中英翻譯。但是在某些情況無法取得足夠的訓練數據,例如上千張梵谷的畫,而這是不可能的任務。
2017年,CycleGAN率先解決了這個問題。這個方法不需要準備成對的Data,而是為兩組訓練集準備分別兩組GAN,負責在兩種訓練及之間互相轉換。對於每個訓練樣本會經過兩次轉換:先轉換成另一個風格、再轉換回自己的風格,並且確保轉換回來的樣本與原始訓練樣本仍然足夠相似。
在損失函數的設計上,這個架構除了對抗損失(Adversarial Loss)之外還加入了循環一致損失(Cycle Consistency Loss),故名思議取名為CycleGAN。詳細的示意圖如下:
這個架構圖裡面看似沒有Latent Variable(z)的存在了,那生成器是怎麼運作的呢?在這裡生成器是直接輸入圖片,並且採用編碼-轉換-解碼的架構,如下圖:
如果直接從模型設計上看生成器架構,就只是一堆卷積層,沒辦法解釋其意義。但是從Latent Variable的含意來看就可以比較輕易的理解了:
- Encoding 編碼:把輸入轉換成Latent Variable的過程。
- Transformation 轉換:把Latent Variable從一個Latent Space轉換到另一個Latent Space。
- Decoding 解碼:把Latent Variable轉換成輸出的過程。純GAN中的生成器就是只有Decoder的架構。
有興趣的同學,可以看這篇ICCV17的報告。總共只有三分半。
最後附上GitHub:
小結
GAN是無監督學習裡面不可避免的一個領域,而且具有強大的能力跟想像空間。這篇文章不接觸數學公式,盡量透過各種論文的案例與示範來解釋GAN的各種現象,像是Mode Collapse, Latent Variable, Generator。最後介紹了Image Translation的題目定義與應用,並且大致圖解了CycleGAN的架構與原理。
最後點個題。雖然GAN能夠生成各種圖片,但是細看原理之後會發現其實這不代表AI取得了創造力,那些千變萬化的生成圖片其實都是來自於人為加入的隨機變數。所謂的AI只是在人類給予的架構跟訓練資料中盡力的去完成他們的數學任務而已。