CGAN和InfoGAN理解

在一些比較經典的GAN模型中(像WGAN、LSGAN、DCGAN等等),往往都是從樣本空間裏隨機採樣得到輸入噪聲,生成的圖像究竟屬於哪一個類別也是隨機的。通過這些模型,我們無法生成指定類別的數據。

舉個不恰當的例子:在解放前夕,我們的目標就是填飽肚子,喫嘛嘛香;隨着經濟社會的不斷髮展和祖國的繁榮昌盛,我們變得越來越挑剔,比如今天只想喫波士頓龍蝦,明天只想喫澳洲大螃蟹… GAN的發展也是一樣,早期我們只關注GAN否生成清晰度高、類別豐富的圖像數據,但是發展到一定的程度,我們就希望模型能夠按照我們的要求生成出指定類別的數據。同時也可以一定程度上解決GAN訓練太自由,以至於在一些複雜數據集上不穩定的弊病。

於是在早些時候,有兩種比較經典的模型CGAN和InfoGAN,都可以生成指定模式的數據。下面對兩種模型分別做一下簡介。

CGAN

CGAN(Conditional GAN)模型是有監督的,即利用了數據集中的標籤信息。在傳統GAN中,Discriminator的打分非常簡單粗暴,生成的圖像比較真實打高分,比較模糊的打低分。但是當引入了標籤信息以後,打分規則需要變得更加嚴格。也就是說,模糊的圖像還是打低分;但是在清晰真實的生成圖像中,如果該圖像與他的標籤不匹配,也是需要打低分的。

CGAN的結構與傳統的GAN非常相似,其模型如下圖所示:

在這裏插入圖片描述

根據上面的模型圖,CGAN引入標籤 yy 的方法也非常直接,就是在Generator和Discriminator的輸入層,加上一個額外的one-hot向量,也就是圖像的標籤信息。因此,整個優化目標就變爲:

V(G,D)=ExPdata[log(D(xy))]+EzPz[1log(D(G(zy)))]V(G,D)=E_{x \sim P_{data}}[log(D(x|y))]+E_{z \sim P_{z}}[1-log(D(G(z|y)))]

根據公式可以看出,Generator和Discriminator都改造成了條件概率的形式,即在給定標籤向量 yy 的條件下進行計算。因此,可以看作是每一個類別 yy 都對應一個隸屬於自己的目標函數。有了這個約束,假如生成了清晰但是類別與標籤不匹配的圖像,也會當做fake來進行打分。因此可以通過調整標籤的值,來改變生成數據的類別。

InfoGAN

相對於CGAN來說,InfoGAN是通過無監督學習來得到一些潛在的特徵表示,這些潛在的特徵就包括數據的類別。如果現在有一個數據集,裏面的數據沒有標籤信息,但仍存在潛在的類別差異,此時InfoGAN就可以提供一種無監督的方法,來辨別出數據中潛在的類別差異,並且可以通過控制潛在編碼 latent code 來生成指定類別的數據。

舉個不恰當的栗子,現在擺在我面前有一卡車美食,但是我並不知道他們是什麼(沒有標籤),只知道這些都是食物。現在我喫到一個帶殼的、兩個鉗兩條腿的、味道鮮美的東西,特別好恰,但由於沒有(澳洲大螃蟹)這個標籤,所以無法通過CGAN去得到它。但是呢,雖然有一卡車的美食,且沒有標籤信息區分他們的類別,但很顯然他們是有潛在的類別區分的,螃蟹和狗不理包子就是不一樣…因此這時候通過無監督的InfoGAN,即使是在沒有標籤信息的指導下,也可以學習到樣本中潛在的類別差異,從而可以生成鮮美可口的澳洲大螃蟹。

在這裏插入圖片描述

InfoGAN 將 Generator 的輸入拆分成兩個部分,一部分是 latent code,一般記作 cc,另一部分和傳統 GAN 的輸入一樣,是一個噪聲向量 zz。其中,cc 通常包括兩個部分,一部分是離散的,一部分是連續的。這個latent code是可以服從於某種分佈的。對於MNIST數據集來說,離散的部分可以服從一個多項分佈(Multinomial Distribution),取值空間是0-9內的隨機數字;連續的部分可以服從某個連續的分佈(如均勻分佈、正態分佈),每一個維度代表着某種潛在的數據特徵(如筆畫的粗細、傾斜程度等)。

