https://blog.csdn.net/qq_27825451/article/details/84968890
一、從生成模型開始談起
1、什么是生成模型?
概率統計層面:能夠在給丁某一些隱含參數的條件下,隨機生成觀測數據的這樣一種模型,稱之為“生成模型”。它給觀測值和比周數據系列制定一個連和概率分布
機器學習層面:直接對數據進行建模,比如根據某個變量的概率密度函數進行數據采樣。在貝葉斯算法中,直接對連和概率分布P(x,y)進行建模,然后利用貝葉斯公式進行求解P(y|x)。
2、生成模型的兩大類型
第一類:完全表示出數據確切的分布函數
第二類:沒有辦法完全表示出確切的分布函數,但是,能夠做到的是新的數據的生成,而具體的分布函數是模糊的。
在機器學習中,不管是自編碼器AE、變分自編碼器VAE、還是生成對抗網路GAN,都是屬於第二類。生成新數據,也是大部分生成模型的核心目標。
二、什么是自編碼器
1、自編碼器的一般結構
自編碼器是一種無監督學習技術,利用神經網絡進行表征學習。也就是說,我們設計一個在網絡中施加“瓶頸”,迫使原始輸入壓縮知識表示的神經網絡架構。如果輸入特征彼此獨立,則該壓縮和隨后的重構將是非常困難的任務。但是,如果數據中存在某種結構(即輸入特征之間存在相關性),則可以學習這種結構,並在強制輸入通過網絡的瓶頸時使用。
通俗理解:即輸入的特征X1、X2、Xn之間存在某種特殊的聯系,但是這些聯系不需要你人為的進行特征提取,而是放到網絡里面進行學習,最終濃縮為更精煉、數量更少的特征h1、h2、hm。其中m<n.這里的Xn就是輸入數據,hm就是所謂的編碼,也就是所謂的“瓶頸數據”。
自編碼器的一般結構如下所示:
如上圖所示,我們可以采取的未標記數據集和框架作為任務監督學習問題,負責輸出新的X(原始輸入x的重構)。這個網絡可以通過最小化重構誤差(原始輸入和重構之間差異的度量)訓練。瓶頸是我們網絡設計的關鍵屬性;如果沒有信息瓶頸,我們的網絡就會將這些值通過網絡傳遞,並且只學會記住輸入值。如下所示,編碼向量和我的最開始的數據輸入完全一樣,要使得能夠對輸入數據進行重構,不需要做任何處理,只需要讓每一個神經元對輸入的數據不做人處理,原樣復制,死記硬背即可,這樣的編碼器沒有任何意義。
瓶頸限制了完整網絡可以傳遞的信息量,從而迫使網絡學習壓縮輸入數據。
2、自編碼器的兩個重要特征
(1)壓縮編碼的數據維度一定要比元時輸入數據更少。也就是所謂的要具有一定的“瓶頸限制”,如果壓縮編碼的數據維度更多,那就到不到數據降維的目的了,那編碼還有什么意義呢?
(2)不管是編碼器,還是解碼器,本質上都是神經網絡層,神經網絡層一定要具有一定的“容量”。什么是容量,就是一定要不止一個神經網絡層才行,為什么?因為我們知道神經網絡層數意味着對數據的隱含特征進行提取(雖然我不知道到底是怎么提取的,但是我知道一定是有隱含關聯性的),如果向上面的只有一個中間的壓縮編碼數據層,此時我們的數據輸入層與編碼輸出層是直接相連接的,如果我在神經元節點上不使用非線性激活函數,我們發現,這會得到和PCA類似的降維效果。所以,最好是多添加劑個網絡層,來儲存輸入數據之間的那些隱含關系,存儲它們的潛在特征和關聯。
總結起來:自編碼器需要“瓶頸+容量”
3、編碼器的常見應用
異常監測、數據去燥、數據降維、圖像修復、信息檢索
三、常見的自編碼器
1、欠完備的自編碼器——普通一般的自編碼器
構建自編碼器最簡單的架構是限制網絡隱藏層中存在的節點數量,進而限制可以通過網絡傳輸的信息量。通過根據重構誤差懲罰網絡,我們的模型可以學習輸入數據的最重要屬性,以及從“編碼”狀態如何最好的重構原始輸入。理想情況下,這種編碼將學習和描述輸入數據的潛在屬性。
由於神經網絡能夠學習非線性關系,因此可以認為這是PCA更有力(非線性)的泛化。而PCA試圖發現描述原始數據的低維超平面,自編碼器則能夠學習非線性流形(流形為連續的非交叉的曲面)。這兩種方法之間的區別如下圖所示。
對於更高維數據,自編碼器能夠學習數據(流形)的復雜表示,可用於描述低維度的觀測數據,並可以對應地解碼成原始輸入空間。
欠完備自編碼器沒有明確的正則化項,只是根據重構損失來訓練我們的模型。因此,確保模型不記憶輸入數據的唯一方法就是確保我們已經充分限制了隱藏層中的節點數量。
總結:
為了深入了解自編碼器,我們還必須了解我們的編碼器和解碼器模型的容量(capacity )。即使“瓶頸層”只有一個隱藏節點,只要編碼器和解碼器模型有足夠的容量來學習一些可以將數據映射到索引的任意函數,我們的模型仍然可以記住訓練數據。
因此,我們希望我們的模型能夠發現我們數據中的潛在屬性,重要的是要確保自編碼器模型不僅是學習有效記憶訓練數據的方法。像監督學習問題,我們可以對網絡采用各種形式的正則化,以鼓勵更好的泛化屬性。
2、稀疏自編碼器——隱藏層選擇性的激活
稀疏自編碼器為我們提供了一種不需要減少我們隱藏層的節點數量,就可以引入信息瓶頸的的方法。相反,我們將構造我們的損失函數,以懲罰層中的激活。對於任何給定的觀察,我們都會鼓勵我們的網絡學習只依賴激活少量神經元進行編碼和解碼。值得注意的是,這是一種比較特殊的正則化實現方法,因為我們通常調整網絡的權重,而不是激活。
通用稀疏自編碼器的可視化如下,節點的不透明度與激活級別對應。請注意,激活的訓練模型的各個節點是數據相關的,不同的輸入將導致通過網絡不同節點的激活。
這樣做的結果是,我們使網絡的各個隱藏層節點對輸入數據的特定屬性敏感。欠完備自編碼器使用整個網絡進行每次觀察,而稀疏自編碼器將被迫根據輸入數據選擇性地激活網絡區域。因此,我們限制了網絡記憶輸入數據的容量,而不限制網絡從數據中提取特征的能力。這讓我們單獨考慮網絡的潛在狀態的表征和正則化分開,這樣我們就可以根據給定數據上下文的意義選擇潛在狀態表征(即編碼維度),同時通過稀疏性約束施加正則化。
我們可以通過兩種主要的方式來強加這種稀疏性約束;都涉及到測量每個訓練批次的隱藏層激活,並為損失函數添加一些懲罰過度的激活的項。這些條款是:
L1正則化:我們可以添加一個對損失函數的正則化項,在h層中為觀察i懲罰激活a的向量值的絕對值,使用微調參數λ進行縮放。
KL -散度(相對熵):本質上,KL散度是兩個概率分布差異的度量。我們可以定義一個參數ρ稀疏,它表示一個神經元在樣本集合上的平均激活。這種期望可以計算為,下標j表示表示層h中特定的神經元,對m個訓練觀察的表征x的激活求和。本質上,通過限制一個神經元在樣本集合上的平均激活,我們鼓勵神經元只對觀測的一個子集進行激活。我們可以將ρ描述為一個伯努利隨機變量分布,我們可以利用KL散度(下展開)來比較理想的分布在所有隱藏層節點上的觀察分布。
注意:伯努利分布是“一個隨機變量的概率分布,p為概率值1,q = 1−p為概率值0”。這與建立神經元激活的概率吻合。
兩個伯內利分布的KL散度可寫成。下面是理想分布p=0.2的損失項可視化,對應於此處的最小(零)懲罰。
3、降噪自編碼器——給輸入數據添加噪聲
我們的模型通過某種信息瓶頸,盡可能重構輸入。回想一下,前面我提到我們希望我們的自編碼器足夠敏感以重構原始觀察的結果,但又要對訓練數據不夠敏感,以至於模型學習通用的編碼和解碼。還有一種開發通用化模型的方法,我們可以略微破壞輸入數據,但仍維持未損壞的數據維作為目標輸出。
采用這種方法,我們的模型不能簡單地開發一個記憶訓練數據的映射,因為我們的輸入和目標輸出不再相同。更確切的說,該模型學習矢量場以將輸入數據映射到較低維流形;如果這個流形精確地描述了自然數據,我們就有效地“消除”了多余的噪聲。
上圖是,對矢量場x與原始值x的可視化描述。黃點表示在添加噪聲之前的訓練樣本。你可以看到,模型已經學會了調整損壞的輸入到已學習的流形。
值得注意的是,這個矢量場通常只在模型在訓練過程中觀察到的區域中表現良好。在遠離自然數據分布的區域,重構誤差既大又不總是指向真實分布的方向。
4、壓縮自編碼器
人們會期望對於非常相似的輸入,學習的編碼也會非常相似。我們可以為此訓練我們的模型,以便通過要求隱藏層激活的導數相對於輸入而言很小。換句話說,對於輸入比較小的改動,我們仍然應該保持一個非常類似的編碼狀態。這與降噪自編碼器相似,因為輸入的小擾動本質上被認為是噪聲,並且我們希望我們的模型對噪聲具有很強的魯棒性。“降噪自編碼器使重構函數(解碼器)抵抗輸入有限小的擾動,而壓縮自編碼器使特征提取函數(編碼器)抵抗輸入無限小的擾動。“
因為我們明確地鼓勵我們的模型學習一種編碼,在這種編碼中,類似的輸入有類似的編碼。我們基本上是迫使模型學習如何將輸入的臨近區域收縮到較小的輸出臨近區域。注意重構數據的斜率(即微分)對於輸入數據的局部鄰域來說基本為零。
我們可以通過構造一個損失項來實現這一點,該項對輸入訓練樣例中的大量的衍生進行懲罰,本質上是懲罰那些在輸入中有微小變化導致編碼空間發生巨大變化的實例。
在更高級的數學術語中,我們可以將我們的正則化損失項設置為雅可比矩陣J的Frobenius范數的平方||A||F,用於對輸入觀測的隱含層激活。Frobenius范數本質上是矩陣的L2范數,而雅可比矩陣僅僅代表了一個向量值函數的所有一階偏導數。
對於m觀察和n隱藏層節點,我們可以計算如下的值。
為了寫得更簡潔,我們可以將我們的完整損失函數定義為:
在這里定義了我們的隱層激活輸入x的梯度場,所有的i訓練示例求和。
5、變分自編碼器——VAE——后面會討論
四、自編碼器的缺點
以一個手寫數字的圖片編碼-解碼為例。
當我們對解碼器輸入一個訓練集中從未出現的編碼的時候,我們得到的重構的輸出可能是一個完全的亂碼或者是噪聲,也就是說與手寫數字數據毫無關系,很顯然,這並不是我們所希望的。我們希望的是“生成模型”能夠對任意的輸入編碼產生有相關意義的數據,這就是我們后面的“變分自編碼器VAE”所要做的事情。
所以,自編碼器其實並不是一個真正意義上“生成模型”。