在一些比較經典的GAN模型中(像WGAN、LSGAN、DCGAN等等),往往都是從樣本空間裏隨機採樣得到輸入噪聲,生成的圖像究竟屬於哪一個類別也是隨機的。通過這些模型,我們無法生成指定類別的數據。
舉個不恰當的例子:在解放前夕,我們的目標就是填飽肚子,喫嘛嘛香;隨着經濟社會的不斷髮展和祖國的繁榮昌盛,我們變得越來越挑剔,比如今天只想喫波士頓龍蝦,明天只想喫澳洲大螃蟹… GAN的發展也是一樣,早期我們只關注GAN否生成清晰度高、類別豐富的圖像數據,但是發展到一定的程度,我們就希望模型能夠按照我們的要求生成出指定類別的數據。同時也可以一定程度上解決GAN訓練太自由,以至於在一些複雜數據集上不穩定的弊病。
於是在早些時候,有兩種比較經典的模型CGAN和InfoGAN,都可以生成指定模式的數據。下面對兩種模型分別做一下簡介。
CGAN
CGAN(Conditional GAN)模型是有監督的,即利用了數據集中的標籤信息。在傳統GAN中,Discriminator的打分非常簡單粗暴,生成的圖像比較真實打高分,比較模糊的打低分。但是當引入了標籤信息以後,打分規則需要變得更加嚴格。也就是說,模糊的圖像還是打低分;但是在清晰真實的生成圖像中,如果該圖像與他的標籤不匹配,也是需要打低分的。
CGAN的結構與傳統的GAN非常相似,其模型如下圖所示:
根據上面的模型圖,CGAN引入標籤 的方法也非常直接,就是在Generator和Discriminator的輸入層,加上一個額外的one-hot向量,也就是圖像的標籤信息。因此,整個優化目標就變爲:
根據公式可以看出,Generator和Discriminator都改造成了條件概率的形式,即在給定標籤向量 的條件下進行計算。因此,可以看作是每一個類別 都對應一個隸屬於自己的目標函數。有了這個約束,假如生成了清晰但是類別與標籤不匹配的圖像,也會當做fake來進行打分。因此可以通過調整標籤的值,來改變生成數據的類別。
InfoGAN
相對於CGAN來說,InfoGAN是通過無監督學習來得到一些潛在的特徵表示,這些潛在的特徵就包括數據的類別。如果現在有一個數據集,裏面的數據沒有標籤信息,但仍存在潛在的類別差異,此時InfoGAN就可以提供一種無監督的方法,來辨別出數據中潛在的類別差異,並且可以通過控制潛在編碼 latent code 來生成指定類別的數據。
舉個不恰當的栗子,現在擺在我面前有一卡車美食,但是我並不知道他們是什麼(沒有標籤),只知道這些都是食物。現在我喫到一個帶殼的、兩個鉗兩條腿的、味道鮮美的東西,特別好恰,但由於沒有(澳洲大螃蟹)這個標籤,所以無法通過CGAN去得到它。但是呢,雖然有一卡車的美食,且沒有標籤信息區分他們的類別,但很顯然他們是有潛在的類別區分的,螃蟹和狗不理包子就是不一樣…因此這時候通過無監督的InfoGAN,即使是在沒有標籤信息的指導下,也可以學習到樣本中潛在的類別差異,從而可以生成鮮美可口的澳洲大螃蟹。
InfoGAN 將 Generator 的輸入拆分成兩個部分,一部分是 latent code,一般記作 ,另一部分和傳統 GAN 的輸入一樣,是一個噪聲向量 。其中, 通常包括兩個部分,一部分是離散的,一部分是連續的。這個latent code是可以服從於某種分佈的。對於MNIST數據集來說,離散的部分可以服從一個多項分佈(Multinomial Distribution),取值空間是0-9內的隨機數字;連續的部分可以服從某個連續的分佈(如均勻分佈、正態分佈),每一個維度代表着某種潛在的數據特徵(如筆畫的粗細、傾斜程度等)。
InfoGAN的精髓在於,在原始GAN的基礎上,加入 latent code 與 生成數據 之間的互信息作爲約束,使兩者之間產生一定的關聯。因爲隱變量 攜帶着某種可以解釋生成數據 的信息。如果兩者的相關性強,那麼 與 之間的互信息 就比較大(互信息簡而言之,是描述兩個隨機變量相關程度的一種度量)。所以InfoGAN的優化目標可以改寫爲:
但是這個互信息 並不能直接計算,因爲:
上式中隱變量的後驗 是無法得到的,所以這裏採取變分推斷,利用一個可控的輔助分佈 來近似這個無法得到的後驗概率 ,於是互信息可以進一步寫爲:
由於KL散度非負,這裏將極大化互信息的問題,轉化爲極大化互信息的下界,令:
這裏又發現一個問題, 我們還是不知道,所以作者在論文中證明了一個引理,即:
通過上述引理,可將互信息下界 改寫爲:
這裏感興趣的話可以證明一下。通過這個轉換,避免了從隱變量後驗分佈中進行採樣,因此可以直接通過蒙特卡洛進行採樣即可。因此最終的優化目標爲:
InfoGAN的理論到這裏就差不多了,下面淺談一下實驗環節。
Github上看過幾個實驗,也跑通了程序,基本思路大致是:假設是在MNIST上訓練,輸入的向量分爲三個部分,10維的離散特徵(服從多項分佈),2維的連續特徵(可以服從(-1,1)均勻分佈),62維的噪聲(後面兩個維度都可以更改)。分別對三者進行採樣,然後進行拼接組成輸入向量,通過Generator生成圖像。和傳統的GAN一樣,對Generator和Discriminator進行辨別圖像真假的訓練。
不同的是,InfoGAN需要加入互信息的約束。在這裏引入一個額外的網絡Q,該網絡除最後一層以外都與鑑別器D共享權值(D和Q只有最後一層全連接不一樣,D最後的維度是1,而Q最後是離散特徵和連續特徵個數的總和,上例中是10+2)。
這樣一來,生成器G與額外引進的網絡Q,兩者一起相當於構成了一個AutoEncoder。首先通過G,將一些潛在特徵編碼到生成圖像中,再通過Q進行解碼得到 latent code,這種“特徵-數據-特徵”的 AutoEncoder,雖然與傳統意義的“數據-特徵-數據”的 AutoEncoder 相反,但也可以通過 Reconstruction Error 來進行約束。因爲通過重構誤差就可以知道生成圖像中究竟攜帶了多少 的特徵,如果在 encoder 過程中失去了輸入的特徵,那麼在 decode 以後也不會得到相近的 latent code。
所以,通過連續部分和離散部分的重構誤差的加權和,就可以間接估計 latent code 與生成數據之間的互信息。
還有的實現代碼是從分佈的角度進行描述,假設 的連續部分服從標準正態分佈 ,通過 Q(x) 得到的是高斯分佈的均值和方差,通過讓 Q(x) 得到的均值和方差向 Standard Normal Distribution 靠攏,來實現互信息的約束。
上面的兩種方法都以一個共性,就是把 InfoGAN 的網絡架構看作“傳統GAN + AutoEncoder”,其中 G 和 Q 組成的自動編碼器勝任了互信息的約束。AutoEncoder 屬於無監督學習模型,因此通過InfoGAN就可以無監督的學習到潛在的類別特徵及一些其他可解釋性的特徵。
剛接觸InfoGAN,學識尚淺,如有不當之處,還望交流指正。
參考:
https://www.jiqizhixin.com/articles/2018-10-29-21
https://blog.csdn.net/u011699990/article/details/71599067