Transformer (機械學習模型)

**Transformer**係喺2017年推出嘅深度學習模型，攞關注機制（多頭、自關注）嚟求權重畀啲成批輸入數據入便嘅每個部份嘅，並藉此唔受順序限制噉去學識各部份對彼此啲影響嘅大細、啲可能會跨好幾重遠嘅，最終去生成返啱啲嘅數據。初初Transformer主要使喺自然語言處理（NLP）領域 ，之後個應用領域亦都擴展到電腦視覺。

似遞迴神經網絡（RNN）一樣，Transformers設計出嚟係攞嚟處理啲順序數據（譬如自然語言）嘅，嚟去執行翻譯同文本摘要生成之類啲任務。之戥RNN唔同，Transformer訓練嗰陣唔使照序處理啲順序數據，而可以憑關注機制幫輸入序迾嘅任意一位捇返啲上下文，啲可能離個位爭好遠嘅。譬如，若果輸入數據係自然語言語句，Transformer可以學識唔使先去處理個開頭、再處理個結尾，而係對於每個詞都識別出邊啲內容係賦予佢意涵嘅。鑑於呢個特點，Transformer允許嘅平行運算多過RNN，可以藉此減少訓練時間。

Transformer經已速度成為唨NLP問題嘅首選模型，同時取代唨啲先前嘅RNN模型似長短期記憶（LSTM）模型。由於喺訓練過程中對平行運算嘅便利性，引入唨Transformer之後愈發大嘅數據集可以得到訓練。呢個都催生唨啲預訓練系統似BERT（從Transformer嚟嘅雙向編碼器表示）同GPT（生成式預訓練Transformer）之類，啲系統經已利用到啲好龐大嘅通用語言數據集（似Wikipedia Corpus同埋Common Crawl）嚟進行訓練，而且仲可以根據特定嘅語言任務微調得。

## 背景
喺引入Transformer之前，大多數最先進嘅NLP系統都依靠啲閘控RNN，譬如LSTM同閘控遞迴單位（GRU），再加埋關注機制。Transformer嘅構建唔使到RNN結構、純粹基於呢啲關注技術，講明僅衹使關注機制而毋需順序處理就足夠喺性能上比肩啲有埋關注機制嘅RNN。

### 順序處理啲弊端
閘控RNN按順序處理啲標識（token，詞、標點等），同時維護住一枚狀態向量（state vector），向量入便表示同埋記錄返啲獲親標識之後睇到嘅數據。要處理第n隻標識，個模型會捉表示到之前第n-1隻標識嘅狀態（state）鬭埋個新標識嘅資訊嚟到創建一個新狀態，表示直到新標識n嘅句。理論上講，嚟自一隻標識嘅資訊可以跟住個序迾任意傳播落去，若果個狀態喺每粒點都繼續對個相關標識嘅語義資訊（contextual information）進行編碼嘅話。之不過喺實踐當中，呢種機制其實唔完善：部分由於梯度消失問題，長句結尾度嘅模型狀態就通常唔包含啲精確又提取得嘅資訊關於好早之前啲標識。

### 關注機制嘅引入

透過引入關注機制（Attention），呢個問題得到解決。關注機制令到個模型可以直接睇返並抽返句入便任意早先處理點嘅狀態。關注層訪問得到所有啲先前狀態，仲識根據一啲學到嘅相關性度量標準，考慮當前標識嘅相關程度幫啲先前狀態加權，係噉即使隔好遠都畀得返啲更加清晰嘅資訊關於個標識。

關注機制嘅一個明顯例係翻譯。喺英語到法語嘅翻譯系統入便，法語輸出嘅第一個單詞好可能好大程度上取決於英語輸入嘅開頭。之但係，喺經典嘅LSTM模型入便，照序產生法語輸出嘅第一個單詞嗰陣，係畀到個模型最孻一個英語單詞嘅狀態向量。理論上講，個向量可以幫啲關於成個英語句子嘅資訊編嗮碼，噉樣畀嗮個模型所有必要嘅知識，但實際上，呢啲資訊好多時冇好好噉保存到。引入唨關注機制嘅話，呢個模型可以學識喺產生法語輸出嘅開頭嗰陣留意返早期英語標識嘅狀態，令佢對佢翻譯緊嘅嘢有一個更好嘅概念。

關注機制着添加到RNN之後就促進到性能嘅大幅提高。Transformer嘅引入揭示唨噉樣一個事實，即關注機製本身就有好強大嘅功能，而且照序循環處理啲數據查實對於達到嗰種性能提升嚟講冇乜必要，之RNN加埋關注機制先得到嘅。另外Transformer使關注機制而唔係RNN，同時處理得嗮所有標識，計出佢哋之間嘅關注權重。

## 架構
似早先發明有嘅嗰啲模型一樣，Transformer用嘅亦都係編碼器-解碼器架構（encoder-decoder architecture）。編碼器由一組編碼層組成，呢啲編碼層逐層噉疊代處理個輸入；解碼器同理，亦都係一組編碼層對個輸出執行相同操作。

