今天要來介紹另一種generative model──variational auto-encoder (VAE) [1] 以及他的延伸 conditional variational auto-encoder (Conditional VAE) [2]
之前提到的generative adversarial nets (GAN) 是讓discriminator和generator透過互相競爭產生一個足夠好的generator來generate data
而VAE則是想透過機率模型模擬出data的distribution
新的data可以透過distribution sample得到

我們先來看看傳統的auto-encoder吧

auto_encoder

傳統的auto-encoder有兩個東西要學──encoder和decoder
通常我們用neural network來學encoder和decoder,並希望encoder和decoder滿足一些性質

data 可以透過encoder轉成一個latent vector
這個latent vector 可以想像成是data 的另一種表示方法
舉個動物圖片的例子來說,我們可以將各種動物的圖片透過encoder轉成latent vector
每個維度可以代表不同的意義,像是動物有幾隻腳,有沒有翅膀等等,當然可能會有更複雜的意義,要看encoder學成怎麼樣
用latent vector 來代替data 有一些好處,其中一個是我們可以讓latent vector 的維度比data 小很多,這樣用 代替 在很多運算上都會比較快速

而latent vector 可以透過decoder轉回data
為了確保latent vector 能夠完整的保存原本的data ,我們會希望data 透過encoder轉成latent vector 再透過decoder轉回的 能跟原本的 越像越好
這大致上就是傳統的auto-encoder

那麼auto-encoder有沒有辦法產生任意的data呢
一個簡單的想法是,我們隨意指定一個latent vector ,透過decoder將 轉成 就可產生一個新的data了
不過不幸地,這個想法產生的data效果並不好
舉剛剛動物圖片的例子,常常隨意指定的 所產生的圖片看起來並不像一個動物
最主要的原因是這樣學出來 的space其實非常的sparse,我們隨意指定的 不一定很有意義

variational auto-encoder (VAE) 剛好可以解決這個問題
我們現在換一種機率的觀點來看 之間的關係
假設真實世界的的data 是根據latent vector 產生的,而 則是根據某種distribution 產生的
換句話說,我們根據 sample出latent vector ,再根據 得到data
為了簡單起見,VAE的paper假設 是一個multivariate normal distribution

這時候我們回來看看剛剛auto-encoder的架構

prob_auto_encoder

有了data ,可以透過 得到 latent vector
如果我們能用neural network學一個distribution ,那麼這個network就可以看成是encoder
VAE的paper假設我們要學的encoder 是一個multivariate Gaussian
換句話說,對於data ,encoder 會output一個 的multivariate Gaussian distribution
有了這個distribution,我們就可以sample一個可能的的latent vector 並配合neural network學出 當做decoder
整個架構會像這樣

vae

在VAE的paper中,是用一個叫做variational inference的方法來學encoder
由於variational inference的數學式子比較複雜,以後有空再介紹,有興趣的人可以看這裡

一旦我們有了encoder和decoder,我們便可以從 sample出 ,再透過decoder產生新的data
這樣的機率模型解決了latent space太sparse的問題
我們來看看VAE根據不同的 產生出來的data長怎麼樣

vae_exp

這是VAE從一堆數字圖中所學出來的generative model,的確可以產生出新的數字圖
不過和GAN一樣,VAE並沒有辦法指定data的label
因此有人提出了VAE的延伸──conditional variational auto-encoder (Conditional VAE)
延伸的方法和Conditional GAN一樣,將encoder和decoder的input多給一個label的資訊
架構如下

conditional_vae

如此一來我們就可以指定產生data的label

conditional_vae_exp1

在Conditional VAE的paper中還有一個有趣的實驗

conditional_vae_exp2

上圖中,最左一欄的數字是真的data
將這些真的data透過encoder可以得到對應的latent vector
右邊的0~9則是這些latent vector在decode時input設成不同label的結果
結果非常有趣,不管latent vector是從哪個數字得到的,decode出來的數字都會是decoder的input label,差別只在於字形的不同

以上大致上就是VAE以及Conditional VAE的介紹

Reference

  1. D. P. Kingma and M.Welling. “Auto-encoding variational bayes.” Preprint arXiv:1312.6114, 2013.
  2. D. P. Kingma, S. Mohamed, D. J. Rezende, and M. Welling. “Semi-supervised learning with deep generative models.” NIPS, 2014.
  3. http://wiseodd.github.io/techblog/2016/12/17/conditional-vae/
  4. http://zhuanlan.zhihu.com/p/22464760
  5. http://www.cnblogs.com/wangxiaocvpr/p/6231019.html
  6. http://kvfrans.com/variational-autoencoders-explained/