這篇是之前自己在學習NLP的attention筆記,整理了網路上不少覺得不錯的資源分享給大家,會從Seq2seq開始,講述attention基本的概念,並如何利用attention融合在seq2seq,最後在講述NLP無人不知無人不曉的”Attention is all you need”這篇的概念(Transfromer)。
Seq2Seq
- 基於encoder-decoder的RNN架構
- 透過encoder產生context vector,然後透過decoder將context vector和前一個輸出結合來預測下一個時間點的輸出
- 目標函數:
- 缺點: 把任意長度的input encode成一個global context vector,當input長的時候很難囊括所有info
Seq2Seq with attention
Effective Approaches to Attention-based Neural Machine Translation
- 注意力機制: 透過attention weight產生動態的context vector
- 每一個decoder的hidden state都會有不同的context vector
Algorithm
- 輸入:
- 輸出:
- encoder的hidden state
- decoder的hidden state
- attention weights: 每次都用當下decoder的hidden state$h_t$去對所有encoder的hidden state進行score function,得出$h_t$對每個$h_s$的重要程度
- context vector: 透過attention weight和原本的$h_s$做weight averaging
- attention vector: 將context vector和decoder的hidden state做concat並做一個nonlinear-transformation
討論
- 這裏的attention是關注decoder的output對於encoder的input重要程度,不同於Transformer的self-attention是指關注同一個句子中其他位置的token的重要程度(後面會介紹)
- 整體的架構仍然是基於RNN的Seq2Seq,RNN很大一個缺點是不能parallelization
Transformer
- RNN的優點是可以引入長時間的資訊,但缺點是很難平行化
- 可以透過深層的CNN使得包含相同的資訊量,但缺點是CNN要疊很多層
- self-attention可以包含長期的資訊,並且可以平行化
完整的transformer架構:
Self-attention
- 對input $x$做embedding
- $X’ = WX$
- 將相同的$X$分成三份,每一份乘上不同的矩陣得到$Q,K,V$
- $X’ \times W_Q = Q$
- $X’ \times W_K = K$
- $X’ \times W_V = V$
- 透過score和$Q, K$計算attention weights
- $softmax(\frac{Q \times K^T}{\sqrt{d}})$
- $d$是$Q$和$K$的維度,因為$Q$和$K$會隨著dimension變大使得variance越大,所以做一點scaled
- 透過attentnion weights和$V$做weighting average
- $Z = softmax(\frac{Q \times K^T}{\sqrt{d}})\cdot V$
- 這些矩陣運算可以透過GPU來加速
multi-head attention
- $Q, K, V$可以有多個,使得不同的attention關注不同的地方
- 最後會有多個$Z$,可以把他們concat起來,也可以做一個線性轉換進行降維$Z\cdot W_Z=Z’$
Position Encoding
- 對於self-attention來說,input的token位置是無關的,因為每個token都會跟前後的所有token做attention
- 所以必須加入position information,直觀的想法是想辦法讓被加入位置編碼的 word embedding 在$d_{model}$維度的空間裡頭不只會因為語義相近而靠近,也會因為位置靠近而在該空間裡頭靠近。
公式為:
- $PE(pos, 2i)=sin(\frac{pos}{10000^{2i/d_{model}}})$
- $PE(pos, 2i+1)=cos(\frac{pos}{10000^{2i/d_{model}}})$
畫出來的圖長這樣:
論文裡頭提到他們之所以這樣設計位置編碼(Positional Encoding, PE)是因為這個函數有個很好的特性:給定任一位置 pos 的位置編碼 PE(pos),跟它距離 k 個單位的位置 pos + k 的位置編碼 PE(pos + k) 可以表示為 PE(pos) 的一個線性函數(linear function)。
因此透過在 word embedding 裡加入這樣的資訊,作者們認為可以幫助 Transformer 學會 model 序列中的子詞的相對位置關係。
Implementation detail
實作上,還有下列的一些需要注意的地方:
- position encoding要用add / concat?
- 兩個會被用到的mask
- padding mask使得attention不會注意到padding的地方
- look ahead mask使得decoder在做attention時不會關注到decoder產生的詞(只會往前看)
- 架構中其實還用到了skip connection的概念
- 可以透過attention weights來關注模型注重的部分,並且在decoder的第二個multi-attention的$Q,K$是來自encoder的output,所以這一個block不是self-attention架構,也因此可以透過這一個block來視覺化input和output之間對應的重要性