DL入門 2 自編碼器 AutoEncoder

2021-10-16 05:37:34 字數 3666 閱讀 4175

寫在前面:看****綜述時,面臨這樣乙個問題:很多dl的方法只是會簡單運用,卻不是特別了解其詳細原理,故針對cnn、rnn、lstm、autoencoder、rbm、dbn以及dbm分別做一些簡單總結,以達到了解的目的,此篇為autoencoder。

2.自編碼器分類

3 損失函式的設計

自動編碼器是一種無監督的資料維度壓縮和資料特徵表達方法。在大部分提到自動編碼器的場合,壓縮和解壓縮的函式是通過神經網路實現的。

乙個簡單的自編碼器結構如下所示:

可以看到上述結構只有乙個隱藏層,從輸入到隱藏層即為encoder(編碼器),從隱藏層到輸出即為decoder(解碼器)。

一提到降維,首先想到的肯定是主成分分析(pca),pca具體原理可以參考:降維基礎知識(樣本均值、樣本方差、中心矩陣)與pca(最大投影方差,最小重構代價,svd分解)

那麼自編碼器這麼簡單的結構如何達到降維的目的呢?我們知道,乙個最簡單的自編碼器(上圖所示)只有三層結構,編碼器將輸入進行編碼,變成中間結果,中間結果再經過解碼器還原,這種輸入等於輸出的結構沒有什麼實際意義。對於上述結構,如果我們只看左邊部分,即編碼器的部分,就很容易理解降維的原理:隱藏層神經元的數目遠低於輸入層,那麼我們就可以用更少的特徵(神經元)去表徵輸入資料,從而到降維目的。

對於樣本x,自編碼器的中間隱藏層的活性值為x的編碼,即:

自編碼器的輸出為重構的資料:

其中,w(1

),w(

2),b

(1),

b(2)

w^, w^, b^, b^

w(1),w

(2),

b(1)

,b(2

)是自編碼器網路的引數,引數經梯度下降訓練得到。

因此,搭建乙個自編碼器需要以下幾個步驟:

搭建編碼器

搭建解碼器

設定乙個損失函式

訓練輸入和輸出完全相同,即上面提到的這種。

對於很多資料來說, 僅使用兩層神經網路的自編碼器還不足以獲取一種好的資料表示。為了獲取更好的資料表示, 我們可以使用更深層的神經網路。深層神經網路作為自編碼器提取的資料表示一般會更加抽象, 能夠更好地捕捉到資料的語義資訊。

在實踐中經常使用逐層堆疊的方式來訓練乙個深層的自編碼器,稱為堆疊自編碼器(stacked auto-encoder, sae)。堆疊自編碼器一般可以採用逐層訓練(layer-wise training)來學習網路引數。

舉乙個具體的例子:

可以看到,相比於普通的自編碼器,我們將隱藏層的個數從1增加到3,其實就是三個普通自編碼器堆疊而成。

訓練過程如下:

第乙個自編碼器:784->1000->784。訓練完畢後,固定引數和中間隱層的結果,去掉輸出層和相應的權值偏置,然後將隱藏層1000作為第二個自編碼器的輸入。

第二個自編碼器:1000->1000->1000。訓練完畢後,固定引數和中間隱層的結果,去掉輸出層和相應的權值偏置,然後再將隱藏層1000作為第三個自編碼器的輸入。

第三個自編碼器:1000->500->1000。訓練完畢後,固定引數和中間隱層的結果,去掉輸出層和相應的權值偏置。

在第三個自編碼器隱藏層後面加乙個分類器(softmax),進行解碼恢復。

三個自編碼器訓練完畢後,最後要進行的是整體的反向調優訓練,即整體網路使用反向傳播進行訓練,對引數進行微調。

我們使用自編碼器是為了得到有效的資料表示, 而有效的資料表示除了具有最小重構錯誤或稀疏性等性質之外,還可以要求其具備其他性質,比如對資料部分損壞(partial destruction)的魯棒性。高維資料(比如影象)一般都具有一定的資訊冗餘,比如我們可以根據一張部分破損的影象聯想出其完整內容。因此, 我們希望自編碼器也能夠從部分損壞的資料中得到有效的資料表示, 並能夠恢復出完整的原始資訊,降噪自編碼器便應運而生。

