當前位置:
首頁 > 最新 > 從自編碼器到變分自編碼器

從自編碼器到變分自編碼器

AiTechYun

編輯:yuxiangyu

自編碼器是一種無監督學習技術,利用神經網路進行表徵學習。也就是說,我們設計一個在網路中施加「瓶頸」,迫使原始輸入壓縮知識表示的神經網路架構。如果輸入特徵彼此獨立,則該壓縮和隨後的重構將是非常困難的任務。但是,如果數據中存在某種結構(即輸入特徵之間存在相關性),則可以學習這種結構,並在強制輸入通過網路的瓶頸時使用。

如上圖所示,我們可以採取的未標記數據集和框架作為任務監督學習問題,負責輸出x帽(原始輸入x的重構)。這個網路可以通過最小化重構誤差(原始輸入和重構之間差異的度量)訓練。瓶頸是我們網路設計的關鍵屬性;如果沒有信息瓶頸,我們的網路就會將這些值通過網路傳遞,並且只學會記住輸入值。

瓶頸限制了完整網路可以傳遞的信息量,從而迫使網路學習壓縮輸入數據。

注意:事實上,如果我們要構造一個線性網路(即,每層都不使用非線性激活函數),我們會觀察到類似PCA中所觀察到的降維。

理想的自編碼器模型平衡以下幾點:

對輸入敏感足以準確建立重構。

這種敏感不能過度,導致模型簡單的記住甚至過擬合訓練數據。

這種取捨迫使模型在只保留重構輸入所需的數據的變化,不保留輸入的冗餘。一般來說,這涉及構建一個損失函數,其中一項鼓勵我們的模型對輸入敏感(比如,重構損失),而第二項防止出現直接記住或過度擬合(如,加個正則化)。

我們通常會在正則化項前面添加一個縮放參數,以便我們可以調整兩個目標之間的平衡。

在這篇文章中,我會討論一些標準的自編碼器架構,用於強加這兩個約束並調整權衡。下一篇,我將討論基於這些概念構建的變分自編碼器,以構建更強大的模型。


構建自編碼器最簡單的架構是限制網路隱藏層中存在的節點數量,進而限制可以通過網路傳輸的信息量。通過根據重構誤差懲罰網路,我們的模型可以學習輸入數據的最重要屬性,以及從「編碼」狀態如何最好的重構原始輸入。理想情況下,這種編碼將學習和描述輸入數據的潛在屬性。

由於神經網路能夠學習非線性關係,因此可以認為這是PCA更有力(非線性)的泛化。而PCA試圖發現描述原始數據的低維超平面,自編碼器則能夠學習非線性流形(流形為連續的非交叉的曲面)。這兩種方法之間的區別如下圖所示。

對於更高維數據,自編碼器能夠學習數據(流形)的複雜表示,可用於描述低維度的觀測數據,並可以對應地解碼成原始輸入空間。

欠完備自編碼器沒有明確的正則化項,只是根據重構損失來訓練我們的模型。因此,確保模型不記憶輸入數據的唯一方法就是確保我們已經充分限制了隱藏層中的節點數量。

為了深入了解自編碼器,我們還必須了解我們的編碼器和解碼器模型的容量(capacity )。即使「瓶頸層」只有一個隱藏節點,只要編碼器和解碼器模型有足夠的容量來學習一些可以將數據映射到索引的任意函數,我們的模型仍然可以記住訓練數據。

因此,我們希望我們的模型能夠發現我們數據中的潛在屬性,重要的是要確保自編碼器模型不僅是學習有效記憶訓練數據的方法。像監督學習問題,我們可以對網路採用各種形式的正則化,以鼓勵更好的泛化屬性。


稀疏自編碼器為我們提供了一種不需要減少我們隱藏層的節點數量,就可以引入信息瓶頸的的方法。相反,我們將構造我們的損失函數,以懲罰層中的激活。對於任何給定的觀察,我們都會鼓勵我們的網路學習只依賴激活少量神經元進行編碼和解碼。值得注意的是,這是一種比較特殊的正則化實現方法,因為我們通常調整網路的權重,而不是激活。

通用稀疏自編碼器的可視化如下,節點的不透明度與激活級別對應。請注意,激活的訓練模型的各個節點是數據相關的,不同的輸入將導致通過網路不同節點的激活。

這樣做的結果是,我們使網路的各個隱藏層節點對輸入數據的特定屬性敏感。欠完備自編碼器使用整個網路進行每次觀察,而稀疏自編碼器將被迫根據輸入數據選擇性地激活網路區域。因此,我們限制了網路記憶輸入數據的容量,而不限制網路從數據中提取特徵的能力。這讓我們單獨考慮網路的潛在狀態的表徵和正規化分開,這樣我們就可以根據給定數據上下文的意義選擇潛在狀態表徵(即編碼維度),同時通過稀疏性約束施加正則化。

