天天看點

4. Stacked AutoEncoder(堆棧自動編碼器)

1. AutoEncoder介紹

2. Applications of AutoEncoder in NLP

3. Recursive Autoencoder(遞歸自動編碼器)

4. Stacked AutoEncoder(堆棧自動編碼器)

1. 前言

深度學習的威力在于其能夠逐層地學習原始資料的多種表達方式。每一層都以前一層的表達特征為基礎,抽取出更加抽象,更加适合複雜的特征,然後做一些分類等任務。

堆疊自編碼器(Stacked Autoencoder,SAE)實際上就是做這樣的事情,如前面的自編碼器,稀疏自編碼器和降噪自編碼器都是單個自編碼器,它們通過虛構一個\(x->h->x\)的三層網絡,能過學習出一種特征變化\(h = f(wx+b)\)。實際上,當訓練結束後,輸出層已經沒有什麼意義了,我們一般将其去掉,即将自編碼器表示為:

4. Stacked AutoEncoder(堆棧自動編碼器)

2. SAE原理

之前之是以将自編碼器模型表示為3層的神經網絡,那是因為訓練的需要,我們将原始資料作為假想的目标輸出,以此建構監督誤差來訓練整個網絡。等訓練結束後,輸出層就可以去掉了,因為我們隻關心的是從\(x\)到\(h\)的變換。

接下來的思路就很自然了,我們已經得到特征表達\(h\),那麼我們可不可以将\(h\)再作為原始資訊,訓練一個新的自編碼器,得到新的特征表達呢?當軟可以,而且這就是所謂的堆疊自編碼器(Stacked Autoencoder,SAE)。Stacked就是逐層堆疊的意思,這個跟“棧”有點像。當把多個自編碼器Stack起來之後,這個系統看起來就像這樣:

4. Stacked AutoEncoder(堆棧自動編碼器)

2.1 第一層AE

這樣就把自編碼器改成了深度結構了,即《learning multiple levels of representation and abstraction》(Hinton, Bengio, LeCun, 2015)。需要注意的是,整個網絡的訓練不是一蹴而就的,而是逐層進行的。比如說我們要訓練一個\(n -> m -> k\) 結構的網絡,實際上我們是先訓練網絡\(n -> m -> n\),得到\(n -> m\)的變換,然後再訓練\(m -> k -> m\)網絡,得到\(m -> k\)的變換。最終堆疊成SAE,即為\(n -> m -> k\)的結果,整個過程就像一層層往上面蓋房子,這就是大名鼎鼎的 layer-wise unsuperwised pre-training (逐層非監督預訓練)。

接下來我們來看一個具體的例子,假設你想要訓練一個包含兩個隐藏層的堆疊自編碼器,用來訓練 MNIST 手寫數字分類。

首先,你需要用原始輸入\(x(k)\)訓練第一個稀疏自編碼器中,它能夠學習得到原始輸入的一階特征表示\(h(1)(k)\),如下圖所示:

4. Stacked AutoEncoder(堆棧自動編碼器)

2.2 第二層AE

接着,你需要把原始資料輸入到上述訓練好的稀疏自編碼器中,對于每一個輸入\(x(k)\),都可以得到它對應的一階特征表示\(h(1)(k)\)。然後你再用這些一階特征作為另一個稀疏自編碼器的輸入,使用它們來學習二階特征\(h(2)(k)\),如下圖:

4. Stacked AutoEncoder(堆棧自動編碼器)

2.3 第三層

同樣,再把一階特征輸入到剛訓練好的第二層稀疏自編碼器中,得到每個\(h(1)(k)\)對應的二階特征激活值$h(2)(k) $。接下來,你可以把這些二階特征作為softmax分類器的輸入,訓練得到一個能将二階特征映射到數字标簽的模型。如下圖:

4. Stacked AutoEncoder(堆棧自動編碼器)

2.4 組合

最終,你可以将這三層結合起來建構一個包含兩個隐藏層和一個最終softmax分類器層的堆疊自編碼網絡,這個網絡能夠如你所願地對MNIST資料集進行分類。最終模型如下圖:

4. Stacked AutoEncoder(堆棧自動編碼器)

3. 總結

為什麼逐層預訓練的SAE有不錯的效果?一個直覺的解釋是,預訓練好的網絡在一定程度上拟合了訓練資料的結構,這使得整個網絡的初始值是在一個合适的狀态,便于有監督階段加快疊代收斂。當然,有不少研究提出了很好的初始化政策,再加上現在常用的dropout、ReLU,直接去訓練一個深層網絡已經不是問題。

最後,多說一句,除了AE和SAE這種逐層預訓練的方式外,還有另外一條類似的主線,即限制玻爾茲曼機(RBM)與深度信念網絡(DBN)。