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)