Transformer架構

在深度學習中，transformer（直譯為「變換器」）是一種基於多頭注意力機制的人工神經網絡架構，其中文本被轉換為稱為詞元（token）的數值表示，每個詞元通過從詞嵌入表中查找轉換為一個向量。在每一層，每個詞元都通過並行的多頭注意力機制在上下文窗口的範圍內與其他（未屏蔽的）詞元進行上下文關聯，從而放大關鍵詞元的信號並減弱不太重要的詞元，從而按輸入數據各部分重要性的不同而分配不同的權重。採用該架構的模型主要用於自然語言處理（NLP）與電腦視覺（CV）領域。

和循環神經網絡（RNN）一樣，transformer旨在處理自然語言等順序輸入數據，可應用於翻譯、文本摘要等任務。但transformer的優勢在於它沒有循環單元，能夠一次性處理所有輸入數據。注意力機制可以為輸入序列中的任意位置提供上下文。如果輸入數據是自然語言，則transformer不必像RNN一樣一次只處理一個單詞，這種架構允許更多的並行計算，並以此減少訓練時間。之後的變體被廣泛用於在大型（語言）數據集上訓練大型語言模型（LLM）。

現代版transformer於2017年由谷歌大腦的一個團隊在論文《Attention Is All You Need》中提出。其前身最初是為了改進機器翻譯的現有架構而開發的，但此後應用範圍不斷擴大。它們被用於大規模自然語言處理、電腦視覺（視覺transformer）、強化學習、音訊處理、多模態學習、機器人，甚至可以下西洋棋，逐步取代長短期記憶（LSTM）等RNN模型成為了NLP問題的首選模型。Transformer模型也催生了預訓練系統（遷移學習）的發展，並行化優勢允許其在更大的數據集上進行訓練，例如GPT 和BERT。這些系統使用了維基百科、Common Crawl等大型語料庫進行訓練，並可以針對特定任務進行微調。

跟2017年的原始模型相比，一些現代模型（如RoBERTa）在詞元化階段可以改用更高效的WordPiece演算法；位置編碼則可能使用更新的旋轉位置編碼(RoPE)方案。

## 背景

在transformer模型之前，大多數最先進的NLP系統都依賴於諸如LSTM、門控循環單元（GRU）等門控RNN模型，並在此基礎上增加了注意力機制。transformer正是在注意力機制的基礎上構建的，但其沒有使用RNN結構，這表明僅依靠注意力機制就能在性能上比肩加上了注意力機制的RNN模型。2014年，注意力機制的提出為transformer奠定了理論基礎。

### 順序處理

RNN模型按順序處理每一個標記（token）並維護一個狀態向量，其中包含所有已輸入數據的表示。如要處理第$n$個標記，模型將表示句中到第$n-1$個標記為止的狀態向量與最新的第$n$個標記的資訊結合在一起創建一個新的狀態向量，以此表示句中到第$n$個標記為止的狀態。從理論上講，如果狀態向量不斷繼續編碼每個標記的上下文資訊，則來自一個標記的資訊可以在序列中不斷傳播下去。但在實踐中，這一機制是有缺陷的：梯度消失問題使得對於長序列，模型訓練效果較差。且按順序處理的機制使得長句末尾的模型狀態會缺少前面標記的精確資訊。此外，每個標記的計算都依賴於先前標記的計算結果，這也使得其很難在現代深度學習硬體上進行並行處理，這導致了RNN模型訓練效率低下。

### 自注意力機制

注意力機制解決了上述這些問題。這一機制讓模型得以提取序列中任意先前點的狀態資訊。注意力層能夠訪問所有先前的狀態並根據學習到的相關性度量對其進行加權，從而提供相距很遠的標記的相關資訊。

翻譯是一個能夠突顯注意力機制優勢的例子，其中上下文對於句子中單詞的含義至關重要。例如在一個將英語翻譯為法語的系統中，法語輸出的第一個詞很可能取決於英語輸入的前幾個詞。然而在經典的LSTM模型中，為了產生法語輸出的第一個單詞，模型需要訪問處理完最後一個英語單詞後得到的狀態向量。理論上這個向量包含了整個英語句子的資訊，從而為模型提供所有必要的知識。然而在實踐中，LSTM通常無法很好地保存這些資訊。可以通過添加注意力機制來解決這個問題：解碼器可以訪問每個英語輸入單詞的狀態向量，而不僅僅是最後一個單詞。同時模型可以學習注意力權重，這些權重決定了對每個英語輸入狀態向量的關注程度。

