十分建議先讀keras文檔
看完之後感覺好像普通的自編碼器好像沒啥用啊?
使用自編碼器做數據壓縮,性能並不怎麼樣……
做逐層預訓練訓練深度網絡吧,現在好的初始化策略、Batch Normalization、殘差連接啥的都很有效了……
那自編碼器豈不是隻有數據去噪、爲進行可視化而降維這兩個可應用的點了!配合適當的維度和稀疏約束,自編碼器可以學習到比PCA等技術更有意思的數據投影。
當然了,變分自編碼器用於生成模型還是挺好的!
1.簡介
自編碼器是一類在半監督學習和非監督學習中使用的人工神經網絡。
功能: 通過將輸入信息作爲學習目標,對輸入信息進行表徵學習。可應用於降維、降噪、異常值檢測、數據生成、深度神經網絡的預訓練,包含卷積層的可被應用於計算機視覺問題,包括圖像降噪、神經風格遷移等 。
結構: 編碼器(encoder)和解碼器(decoder)。輸入神經元和輸出神經元的個數相等,輸出是在設法重建輸入,損失函數是重建損失。
特點: 是一種數據壓縮算法。
- 數據相關的(data-specific),只能壓縮類似於訓練集的數據。
- 有損的,解壓縮的輸出與原來的輸入相比是退化的。
- 從數據樣本中自動學習的,這意味着很容易對指定類的輸入訓練出一種特定的編碼器,而不需要完成任何新工作。
按學習範式分類: 前兩者是判別模型、後者是生成模型
- 收縮自編碼器(Undercomplete autoencoder)
- 正則自編碼器(Regularized autoencoder)
- 變分自編碼器(Variational AutoEncoder, VAE)
按構築類型分類:
- 前饋結構的神經網絡
- 遞歸結構的神經網絡
不完備自編碼器(undercomplete autoencoder):內部表示(隱層的輸出)的維度小於輸入數據。
自編碼器吸引了一大批研究和關注的主要原因之一是很長時間一段以來它被認爲是解決無監督學習的可能方案,即大家覺得自編碼器可以在沒有標籤的時候學習到數據的有用表達。再說一次,自編碼器並不是一個真正的無監督學習的算法,而是一個自監督的算法。自監督學習是監督學習的一個實例,其標籤產生自輸入數據。要獲得一個自監督的模型,你需要想出一個靠譜的目標跟一個損失函數,問題來了,僅僅把目標設定爲重構輸入可能不是正確的選項。基本上,要求模型在像素級上精確重構輸入不是機器學習的興趣所在,學習到高級的抽象特徵纔是。事實上,當你的主要任務是分類、定位之類的任務時,那些對這類任務而言的最好的特徵基本上都是重構輸入時的最差的那種特徵。
2.最簡單的自編碼器
一個全連接的編碼器和解碼器,學到的是PCA的近似。
3.稀疏自編碼器
對隱層單元施加稀疏性/正則性約束的話,會得到更爲緊湊的表達,只有一小部分神經元會被激活。所以模型過擬合的風險降低。
2.棧式自編碼器Stacked Autoencoders
定義: 有多個隱層的自編碼器,即把自編碼器疊起來。
Q:增加隱層可以學到更復雜的編碼,但千萬不能使自編碼器過於強大。
A:想象一下,一個Encoder過於強大,它僅僅是學習將輸入映射爲任意數,然後Decoder學習其逆映射。很明顯,這一自編碼器可以很好的重建數據,但它並沒有在這一過程中學到有用的數據表示,也不能推廣到新的實例。
2.1.訓練方式
2.1.1.捆綁權重,直接訓練整個棧式自編碼器
前提: 自編碼器的層次是嚴格軸對稱的(如上圖)。
實現: 將Decoder層的權重捆綁到Encoder層。
好處: 使得模型參數減半,加快了訓練速度,降低了過擬合風險。
假設自編碼器一共有層(不算輸入層),表示第層的權重。即,第一層是第一個隱層,第層是編碼層,第層是輸出層)。則,Decoder層的權重可以表示爲。
注意: 偏置項不會捆綁。
2.1.2.多次訓練,一次訓練一個淺層自編碼器
方法: 訓練多個淺層的自編碼器,然後再將它們合併爲一體,這樣要快得多。
實現方法1: 使用這種方式,可創建很深的棧式AE。
- 第一個自編碼器:重建輸入。
- 第二個自編碼器:重建第一個自編碼器隱層的輸出。
- 整合這兩個自編碼器。
實現方式2:
- 中間:完整的棧式編碼器,在訓練完成之後可以使用。
- 左側:是最先需要訓練的,它跳過第二和第三個隱層,直接創建一個輸出層。這個輸出層與棧式自編碼器的輸出層共享同樣的權重和偏置。
- 右側:隨後訓練。它使得第三個隱層的輸出與第一個隱層的輸出儘可能的接近。
2.2.使用棧式自編碼器進行無監督預訓練
如果我們要處理一個複雜的有監督學習問題又沒有足夠的標註數據,一個解決方案是找到一個解決類似任務的訓練好的模型,複用低層。
類似的,如果有一個很大的數據集但絕大部分是未標註數據,可以使用所有的數據先訓練一個棧式自編碼器,然後複用低層來完成真正的任務。
3.去噪自編碼器
目的: 強制自編碼器學習有用特徵。防止自編碼器簡單的將輸入複製到輸出,提取出數據中有用的模式。
實現方式1: 對輸入增加噪聲(如高斯噪聲),通過訓練之後得到無噪聲的輸出。
實現方式2: 隨機丟棄輸入層的某個特徵,類似於dropout。
4.卷積自編碼器:用卷積層搭建
在現實中,用於處理圖像的自動編碼器幾乎都是卷積自動編碼器。
編碼器:卷積層、MaxPooling層(空域下采樣)
解碼器:卷積層、上採樣層
5.序列到序列的自動編碼器
如構造基於LSTM的自編碼器:首先用一個LSTM的編碼器來將輸入序列變爲一個向量,然後將這個向量重複N次,然後用LSTM的解碼器將這個N步的時間序列變爲目標序列。
典型:seq2seq模型
- 編碼器:處理序列輸入並壓縮信息到一個固定長度的上下文向量中(sentence embedding)。上下文向量被當做是輸入序列的語義概要。
- 解碼器:由上下文向量初始化,並每次產生一個轉碼輸出。早期的研究僅使用編碼網絡的最後一個狀態作爲下次解碼的初始狀態。
固定長度上下文向量具有一個明顯的致命缺點:無法記憶長句子。一旦完成編碼器輸入序列的處理,就會遺忘開始的部分。因此注意力機制(Bahdanau et al., 2015)被提出,解決這個問題。
6.變分自編碼器:編碼數據的分佈
VAE爲碼字施加約束,是使編碼器學習到輸入數據的隱變量模型。
隱變量模型是連接顯變量集和隱變量集的統計模型,隱變量模型的假設是顯變量是由隱變量的狀態控制的,各個顯變量之間條件獨立。
也就是說,變分編碼器不再學習一個任意的函數,而是學習你的數據概率分佈的一組參數。通過在這個概率分佈中採樣,你可以生成新的輸入數據,即變分編碼器是一個生成模型。
工作原理:
- 建立編碼網絡,將輸入影射爲隱分佈的參數: 編碼器網絡將輸入樣本x轉換爲隱空間的兩個參數,記作z_mean和z_log_sigma。
- 然後從這些參數確定的分佈中採樣,這個樣本相當於之前的隱層值: 隨機從隱藏的正態分佈中採樣得到數據點z,這個隱藏分佈我們假設就是產生輸入數據的那個分佈。,是一個服從正態分佈的張量。
- 最後,將採樣得到的點映射回去重構原輸入: 使用解碼器網絡將隱空間映射到顯空間,即將z轉換回原來的輸入數據空間。
需要實例化三個模型:
- 一個端到端的自動編碼器,用於完成輸入信號的重構
- 一個用於將輸入空間映射爲隱空間的編碼器
- 一個利用隱空間的分佈產生的樣本點生成對應的重構樣本的生成器
使用端到端的模型訓練,參數集由兩個損失函數來訓練:
- 重構損失函數:要求解碼出來的樣本與輸入的樣本相似(與之前的自編碼器相同)
- 學習到的隱分佈與先驗分佈的KL距離,作爲一個正則。實際上,把這項損失函數去掉也可以,儘管它對學習符合要求的隱空間和防止過擬合有幫助。
Python實現:
參考
https://blog.csdn.net/qq_19707521/article/details/78740986
https://www.cnblogs.com/royhoo/p/Autoencoders.html