autoencoder可以用於數據壓縮、降維,預訓練神經網絡,生成數據等等。
autoencoder的架構
autoencoder的架構是這樣的:
需要分別訓練一個Encoder和一個Decoder。
比如,一張數字圖片784維,放入Encoder進行壓縮,編程code,通常要小於原來的784維;
然后可以將壓縮后的code,放入Decoder進行reconsturct,產生和原來相似的圖片。
Encoder和Decoder需要一起進行訓練。
下面看看PCA對於數據的壓縮:
輸入同樣是一張圖片,通過選擇W,找到數據的主特征向量,壓縮圖片得到code,然后使用W的轉置,恢復圖片。
我們知道,PCA對數據的降維是線性的(linear),恢復數據會有一定程度的失真。上面通過PCA恢復的圖片也是比較模糊的。
所以,我們也可以把PCA理解成為一個線性的autoencoder,W就是encode的作用,w的轉置就是decode的作用,最后的目的是decode的結果和原始圖片越接近越好。
現在來看真正意義上的Deep Auto-encoder的結構。通常encoder每層對應的W和decoder每層對應的W不需要對稱(轉置)。
從上面可以看出,Auto-encoder產生的圖片,比PCA還原的圖片更加接近真實圖片。
上面是使用PCA和autoencoder對於數字圖片壓縮后的可視化結果,明顯autoencoder的區分度更高。
De-noising auto-encoder
為了讓aotoencoder訓練的更好,更加robust,我們在訓練的時候加入一些noise,這就是De-noising auto-encoder。
examples
接下來再看兩個例子。
文本檢索,簡單的詞袋模型,將文本轉化成詞向量。
當搜索的詞和文本向量角度越接近,就說明內容越相關。
將詞向量放入autoencoder中進行壓縮,得到code,內容相近的文本,code也越接近。
不同主題的文本被明顯的分開,得到右上的2維圖像。
搜索圖片的相似性。
搜索紅框中的邁克傑克遜的照片,下面是使用像素點之間的歐式距離得到的搜索結果。
下面使用autoencoder編碼后的code,進行相似性的搜索結果。
使用CNN實現autoencoder
經過多次convolution和pooling后的code,可以再經過deconvolution和unpooling恢復。
下面將如何實現unpooling和deconvolution。
在maxpooling時,需要記住max值在圖片中的位置。
當進行unpooling時,把小的圖片做擴展,先把max值恢復到之前的位置,然后在之前進行maxpooling的field內的像素都置為0.
接下來看Deconvolution
現在假設一個field里面有3個像素點,每個filter的3個weight作用下得到一個output,如圖左。
而deconvolution就是要讓這3個output復原成原來那么多的點,一個output變成3各點,把重疊的點加起來,如圖中。
現在,將3個output進行擴展,給擴展的點的值為0,然后就依然做convolution,還是可以得到和圖中相同的結果。
所以,deconvolution其實就是convolution。
最后,我們可以使用autoencoder壓縮后的code,輸入到decoder里,得到一張新的圖像,如下所示。