天天看點

綜述各種各樣的GAN:原理及功能GAN的基本原理GAN的變體

目錄

  • GAN的基本原理
    • GAN的損失函數
    • GAN的缺點
  • GAN的變體
    • DCGAN
    • CGAN(conditional GAN)
    • Wasserstein GAN
    • BEGAN
    • cycleGAN
    • discoGAN
    • StackGAN

GAN的基本原理

GAN全稱為Generative Adversarial Network,即生成對抗網絡。基本原理跟造假鈔犯罪集團和警察的關系一樣,生成器負責生成盡可能逼真的“假鈔”,而鑒别器要盡可能甄别出“真鈔”和“假鈔”,給出一個該樣本是真樣本的機率(0~1)。所謂道高一尺魔高一丈,兩者互相牽制,生成器生成的越來越真,鑒别器越來越難辨識真僞,最終達到以0.5機率辨識真僞的平衡态。

GAN的損失函數

在平衡态,是極大極小博弈的最優點,極大極小博弈中的目标函數是

min ⁡ G max ⁡ D V ( D , G ) = E x − p d a t a ( x ) [ log ⁡ D ( x ) ] + E z − p z ( z ) [ log ⁡ ( 1 − D ( G ( z ) ) ) ] \min_{G}\max_{D}V(D,G)=E_{x-p_{data}(x)}[\log D(x)]+E_{z-p_{z}(z)}[\log(1-D(G(z)))] Gmin​Dmax​V(D,G)=Ex−pdata​(x)​[logD(x)]+Ez−pz​(z)​[log(1−D(G(z)))]

公式看起來比較複雜,其實可以分為兩部分看。首先固定G,看maxD的部分,作為鑒别器,他要做的是要對所有服從真實資料分布pdata(x)的真樣本D(x)=1的判斷,對所有生成器生成的樣本給出D(G(z))=0的判斷,這使得V(D,G)最大化,這就是maxD的原因。同理,固定D,隻含有D的第一項可以删去,第二項中,生成器的生成樣本要盡可能真,即生成器保證D(G(z))盡可能大,即生成器期望第二項盡可能小,是以是minG。

GAN的缺點

  1. 難以訓練

    在訓練過程中,初始化對模型是否最終能收斂到納什均衡點來說很關鍵,因為這是一個高維非凸優化問題。在訓練過程中,為了保證模型收斂,在每個回合,應該先訓練判别器,再訓練生成器。大多數情形下,生成器的進度要比判别器慢。若發現判别器損失降為零,則模型訓練肯定是出現了問題。

  2. 模型坍塌問題

    指的是生成器開始單一重複地生成完全一緻的圖像。可以通過給判别器增加額外特征(批樣本之間的距離)來避免這一問題。

  3. 計數和角度問題

    如在人臉合成中,可能計算機會合成三隻眼睛的人臉,或者眼睛顔色不同的人臉,這樣的人臉在真實世界中不會存在,說明生成器學到的真實樣本分布并不全面。

GAN的變體

因為包含上述問題在内的多個問題的存在,GAN的訓練并不容易,往往需要很多技巧,是以許許多多GAN的變體也在提出。其中走進更多普通人眼裡的要數最近在網絡上大火的StyleGAN,每重新整理一下網頁,就能生成一副逼真的人臉,而現實世界中這個人臉卻是不存在的,讓不少網民大喊細思極恐。接下來讓我們看看GAN的經典變體。

DCGAN

Deep convolutional GAN(論文連結),生成器是一個上采樣的過程,也就是小數步長卷積,也就是反卷積(fractional strided convolution).鑒别器就是一個常見的卷積網絡。特征100維,圖像64643的RGB圖像。

主要的特點:

  1. 鑒别器中用步長卷積代替池化層(自學習空間下采樣),生成器中用小數步長卷積代替池化層(自學習空間上采樣)
  2. 生成器和鑒别器中使用批規範化(BN層)
  3. 消除全連接配接層,隻是用平均值池化(提高模型穩定性,損害收斂速度)
  4. 生成器輸出層使用tanh激活函數,其他層用relu;判别器均用leaky relu

關于什麼是反卷積,這篇部落格中運用矩陣與矩陣轉置的乘法,展示了卷積與反卷積的過程與關系。

這裡是可視化過程。

CGAN(conditional GAN)

論文連結

條件GAN是指定GAN生成器生成樣本的類别y,D(x)和G(x)變成了D(x,y)和G(x,y).目标函數變成

