前段時間公司組織技術分享,輪到筆者時,大家希望我講講VAE。鑑於之前筆者也寫過變分自編碼器系列,所以對筆者來說應該也不是特別難的事情,因此就答應了下來,後來仔細一想才覺得犯難:怎麼講才好呢?
對於VAE來說,之前筆者有兩篇比較系統的介紹:《變分自編碼器(一):原來是這麼一回事》和《變分自編碼器(二):從貝葉斯觀點出發》。後者是純機率推導,對於不做理論研究的人來說其實沒什麼意義,也不一定能看得懂;前者雖然顯淺一點,但也不妥,因為它是從生成模型的角度來講的,並沒有說清楚“為什麼需要VAE”(說白了,VAE可以帶來生成模型,但是VAE並不一定就為了生成模型),整體風格也不是特別友好。
筆者想了想,對於大多數不瞭解但是想用VAE的讀者來說,他們應該只希望大概瞭解VAE的形式,然後想要知道“VAE有什麼作用”、“VAE相比AE有什麼區別”、“什麼場景下需要VAE”等問題的答案,對於這種需求,上面兩篇文章都無法很好地滿足。於是筆者嘗試構思了VAE的一種幾何圖景,試圖從幾何角度來描繪VAE的關鍵特性,在此也跟大家分享一下。
自編碼器 #
我們從自編碼器(AutoEncoder,AE)出發。自編碼器的初衷是為了資料降維,假設原始特徵$x$維度過高,那麼我們希望透過編碼器$E$將其編碼成低維特徵向量$z=E(x)$,編碼的原則是儘可能保留原始資訊,因此我們再訓練一個解碼器$D$,希望能透過$z$重構原始資訊,即$x\approx D(E(x))$,其最佳化目標一般是
\begin{equation}E,D = \mathop{\arg\min}_{E,D}\mathbb{E}_{x\sim \mathcal{D}}\big[\Vert x - D(E(x))\Vert^2\big]\end{equation}
對應的示意圖如下:
編碼空間 #
假如每個樣本都可以重構得很好,那麼我們可以將$z$當作是$x$的等價表示,也就是說把$z$研究好了就相當於把$x$研究好了。現在我們將每個$x$都編碼出對應的特徵向量$z$,然後我們關心一個問題:這些$z$覆蓋的空間“長什麼樣”?
為什麼要關心這個問題呢?因為我們可以有很多不同的編碼方式,不同編碼方式得到的特徵向量也有好壞之分,從“編碼空間長什麼樣”我們可以大致地看出特徵向量的好壞。比如下面四個不同的編碼向量的分佈形狀模擬圖:
第一個圖的向量分佈沒什麼特別的形狀,比較散亂,說明編碼空間並不是特別規整;第二個圖的向量集中在一條線上,說明其實編碼向量的維度之間存在冗餘;第三個圖是一個環形,說明其圓心附近並沒有對應的真實樣本;第四個圖是一個圓形,表明它比較規整地覆蓋了一塊連續空間。就四個圖來看,我們認為最後一個圖所描繪的向量分佈形狀是最理想的:規整、無冗餘、連續,這意味著我們從中學習了一部分樣本,就很容易泛化到未知的新樣本上去,因為我們知道編碼空間是規整連續的,所以我們知道訓練樣本的編碼向量之間的“縫隙”(圖中的兩個點之間的空白部分),實際上也對應著未知的真實樣本,因此把已知的搞好了,很可能未知的也搞好了。
從點到面 #
總的來說,大體上我們關心編碼空間的如下問題:
1、所有編碼向量覆蓋一個怎樣的區域?
2、是否有未知的真實樣本對應空白之處的向量?
3、有沒有“脫離群眾”的向量?
4、有沒有辦法讓編碼空間更規整一些?
常規的自編碼器由於沒有特別的約束,因此很難回答上述問題。於是,變分自編碼器出來了,從編碼角度來看,它的目的是:1、讓編碼空間更規整一些;2、讓編碼向量更緊湊一些。為了達到這個目的,變分自編碼器先引入了後驗分佈$p(z|x)$。
對於不想深究機率語言的讀者來說,該怎麼理解後驗分佈$p(z|x)$呢?直觀來看,我們可以將後驗分佈理解為一個“橢圓”,原來每個樣本對應著一個編碼向量,也就是編碼空間中的一個點,引入後驗分佈之後,相對於說現在每個樣本$x$都對應一個“橢圓”。剛才我們說希望編碼向量更“緊湊”一些,但理論上來講,再多的“點”也沒有辦法把一個“面”覆蓋完,但要是用“面”來覆蓋“面”,那麼就容易把目標覆蓋住了。這就是變分自編碼器做出的主要改動之一。
讀者可能會問,為什麼非得要橢圓呢?矩形或者其他形狀可以嗎?回到機率語言上,橢圓對應著“假設$p(z|x)$各分量獨立的高斯分佈”,從機率的角度來看,高斯分佈是比較容易處理的一類機率分佈,所以我們用高斯分佈,也就對應著橢圓,其他形狀也就對應這其他分佈,比如矩形可以跟均勻分佈對應,但後面再算KL散度的時候會比較麻煩,因此一般不使用。
取樣重構 #
現在每個樣本$x$都對應一個“橢圓”,而確定一個“橢圓”需要兩個資訊:橢圓中心、橢圓軸長,它們各自構成一個向量,並且這個向量依賴於樣本$x$,我們將其記為$\mu(x),\sigma(x)$。既然整個橢圓都對應著樣本$x$,我們要求橢圓內任意一點都可以重構$x$,所以訓練目標為:
\begin{equation}\mu,\sigma,D = \mathop{\arg\min}_{\mu,\sigma,D}\mathbb{E}_{x\sim \mathcal{D}}\big[\Vert x - D(\mu(x) + \varepsilon\otimes \sigma(x))\Vert^2\big],\quad \varepsilon\sim \mathcal{N}(0, 1)\end{equation}
其中$\mathcal{D}$是訓練資料,$\mathcal{N}(0, 1)$為標準正態分佈,我們可以將它理解為一個單位圓,也就是說,我們先從單位圓內取樣$\varepsilon$,然後透過平移縮放變換$\mu(x) + \varepsilon\otimes \sigma(x)$將其變為“中心為$\mu(x)$、軸長為$\sigma(x)$”的橢圓內的點,這個過程就是所謂的“重引數(Reparameterization)”。
這裡的$\mu(x)$其實就對應於自編碼器中的編碼器$E(x)$,$\sigma(x)$相當於它能泛化的範圍。
空間正則 #
最後,“橢圓”可以“讓編碼向量更緊湊”,但還不能“讓編碼空間更規整”。現在我們希望編碼向量滿足標準正態分佈(可以將它理解為一個單位圓),即所有的橢圓覆蓋的空間組成一個單位圓。
為此,我們希望每個橢圓都能向單位圓靠近,單位圓的中心為0,半徑為1,所以一個基本想法是引入正則項:
\begin{equation}\mathbb{E}_{x\sim \mathcal{D}}\big[\Vert \mu(x) - 0\Vert^2 + \Vert \sigma(x) - 1\Vert^2\big]\end{equation}
事實上,這前面兩項loss結合起來,就已經非常接近標準的變分自編碼器了。標準的變分自編碼器用了一個複雜一些、功能類似的正則項:
\begin{equation}\mathbb{E}_{x\sim \mathcal{D}}\left[\sum_{i=1}^d \frac{1}{2}\Big(\mu_{i}^2(x) + \sigma_{i}^2(x) - \log \sigma_{i}^2(x) - 1\Big)\right]\end{equation}
這個正則項來源於兩個高斯分佈的KL散度,所以通常也叫“KL散度項”。
將兩專案標組合起來,就得到最終的變分自編碼器了:
\begin{equation}\Vert x - D(\mu(x) + \varepsilon\otimes \sigma(x))\Vert^2 + \sum_{i=1}^d \frac{1}{2}\Big(\mu_{i}^2(x) + \sigma_{i}^2(x) - \log \sigma_{i}^2(x) - 1\Big), \quad \varepsilon\sim \mathcal{N}(0, 1)\end{equation}
文章總結 #
本文從幾何類比的角度介紹了對變分自編碼器(VAE)的理解,在此視角下,變分自編碼器的目標是讓編碼向量更加緊湊,並規範了編碼分佈為標準正態分佈(單位圓)。
這樣一來,VAE能達到兩個效果:1、從標準高斯分佈(單位圓)隨機取樣一個向量,就可以由解碼器得到真實樣本,即實現了生成模型;2、由於編碼空間的緊湊形以及訓練時對編碼向量所加入的噪聲,使得編碼向量的各個分量能做到一定程度的解耦,並賦予編碼向量一定的線性運算性質。
幾何視角能讓我們快速地把握變分自編碼器的關鍵特性,降低入門難度,但也有一定的不嚴謹之處。如有不妥當的地方,還請讀者理解並指出。
轉載到請包括本文地址:https://spaces.ac.cn/archives/7725
更詳細的轉載事宜請參考:《科學空間FAQ》