如何使用變分自編碼器VAE生成動漫人物形象
變分自編碼器(VAE)與生成對抗網路(GAN)經常被相互比較,其中前者在圖像生成上的應用範圍遠窄於後者。VAE 是不是只能在 MNIST 數據集上生成有意義的輸出?在本文中,作者嘗試使用 VAE 自動生成動漫人物的頭像,並取得了不錯的結果。
以上是通過變分自編碼器生成的動畫圖片樣本。想要獲得本文在 Github 代碼倉庫中的相關代碼請點擊:https://github.com/wuga214/IMPLEMENTATION_Variational-Auto-Encoder
在圖像生成領域,人們總是喜歡試著將變分自編碼器(VAE)和對抗生成網路(GAN)相比較。人們的共識是,VAE 更容易被訓練,並且具有顯式的分布假設(高斯分布)用於顯式的表示和觀察,而 GAN 則能夠更好地捕獲觀測值的分布並且對觀測分布沒有任何的假設。結果就是,每個人都相信只有 GAN 能夠創造出清晰而生動的圖片。雖然可能確實是這樣,因為從理論上講,GAN 捕獲到了像素之間的相關性,但是沒有多少人試過用比 28*28 維的 MNIST 數據更大的圖片作為輸入訓練 VAE 來證明這一點。
在 MNIST 數據集上有太多變分自編碼器(VAE)的實現,但是很少有人在其他的數據集上做些不一樣的事情。這是因為最原始的變分自編碼器的論文僅僅只用 MNIST 數據集作為了一個例子嗎?
流言終結者!
現在,讓我們做一個「流言終結者」的實踐來看看 VAE 圖像生成器的效果是多麼不盡人意。例如,下面這些圖像。
模糊不清的 VAE 樣例。
我們從尋找一些 GAN 的對比組開始。我在 Google 上搜索了」GAN 應用程序」,並且發現了一個非常有趣的 Github 代碼倉庫,這個代碼倉庫總結了一些 GAN 應用程序:https://github.com/nashory/gans-awesome-applications
為什麼「GAN 應用程序」就可以呢?好吧,很難找到不是圖像生成的 GAN 應用程序,不是嗎?為了讓這個實踐更加令人興奮,我們這次將嘗試用生成模型輸出一些動漫形象!
首先,讓我們看看一個 GAN 模型完成這個任務的效果有多好。下面的兩組圖片來自於兩個做動漫圖片生成的項目,它們被很多人選擇並且以此為基礎開展工作:
1)https://github.com/jayleicn/animeGAN
2)https://github.com/tdrussell/IllustrationGAN
還不錯哦,不是嗎?我喜歡它們的色彩,它們和真實的圖片十分相似。
儘管這些圖片裡面有些重影,但它們看上去更好。我猜竅門是放大圖像,僅僅只看人臉。
結果表明,GAN 的優異表現令人印象深刻。這讓我倍感壓力。
額... 我們還應該繼續嗎...
從哪裡獲得數據?
很不幸,在網路上沒有可以得到的標準動漫形象數據集。但是這不能阻止像我這樣的人去尋找它。在瀏覽了一些 GitHub 代碼倉庫之後,我得到了一些提示:
一個叫做「Getchu」的日本網站有大量的動漫圖片。
需要一些工具從網上下載圖片,但是你需要自己找到這種工具。(我在這裡向你提供一個可能是不合法的)
有很多預訓練好的 U-net/ RCNN 動漫人臉檢測器,比如 lbpcascade_animeface,這樣一來你就可以將人臉提取成 64×64 的圖片。
變分自編碼器 VAE
本文假設你已經閱讀了大量關於變分自編碼器的帖子。如果你沒有的話,我想向你推薦下面這幾篇文章:
Intuitively Understanding Variational Autoencoders (https://towardsdatascience.com/intuitively-understanding-variational-autoencoders-1bfe67eb5daf)
Tutorial—What is a variational autoencoder? (https://jaan.io/what-is-variational-autoencoder-vae-tutorial/)
Introducing Variational Autoencoders (in Prose and Code) (http://blog.fastforwardlabs.com/2016/08/12/introducing-variational-autoencoders-in-prose-and.html)
在 TensorFlow 中對比兩大生成模型:VAE 與 GAN
所以,在你知道了什麼是 VAE 以及如何實現它之後,現在的問題就是「如果知道目標函數和實現方法就足夠去訓練一個變分自編碼器了嗎?」我認為答案是肯定的,但是它並不想通常說的那麼簡單。例如,這個目標函數來自哪裡的問題,以及 KL 散度分量在這裡有什麼作用。在這篇帖子中,我會試著去解釋 VAE 背後隱藏的奧秘。
變分推斷是一種在概率圖模型(PGM)中推斷複雜分布的技術。直觀地說,如果你不能很容易地捕獲複雜分布的最優點,你就可以用一些像高斯分布這樣的簡單分布來近似估計它的上界或者下界。例如,下圖展示了如何使用高斯分布近似估計局部最優解。
圖片來自:https://people.duke.edu/~ccc14/sta-663/EMAlgorithm.html
請忽略標題中的 EM(最大期望演算法)。這是一個在概率圖模型中經典的優化方法,它能夠更新變分下界,但是現在你在深度學習中會使用隨機梯度下降演算法(SGD)。
KL 散度是另外一個在概率圖模型中會用到的非常重要的技術。它用來測量兩個分布之間的差異。它不是一個距離度量,因為 KL[Q||P] 不等於 KL[P||Q]。下面的幻燈片展示了這種差異。
圖片來自:https://www.slideshare.net/Sabhaology/variational-inference
顯然,在 Q>0 時,KL[Q||P] 不允許 P=0. 換句話說,當最小化 KL[Q||P] 時,你想用 Q 分布來捕獲 P 分布的一些模式,但是你必然會忽略一些模式的風險。並且,在 P>0 時,KL[P||Q] 不允許 Q=0。換句話說,當最小化 KL[P||Q] 時,你想讓 Q 捕獲整個分布,而且如果有需要的話,完全忽略掉 P 的模式。
到目前為止,我們直觀地明白了兩個事實:
「變分」大致是對上界或者下界的近似。
「KL」衡量兩個分部之間的差異。
現在讓我們回過頭來看看 VAE 的目標函數是怎麼得來的。
這是我對 VAE 的推導。儘管它似乎與你可能在論文中看到的看起來不同,但這是我認為最容易理解的推導。
給定一些圖像作為訓練數據,我們想要擬合一些能夠儘可能準確地表示訓練數據的參數(theta)。正式一點說,我們想要擬合用於最大化觀測值的聯合概率的模型。因此,你會得到左邊的表達式。
「z」從何而來?
z 是創造觀測值(圖像)的潛在表示。直觀地說,我們假設一些神秘的畫家在數據集中創作這些圖像(x),我們將它們稱作 Z。並且,我們發現 Z 是不確定的,有時 1 號畫家創作了圖片,有時候是 2 號畫家創作了圖片。我們僅僅知道所有的藝術家都對他們所畫的圖片有著特別的偏愛。
大於等於號是怎麼來的?
Jensen 不等式如下所示。注意: log 是凹函數,所以在我們的例子中,不等式反過來的。
圖片來自 Youtube:https://www.youtube.com/watch?v=10xgmpG_uTs
為什麼在最後一行取近似?
我們不能對無窮的可能的 z 做幾分,所以我們使用數值逼近,這意味著我們從分布中進行抽樣來對期望取近似。
VAE 目標函數的兩個組成部分的意義
最小化 KL 項:將 P(z|x) 看作 N(0,1)(標準正態分布)。我們希望通過從標準正態分布中抽樣來生成圖像。因此,我們最好讓潛在的分布儘可能地接近標準正態分布。
最大限度地減小重構損失:創造儘可能生動/真實的圖像。最小化真實的圖像和生成的圖像之間的誤差。
很容易看到,為了使 VAE 很好的工作,平衡這兩個部分是十分關鍵的。
如果我們完全忽略 KL 項,變分自編碼器將收斂到標準的自編碼器,它將刪除目標函數中的隨機部分。因此,VAE 不能生成新的圖像,只能記住並且展示訓練數據(或者創造純粹的雜訊,因為在那個潛在的位置沒有編碼的圖像!)如果你足夠幸運的話,理想的結果是實現了核主成分分析!
如果我們完全忽略了重構項,那麼潛在的分布會退化成標準的正態分布。所以無論輸入是什麼,你總是得到類似的輸出。
一個 GAN 退化的案例。VAE 的情況也相同。圖片來自:http://yusuke-ujitoko.hatenablog.com/entry/2017/05/30/011900
現在我們明白了:
我們希望 VAE 生成合理的圖像,但是我們不想讓它顯示訓練數據。
我們想從標準正態分布中取樣,但是我們不想一次又一次地看到同樣的圖像。我們希望模型能產生差別非常大的圖像。
最後,如果我們上面做的事情都是正確的,是時候看看 VAE 的力量了。
成功了!
好吧,我承認,小圖片是沒有說服力的。
稍微放大一點...
結論
關於 VAE 只能生成模糊的圖片的流言是真實的,但是我仍然認為這是可以接受的。
如果你對這個實踐感興趣,可以試試這裡的代碼:https://github.com/wuga214/IMPLEMENTATION_Variational-Auto-Encoder
※22分鐘直衝Kaggle競賽第二名!一文教你做到
※如何理解KL散度的不對稱性?
TAG:機器之心 |