当我们在谈论 Deep Learning:AutoEncoder 及其相关模型
引言
AutoEncoder 是 Feedforward Neural Network 的一種,曾經主要用于數據的降維或者特征的抽取,而現在也被擴展用于生成模型中。與其他 Feedforward NN 不同的是,其他 Feedforward NN 關注的是 Output Layer 和錯誤率,而 AutoEncoder 關注的是 Hidden Layer;其次,普通的 Feedforward NN 一般比較深,而 AutoEncoder 通常只有一層 Hidden Layer。
本篇文章會主要介紹傳統的 AutoEncoder 相關模型、以及生成模型 Variational AutoEncoder。為了方便講述,以下主要以單層 Hidden Layer 的 AutoEncoder 為例。
AutoEncoder
原始 AutoEncoder
原始的 AutoEncoder 結構很簡單:Input Layer、Hidden Layer、Output Layer。此網絡的約束有:
于是,可以用 Hidden Layer 中神經元組成的向量(這里我們稱為 Code)來表示 Input,就達到了對 Input 壓縮的效果。AutoEncoder 的訓練方式就是普通的 BP。其中,將 Input 壓縮為 Code 的部分稱為 encoder,將 Code 還原為 Input 的部分稱為 decoder。于是,AutoEncoder 的結構可以表示為
其數學表達式如下,其中、分別表示 encoder 和 decoder
可以看出,AutoEncoder 其實是增強的 PCA:AutoEncoder 具有非線性變換單元,因此學出來的 Code 可能更精煉,對 Input 的表達能力更強。
雖然用 AutoEncoder 來壓縮理論上看起來很智能,但是實際上并不太好用:
下面再簡要介紹一些 AutoEncoder 的擴展。
Sparse AutoEncoder
Sparse 本身已經被研究了很多年了,比如曾輝煌一時的 Sparse Representation。Sparse AutoEncoder(SAE)其實就是對 AutoEncoder 的 Code 增加了稀疏的約束。而稀疏具有很多良好的性質,如:
- 有降維的效果,可以用于提取主要特征
- 由于可以抓住主要特征,故具有一定抗噪能力
- 稀疏的可解釋性好,現實場景大多滿足這種約束(如“奧卡姆剃刀定律”)
增加了稀疏約束后的 AutoEncoder 的損失函數定義如下:
其中,表示 KL散度,表示網絡中神經元的期望激活程度(若 Activation 為 Sigmoid 函數,此值可設為 0.05,表示大部分神經元未激活),表示第個神經元的平均激活程度。在此處,KL散度 定義如下
其中,定義為訓練樣本集上的平均激活程度,公式如下。其中表示第個訓練樣本
Denoising AutoEncoder
Denoising AutoEncoder(DAE)是在“Vincent Extracting and composing robust features with denoising autoencoders, 2008”中提出的。本質就是在原樣本中增加噪聲,并期望利用 DAE 將加噪樣本來還原成純凈樣本。
在文章中,作者以圖像為例,對圖像中的像素以一定概率遮擋,作為輸入。隨后利用 DAE 進行恢復。由于增加了噪聲,因此學習出來的 Code 會更加穩健。其次,論文中還從各種方面(流形、生成模型、信息論等等)對 DAE 進行了解釋。但是由于 DAE 應用不多,這里就不展開了,有興趣的同學可以參考原文。
其他 AutoEncoder
除了上述的 AutoEncoder,為了學習出更加穩健,表達能力更強的 Code,還有其他的 AutoEncoder,如:
Contrative AutoEncoder(CAE),在文章"Contractive auto-encoders: Explicit invariance during feature extraction, 2011"中提出。其與 DAE 的區別就在于約束項進行了修改,意在學習出更加緊湊穩健的 Code。
Stacked AutoEncoder(SAE),在文章“Greedy Layer-Wise Training of Deep Networks, 2007”中提出。作者對單層 AutoEncoder 進行了擴展,提出了多層的 AutoEncoder,意在學習出對輸入更抽象、更具擴展性的 Code 的表達。
除此之外,還有將傳統 FNN 網絡中的結構融入到 AutoEncoder 的,如:Convolutional Autoencoder、 Recursive Autoencoder、 LSTM Autoencoder 等等。
Autoencoder 期望利用樣本自適應學習出穩健、表達能力強、擴展能力強的 Code 的設想很好,但是實際中應用場景卻很有限。一般可以用于數據的降維、或者輔助進行數據的可視化分析。有學者另辟蹊徑,借鑒了 Autoencoder 的思想,將其用于數據的生成,取得到驚人的效果,如下面會介紹的 Variational AutoEncoder。
Variational AutoEncoder
Variational AutoEncoder(VAE)是由 Kingma 和 Welling 在“Auto-Encoding Variational Bayes, 2014”中提出的一種生成模型。VAE 作為目前(2017)最流行的生成模型之一,可用于生成訓練樣本中沒有的樣本,讓人看到了 Deep Learning 強大的無監督學習能力。
如下圖這張廣為人知的“手寫數字生成圖”,就是由 VAE 產生的。
判別模型 與 生成模型
我們都知道一般有監督學習可以分為兩種模型:判別模型(DM,Discriminative Model)和生成模型(GM,Generative Model)。下面我們以分類問題為例,簡單回顧一下其概念。
對于分類問題,本質需要解決的其實就是最大化后驗概率,即
于是,可以衍生出兩種方案。第一種方法如下:
由于
原問題就轉化為了求和,這就是生成模型特點:需要直接或間接對建模。常見的生成模型有隱馬爾可夫模型(HMM)、樸素貝葉斯、高斯混合模型(GMM)等等。
形象一點地表達,即為了求樣本屬于每一類的概率,我們先求解每一類出現的概率;并對每一類分別建模,求出樣本在該類發生的概率。最后利用貝葉斯公式算出。
其二種方法即,我們可以直接對后驗建模,顯性或隱形地求出其表達式。對樣本,代入公式求解出每一類的后驗概率,取其中最大值即可。這就是判別模型。常見的判別模型有線性回歸模型、支持向量機(SVM)、神經網絡等等,
VAE
VAE 跟傳統 AutoEncoder 關系并不大,只是思想及架構上也有 Encoder 和 Decoder 兩個結構而已。跟 AutoEncoder 不同,VAE 理論跟實際效果都非常驚艷,理論上涉及到的主要背景知識也比較多,包括:隱變量(Latent Variable Models)、變分推理(Variational Inference)、Reparameterization Trick 等等。
由于涉及到的知識較多,本部分只會對 VAE 進行簡要介紹,省略很多證明。本部分講解思路參考論文"Tutorial on Variational Autoencoders"和博客“Tutorial - What is a variational autoencoder??”。
首先,先定義問題:我們希望學習出一個模型,能產生訓練樣本中沒有,但與訓練集相似的數據。換一種說法,對于樣本空間,當以抽取數據時,我們希望以較高概率抽取到與訓練樣本近似的數據。對于手寫數字的場景,則表現為生成像手寫數字的圖像。
對于我們期望獲取的數據,其不同維度之間可能存在特定的聯系。將這些聯系對應的因素單獨抽取出來作為特征,即隱變量(Latent Variables),寫作。則原來對建模轉為對進行建模,同時有
其中,是隱變量空間中的點,是模型參數空間中的點。此時可以分別對和建模,這就與上面提到的生成模型是一致的,因此 VAE 是無監督的生成模型。對于手寫數字的場景,隱變量可以理解成圖像對應的真實數字、書寫的角度、筆尖寬度等等方面。
為了計算這個積分,首先需要給出的表達形式。在 VAE 中,作者選擇高斯分布,即
其中,表示單位矩陣,為超參數。為將映射到的函數,即。
此時,還需要給出的表達式。不過,其中隱變量到底代表什么(對應的數字、書寫的角度、筆尖寬度等等,難以人工窮舉),以及它們對應的表達式都是很難人工定義的。這里,作者給出一個很巧妙的解決方法,即取,同時利用多層 DNN 來學習。當然,真實的隱變量不可能是簡單的。巧妙之處在于,由于任何維的分布,都可以利用維的高斯分布經過某種復雜函數變換得到。因此,對應的多層 DNN,前幾層負責將高斯分布的映射到真正的隱變量,后幾層負責將這個隱變量映射到。
接下來我們可以開始解決最大化的問題,公式為
如果的數量較少,我們就可以利用采樣來計算積分,即
但若現在隱變量維度很大時,就會需要極大量的樣本,幾乎是不可能計算的。但是根據經驗可以得知,對大多數來說,,對估計沒有幫助。于是只需要采樣那些對有貢獻的。此時,就需要知道,但是這個無法直接求取。VAE 中利用 Variational Inference,引入來近似。
關于 Variational Inference,鑒于篇幅不會展開講,有需要了解的同學的請參考《PRML》第10章、《Deep Learning》第19章、以及其他教材。
最終,可以得到需要優化的目標 ELBO(Evidence Lower BOund),此處其定義為
其中,第一項是我們希望最大化的目標;第二項是在數據下真實分布與假想分布的距離,當的選擇合理時此項會接近為0。但公式中含有,無法直接求解,于是將其化簡后得到
上述公式中每一項的分布如下。其中中參數和依然利用 DNN 來學習
由于兩個高斯分布的 KL 距離可以直接計算,故當與中參數已知時(通過 DNN 學習),就能求解。當與很接近時,接近于0,優化此式就相當于在優化我們期望的目標。
概率視角講的差不多了,我們回到 DNN 視角。上述文章已經說明了我們需要最大化的目標是
于是,對于某個樣本,其損失函數可以表示為
其中,意味著將樣本編碼為隱變量,對應于 AutoEncoder 中的 Encoder;意味著將隱變量恢復成,對應著 Decoder。于是,的意義就可以這樣理解
第一項,表示隱變量對樣本的重構誤差,并在空間內取期望,即平均的重構誤差。我們的目標就是使誤差最小化
第二項,可以理解為正則項。其計算的是與真實的差異,表示我們用近似帶來的信息損失。我們也希望這個信息損失項盡可能的小
于是,VAE 的結構可以表示為
但是,上面這種方式需要在 FF 時進行采樣,而這種采樣操作是無法進行 BP 的。于是,作者提出一種“Reparameterization Trick”:將對采樣的操作移到輸入層進行。于是就有了下面的 VAE 最終形式
采樣時,先對輸入的進行采樣,然后計算間接對采樣。通過這種方式,就可以利用 BP 來優化損失函數了。
我們再結合兩個圖梳理一下 VAE 的過程。
下圖表示了 VAE 整個過程。即首先通過 Encoder 得到的隱變量分布參數;然后采樣得到隱變量。接下來按公式,應該是利用 Decoder 求得的分布參數,而實際中一般就直接利用隱變量恢復。
下圖展示了一個具有3個隱變量的 VAE 結構示意圖,是對上面抽象描述的一個補充說明,不再贅述。
尾巴
前幾周由于個人原因無暇他顧,使本篇拖更良久。近期更新可能仍會比較緩慢,但我還是會保持更新,畢竟值得寫的東西太多太多。
最后關于 VAE 部分,限于個人水平、VAE 的難度、篇幅等,本篇未能完全做到足夠清晰明了,其中省略了不少的證明及推理過程。有需要深入研究的同學建議看完本篇后,再深入閱讀下文中提到的 Paper,才能對 VAE 有更系統的理解。
Reference:
原文地址:?https://zhuanlan.zhihu.com/p/27865705
總結
以上是生活随笔為你收集整理的当我们在谈论 Deep Learning:AutoEncoder 及其相关模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tensorflow Day17 Spa
- 下一篇: Keras Tutorial: Deep