---
# System prepended metadata

title: Transformer
tags: [李宏毅]

---

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