我們可以通過兩種主要的方式來強加這種稀疏性約束;都涉及到測量每個訓練批次的隱藏層激活,並為損失函數添加一些懲罰過度的激活的項。這些條款是:

L1正規化:我們可以添加一個對損失函數的正則化項,在h層中為觀察i懲罰激活a的向量值的絕對值,使用微調參數λ進行縮放。

KL -散度(相對熵):本質上,KL散度是兩個概率分布差異的度量。我們可以定義一個參數ρ稀疏,它表示一個神經元在樣本集合上的平均激活。這種期望可以計算為,下標j表示表示層h中特定的神經元,對m個訓練觀察的表徵x的激活求和。本質上,通過限制一個神經元在樣本集合上的平均激活,我們鼓勵神經元只對觀測的一個子集進行激活。我們可以將ρ描述為一個伯努利隨機變數分布來,我們可以利用KL散度(下展開)來比較理想的分布在所有隱藏層節點上的觀察分布。

注意:伯努利分布是「一個隨機變數的概率分布,p為概率值1和q = 1?p為的概率值0」。這與建立神經元激活的概率吻合。

兩個伯內利分布的KL散度可寫成。下面是理想分布p=0.2的損失項可視化,對應於此處的最小(零)懲罰。

我們的模型通過某種信息瓶頸,儘可能重構輸入。回想一下,前面我提到我們希望我們的自編碼器足夠敏感以重構原始觀察的結果,但又要對訓練數據不夠敏感,以至於模型學習通用的編碼和解碼。還有一種開發通用化模型的方法,我們可以略微破壞輸入數據,但仍維持未損壞的數據維作為目標輸出。

採用這種方法,我們的模型不能簡單地開發一個記憶訓練數據的映射,因為我們的輸入和目標輸出不再相同。更確切的說,該模型學習矢量場以將輸入數據映射到較低維流形;如果這個流形精確地描述了自然數據,我們就有效地「消除」了多餘的雜訊。

上圖是,對矢量場x與原始值x的可視化描述。黃點表示在添加雜訊之前的訓練樣本。你可以看到,模型已經學會了調整損壞的輸入到已學習的流形。

值得注意的是,這個矢量場通常只在模型在訓練過程中觀察到的區域中表現良好。在遠離自然數據分布的區域,重構誤差既大又不總是指向真實分布的方向。


人們會期望對於非常相似的輸入,學習的編碼也會非常相似。我們可以為此訓練我們的模型,以便通過要求隱藏層激活的導數相對於輸入而言很小。換句話說,對於輸入比較小的改動,我們仍然應該保持一個非常類似的編碼狀態。這與降噪自編碼器相似,因為輸入的小擾動本質上被認為是雜訊,並且我們希望我們的模型對雜訊具有很強的魯棒性。「降噪自編碼器使重構函數(解碼器)抵抗輸入有限小的擾動,而壓縮自編碼器使特徵提取函數(編碼器)抵抗輸入無限小的擾動。「

因為我們明確地鼓勵我們的模型學習一種編碼,在這種編碼中,類似的輸入有類似的編碼。我們基本上是迫使模型學習如何將輸入的臨近區域收縮到較小的輸出臨近區域。注意重構數據的斜率(即微分)對於輸入數據的局部鄰域來說基本為零。

我們可以通過構造一個損失項來實現這一點,該項對輸入訓練樣例中的大量的衍生進行懲罰,本質上是懲罰那些在輸入中有微小變化導致編碼空間發生巨大變化的實例。

在更高級的數學術語中,我們可以將我們的正則化損失項設置為雅可比矩陣J的Frobenius範數的平方||A||F,用於對輸入觀測的隱含層激活。Frobenius範數本質上是矩陣的L2範數,而雅可比矩陣僅僅代表了一個向量值函數的所有一階偏導數。

對於m觀察和n隱藏層節點,我們可以計算如下的值。

為了寫得更簡潔,我們可以將我們的完整損失函數定義為:

在這裡

定義了我們的隱層激活輸入x的梯度場,所有的i訓練示例求和。


自編碼器是一種神經網路架構,能夠發現數據中的結構,以便開發輸入的壓縮表示。一般自編碼器架構的許多不同變種,其目標是確保壓縮表徵表示原始數據輸入的有意義的屬性;通常使用自編碼器工作時遇到的最大挑戰,是讓你的模型實際學習一種有意義且可泛化的潛在空間表徵。

因為自編碼器學習如何根據訓練期間從數據中發現的屬性(即,輸入特徵向量之間的相關性)來壓縮數據,所以這些模型通常僅能夠重構與訓練中觀察到的模型相似的數據。

自編碼器的應用包括:

異常檢測

數據去噪(例如圖像,音頻)

圖像修復

信息檢索

https://www.jeremyjordan.me/autoencoders/

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AiTechYun 的精彩文章:

世界反興奮劑機構使用人工智慧來識別興奮劑作弊
谷歌開源其語義圖像分割模型DeepLab-v3+

TAG:AiTechYun |