CVAE-GAN:Fine-Grained Image Generation through Asymmetric Training
在幾年前,深度神經網絡的熱門話題是分類問題:
給定一張圖 x,神經網絡可以告訴你其中是什么內容,或者說屬于什么類別 c。
而近年來,深度神經網絡的熱門話題是生成模型,它想做的事情相反:
給定一個類別 c,神經網絡就可以無窮無盡地自動生成真實而多變的此類別的圖像 x。
這無疑聽上去更神奇,也更困難。這里介紹的 CVAE-GAN 方法,其論文是Fine-Grained Image Generation through Asymmetric Training?,它可以在各個數據集上生成目前綜合效果最好的結果:
請注意,以上的圖像都是神經網絡根據少量參考圖,憑空想象出來的全新圖片。而且它可以無窮無盡地自動生成下去,例如包括各種角度,表情,而且會在此過程中不斷進步(簡直正如 AlphaGo 可以無窮無盡地左右互搏)。
在人臉數據集上,效果已經好得驚人,栩栩如生。而在其它數據集上,雖然看似還有瑕疵,但這可能已經只是因為參考圖的數量不夠多(正如最近的[1707.02968] Revisiting Unreasonable Effectiveness of Data in Deep Learning Era?所述,目前的瓶頸可能已經在于數據,而非模型。文中發現,采用3億張訓練圖片作預訓練后,所有模型的效果都可以得到明顯提升。而且看上去3億張訓練圖片也沒有“喂飽”神經網絡,依舊會發現訓練圖片越多效果越好)。
我們將會看到,CVAE-GAN 的思想實際簡單而直接。它有四大組件,對應到四個神經網絡,互為補充,互相促進(這是否又讓我們想起 AlphaGo?是的,多個神經網絡協同組合,確實會有驚人的威力。而且其實還有更多的相似之處,因為它們最終都屬于博弈問題)。
1. 生成模型的派別:VAE 和 GAN
在最近幾年,生成模型分為 VAE 和 GAN 兩條路(其實還有一條值得繼續的路是 PixelCNN/RNN,另外我可能還有個不一樣的路子...)。十分有趣的是,它們擁有互補的長處和短處:
以上都加上了類別作為輸入,所以稱之為 CVAE 和 CGAN。直觀地看:
? CVAE 生成的圖像很中規中矩,但是模糊。
? CGAN 生成的圖像清晰,但是喜歡亂來。
所以剛好是互補。這其實來自于它們各自的構造。首先,在構造生成模型時,人們漸漸發現,最常用的是下面四個網絡:
? E:編碼器 Encoder。給定一張圖 x,可以將其編碼為隱變量 z(且希望滿足高斯分布)。如果還給定了類別 c,那么生成的隱變量就會質量更高(更隨機)。
? G:生成器 Generator。給定隱變量 z(如隨機噪聲),就可以生成像模像樣的圖像。如果還給定了類別 c,那么就會生成像模像樣的屬于類別 c 的圖像。
? C:分類器 Classifier。給定一張圖 x,輸出所屬類別 c。這是大家的老朋友。
? D:辨別器 Discriminator。給定一張圖 x,判斷它是真實的圖片,還是“電腦亂想出來的”。這是 GAN 首先引入的網絡,它可以和 G 左右互搏,互相進步。
那么,CVAE 是這樣的:
它來自于經典的自編碼器 AE,其實 E 有點類似于人腦把圖片變成文字描述的過程,z 就類似于文字描述,然后 G 試圖按 z 的描述還原圖片。VAE 的目標是, x' 接近 x,同時 z 接近高斯分布(這樣我們可以很容易地構造大量 z,從而生成大量 x')。
為什么 VAE 生成的圖像會模糊?如圖,可以真的很模糊:
最重要的原因是,它不容易找到合理的判斷 “x' 接近 x” 的標準,只能用 MSE 之類的粗略誤差。
而 CGAN 是這樣的:
也是有個 G(其實和之前的 VAE 的 G 類似,只是由于優化的目標不同,所以生成的圖像的特點不同),目標是從 z 生成盡量真實的 x',而且我們還再做了一個網絡 D,用于判斷“真實度”。
D 的做法很暴力,就是一直認為 x 是真的,x' 是假的,并以此訓練自己。而 G 的目標當然就是盡量騙過 D,做法也很暴力,直接把 D 的輸入梯度信息拿出來用于訓練自己,盡量生成“最能騙過 D 的圖像”。其實就像之前大家構造能騙過神經網絡 C 的圖片一樣,直接用輸入的梯度。
隨著 G 和 D 的互相斗爭,最終大家達成 Nash 均衡,生成的 x' 也就比較真實了。
為什么 GAN 生成的圖像喜歡亂來?我認為,原因之一是 D 的能力不夠,是因為 D 看過的樣本太單調(要么是固定的原始樣本,要么都是 G 生成的),所以辨別能力容易存在盲區,而 G 是發現空子就去鉆,所以就容易亂來了。
原因之二是 G 的鉆空子太暴力。比如說,如果 G 學會了每次都生成一模一樣的和訓練集中某個圖像一模一樣的圖?或者一個固定的特別容易騙過 D 的圖?那 D 就分辨不出來了,但生成這樣的圖片當然也沒有意義了。這其實就是個常見的問題,叫做模式的坍塌,就像下圖:
而之前 VAE 的 G 是不會犯這種錯誤,因為它必須有足夠的生成能力,對于訓練集中每個圖片,它都需要有能力生成相似的圖片。
其實,某種意義上,AlphaGo 的策略網絡類似于 G(試圖一步步生成“完美的神之棋局”),AlphaGo 的價值網絡類似于 D(如果勝率在走了某步之后倒向一方,就說明棋局不夠完美)。
2. 取長補短,E+G+C+D = CVAE-GAN
看 CVAE-GAN 的結構圖:
首先,之前說過了,VAE 的 G 比 GAN 的 G 更有前途,所以前面是 VAE 的結構。
然后,由于 VAE 的判斷 x' 和 x 相似的標準不夠好,所以要再加入 D 來判斷。
最后,我們還得真的保證生成的圖像是屬于 c 類別,所以還要加上 C。
所以 G 的 Loss 其實有三大部分:
? 對于從 x 生成的 z,G 應該更還原出接近 x 的 x' (像素上的接近)。稱為 L_G(img)。
? G 生成的圖像應該可以由 C 鑒別為屬于 c。稱為 L_G(C)。
? G 生成的圖像應該可以由 D 鑒別為屬于真實圖像。稱為 L_G(D)。
這三者都很重要。舉例,原始圖像 x:
CVAE-GAN 的復原 x',與 x 接近,只是少了皺紋之類的噪音,這也說明 D 對于皺紋是不在意的,它認為皺紋不是判斷“真實性”的標準,也許沒皺紋還會更“真實”:
如果我們去掉 D,馬上就模糊了:
如果我們去掉 C,那么 artifact 就多了:
如果我們去掉 img,那么就容易亂來了:
最終的隱變量 z 可以相當好地自動刻畫圖片:
編碼轉移,給定左邊的照片,要求網絡更換其中的明星,生成的是右邊的圖:
插值效果,給定左右兩張圖片,可以生成“中間的漸變過程”:
自動填充缺失區域的效果(左邊的原始圖片都是網絡從來沒有見過的全新圖片):
由于網絡生成的樣本質量很高,還可以用于增強訓練樣本集,使其它模型得到更好的效果:
最后,CVAE-GAN 的詳細架構如圖:
CVAE-GAN 的訓練算法如圖,其中的每一項都是很直觀的。注意里面還用了一個重要 trick,就是希望 x' 和 x 在 D 和 C 的網絡的中間層的特征也相似。這有助于穩定網絡:
3. 總結
通過使用 E+G+C+D 四大網絡, CVAE-GAN 實現了相當令人滿意的生成模型。目前的 GAN 變種非常多,大家都是把 E G C D 到處串起來,不過一般只用到三個,很少有用到四個的。本來我想試把四個都串起來,然后發現 CVAE-GAN 已經做了,效果也確實好。
最近還有一篇 Triple GAN?https://arxiv.org/pdf/1703.02291.pdf類似,但它沒有用 VAE 作為前端,少了 E 網絡,所以效果會不如。而 CycleGAN DualGAN DiscoGAN 等等把網絡串起來的方式,無疑可以與 CVAE-GAN 結合,進一步提升效果。相信 U-NET PatchGAN 等等 trick 也可以進一步提升效果。
總結
以上是生活随笔為你收集整理的CVAE-GAN:Fine-Grained Image Generation through Asymmetric Training的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【有利可图网】PS实战系列:巧用PS设计
- 下一篇: 用迅捷CAD编辑器怎么更改文字样式