在RNN模型中添加注意力機制能提高模型的性能。而transformer架構的發展表明，注意力機制本身就足夠強大，並且不需要像RNN模型一樣再對數據進行順序循環處理。transformer模型採用了沒有RNN模型的注意力機制，它能夠同時處理所有標記並計算它們之間的注意力權重。由於注意力機制僅使用來自之前層中其他標記的資訊，因此可以並行計算所有標記以提高訓練速度。

## 架構

### 輸入

輸入文本使用字節對編碼以進行標記化，每個標記通過詞嵌入轉換為向量。然後，將標記的位置資訊添加到嵌入向量中。

### 編碼器-解碼器架構

與早期的seq2seq模型一樣，原始的Transformer模型使用「編碼器-解碼器」（encoder–decoder）架構。編碼器由逐層迭代處理輸入的編碼層組成，而解碼器則由對編碼器的輸出執行相同操作的解碼層組成。

每個編碼層的功能是確定輸入數據的哪些部分彼此相關。它將其編碼作為輸入再傳遞給下一個編碼層。每個解碼層的功能則相反，讀取被編碼的資訊並使用整合好的上下文資訊來生成輸出序列。為了實現這一點，每個編碼層和解碼層都使用了注意力機制。

對於每個輸入，注意力會權衡每個其他輸入的相關性，並從中提取資訊以產生輸出。每個解碼層都包含一個額外的注意力機制，它會在從編碼層提取資訊之前先從之前解碼器的輸出中提取資訊。

編碼層和解碼層都有一個前饋神經網絡用於對輸出進行額外處理，並包含殘差連接和層歸一化步驟。

### 縮放點積注意力

transformer模型的基本構建單元是縮放點積注意力（scaled dot-product attention）單元。當一個句子被傳遞到一個transformer模型中時，可以同時計算所有標記互相之間的注意力權重。注意力單元為上下文中的每個標記生成嵌入，其中包含有關標記本身的資訊以及由注意力權重加權得到的其他相關標記的資訊。

對於每個注意力單元，transformer模型學習三個權重矩陣，分別為查詢（query）權重$W_Q$、鍵（key）權重$W_K$以及值（value）權重$W_V$。對於每個標記$i$，輸入詞嵌入$x_i$分別與三個權重矩陣相乘以得到查詢向量$q_i = x_iW_Q$、鍵向量$k_i = x_iW_K$與值向量$v_i=x_iW_V$。再使用查詢向量和鍵向量計算注意力權重，即計算$q_i$和$k_j$的點積以得到從標記$i$到標記$j$的注意力權重$a_{ij}$。之後再將注意力權重除以向量維度的平方根$\sqrt{d_k}$以在訓練期間穩定梯度，並通過softmax函數對權重進行歸一化。$W_Q$與$W_K$的不同意味著注意力是非對稱的：即使標記$i$很關註標記$j$（即$q_i\cdot k_j$很大），也不能保證標記$j$也反過來關註標記$i$（即$q_j\cdot k_i$可能很小）。對每一個標記$i$而言，注意力單元的輸出是以$a_{ij}$（標記$i$到每一個標記的注意力）加權所有標記的值向量得到的加權和。

對所有標記的注意力計算可以表示為使用softmax函數的一個大型矩陣計算，由於可以對矩陣運算速度進行優化，這十分利於訓練速度的提升。矩陣$Q$、$K$和$V$可分別定義為第$i$行是向量$q_i$、$k_i$ 和$v_i$的矩陣。

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

#### 多頭注意力