降噪自編碼器(denoising auto-encoder)就是一種通過引入雜訊來增加編碼魯棒性的自編碼器。

工作原理

對於乙個向量x

xx,我們首先根據乙個比例μ

\muμ將x的某些維度設定為0,得到乙個被損壞的向量x

^\hat

x^,要注意,損壞比例一般不超過0.5,另外,也可通過引入高斯雜訊來損壞資料。

我們把損壞的資料x

^\hat

x^送給自編碼器的輸入端,並要求它通過編碼+解碼兩個步驟重構出無損的原始輸入。那麼當輸入乙個沒有經過損壞的資料時,我們就能將其恢復到更理想的狀態。

因此,降噪自編碼器的思想十分簡單, 通過引入雜訊來學習更魯棒性的資料編碼,並提高模型的泛化能力。

一般來說,自編碼器的隱層節點數小於輸入層的節點數,比如前面所述,為了達到降維的目的,一般使隱藏層神經元個數小於輸入層神經元個數。但假設我們並不限制隱藏層神經元個數,而是限制了其中一部分神經元的活性,如下所示:

隱藏層中,淺藍色的神經元被抑制了活性。

稀疏自編碼器的目標函式中我們加入了乙個正則化項,用於防止過擬合,如下所示:

其中z= [z(1), ⋯ , z(n)]表示所有訓練樣本的編碼,ρ(z

)\rho(z)

ρ(z)

為稀疏性度量函式,?表示自編碼器中的引數。

一般而言,我們不會指定隱層表達h中哪些節點是被抑制的,而是指定乙個稀疏性引數ρ,代表隱藏神經元的平均活躍程度(在訓練集上取平均)。比如,當ρ=0.05時,可以認為隱層節點在95%的時間裡都是被抑制的,只有5%的機會被啟用。

欠完備自編碼器為了得到有用資訊,會限制編碼維度小於輸入維度,因為隱層編碼維數小於輸入維數,可以學習資料分布中最顯著的特徵。

但是,若中間隱層單元數特別少,則其表達資訊有限,會導致重構過程比較困難。

普通自編碼器訓練目的就是為了使得輸入等於輸出,因此,損失函式loss可以設計如下:

公式中各項意義一目了然,不再解釋。

給自編碼器中隱藏層單元加上稀疏性限制,在學習的過程中,均方誤差可能變得很小,這樣會導過擬合,而我們期望的是乙個泛化能力很強的編碼器,所以我們加入l1正則化來抑制過擬合。

目標函式設計如下:

最後一項為正則化項,中間為稀疏操作。

自編碼器(AutoEncoder

本文講述自編碼器 auto encoder,下文簡稱ae 將按照以下的思路展開講解,力圖使得初學者能看懂其中要義。目錄如下 1.ae的基本原理 2.ae的用途 3.基於mnist資料集的ae的簡單python實現 ae,是神經網路模型的一種,是一種全連線網路模型,而且進行無監督學習,下圖是簡單的ae...

自編碼器簡介

autoencoder,中文譯名自編碼器。主要用於特徵提取,可以理解為一種基於神經網路的壓縮 降維演算法,和pca等類似。自編碼器為一種有損壓縮演算法,通過壓縮 編碼 獲得資料等抽象特徵,並可以通過解壓縮 解碼 將抽象特徵盡可能地還原成原始資料。因此,根據原ppt中對自編碼器 學習使用者高度抽象的特...

了解自編碼器

1.什麼是自編碼器?自動編碼器是一種無監督的機器學習演算法,該演算法將影象作為輸入並使用較少的位數來重建它。這聽起來像是影象壓縮,但是自動編碼器和通用影象壓縮演算法之間的最大區別在於,在自動編碼器的情況下,壓縮是通過學習訓練資料集來實現的。當影象類似於所使用的訓練集時,雖然可以實現合理的壓縮,但是自...