---
# System prepended metadata

title: auto encoder 可以分為兩個部分，分別是encod

---

auto encoder 可以分為兩個部分，分別是encoder和decoder，而為了瞭解encoder和decoder的原理，我去看了transformer的原理，而我又發現transformer和self-attention息息相關，因此我將先從self-attention 介紹。
### self-attention
是用來處理，network 的輸入是一排向量（vector set）的情況，可能是句子、聲音，或是可以改變長度的向量。
而輸出總共會有三種情況，分別是：
(1)有多少輸入的 vector，就有多少輸出的 vector
(2)一整個 sequence 只有一個 label 的輸出
(3)不知道輸出多少 label，機器要自己去決定，這又稱為 sequence-to-sequence
這邊以第一種情況為例
![image](https://hackmd.io/_uploads/Sy0K4Q7G0.png)
怎麼產生b1呢，先找出 a1 與其他 vector 各個的相關性，利用 α 來表示，
![image](https://hackmd.io/_uploads/SJACEX7M0.png)
算相關性有很多種方法，較常見的有dot product 和additive
![image](https://hackmd.io/_uploads/ByPWB7XMR.png)
![image](https://hackmd.io/_uploads/SJUMrXmfA.png)
這邊使用dot product
![image](https://hackmd.io/_uploads/SJKm8QmMC.png)
![image](https://hackmd.io/_uploads/H1-N8mXM0.png)
再來根據 α’，抽取 sequence 的重要資訊，首先將 a*Wv 得到 v 再乘以 α’ 做加總得到 b
根據 α’（attention score）我們可以知道哪些向量和a有關，而
b2 b3 b4 也可以用相同的方式來得到，經過觀察，我們可以發現其實這一連串的運算只是矩陣乘法而已。

![image](https://hackmd.io/_uploads/H1FaDXQG0.png)
Multi-head Self-attention算是Self-attention的延伸， 透過計算更多的聯性來希望做出更佳的結果，但代價是計算量變大
![image](https://hackmd.io/_uploads/BJ9WOQQfA.png)
![image](https://hackmd.io/_uploads/S1iMOmXfR.png)
原先的Self-attention是不包含label的位置的，因此 Positional Encoding 是為每個位置加上獨特的 vector（可以是sin or cos funciton）

而這邊有一個有趣的發現，self-attention 也可以用在影像辨識上，CNN 其實就是 self-attention 的一種特例，
CNN only consider the receptive field but self-attention consider the relationship between all pixels，
CNN的彈性較少，比較不會 overfitting，但在訓練資料多時，沒有辦法在其中得到好處!但self-attention所需的資料量太大
![image](https://hackmd.io/_uploads/rJazFXmGC.jpg)

稍微介紹self-attention後，我接下來要介紹transformer
Transformer 就是 Sequence-to-sequence(Seq2seq) 的 Model，特色是 Input a sequence, output a sequence, output length is determine by model.

Seq2seq model 可以分為 Encoder 和 Decoder 兩個部份。


![image](https://hackmd.io/_uploads/Byr6tm7f0.png)

Encoder 簡單來說就是輸入一排向量，輸出一排向量 ( 其實 CNN. RNN 也可以做到)，更細一點說，一個 Encoder是由很多 Block 所組成，每個 Block 所做的事情就是輸入一排向量做 Self-attention，考慮整個 Sequence 的資訊，然後做 Fully connect network，輸出另一排向量，此向量是另一個 Block 的輸入

![image](https://hackmd.io/_uploads/SkxrsX7M0.png)

在原始論文中，Seq2Seq 的 Block，輸入一排向量，做完 Self-attention 後，得到考慮所有 vector 的資訊後的輸出，還要加上原始輸入向量，這也稱為 Residual connection，再做 Layer normalization (非 Batch normalization)，結果為 Fully connection network 的輸入，Fully connection network 也有 Residual connection 的架構，再做 Layer normalization ，這才是一個 Encoder 一個 block 的輸出
![image](https://hackmd.io/_uploads/BkMviQ7GA.png)

Layer normalization 就是對同個 Sample(Feature) 的不同 Dimension 計算 Standard deviation(σ) 和 Mean，與 Batch normalization 不同是，它是對不同 Sample(Feature) 的同一個 Dimension 去計算 Standard deviation(σ) 和 Mean。

Encoder 編碼完會傳給 Decoder ，分為兩種，比較常見的為 Autoregressive(AT)，另一種 Decoder是 Non-autoregressive(NAT)
先介紹AT
Encoder 的 Self-attention 和 Decoder 的 Masked self-attention 有什麼不同呢?
![image](https://hackmd.io/_uploads/SJazam7MA.png)
因為輸入的向量a1 a2 a3 a4 是一個個被輸入進去的而不是一起被輸入
接下來是NAT，他是一個步驟產生完整的句子，好處是平行化，較快，可以自己決定 Decoder 的輸出的長度，但通常壞於 AT，這是因為 Multi-modality。
大部分都是用AT，因為performance比較好


而這邊有一個地方是我剛剛沒有提到的，就是encoder是如何給decoder資料的呢？ 是用一種叫cross attention 的技術，流程如下
![image](https://hackmd.io/_uploads/rJFGC7mGC.png)
![image](https://hackmd.io/_uploads/H19QCQmMC.png)

最後，我們開始介紹auto encoder的原理，
首先Auto-encoder 也是self-supervised 中的一環，而self-supervised learning是指從沒有標註的資料去學習，或稱為 pre-training
將這些沒有標註，去訓練的資料，downstream 去下游去做運算就是 self-supervised(BERT. GPT…)。
![image](https://hackmd.io/_uploads/B1XqkEQfR.png)
auto-encoder 應用在圖片上就是其中一種，我們希望encoder 的輸入和 decoder 的輸出越接近越好，如果輸入是一個向量的話，就會希望 encoder 的輸入和 decoder 的輸出向量之間的距離越接近越好，也有人說這是 reconstruction，因為這個過程不需要標註的資料，只需要收集大量的圖片就好，所以這是一個 unsupervised 的方法，encoder 的輸出有人稱為 embedding 或representation 或 code
![image](https://hackmd.io/_uploads/rySZlV7MA.png)
而這個流程其實跟cycle gan 是十分相像的
![image](https://hackmd.io/_uploads/SkfNxEXfC.png)
因為圖片的變化是有限的，所以可以化繁為簡來表示，而我的理解是在輸入的向量經過encoder之後，所產生的ouput vector contains many input image的重要資訊（feature），因此我認為encoder有特徵提取（extracted feature）的作用，提取了特徵的向量後再交給decoder reconstruct，
![image](https://hackmd.io/_uploads/ByyHZNXGA.jpg)

除此之外，由於所提取到的特徵向量是纏繞在一起的，有一種技術是feature disentangle 可以知道embedding 的每一個dimension 代表什麼資訊

![image](https://hackmd.io/_uploads/r1Y-GVQfR.jpg)

而我們也可以發現，auto-encoder 後半段，就是一個 generator，再經過一些修改就是 VAE。
![image](https://hackmd.io/_uploads/rJNbXVXG0.png)