每𤗲編碼層嘅功能都係處理佢攞到嘅輸入嚟生成編碼，其中包含有啲資訊關於啲輸入嘅邊啲部分係互相之間相關嘅。之後𤗲編碼層會捉佢個編碼集傳遞到後尾一𤗲編碼層作爲輸入。每𤗲解碼層就做逆向嘅操作，攞嗮啲編碼並結合埋啲編碼嘅上下文資訊對編碼進行處理，嚟最終去到生成一條輸出序迾。每𤗲編碼層同解碼層都使開一種關注機制，呢種機製針對每個輸入都衡量返其他每個輸入嘅相關度，同埋從啲輸入當中相應噉提取返資訊嚟產生個輸出。每𤗲解碼層仲有埋一個附加關注機制，呢個機制幫解碼層從先前啲解碼器嘅輸出當中獲取資訊，然之後先輪到𤗲解碼層從嗰啲編碼當中提取資訊。編碼器層同解碼器層都有埋前饋神經網絡嚟額外處理啲輸出，仲有殘差連接（residual connections）同埋層歸一化步驟（layer normalization steps）。

### 縮放點積關注
Transformer啲基本構建塊係啲縮放點積關注單元。一條句子傳到Transformer模型之後，會得出每隻標識之間嘅關注權重。一粒關注單元識幫上下文當中嘅每隻標識都生成埋啲詞嵌入（embeddings），入便啲資訊唔單之涉及隻標識本身、仲涉及埋一個嚟自其他啲相關標識嘅加權組合、其中個加權係由關注權重決定。

具體嚟講，對於每粒關注單元，Transformer模型學習有三個權重矩陣；查詢（query）權重矩陣\mathbf W_Q，關鍵（key）權重矩陣\mathbf W_K，與及價值（value）權重矩陣\mathbf W_V。對於每隻標識 i，個輸入詞嵌入\mathbf x_i同三個權重矩陣嘅每一個乘埋，嚟生成查詢向量\mathbf q_i = \mathbf x_i \mathbf W_Q、關鍵向量\mathbf k_i = \mathbf x_i \mathbf W_K
同埋值向量\mathbf v_i= \mathbf x_i \mathbf W_V。關注權重使查詢向量同關鍵向量計返：個關注權重a_{ij}係標識 i 嘅查詢向量\mathbf q_i、戥標識 j 嘅關鍵向量\mathbf k_j之間嘅點積：

:a_{ij} =\mathbf q_i\cdot \mathbf k_j

啲關注權重除以關鍵向量維數嘅平方根\sqrt{d_k}（可以喺訓練過程嗰陣穩定返梯度）之後着透過softmax歸一化。由於\mathbf W_Q同\mathbf W_K係唔同嘅矩陣，可以令到個關注唔對稱：若果標識 i會捉個關注導向標識 j（即a_{ij}好大），亦都唔一定代表反過嚟標識 j 就會將關注導向標識 i （即反之a_{ji}大）。關注單元幫標識 i 整嘅輸出即係所有標識啲值向量嘅帶a_{ij}加權和，即累加 i 啲導向每隻標識嘅關注度。

所有啲標識嘅關注度計算可以表示成一個大型矩陣計算。由於計算矩陣運算嘅改善令到矩陣運算可以速度噉計算，噉樣就會對於訓練好有用。定義上，矩陣\mathbf Q、\mathbf K、\mathbf V係三個矩陣攞嚟裝啲前述向量嘅；佢哋個第 i行分別係向量\mathbf q_i、\mathbf k_i、\mathbf v_i。

:\begin{align}
\text{Attention}(\mathbf Q, \mathbf K, \mathbf V) = \text{softmax}\left(\frac{\mathbf Q\mathbf K^\mathrm{T}}{\sqrt{d_k}}\right)\mathbf V
\end{align}

#### 多頭關注
一套\left( \mathbf W_Q, \mathbf W_K, \mathbf W_V \right)矩陣喊做「關注頭」，而Transformer模型入便嘅每一層都有好幾隻關注頭。由於一隻關注頭識關注同每隻標識相關嘅標識，設好多隻關注頭之後個模型可以學識根據唔同嘅「相關性」定義嚟唔同噉追返啲標識。研究表明，Transformer入便嘅好多關注頭對啲關連拏褦嘅編碼方式，從人類角度嚟睇係理解得嘅。譬如，有一啲關注頭主要係𥄫定下一個單詞畀每隻標識，有一啲係主要從動詞導向到直接賓語。由於Transformer模型有多個關注頭，所以佢哋有可能捕獲到好多拏褦嘅層次同埋類型，從表層到語義。多頭關注層嘅多個輸出着級聯（concatenated）傳遞到前饋神經網絡層。

### 編碼器
每隻編碼器都係由兩隻主要組件組成：自關注機制（self-attention）同埋前饋神經網絡。自關注機制從先前嘅編碼器度獲取一組輸入編碼、權衡埋啲編碼之間嘅相關性，去生成一組輸出編碼。然之後，個前饋神經網絡進一步分別處理每隻輸出編碼。呢啲輸出編碼最終會遞畀解碼器與及下一個編碼器，作為輸入。