一組$\left( W_Q, W_K, W_V \right)$矩陣稱為一個注意力頭（attention head），transformer模型中每一層都包含多個注意力頭。每個注意力頭都表示不同標記相互之間的注意力，而多個注意力頭則可以針對不同的「相關性」計算不同的注意力權重。多注意力頭編碼的相關性資訊是人類可以理解的，例如某個注意力頭可能主要關注下一個單詞，而另一個注意力頭則可能主要關注動詞與其直接賓語之間的關係。每個注意力頭的計算可以並行執行，這使得處理速度得以加快。注意力層的輸出被連接起來傳遞到前饋神經網絡層。

### 編碼器

每個編碼器由一個自注意力機制和一個前饋神經網絡兩個主要部分組成。自注意力機制接受來自前一個編碼器的輸入編碼，並計算它們之間相關性的權重以生成輸出編碼。前饋神經網絡則進一步單獨處理每個輸出編碼。然後將這些輸出編碼作為輸入傳遞給下一個編碼器以及解碼器。

第一個編碼器將輸入序列的位置資訊和嵌入作為其輸入。位置資訊向transformer模型提供了序列的順序資訊，這是模型中唯一利用這一信息的部分。

編碼器是雙向的，這意味著當前標記的注意力可以放在之前或之後的標記上。

BERT是一種僅具有編碼器的結構。

### 解碼器

每個解碼器由一個自注意力機制、一個針對編碼器的注意力機制和一個前饋神經網絡三個主要部分組成。解碼器的功能與編碼器類似，但插入了一個額外的注意力機制，它從編碼器生成的編碼中提取相關資訊。這種機制也可以稱為編碼器-解碼器注意力（encoder-decoder attention）。

與第一個編碼器一樣，第一個解碼器也將輸出序列的位置資訊和嵌入作為其輸入。因為模型不能使用當前或未來的輸出來預測輸出，因此必須對輸出序列進行部分屏蔽以防止這種反向信息流。這使得自回歸文本生成成為可能。最後一個解碼器之後是最終的線性變換和softmax層以產生所有詞彙的輸出機率。

GPT及其之後的大型語言模型是一種僅具有解碼器的架構。

### 替代架構

訓練基於transformer模型的架構可能很昂貴，尤其是對於長輸入而言。替代架構包括Reformer模型、ETC/BigBird模型等，前者可以將計算複雜度從$O(N^2)$減少為$O(N\ln N)$，後者則可以減少到$O(N)$，其中$N$表示序列長度。其實現得益於局部敏感哈希與可逆層。

原始的Transformer模型需要與上下文窗口大小成二次方的記憶體大小。無注意力transformer模型（attention-free transformer）則將對記憶體的需求減少為線性依賴，同時通過連接鏈與值保留了transformer模型的優勢。

2020年底推出了用於比較不同transformer架構的基準測試。

### 稀疏注意力

- Block Sparse（GPT-3）：局部窗口注意力+隨機注意力
- Longformer：膨脹滑動窗口模式

### 混合架構

模型｜CV融合方式｜NLP代表

ViT｜圖像分塊嵌入｜/

BEiT｜視覺tokenizer｜BERT-style

Flamingo｜跨模態適配器｜Chinchilla

## 訓練

transformer模型通常會進行自監督學習，包括無監督預訓練和監督微調。由於監督微調時使用的帶標籤訓練數據一般比較有限，預訓練通常會在比微調時所用的更大的數據集上完成。預訓練和微調的任務通常包括：

- 語言建模
- 下一句預測
- 問答系統
- 閱讀理解
- 文本情感分析
- 文本改寫

## 應用

transformer模型在自然語言處理（NLP）領域取得了巨大成功，例如機器翻譯與時間序列預測任務。包括GPT-2、GPT-3、BERT、XLNet與RoBERTa在內的許多預訓練模型展示了transformer模型執行各種NLP相關任務的能力，並有很多潛在實際應用。這些應用包括：

- 機器翻譯
- 文本摘要
- 文本生成
- 命名實體識別
- 生物序列分析
- 影片理解

2020年，transformer架構（更具體地說是GPT-2）被證明可以通過微調執行下象棋的任務。transformer模型也已應用於圖像處理，其結果可與卷積神經網絡相媲美。

## 實現

transformer模型已在TensorFlow、PyTorch等標準深度學習框架中實現。

「transformers」是由Hugging Face製作的一個庫，提供基於transformer的架構和預訓練模型。