# Transformer 李宏毅深度學習 ###### tags: `Deep Learning`, `Transformer`, , `seq2seq`, `Attention` 筆記內容參考於:https://youtu.be/ugWDIIOHtPA ![](https://i.imgur.com/ksAM6Ey.png) RNN: - 是最經典的處理Sequence的模型,單向RNN或雙向RNN等等。 - RNN的問題:難以平行處理=>就有人提出用CNN取代RNN CNN取代RNN: - CNN filters:每一個三角形代表一個filter輸入為seq的一小段,輸出一個數值(做內積得到),不同的filter對應seq中不同的部分。 - 每一個CNN只能考慮有限的內容,RNN能考慮一整個句子 - 考慮很長的句子:疊很多層CNN,上層的filter就可以考慮較多資訊,因為上層的filter會把下層的filter的輸出當作輸入 - 問題:必須疊很多層才有辦法做到考慮較長的句子,因此出現了self-attention機制 ## Self-Attention Layer ![](https://i.imgur.com/ma6cYQP.png) ### 目的 - 想取代RNN原本想做的事情,輸入輸出同RNN,可以輸入sequence輸出sequence - 跟雙向RNN有同樣能力,可以先偷看過整個sequence,但特別的是$b^1,b^2,b^3,b^4$是同時處理的,不需要一個算完才能算下一個 - 可以完全取代RNN > 以前用RNN發表過的paper已經全部被使用self-attention機制洗一輪了......[name=Li] ### Attention機制(參考自[4]) 核心思想: - 用三元組 $<Q,K,V>$ 代表注意力機制,表示Query和Key的相似性,再根據相似性賦予Value的取值 公式: ![](https://i.imgur.com/uFNNTPY.png) ### Self-attention 思路(本文) - input: $x_1,..., x_4$,是一個sequence - 每一個輸入先通過一個embedding,乘上一個權重矩陣變成$a_1,...,a_4$,把$a_1,...,a_4$丟進Self-attention layer - 每一個輸入都乘上不同的vector:$q,k,v$ - $q$:query(為了去匹配其他人) - $q_i=W_qa_i$ - $k$:key(為了被匹配) - $k_i=W_ka_i$ - $v$:value 被抽取出來的資訊 - $v_i=W_va_i$ - 權重$W_q W_k W_v$是訓練出來的,一開始隨機初始化 ### 方法 ![](https://i.imgur.com/8zYZ7ti.png) ![](https://i.imgur.com/6zSwYDS.png) 1. 拿每個query q去對每個key k做attention(吃兩個向量, 輸出一個分數),其實就是計算q.k的相似度Similarity。 - Scaled Dot-Product : $S(q_1,k_1)$得到$\alpha_{1,1}$,$S(q_1,k_2)$得到$\alpha_{1,2}$... - $\alpha_{1,i}=q_1・k_i /\sqrt{d}$ - d代表q和k的dimension,只是論文中作者使用的小技巧 2. 再做Softmax normalization(歸一化) 3. 把得到的 $\hat{\alpha}$與$v$相乘得到$b$,相當於做weighted sum 4. 上圖中得到的$b_1$就是所求sequence的第一個vector(word或character) 5. 每個output vector都用了整個sequence的資訊 === ### Self-attention 平行化處理 ![](https://i.imgur.com/uCc1ru1.png) $q_i=W_qa_i$ $k_i=W_ka_i$ $v_i=W_va_i$ ![](https://i.imgur.com/tNyNAhC.png) 1. 把$a_1,...,a_4$當作一個矩陣$I$,與權重矩陣$W_q$相乘得到$q_1,...,q_4$,當作一個矩陣$Q$。相同的矩陣$K,V$也是同樣方式,由$q,k$和$a$相乘得來的 2. $\alpha_{1,1}=k_1^T.q_1$ $\alpha_{1,2}=k_2^T.q_1$ ... 所以把$k_1,...k_4$疊一起變成矩陣$K$,同乘以$q_1$ 也把$q_1,...q_4$疊一起變成矩陣$Q$,得到$\alpha$集合成的矩陣$A$,就是Attention,做Softmax後變成$\hat{A}$ 3. 每一個time step中,兩兩vector之間都有attention ![](https://i.imgur.com/wx4mdTE.png) 4. 計算V、A hat的weighted sum,就得到b,b集合成的矩陣就是輸出的矩陣$O$ ### Self-attention Layer做的事情 ![](https://i.imgur.com/56JpMo7.png) ![](https://i.imgur.com/uZLy5zJ.png) 轉換成矩陣乘法,就可以使用GPU來加速運算了 ### Multi-head Self-attention ![](https://i.imgur.com/4c9iFPJ.png) 以2 heads為例 - 2個head就是把$q,k,v$分裂成兩個$q,k,v$,而$q_{i,1}$只會跟$k_{i,1}$相乘得到$\alpha_{i,1}$,最後計算出$b_{i,1}$ - 最後把$b_{i,1},b_{i,2}$concat起來,乘上一個transform,做降維得到最終的$b_i$ 每個head所關注的資訊不同,有的只關心local資訊(鄰居的資訊),有個只關心global(較長時間)資訊等等。 ### Positional Encoding > 天涯若比鄰 在注意力機制中,輸入句子的詞的順序如何是沒差的。 ![](https://i.imgur.com/LTmJC97.png) ![](https://i.imgur.com/7BQOS1a.png) - 沒有位置資訊=>所以有一個唯一的位置向量 $e_i$,不是學出來的而是人設置的。 - 其他方法:使用one-hot encoding表示的$p_i$為$x_i$表示其位置 ### Seq2seq with Attention ![](https://i.imgur.com/vMWuegd.png) 原始seq2seq2 model由兩個RNN分別組成了Encoder、Decoder,可以應用於機器翻譯。 上圖中原本Encoder裡面是雙向RNN,Decoder裡面是一個單向RNN,下圖把兩個都用Self-attention layer取代,可以到達一樣的目的而且可以平行運算。 ![](https://i.imgur.com/UPAlIwM.png) ### 細看Transformer Model ![](https://i.imgur.com/X0IgIjE.png) ![](https://i.imgur.com/Vt3iFUR.png) #### Encoder的部分 1. Input通過Input Embedding,考慮位置資訊,加上人為設置的Positional Encoding,進入會重複N次的block ![](https://i.imgur.com/Qou2NfM.png) 2. Multi-head:進到Encoder裡面,他是Multi-head Attention的,也就是q,k,v有多個,在裡面做qkv個別乘以a的運算,算出$\alpha$ 最後得到$b$ ![](https://i.imgur.com/AEWD7zx.png) 3. Add & Norm(==[3]殘差連接residual connection==):把Multi-head attention的input $a$和output $b$加起來得到$b'$,再做[1]==Layer Normalization== 4. 計算完後丟到前向傳播,再經過一個Add & Norm #### Decoder的部分 ![](https://i.imgur.com/Jy5uxlE.p ng) 1. Decoder input為前一個time step的output,通過output embedding,考慮位置資訊,加上人為設置的positional encoding,進入會重複n次的block 2. **Masked** Multi-head Attention:做Attention,Masked表示只會attend到已經產生出來的sequenc e,再經過Add & Norm Layer 3. 再經過Multi-head Attention Layer,attend到之前Encoder的輸出,然後再進到Add & Norm Layer 4. 計算完丟到Feed Forward前向傳播,再做Linear和Softmax,產生最終輸出 ### Attention Visualization #### single-head ![](https://i.imgur.com/Agvn0v5.png) 文字倆倆之間的關係,線條越粗代表關聯越深 #### Multi-head ![](https://i.imgur.com/43k2M4X.png) 用不同組的q.k配對出來的結果有所不同,代表不同組的q.k擁有不同資訊(下面local or 上面global) ## 應用 ### Summarizer By Google input為一堆文檔,output為一篇文章(summarize) ### Universal Transformer 橫向(時間上)是Transformer,縱向是RNN ### Self-attention GAN 用在影像生成上 # 參考資料 ![](https://i.imgur.com/n2nKumo.png) [1]. Layer Norm https://arxiv.org/abs/1607.06450 不需要考慮batch,希望各個不同維度的資料平均=0,變異數=1,一般來說Layer Norm會搭配RNN使用 [2] Batch Norm https://www.youtube.com/watch?v=BZh1ltr5Rkg 對同一batch中不同data做normalization,希望平均數=0,變異數=1 [3] Residual Connection 殘差連接:將輸出表示成輸入和輸入的非線性變換的線性疊加