第一編碼器唔係捉編碼、而係捉輸入序迾啲詞嵌入同位置資訊（以位置向量嘅形式）作為輸入。要令Transformer可以利用返序迾嘅順序，個位置資訊係必須嘅，因為Transformer嘅其他部分都冇使到個資訊。

### 解碼器
每隻解碼器由三隻主要組件組成：自關注機制、編碼關注機制同埋前饋神經網絡。解碼器嘅功能類似編碼器，之不過有一個附加嘅編碼關注機制、識由編碼器生成好嘅編碼捇返相關資訊。

似第一編碼器一樣，第一解碼器捉輸出序迾啲詞嵌入同位置資訊作為輸入。由於Transformer唔應使用當前抑或未來嘅輸出嚟預測輸出，所以必須部分屏蔽走個輸出序迾，嚟避免呢種反向資訊流。最後一個解碼器之後係最終嘅線性變換同埋softmax層，嚟生成出一個輸出概率對於啲詞彙。

### 偽代碼
下低係實現其中一隻Transformer變體、「原版」Transformer嘅偽代碼：
```python
def vanilla_transformer(enc_inp, dec_inp):
    """Transformer variant known as the "vanilla" transformer."""
    x = embedding(enc_inp) * sqrt(d_m)
    x = x + pos_encoding(x)
    x = dropout(x)
    for _ in range(n_enc_layers):
        attn = multi_head_attention(x, x, x, None)
        attn = dropout(attn)
        attn = layer_normalization(x + attn)

        x = pointwise_ff(attn) # GELU activation(affine map(attn))
        x = layer_normalization(x + attn)

    # x is at this point the output of the encoder
    enc_out = x

    x = embedding(dec_inp) * sqrt(d_m)
    x = x + pos_encoding(x)
    x = dropout(x)
    mask = causal_mask(x)
    for _ in range(n_dec_layers):
        attn1 = multi_head_attention(x, x, x, mask)
        attn1 = layer_normalization(attn1 + x)

        attn2 = multi_head_attention(attn1, enc_out, enc_out, None)
        attn2 = dropout(attn2)
        attn2 = layer_normalization(attn1 + attn2)

        x = pointwise_ff(attn2)
        x = layer_normalization(attn2 + x)
    return dense(x)
```


### 備揀方案
訓練啲基於Transformer嘅架構可能非常之昂貴，尤其係對於長句子嚟講。備揀架構包括有Reformer，之可以減少個計算量從O(N^2)到O(N\ln N)，其中N係序迾嘅長度。呢個係透過使返局部敏感哈希法同可逆層來做到嘅。

2020年末，仲有個基準測試得引入嚟比較啲唔同嘅xformer架構。

## 訓練
Transformer通常會接受半監督學習，當中包括非監督式嘅預培訓，然之後進行監督式嘅微調。由於標註好嘅訓練數據個資源查實有限，所以預訓練好多時係喺更大嘅數據集度進行，而唔係做微調（fine-tuning）。預訓練同微調嘅任務通常包括：

* 下一句預測
* 問答系統
* 閱讀理解
* 情緒分析
* 文章改寫（Paraphrasing）

## 應用領域
Transformer喺自然語言處理（NLP）領域入便得到好多唔同應用，譬如機械翻譯同時間序迾預測啲任務。好多預訓練模型（譬如GPT-2，GPT-3，BERT，XLNet同RoBERTa）都證明唨Transformers執行得各種噉樣嘅同NLP相關嘅任務，而且有應用於實際嘅潛力。當中可能包括：

* 機械翻譯
* 文本總結（document summarization）
* 文本生成（document generation）
* 命名實體識別（NER）
* 生物序迾分析（biological sequence analysis）

到唨2020年，事實證明可以對Transformer體系結構（尤其係GPT-2）進行微調來做走棋任務。Transformer亦都經已喺圖像處理使開，結果表明佢哋具有戥卷積神經網絡競爭嘅能力。

## 實現
Transformer模型經已喺TensorFlow同PyTorch等主要深度學習框架入便實現。

*Transformers*係Hugging Face製作嘅庫，佢提供基於Transformer嘅體系結構同預訓練嘅模型。呢個庫係免費軟件，喺GitHub度可以獲得。佢嘅模型有PyTorch同TensorFlow格式。

## 考

## 深入閱讀

* 休伯特·拉姆紹爾*等人*（2020），，提交預印本ICLR2021年arXiv;另見作者嘅博客

:: –討論作爲同Hopfield更新等效嘅Transformer層嘅影響，令到輸入更接近其中一個喺連續值Hopfield網絡入便嘅不動點（可表示模式）

## 連出去

* 亞歷山大·剌殊（Alexander Rush），帶埋註釋嘅Transformer，哈佛大學自然語言處理組，2018年4月3號