---
# System prepended metadata

title: 'Unsupervised Learning: Deep Auto-encoder'
tags: [李宏毅]

---

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)
