---
# System prepended metadata

title: Transformer介紹

---

# Transformer介紹

## 前言
Transformer是由Google在2017年提出的一個用於sequence to sequence的模型，直至今日仍是生成式AI不可或缺的技術，不管是文字生成、圖片生成、甚至是音樂生成都會用到它。因此，這篇文章會簡單但完整的介紹Transformer的原理。

## Transformer的主要架構
Transformer可分為兩個主要部分，Encoder理解輸入，Decoder生成輸出。Attention為其關鍵技術。

![圖片](https://hackmd.io/_uploads/ry07pIhV1l.png)
圖1: Transformer的主要結構，左邊一大塊是Encoder，右邊則是Decoder

### 將文字變成數值
這步驟在圖1中是Input Embedding層加上Positional Encoding，這層的主要用意是讓文字變成能夠計算的東西。

![圖片](https://hackmd.io/_uploads/Hy1-JvnEkl.png)
圖2: 文字變成數值示意圖

在文句輸入進這層後，首先會先將其分token。為求簡單，我們在圖2中假設`"A very smart student who is dancing"`這句話分詞(紅框)後，對到的token分別是藍色的數字，也就是變成`[1,2,3,4,5,6,7]`。

接著，模型會在一個很大的embedding表中找到那個數字代表的向量，也就是:
$\overrightarrow{V_{n}}=\textnormal{EmbedTable[n]}$

再把這個詞的向量加上位置資訊，也就是Positional Encoding:

$\overrightarrow{E_{n}}=\textnormal{PosEnc}(\overrightarrow{V_{n}})$

:::info
關於Positional Encoding，其實就是一個數學函式，有興趣請見: [hunter-j-phillips](https://medium.com/@hunter-j-phillips/positional-encoding-7a93db4109e6)
::::

至此，模型可以知道每個字在哪，但不知道每個字的關聯。

### 理解Self Attention
Transformer是以很多層Self-Attention組合的，每層Self-Attention會將每個Embedding互相交流。

Attention的公式非常簡單，如下:
$\textnormal{Attention}(Q, K, V) = \textnormal{softmax}(\frac{QK^T}{\sqrt{d_k}})V$

但寫成這樣，一般人是看不懂的。所以我們先分解各項的功用。

$\overrightarrow{Q_{n}}=\textnormal{W}_Q\overrightarrow{E_{n}}$
$\overrightarrow{K_{n}}=\textnormal{W}_K\overrightarrow{E_{n}}$
$\overrightarrow{V_{n}}=\textnormal{W}_V\overrightarrow{E_{n}}$

試想一個情境，每個字都會問所有其他字一個問題$Q$，他們各自也都會回答一個答案$K$，我們可以藉由計算$Q$,$K$的接近程度(內積)，來知道兩個字之間對這個問題的相關性。

接著就依據相關性，把原本問問題的那個字的向量，移到更接近回答的那個字的向量。當然不能直接位移，要位移的方向是"對於這個問題，回答的那個字的意義$V$"。

現在來看一個例子
- 假設模型讓$\textnormal{W}_Q$學到要問"誰是形容我的字"
- $\textnormal{W}_K$則是學到答"我是形容你的字"
- 分數越高代表那列越像是形容那行的字

![圖片](https://hackmd.io/_uploads/Sy4JqD3Vkl.png)
圖3: 文字所對到的向量

![圖片](https://hackmd.io/_uploads/HyIe5wnVkg.png)
圖4: QK內積的結果，紅點代表分數高的，本張圖中所代表的意義為very形容smart；smart形容student；dancing形容student

接著我們拿第四行(student的$\overrightarrow{Q_{4}}$)為例，其embedding再加上$\overrightarrow{V}$乘以他的分數$S$，這個$S$就是圖4由QK計算出的矩陣。

$\Delta E_4=\displaystyle\sum_{i=1}^{7}S_{4,i}\cdot\overrightarrow{V_{i}}$
$\overrightarrow{E_{4}'}=\overrightarrow{E_{4}}+\Delta E_4$

![圖片](https://hackmd.io/_uploads/Hy4Rnv34yx.png)
對每個embedding都做一次這個動作，即完成一次的Self-Attention。

:::warning
這裡以"誰是形容我的字"當作問的問題，但實際情況是$W_Q$、$W_K$、$W_V$會學到問各種問題，這裡只是以一個簡單的例子幫助理解。
:::

### MLP層
在Transformer中，Self-Attention負責理解文句，MLP負責儲存實際資訊(記憶)。

## 思考參數量(以GPT3為例)
$W_Q$和$W_K$會將詞向量(d=12288)變換為低維(d=128)，$W_V$會將詞向量轉換為同維度的向量(因為是位移量)。可計算出各矩陣需要的參數量:
$\textnormal{Parameter}(W_Q)=\textnormal{Parameter}(W_K)=12288\cdot128$
$\textnormal{Parameter}(W_V)=12288\cdot12288$

這樣非常不完美，$W_V$的參數量遠大於$W_Q$和$W_K$，於是工程師們用了一個叫做低秩矩陣分解(Low Rank Decomposition)的東西，把$W_V$分解成兩個矩陣相乘。
![圖片](https://hackmd.io/_uploads/ryj6luhNJl.png)

## Multihead Self-Attention
Multihead其實就是一次問很多問題，也就是一次計算很多個$\Delta E_n$，假設有$k$個頭，則:
$\overrightarrow{E_{n}'}=\overrightarrow{E_{n}}+\Delta E_n^{(1)}+\Delta E_n^{(2)}+\dotsb+\Delta E_n^{(k)}$

## Cross-Attention
Cross Attention可以用在翻譯問題上，假設將英文翻成法文，就是$W_Q$乘上輸入的詞向量(英文)，$W_K$乘上產生的詞向量(法文)。

## 結語
Transformer實為劃時代的新技術，其內部原理雖可用簡單一條式子帶過，但想要了解其精隨，還是要分解為一步一步。在初次接觸Transformer地當時的我還是小高一，遇到這些要消化也是非常的艱苦。希望這篇文章能幫助想認識AI的大家，如果有不懂之處請告訴我，我肯定把這篇文章修得老嫗能解。
