Transformer 模型（直譯為「變換器」）是一種採用自注意力機制的深度學習模型，這一機制可以按輸入資料各部分重要性的不同而分配不同的權重。該模型主要用於自然語言處理（NLP）與電腦視覺（CV）領域。

與迴圈神經網路（RNN）一樣，Transformer 模型旨在處理自然語言等順序輸入資料，可應用於翻譯、文字摘要等任務。而與 RNN 不同的是，Transformer 模型能夠一次性處理所有輸入資料。注意力機制可以為輸入序列中的任意位置提供上下文。如果輸入資料是自然語言，則 Transformer 不必像 RNN 一樣一次只處理一個單詞，這種架構允許更多的平行計算，並以此減少訓練時間。

Transformer 模型於 2017 年由 Google 大腦的一個團隊推出，現已逐步取代長短期記憶（LSTM）等 RNN 模型成為了 NLP 問題的首選模型。並列化優勢允許其在更大的資料集上進行訓練。這也促成了 BERT、GPT 等預訓練模型的發展。這些系統使用了維基百科、Common Crawl 等大型語料庫進行訓練，並可以針對特定任務進行微調。



背景

在 Transformer 模型之前，大多數最先進的 NLP 系統都依賴於諸如 LSTM、門控迴圈單元（GRU）等門控 RNN 模型，並在此基礎上增加了注意力機制。Transformer 正是在注意力機制的基礎上構建的，但其沒有使用 RNN 結構，這表明僅依靠注意力機制就能在效能上比肩加上了注意力機制的 RNN 模型。

順序處理

門控 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_{i}W_{Q}$ 、鍵向量 $k_{i}=x_{i}W_{K}$ 與值向量 $v_{i}=x_{i}W_{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{aligned}{\text{Attention}}(Q,K,V)={\text{softmax}}\left({\frac {QK^{\mathrm {T} }}{\sqrt {d_{k}}}}\right)V\end{aligned}}
$$

多頭注意力

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

編碼器

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

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

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

解碼器

每個解碼器由一個自注意力機制、一個針對編碼器的注意力機制和一個前饋神經網路三個主要部分組成。解碼器的功能與編碼器類似，但插入了一個額外的注意力機制，它從編碼器生成的編碼中提取相關資訊。這種機制也可以稱為編碼器 - 解碼器注意力（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 架構的基準測試。



訓練

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


* 語言建模

* 下一句預測

* 問答系統

* 閱讀理解

* 文字情感分析

* 文字覆寫



應用

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


* 機器翻譯

* 文字摘要

* 文字生成

* 命名實體辨識

* 生物序列分析

* 影片理解

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



實現

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

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



參見


* GPT-3

* BERT

* 悟道預訓練模型



參考文獻