在 autoencoder 的模型裏面,會希望以一個 unsupervised 方法來做到特徵萃取的目的。

你也可以說他是一種降維的方法或是有損壓縮的方法。

基本上就是透過一個線性轉換將原來的特徵,映射到比較低維度的特徵空間上。

圖中就是一個基本的 autoencoder 的樣子,而中間的 hidden layer 就是我們希望的特徵萃取結果。

我們希望所萃取到的特徵,可以被 還原 成原本圖形的樣子。他就會是類似壓縮跟解壓縮的概念。

如果我們想看看他會壓縮成什麼樣子,我們可以將中間的 hidden layer 換成兩個 node 就好,如此一來,我們就可以將他視覺化。

問題

常常在訓練 autoencoder 之後,我們希望他的 decoder,也就是後半的部份,可以被拿出來作為一個獨立的 generative model 使用。例如,我可以把 MNIST 資料集當中的數字 1 的圖片輸入 encoder 會得到一個特徵向量 $\mathbf{z}$,相對,這個特徵向量 $\mathbf{z}$ 可以被放到 decoder 中還原回原本的數字 1 圖片,我們希望如果日後知道某個特徵向量 $\mathbf{z}$ 也可以用同樣的作法還原出他原本的樣子。

但往往行不通,在 $\mathbf{z}$ 上有些許的差異,就有可能產生很奇怪的結果。原因在於訓練資料通過 encoder 之後所產生的特徵向量的(流形)空間分佈,只有在訓練資料相對應的特徵向量分佈的附近才能產生出好的結果,離這些特徵向量太遠的是沒辦法產生好的結果,所以模型沒有看到過的資料就無法產生好的結果。

Variational autoencoder(VAE) 就是為了解決這樣的問題引進了 evidence lower bound(ELOB)的方法,並且將他改進成可用在 gradient-based method 上的模型。接下來會以兩種觀點切入講解,先講比較直觀的觀點。

直觀觀點

如果不在點附近的區域就無法產生合理的結果,我們可以去找出這些點是不是會呈現什麼樣的分佈,並且去得到這些分佈的參數。

如果是使用機率分佈的話,就可以減少空間上有 的情形發生,也就是比較不會有模型沒看過的資料的地方,導致產生的圖不合理的狀況。

在 VAE 中,假設特徵向量會呈現常態分佈,所以我們會去計算這個分佈的平均值 $\mu$ 與標準差 $\sigma$,每個 hidden layer 的 node 都有一個相對應的平均值與標準差向量。

相似的特徵向量會在空間分佈上在比較相近的位置,不同的特徵向量就各自形成各自的分佈情形。舉例來說,數字 1 的特徵向量會在空間分佈上比較接近,所以會形成一個分佈,跟數字 2 的分佈是不同的。如此一來,就可以用機率分佈的方式去涵蓋一些沒有被模型看過的資料。

但是這要怎麼接續後面的 decoder 呢?當我們知道分佈之後,我們可以從分佈中做抽樣阿!

既然是數字 1 的分佈,我就可以從這個分佈當中做抽樣,抽樣出來的向量應該要可以還原回原本的樣子。

我們就可以將 encoder 跟 decoder 一起做訓練了!

機率圖模型觀點

接下來會以比較抽象的觀點來說明。

隱含因素

我們的目標是想造出一個 generative model,這個 generative model 需要產出不同的結果($\mathbf{x}$),例如 MNIST 數字,而且我們會給一個 input($\mathbf{z}$)來決定要產生出什麼數字,這個 input 就是決定要產生出什麼數字的 因素,我們希望從模型自己去學出來。整體來說,他是一個 unsupervised 問題,我們只能從結果($\mathbf{x}$)去做回推這個 generative model($p(\mathbf{x}, \mathbf{z})$)的長相,並且試圖猜測 input($\mathbf{z}$)。

作者從貝氏定理出發,我們手上的資料只有 $\mathbf{x}$,想去求 $\mathbf{z}$,我們會假設資料產生的過程是個隨機過程,他牽涉到一個無法觀察的變數 $\mathbf{z}$。

$$
p_{\theta}(\mathbf{z} | \mathbf{x}) = \frac{p_{\theta}(\mathbf{x}, \mathbf{z})}{p_{\theta}(\mathbf{x})} = \frac{p_{\theta}(\mathbf{x} | \mathbf{z}) p_{\theta}(\mathbf{z})}{p_{\theta}(\mathbf{x})}
$$

這個過程包含了兩個部份:

  1. $p(\mathbf{z})$,$\mathbf{z}$ 是怎麼被產生的?
  2. $p(\mathbf{x} | \mathbf{z})$,$\mathbf{x}$ 是如何從 $\mathbf{z}$ 產生的?

