深度學習與神經網路(十四) VAE變分自編碼器

2021-10-07 09:53:03 字數 2835 閱讀 4836

vae是無監督學習

variational autoencoder 變分自編碼器

通常我們會拿 vae 跟 gan 比較,的確,它們兩個的目標基本是一致的——希望構建乙個從隱變數 z 生成目標資料 x 的模型,但是實現上有所不同

vae作為乙個生成模型,其基本思路是很容易理解的:把一堆真實樣本通過編碼器網路變換成乙個理想的資料分布,然後這個資料分布再傳遞給乙個解碼器網路,得到一堆生成樣本,生成樣本與真實樣本足夠接近的話,就訓練出了乙個自編碼器模型。

那vae(變分自編碼器)就是在自編碼器模型上做進一步變分處理,使得編碼器的輸出結果能對應到目標分布的均值和方差

vae最想解決的問題是什麼?當然是如何構造編碼器和解碼器,使得能夠編碼成易於表示的形態,並且這一形態能夠盡可能無損地解碼回原真實影象。

這似乎聽起來與pca(主成分分析)有些相似,而pca本身是用來做矩陣降維的:

現在我們需要對這一雛形進行改進。首先乙個最明顯能改進的地方是用神經網路代替w變換和wt變換,就得到了如下deep auto-encoder模型:

這一替換的明顯好處是,引入了神經網路強大的擬合能力,使得編碼(code)的維度能夠比原始影象(x)的維度低非常多。在乙個手寫數字影象的生成模型中,deep auto-encoder能夠把乙個784維的向量(28*28影象)壓縮到只有30維,並且解碼回的影象具備清楚的辨認度

至此我們構造出了乙個重構影象比較清晰的自編碼模型,但是這並沒有達到我們真正想要構造的生成模型的標準,因為,對於乙個生成模型而言,解碼器部分應該是單獨能夠提取出來的,並且對於在規定維度下任意取樣的乙個編碼,都應該能通過解碼器產生一張清晰且真實的。

我們先來分析一下現有模型無法達到這一標準的原因。

如上圖所示,假設有兩張訓練,一張是全月圖,一張是半月圖,經過訓練我們的自編碼器模型已經能無損地還原這兩張。接下來,我們在code空間上,兩張的編碼點中間處取一點,然後將這一點交給解碼器,我們希望新的生成是一張清晰的(類似3/4全月的樣子)。但是,實際的結果是,生成是模糊且無法辨認的亂碼圖。乙個比較合理的解釋是,因為編碼和解碼的過程使用了深度神經網路,這是乙個非線性的變換過程,所以在code空間上點與點之間的遷移是非常沒有規律的。

如何解決這個問題呢?我們可以引入雜訊,使得的編碼區域得到擴大,從而掩蓋掉失真的空白編碼點。

如上圖所示,現在在給兩張編碼的時候加上一點噪音,使得每張的編碼點出現在綠色箭頭所示範圍內,於是在訓練模型的時候,綠色箭頭範圍內的點都有可能被取樣到,這樣解碼器在訓練時會把綠色範圍內的點都盡可能還原成和原圖相似的。然後我們可以關注之前那個失真點,現在它處於全月圖和半月圖編碼的交界上,於是解碼器希望它既要盡量相似於全月圖,又要盡量相似於半月圖,於是它的還原結果就是兩種圖的折中(3/4全月圖)。

由此我們發現,給編碼器增添一些噪音,可以有效覆蓋失真區域。不過這還並不充分,因為在上圖的距離訓練區域很遠的黃色點處,它依然不會被覆蓋到,仍是個失真點。為了解決這個問題,我們可以試圖把噪音無限拉長,使得對於每乙個樣本,它的編碼會覆蓋整個編碼空間,不過我們得保證,在原編碼附近編碼的概率最高,離原編碼點越遠,編碼概率越低。在這種情況下,影象的編碼就由原先離散的編碼點變成了一條連續的編碼分布曲線,如下圖所示。

那麼上述的這種將影象編碼由離散變為連續的方法,就是變分自編碼的核心思想。下面就會介紹vae的模型架構,以及解釋vae是如何實現上述構思的。

在auto-encoder中,編碼器是直接產生乙個編碼的,但是在vae中,為了給編碼新增合適的噪音,編碼器會輸出兩個編碼,乙個是原有編碼(m1,m2,m3),另外乙個是控制噪音干擾程度的編碼(σ1,σ2,σ3),第二個編碼其實很好理解,就是為隨機噪音碼(e1,e2,e3)分配權重,然後加上exp(σi)的目的是為了保證這個分配的權重是個正值,最後將原編碼與噪音編碼相加,就得到了vae在code層的輸出結果(c1,c2,c3)。其它網路架構都與deep auto-encoder無異。

損失函式方面,除了必要的重構損失外,vae還增添了乙個損失函式(見上圖minimize2內容),這同樣是必要的部分,因為如果不加的話,整個模型就會出現問題:為了保證生成的質量越高,編碼器肯定希望噪音對自身生成的干擾越小,於是分配給噪音的權重越小,這樣只需要將(σ1,σ2,σ3)賦為接近負無窮大的值就好了。所以,第二個損失函式就有限制編碼器走這樣極端路徑的作用,這也從直觀上就能看出來,exp(σi)-(1+σi)在σi=0處取得最小值,於是(σ1,σ2,σ3)就會避免被賦值為負無窮大。

中間神經元的連線方式也是不太一樣的

gan的效果要更好

機器學習,深度學習,神經網路,深度神經網路

先來說一下這幾者之間的關係 人工智慧包含機器學習,機器學習包含深度學習 是其中比較重要的分支 深度學習源自於人工神經網路的研究,但是並不完全等於傳統神經網路。所以深度學習可以說是在傳統神經網路基礎上的公升級。神經網路一般有輸入層 隱藏層 輸出層,一般來說隱藏層大於2的神經網路就叫做深度神經網路,深度...

深度學習 深度神經網路

神經網路是由乙個個神經元相互連線並按層次排列構成的,深度神經網路是有任意層的神經網路,這裡的深度是指層次的多,而不是神經元數量的多。有任意層,那麼就要有乙個迴圈來負責遍歷每一層進行計算。所以深度神經網路的計算形式,就必須要適應這個迴圈結構。我們先來說說神經元吧 對於多神經元神經網路,其實也是一樣的。...

神經網路與深度學習(一)

參考 關於權重和偏置的合理解釋 這周開始考慮在基於mp實現一些特定應用的時候,其實我心中是有幾個雛形的,但是涉及到技術細節的時候,還是有些缺乏,所以就想找本書能提供些參考。巧合的是,發現了這本 神經網路與深度學習 正好也是基於python的,有用武之地。本章通過神經網路來識別手寫數字,在這一章中涉及...