先從Auto Encoder開始
- 透過兩組神經網路學習資料的特徵表示法
- 透過decoder盡可能還原輸入
Intro
由很多部件組成,部件形成一些Block (encoder block, decoder block),堆疊這些block形成encoder, decoder
Encoder & Decoder + Attention
Encoder接收序列資料,透過位置編碼輸入模型,並產生Context Vector
Decoder接收右移過的decoder輸出 (自回歸),並結合Encoder的Context Vector (注意力)
Embedding
- Word Embedding : Bagging / Word2Vec
- Positional Embedding : 可以用訓練或是公式
- $PE_{(pos, 2i)} = \sin(pos / 10000^{2i / d_{model}})$
- $PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i / d_{model}})$
最後將兩者相加,得到輸入的向量表示法,用來餵給Transformer
Attention
Scaled Dot-Product Attention
- QKV矩陣 (Query, Key, Value)
- 最終的Attention Score是Value的加權和
- Value為Key與Query的相似度,而不同的Q會產出不同的注意力 (Query Driven)
$$ \text{Attention}(Q, K, V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V $$
- $QK^T$ : 相似度
- ${1}/{\sqrt{d_k}}$ : 縮放,用來防止梯度消失
- $\text{softmax}(\cdot) V$ : 算出權重 (Softmax 歸一化) + 得到最終輸出
Multi-Head Attention
- 先把$Q, K, V$ 投影,再做$h$次注意力(投影到$h$個子空間)
- 算完之後做Concat,接著線性變換回原本的空間
$$ \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, …, \text{head}_h)W^O $$
- 模型去學習$W_i^Q, W_i^K, W_i^V$,還有$W^O$ (最後的線性變換) 的參數
Masked Attention
- 避免模型看到之後的資料
- 乘上一個非常小的權重,讓Softmax輸出為0
Add & Norm
- 殘差連接 (學習輸出不變的可能性)
- 提升泛化能力
$$ \text{LayerNorm}(X + \text{MultiHeadAttention}(X)) $$
Feed Forward
- 兩層FC,第一層是ReLU,第二層不激活 $$ \text{LayerNorm}(X + \text{FeedForward}(X)) $$
Decoder Attention
1 : Masked Multi-Head Attention
- 讓模型只使用之前的資訊 (根據之前的翻譯,推得現在的翻譯)
- 做$QK^T$的計算,然後在Softmax之前進行Mask
2 : Multi-Head Attention
- 這邊接入了Encoder的輸出$C$
- 根據$C$算出$K$, $V$
- 根據上一個Block的輸出計算$Q$
- 這邊接入編碼器的輸出,是從原文得來的,所以不用Mask
3 : FC + Softmax
- 經過Feed Forward後進入FC
- FC做線性變換投影到詞彙表
- 輸出矩陣做Softmax,因為Mask所以每一行對應那個位置的單字
- 最後的機率拿來做預測
與CNN的比較
- CNN一次只能看一個Window, Transformer可以看到全局資料
- CNN的多通道也可以用多頭注意力來模擬