InfoGAN的精髓在於,在原始GAN的基礎上,加入 latent code生成數據 之間的互信息作爲約束,使兩者之間產生一定的關聯。因爲隱變量 cc 攜帶着某種可以解釋生成數據 G(z,c)G(z,c) 的信息。如果兩者的相關性強,那麼 ccG(z,c)G(z,c) 之間的互信息 I(c;G(z,c))I(c;G(z,c)) 就比較大(互信息簡而言之,是描述兩個隨機變量相關程度的一種度量)。所以InfoGAN的優化目標可以改寫爲:

minGmaxDVI(G,D)=V(G,D)λI(c;G(z,c))min_{G}max_{D}V_{I}(G,D)=V(G,D)-\lambda I(c;G(z,c))

但是這個互信息 I(c;G(z,c))I(c;G(z,c)) 並不能直接計算,因爲:

I(c;G(z,c))=H(c)H(cG(z,c))=H(c)+ExG(z,c)[EcP(cx)[logP(cx)]]I(c;G(z,c))=H(c)-H(c|G(z,c))=H(c)+E_{x \sim G(z,c)} [E_{c' \sim P(c|x)}[logP(c'|x)]]

上式中隱變量的後驗 P(cx)P(c|x) 是無法得到的,所以這裏採取變分推斷,利用一個可控的輔助分佈 Q(cx)Q(c|x) 來近似這個無法得到的後驗概率 P(cx)P(c|x),於是互信息可以進一步寫爲:

I(c;G(z,c))=H(c)+ExG(z,c)[EcP(cx)[logP(cx)Q(cx)Q(cx)]]I(c;G(z,c))=H(c)+E_{x \sim G(z,c)} [E_{c' \sim P(c|x)}[log\frac{P(c'|x)}{Q(c'|x)}Q(c'|x)]]

=H(c)+ExG(z,c)[EcP(cx)[logP(cx)Q(cx)+logQ(cx)]]=H(c)+E_{x \sim G(z,c)} [E_{c' \sim P(c|x)}[log\frac{P(c'|x)}{Q(c'|x)}+logQ(c'|x)]]

=H(c)+ExG(z,c)[KL(P(x)Q(x))+EcP(cx)logQ(cx)]]=H(c)+E_{x \sim G(z,c)} [KL(P(\cdot|x)||Q(\cdot|x))+E_{c' \sim P(c|x)}logQ(c'|x)]]

H(c)+ExG(z,c)[EcP(cx)logQ(cx)]]\geq H(c)+E_{x \sim G(z,c)} [E_{c' \sim P(c|x)}logQ(c'|x)]]

由於KL散度非負,這裏將極大化互信息的問題,轉化爲極大化互信息的下界,令:

L1(G,Q)=H(c)+ExG(z,c)[EcP(cx)logQ(cx)]]L_{1}(G,Q) = H(c)+E_{x \sim G(z,c)} [E_{c' \sim P(c|x)}logQ(c'|x)]]

這裏又發現一個問題,P(cx)P(c|x) 我們還是不知道,所以作者在論文中證明了一個引理,即:
$$$$
通過上述引理,可將互信息下界 L1(G,D)L_{1}(G,D)改寫爲:

L1(G,Q)=H(c)+EcP(c),xG(z,c)[logQ(cx)]L_{1}(G,Q) = H(c)+E_{c \sim P(c), x \sim G(z,c)} [logQ(c|x)]

這裏感興趣的話可以證明一下。通過這個轉換,避免了從隱變量後驗分佈中進行採樣,因此可以直接通過蒙特卡洛進行採樣即可。因此最終的優化目標爲:

minGmaxDVI(G,D,Q)=V(G,D)λI(G;Q)min_{G}max_{D}V_{I}(G,D,Q)=V(G,D)-\lambda I(G;Q)

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 來進行約束。因爲通過重構誤差就可以知道生成圖像中究竟攜帶了多少 cc 的特徵,如果在 encoder 過程中失去了輸入的特徵,那麼在 decode 以後也不會得到相近的 latent code。

所以,通過連續部分和離散部分的重構誤差的加權和,就可以間接估計 latent code 與生成數據之間的互信息。

還有的實現代碼是從分佈的角度進行描述,假設 cc 的連續部分服從標準正態分佈 N(0,I)N(0,I),通過 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章