min ⁡ G max ⁡ D V ( D , G ) = E x − p d a t a ( x ) [ log ⁡ D ( x ) ] + E z − p z ( z ) [ log ⁡ ( 1 − D ( G ( z , y ) , y ) ) ] \min_{G}\max_{D}V(D,G)=E_{x-p_{data}(x)}[\log D(x)]+E_{z-p_{z}(z)}[\log(1-D(G(z,y),y))] Gmin​Dmax​V(D,G)=Ex−pdata​(x)​[logD(x)]+Ez−pz​(z)​[log(1−D(G(z,y),y))]

Wasserstein GAN

論文連結

損失函數

min ⁡ G max ⁡ D V ( D , G ) = E x − p d a t a ( x ) [ D ( x ) ] − E z − p g ( z ) [ D ( G ( z ) ) ] \min_{G}\max_{D}V(D,G)=E_{x-p_{data}(x)}[D(x)]-E_{z-p_{g}(z)}[D(G(z))] Gmin​Dmax​V(D,G)=Ex−pdata​(x)​[D(x)]−Ez−pg​(z)​[D(G(z))]

等式右側表達式又叫Wasserstein距離,這種度量分布的方式,相比傳統GAN中用的JS散度(交叉熵),極大緩解了模型坍塌問題。

BEGAN

論文連結

自帶自動編碼器,也就是說判别器是一個autoencoder的結構包括編碼器,解碼器,生成器與解碼器構造相同,但權重上有差别。(這與後期師兄推薦讀的ae+gan的一些組合論文思路很接近,好像隻是loss的設計上略有不同。began可能是ae和gan的首次組合使用。)

損失函數

L D = L ( x ) − k t L ( G ( z D ) )    f o r   θ D L G = L ( G ( z G ) )    f o r   θ G k t + 1 = k t + λ x ( γ L ( x ) − L ( G ( z G ) ) )    f o r   e a c h   t r a i n i n g   s t e p   t γ = E [ L ( G ( z ) ) ] E [ L ( x ) ] L = L D + L G L_{D}=L(x)-k_tL(G(z_D)) ~~for~\theta_D\\ L_{G}=L(G(z_G))~~for~\theta_G\\ k_{t+1}=k_t+\lambda_x(\gamma L(x)-L(G(z_G)))~~for~each~training~step~t\\ \gamma = \frac{E[L(G(z))]}{E[L(x)]}\\ L=L_{D}+L_{G} LD​=L(x)−kt​L(G(zD​))  for θD​LG​=L(G(zG​))  for θG​kt+1​=kt​+λx​(γL(x)−L(G(zG​)))  for each training step tγ=E[L(x)]E[L(G(z))]​L=LD​+LG​

權重γ的大小是模型生成圖檔的真實度與多樣性能力的調節。

模型允許在每一步同時以對抗方式訓練生成器和判别器。

損失函數裡面包括1)判别器最小化真實圖像的重構損失,2)判别器最大化生成圖像的重構損失,以及3)生成器最小化生成圖像的重構損失。

cycleGAN

論文連結

cycle consistent generative network,即循環一緻生成網絡。其核心思想是再沒有其它資訊輔助條件下,完成從原域到目标域的風格轉換。如灰階圖變RGB圖,斑馬變馬等。如何實作這樣的功能?需要有兩個轉換器F和G,其中F将圖像從域A轉為域B,G則相反。而且要保證對于域A中的圖像x,期望G(F(x))要與x相同,對另一個域中圖像的轉換亦然。DX和DY表示區分域A和域B圖像的判别器。損失函數:

