[DL]Attention Mechanism學習筆記

Posted by John on 2019-11-23
Words 1.1k and Reading Time 4 Minutes
Viewed Times

這篇是之前自己在學習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
  1. attention weights: 每次都用當下decoder的hidden state$h_t$去對所有encoder的hidden state進行score function,得出$h_t$對每個$h_s$的重要程度
  2. context vector: 透過attention weight和原本的$h_s$做weight averaging
  3. attention vector: 將context vector和decoder的hidden state做concat並做一個nonlinear-transformation

討論

  • 這裏的attention是關注decoder的output對於encoder的input重要程度,不同於Transformer的self-attention是指關注同一個句子中其他位置的token的重要程度(後面會介紹)
  • 整體的架構仍然是基於RNN的Seq2Seq,RNN很大一個缺點是不能parallelization

Transformer

Attention Is All You Need

  • RNN的優點是可以引入長時間的資訊,但缺點是很難平行化
  • 可以透過深層的CNN使得包含相同的資訊量,但缺點是CNN要疊很多層
  • self-attention可以包含長期的資訊,並且可以平行化

完整的transformer架構:

Self-attention

  1. 對input $x$做embedding
    • $X’ = WX$
  2. 將相同的$X$分成三份,每一份乘上不同的矩陣得到$Q,K,V$
    • $X’ \times W_Q = Q$
    • $X’ \times W_K = K$
    • $X’ \times W_V = V$
  3. 透過score和$Q, K$計算attention weights
    • $softmax(\frac{Q \times K^T}{\sqrt{d}})$
    • $d$是$Q$和$K$的維度,因為$Q$和$K$會隨著dimension變大使得variance越大,所以做一點scaled
  4. 透過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之間對應的重要性

Reference


>