Transformer === ###### tags: `李宏毅` * [Ref: 李弘毅影片](https://www.youtube.com/watch?v=ugWDIIOHtPA&ab_channel=Hung-yiLee) * BERT * 一個 unsupervised trained transform * Transform ![](https://i.imgur.com/vdZyjfH.png) * Seq2Seq model * 大量用到 self-attention 特別的 layer * Sequence * RNN ![](https://i.imgur.com/lZsj0Id.png) * 要處理 Sequence,最常想到 RNN * RNN 有分 single directional 和 bidirectional * RNN 的輸入跟輸出都是一串 vector sequence * 如果是 single directional,當輸出 b3,會把 a1~a3 都看過 * 如果是 bidirectional,當輸出 b1 時,就會把 a1~a4 都看過 * RNN 的缺點是不容易被平行化 * CNN ![](https://i.imgur.com/O74jVBe.png) * 每個三角形代表一個 filter * 一次只吃 n 個 vector,filter 把這些 vector 串起來跟 filter 中的參數做 inner product * filter 會掃過整個 sequence * filter 有很多個 * 跟 RNN 一樣輸入跟輸出都可以是一個 sequence * 看起來 CNN 比 RNN 少考慮一些輸入,但是如果讓 CNN 的層數變多,上層的 layer 就會考慮到更多的輸入 * 可以平行化 * 無法在前面低層的地方就看到長時間的資訊,所以要有 Self-attention * Self-Attention * 取代 RNN 可以做的事情 * 輸入輸出跟 RNN 一樣都是 sequence * 跟 bidirectional RNN 一樣可以同時看完整個 input sequence 的資訊 * 可以平行化 * 在 2017 就被提出來,所以 RNN 能做的事情都被這招用過了,paper 也被洗過一輪了XD * 最早出現於 google 的一篇 paper ![](https://i.imgur.com/9AueYGf.png) 1. 輸入先經過 embedding,乘上一個 Matrix 2. 每個 input 都乘以三個不同的 transformation matrix 3. 產生的三個 vector 分別稱作 q, k, v ![](https://i.imgur.com/xgv3rYE.png) 4. 把每個 q 對每個 k 做 attention,attention 拿 q, k 兩個向量,會輸出一個分數,表示 q, k 有多匹配。 5. attention 有各種不同的做法,其中一個如圖片把 q, k 做 dot product 後除以 q, k 的根號維度,直觀原因是 dot product 的結果會隨著維度而變大 6. 將 attention 的結果 softmax 做 normalization ![](https://i.imgur.com/qTNMP5e.png) 7. 把 softmax 的輸出 ɑi,j 跟 vj 做 inner product,就可以得到 bi ![](https://i.imgur.com/Tlv9Bhm.png) * 如果要考慮 local 的 information,那就把其他的 ɑ 弄成 0;如果要考慮 global,那就讓其他 ɑ 有值 * 平行化方式 * 把 a1, a2, ... 變成一個 matrix 乘以 Wq 就可以直接算完大家的 q ![](https://i.imgur.com/cyx0Wjn.png) * ɑ1,1 到 ɑ1,4 也可以平行化 ![](https://i.imgur.com/J5w5J4p.png) * b 也平行化 ![](https://i.imgur.com/Eb8f3bN.png) * 總流程,所以都是一堆矩陣乘法,所以可以輕易用 GPU 加速 ![](https://i.imgur.com/sSF2y4U.png) * Multi-head Self-attention ![](https://i.imgur.com/EHs5u9m.png) * 作法就是在產生 q, k, v 時,分別用 Wq1, Wq2 分別產生 qi,1、qi,2,在做 attention 的時候,qi,1 只會 attention ki,1、kj,1、... * 因此輸出的 b 也會變 n 倍(n = 幾個 head),所以可以再用個 transform 矩陣降維 * 優點: 不同的 head 可以關注不同點,例如有的 head 只想看 local,有的看比較 global 的資訊 * Positional Encoding * 因為 self-attention 每個輸出 bi 都會考慮每個輸入,所以位置關係就沒了,因此要再加個 ei 在輸入 x embedding 後的 ai ![](https://i.imgur.com/jRYYYD4.png) * ei 不是學出來的,而是人直接設的 * 用相加而不是 concat 的原因是,想像現在用一個 one-hot vector,只有第 i 個輸入是 1 其他是 0 的 vector 跟輸入 x 接起來,之後跟 W 內積,最後也等同是會讓結果加上一個 ei ![](https://i.imgur.com/DHgGSwg.png) * Seq2seq with Attention * RNN 可以實作 encoder 和 decoder,應用例如翻譯機 ![](https://i.imgur.com/bhBszr0.png) * 但是現在可以把 RNN 的步驟改成 self-attention