L G A N ( G , D Y , X , Y ) = E y − p d a t a ( y ) [ log ⁡ D Y ( y ) ] + E x − p d a t a ( x ) [ log ⁡ ( 1 − D Y ( G ( x ) ) ) ] L c y c ( G , F ) = E x − p d a t a ( x ) [ ∣ ∣ F ( G ( x ) ) − x ∣ ∣ 1 ] + E y − p d a t a ( y ) [ ∣ ∣ G ( F ( y ) ) − y ∣ ∣ 1 ] L = L G A N ( G , D Y , X , Y ) + L G A N ( G , D X , Y , X ) + λ ∗ L c y c ( G , F ) L_{GAN}(G,D_Y,X,Y)=E_{y-p_{data}(y)}[\log D_Y(y)]+E_{x-p_{data}(x)}[\log(1-D_Y(G(x)))]\\ L_{cyc}(G,F)=E_{x-p_{data}(x)}[||F(G(x))-x||_1]+E_{y-p_{data}(y)}[||G(F(y))-y||_1]\\ L=L_{GAN}(G,D_Y,X,Y)+L_{GAN}(G,D_X,Y,X)+\lambda*L_{cyc}(G,F) LGAN​(G,DY​,X,Y)=Ey−pdata​(y)​[logDY​(y)]+Ex−pdata​(x)​[log(1−DY​(G(x)))]Lcyc​(G,F)=Ex−pdata​(x)​[∣∣F(G(x))−x∣∣1​]+Ey−pdata​(y)​[∣∣G(F(y))−y∣∣1​]L=LGAN​(G,DY​,X,Y)+LGAN​(G,DX​,Y,X)+λ∗Lcyc​(G,F)

discoGAN

論文連結

這裡的disco是discovery的縮寫,非彼迪斯科。旨在探索跨域的關系。個人感覺與cycleGAN非常像,也許是所有的GAN都是萬變不離其宗。此算法中包括兩組編碼器-解碼器對,或者說兩種autoencoder,但是隐變量是向其中的一個域映射。假設兩個域是A和B,那麼一組ae是完成從A到B再到A,另一組ae是完成從B到A再到B。假設DA和DB表示域A和域B上的判别器,A→B表示從域A圖像生成域B圖像的編碼或解碼器。對第一組ae,損失函數包括A→B→A的重構損失( L C O N S T A L_{CONST_A} LCONSTA​​),以及生成器A→B( L G A N B L_{GAN_B} LGANB​​)、判别器DB損失( L D B L_{D_B} LDB​​)。對第二組ae,損失函數包括B→A→B的重構損失以及生成器B→A、判别器DA損失。

L C O N S T A = d i s t ( G B A ( G A B ( x A ) ) , x A ) L G A N B = − E x A ∼ p A [ log ⁡ D B ( G A B ( x A ) ) ] L D B = − E x B ∼ p B [ log ⁡ D B ( x B ) ] − E x A ∼ p A [ log ⁡ ( 1 − D B ( G A B ( x A ) ) ) ] L G = L C O N S T A + L C O N S T B + L G A N A + L G A N B L D = L D A + L D B L_{CONST_A}=dist(G_{BA}(G_{AB}(x_A)),x_A)\\ L_{GAN_B}=-E_{x_A\sim p_A}[\log D_B(G_{AB}(x_A))]\\ L_{D_B}=-E_{x_B\sim p_B}[\log D_B(x_B)]-E_{x_A\sim p_A}[\log (1-D_B(G_{AB}(x_A)))]\\ L_G=L_{CONST_A}+L_{CONST_B}+L_{GAN_A}+L_{GAN_B}\\ L_D=L_{D_A}+L_{D_B} LCONSTA​​=dist(GBA​(GAB​(xA​)),xA​)LGANB​​=−ExA​∼pA​​[logDB​(GAB​(xA​))]LDB​​=−ExB​∼pB​​[logDB​(xB​)]−ExA​∼pA​​[log(1−DB​(GAB​(xA​)))]LG​=LCONSTA​​+LCONSTB​​+LGANA​​+LGANB​​LD​=LDA​​+LDB​​

StackGAN

論文連結

深度學習總希望網絡做得更深,網絡的層疊往往能達到更好的效果,stackGAN就是利用層疊的多個生成網絡實作從文本生成圖像。

StackGAN分為兩個stage,stage-Ⅰ生成器根據文本描述生成大緻物體輪廓和顔色等,stage-Ⅱ則在第一步的基礎上填充背景和細節等資訊,生成更逼真的圖像。

綜述各種各樣的GAN:原理及功能GAN的基本原理GAN的變體

總之,以上GAN的變種包含了從損失函數入手進行改進,優化真實樣本分布與生成樣本分布之間的距離度量,越來越多跨域,跨模态的GAN被提出。

開部落格以來,第一次走心的總結,第一次學習使用markdown語言。算是碌碌無為的寒假裡的一個小小小工作。這是篇概述,重點參考了《GAN:實戰生成對抗網絡,Kuntal

Ganguly著》這本書。其中GAN的諸多變種的原理也是一筆帶過,下一步還是結合實踐,閱讀經典原作,關于其他GAN的變體後續部落格可能會繼續寫一些。

繼續閱讀