Unsupervised Learning: Deep Auto-encoder === ###### tags: `李宏毅` ## 教材 * [pdf](https://drive.google.com/file/d/1SdoHnlhWKcjsLT6K-z444zCk5Ps1OfCL/view?usp=sharing) * [youtube](https://www.youtube.com/watch?v=Tk5B4seA-AU&ab_channel=Hung-yiLee) ## Auto-encoder 以辨識手寫數字為例,NN Encoder 的概念就是把圖片當輸入,訓練 NN Encoder 產生一段 Code;訓練 NN Decoder 則相反,輸入一段 Code 要輸出一張圖片。但是因為 Code 未知,所以無法單獨訓練 NN Encoder、Decoder,然而可以一起訓練。 ![](https://i.imgur.com/XzOQqhI.png) 從 PCA 開始解釋,最後會得到矩陣 W,當輸入為 X 時,WX 就是 Encode,輸出就是 Code;Decode 時則是乘以 $W^T$ 變成 $\hat{x}$。下圖中間是 Hidden Layer,也稱 Bottleneck Layer,因為維度下降。 ![](https://i.imgur.com/5RjpL6R.png) ## Text Retrieval Auto-encoder 可以用在搜尋引擎,把文章和搜尋詞的 Bag-of-word 向量壓成二維,透過比對兩者的相似度來分析搜尋結果。用二維圖表示,結果會發現文章們的分布會像是下圖呈現的一朵花,如果用 LSA 就達不到相同效果。 ![](https://i.imgur.com/4i7ytRq.png) ## Similar Image Search Auto-encoder 還可以做相似圖搜尋,把每張圖片變成一段 Code,比對兩者的相似度。 ![](https://i.imgur.com/WvudF4I.png) ## Pre-training DNN 訓練前,要初始化一些參數,但是很多時候會不知道要設多少,這時可以使用 Auto-encoder。 一開始假設輸入 784 維,訓練一個轉成 1000 維的 Auto-encoder $W^1$;再來訓練一個轉成 1000 維的 Auto-encoder $W^2$;然後訓練一個轉成 500 維的 Auto-encoder $W^3$。$W^1, W^2, W^3$ 就是 Initailzation。 最後隨機初始化轉成 10 維的 $W^4$,再用 Backpropagation 做 Fine-tune。這在有大量的 Unlabeld Data 時是有用的。 ![](https://i.imgur.com/XMiRTAA.png) ## Auto-encoder for CNN 簡單來說,CNN 怎麼訓練的就怎麼轉回去。例如做 Convolution 就改作 Deconvolution,Pooling 則是改做 Unpooling。 ![](https://i.imgur.com/kXxBEzU.png) ### Unpooling 原本 Pooling 可能是從四塊相鄰的 Pixel 變成一塊,那 Unpooling 就是把剩下的那一塊再擴散變成四塊。Unpooling 在不同套件有不同做法,Keras 是直接補相同的值;也有的是記錄當初 Pooling 是從哪一個 Pixel 取值,那在 Unpooling 時就把原本位置的值填回去,其他填 0。 ![](https://i.imgur.com/CLeGu1x.png) ### Deconvolution 其實就是在做 Convolution,假設目前的 Convolution 把 5 維變 3 維,那 Deconvolution 就是把 3 維變 5 維,而 3 維變 5 維這個步驟可以想成是在輸入的 3 維兩邊 Padding 0 再做 Convolution。 ![](https://i.imgur.com/D8nNS1u.png)