難題

一般來說,使用貝氏定理會遇到一個難題,也就是需要知道分母怎麼估算,其中需要對 $\mathbf{z}$ 積分,那麼就需要知道所有的 $\mathbf{z}$ 排列組合,但是這是不可能的。

$$
p_{\theta}(\mathbf{x}) = \int p_{\theta}(\mathbf{x} | \mathbf{z}) p_{\theta}(\mathbf{z}) d\mathbf{z}
$$

目前貝氏的方法是用抽樣的方法(Markov chain Monte Calro)去估 $p_{\theta}(\mathbf{x})$,避開了直接去積分他。而且這樣的方法也太慢了,所以作者希望用 SGD 的方法來取代抽樣的方法。

Evidence lower bound

在這邊作者使用了 evidence lower bound(ELOB)的方法,既然要估 $p_{\theta}(\mathbf{x})$ 很困難,那麼我們直接去估 $p_{\theta}(\mathbf{z} | \mathbf{x})$ 如何?

那要怎麼估 $p_{\theta}(\mathbf{z} | \mathbf{x})$ 呢?如果直接算的話就是回到上面的方法,所以 ELOB 方法假設了另一個類似的 $q_{\phi}(\mathbf{z} | \mathbf{x})$ 來逼近 $p_{\theta}(\mathbf{z} | \mathbf{x})$。

要逼近 $p_{\theta}(\mathbf{z} | \mathbf{x})$,也就是要求兩個機率分佈的 KL divergence($D_{KL}[q_{\phi}(\mathbf{z} | \mathbf{x}) || p_{\theta}(\mathbf{z} | \mathbf{x})]$)愈小愈好。

架構

原本的問題就從左圖變成右圖,也就是以 $q_{\phi}(\mathbf{z} | \mathbf{x})$ 來逼近 $p_{\theta}(\mathbf{z} | \mathbf{x})$。$q_{\phi}(\mathbf{z} | \mathbf{x})$ 就是虛線箭頭的部份。

我們再把右圖當中的兩個箭頭拆開,$q_{\phi}(\mathbf{z} | \mathbf{x})$ 就是 encoder,而在

$$
p_{\theta}(\mathbf{z} | \mathbf{x}) = \frac{p_{\theta}(\mathbf{x} | \mathbf{z}) p_{\theta}(\mathbf{z})}{p_{\theta}(\mathbf{x})}
$$

當中的 $p_{\theta}(\mathbf{x} | \mathbf{z})$ 就是 decoder 的部份。Encoder 對應到實際神經網路模型中,則是一個 $\mathbf{z} = f(\mathbf{x})$ 函數,decoder 對應的是另一個函數 $\mathbf{x} = g(\mathbf{z})$。

我們可以把他轉換成這個樣子,這樣就形成了 autoencoder 的架構雛型了。

抽樣

回到前面的老問題,我們用一些資料通過 encoder 之後可以得到被壓縮的資料,而我們去估計出這些資料的機率分佈,我們要如何從這些機率分佈繼續往下計算呢?

是的!就是抽樣!我們會從這些機率分佈當中重新做抽樣,把他作為 decoder 的輸入,並且繼續做訓練。

但是在模型中間卡一個抽樣的動作,這個動作引進了機率這個不確定因素,這樣要怎麼做 gradient descent 呢?

Reparametrization trick

圖片來自 Tutorial on Variational Autoencoders

左圖就是原本的抽樣的模型。要讓模型可以進行 gradient descent,這時候作者做了重新參數化的技巧,這樣的技巧就如同將抽樣的動作抽離出來,就如同右圖那樣。

重新參數化技巧是從標準常態分佈當中去隨機抽樣,抽樣的結果將他乘上標準差,並且加上平均值,這樣就可以模擬從隱藏層的分佈抽樣的動作。但是這並非重新參數化技巧的巧妙之處,巧妙之處是在於重新參數化之後,就可以將抽樣這個動作從反向傳遞(backpropagation)的路徑上移除,這樣子我們就可以輕鬆的做訓練了!

將抽樣的動作從反向傳遞的路徑上移除,你可以將這樣的抽樣動作看成資料的一部份,也就是原本的資料上會多加一筆從標準常態分佈的抽樣數值。而資料不也是抽樣而來的嗎?其實兩者的概念是等價的。

結論

這個模型結合了 Variational inference 的技巧,並且以 reparametrization trick 來讓模型可以用 gradient descent。這是非常重大的突破,他也開啟了生成型模型的一條路。真的非常推荐大家讀讀這個模型!不過原論文有點難懂就是了…