目錄
- 一、Transformer 的整體結構
- 二、Input Encoding
- 三、Transformer Block
- 3.1 Encoder
- 3.1.1 Attention
- 3.1.2 Self-attention
- 3.1.3 Multi-head Attention
- 3.2 Decoder
- 3.2.1 Masked Multi-head Attention
- 四、Transformer 的優缺點
遇到看不明白的地方,歡迎在評論中留言吶,一起討論,一起進步!
前提知識:注意力機制
本文參考:
【清華NLP】劉知遠團隊大模型公開課全網首發|帶你從入門到實戰
【官方雙語】Transformer模型最通俗易懂的講解,零基礎也能聽懂!
全網最透徹的注意力機制的通俗原理與本質【推薦】
【Transformer系列(2)】注意力機制、自注意力機制、多頭注意力機制、通道注意力機制、空間注意力機制超詳細講解
之前我們已經了解了 RNN,它是一個順序計算模型,無法并行處理。這就導致了計算機的并行資源被浪費。而 RNN 變體 GRU 或者 LSTM 仍然需要注意力機制。RNN 這樣“笨”,那我們是否能不要它呢?答案是肯定的,論文 Attention is all you need (NeurIPS 2017) 給了我們答案。在這篇文章中,作者提出了一個非常強大的模型結構來進行機器翻譯的任務,這個結構就是接下來要介紹的 Transformer。
一、Transformer 的整體結構
Transformer 同樣是一個編碼器-解碼器的模型。下圖中的紅色框表示編碼器(encoder)部分,藍色框表示解碼器(decoder)部分。
我們現在從下往上來看這個過程。首先第一層(下圖紅框內容)是輸入層,輸入層需要將文本序列切分成一個個小的單元(這個單元我們叫 token),然后通過 Embedding 轉換為向量表示。
這里有兩點不同于 RNN:
1、Transformer 會使用 byte pair encoding(BPE) 的方式來對文本進行切分。
2、在每個位置會加上一個 token 的位置向量,即 positional encoding,用來表示 token 在文本序列中的一個位置。
我們再來看 Transformer 的主體部分(下圖紅框內容),它是由多個 encoder blocks(編碼器塊)和多個 decoder blocks(解碼器塊)堆疊而成的。
在 encoder blocks 和 decoder blocks 之間,存在一些差異。然而,不同的 encoder block 之間和不同的 decoder block 之間的結構完全一致,只有參數有所不同。
最后來看模型的輸出層,其實就是通過一個線性層的變換和一個 Softmax 來輸出一個在詞表上的概率分布。這與之前 RNN 輸出層基本是一致的。在訓練過程中,我們也是通過在詞表這樣一個維度通過計算交叉熵來計算 loss。
以上就是 Transformer 的整體結構,接下來我們逐個部分進行講解。
二、Input Encoding
輸入層使用 Byte-Pair Encoding 對輸入進行切分,具體細節可以參考之前的博客 BPE (Byte-Pair Encoding) Tokenization 。
我們知道一個 token 出現在文本中的位置是非常重要的。
Transformer 提出了一個顯式建模位置關系的一個方法:通過在原有的 embedding 上加上一個位置向量來讓同一個單詞在不同位置有不同的表示,進而讓模型進行區分。
我們首先假設通過 BPE 和 embedding 得到的向量的維度為 d d d,而位置編碼也需要一個維度為 d d d 向量。
Transformer 采用了一個基于三角函數的一個方法來得到對應的一個位置向量:
p o s pos pos 表示當前 token 在句子中的位置,是一個從 0 0 0 到 序列長度之間的數。
i i i 表示當前這個位置在 embedding 中的 index,是一個從 0 0 0 到 d / 2 d/2 d/2 之間的數。
下圖展示的是一個長度為 10 10 10 個 token,編碼向量維度 d = 64 d=64 d=64 的位置編碼可視化。我們可以看到相同維度的編碼(就是每個豎線)其實是一個周期的正弦或者余弦函數,而相同位置的編碼(就是每個橫線)對應著不同周期的正弦和余弦函數。
根據三角函數的性質我們知道,不同位置的位置編碼向量之間的差別取決于它們之間的相對位置。
我們最終就是將 BPE 和 PE 按照位置相加得到的向量輸入到 Transformer 主體部分中。
三、Transformer Block
3.1 Encoder
Encoder 整體是由兩大塊組成的,分別是 Multi-Head Attention 網絡(下面橙色部分)和 Feed-Forward 網絡(上面藍色部分,本質上是一個帶激活函數的兩層 MLP 全連接,大家應該比較熟悉了)。
圖中的 Nx 表示 N 個模塊(block)可以堆疊在一起組成一個更深的神經網絡,在原始論文中, Encoder 端一共堆疊了 6 個模塊。
除此之外,這里附加了兩個小技巧:
1、殘差連接(Residual connection)(如圖左側的兩個箭頭)
殘差連接主要用于解決深層神經網絡中的梯度消失和梯度爆炸問題。它通過在網絡中添加跨層的直接連接,將上一層的輸出與下一層的輸入相加,從而將梯度從較深的層傳遞到淺層,使得網絡更易于訓練。具體而言,殘差連接可以使用以下公式表示:
y = F ( x ) + x y = F(x) + x y=F(x)+x其中, x x x 代表上一層的輸入, F ( x ) F(x) F(x) 代表上一層經過一系列操作后的輸出, y y y 代表當前層的輸出。通過將 x x x 直接添加到 F ( x ) F(x) F(x) 上,實現了梯度的直接傳遞。
殘差連接最早被引入到深度殘差網絡(ResNet)中,該網絡在 2015 年的 ImageNet 比賽中取得了優秀的成績。自此以后,殘差連接成為了深度學習中的重要組件,被廣泛用于各種網絡結構的設計中,例如DenseNet、Highway Network等。
深入了解可以參考論文:
Deep residual learning for image recognition. He et al. CVPR 2016.
2、層歸一化(Layer normalization)(見圖中兩處黃色部分)
Layer normalization 的主要思想是對每個神經網絡層的輸入進行歸一化,使得其均值為 0,方差為
1。具體而言,給定一個輸入向量 x x x,Layer normalization 的計算公式如下: LayerNorm ( x ) = scale ? ( x ? mean variance + epsilon ) + bias \text{{LayerNorm}}(x) = \text{{scale}} \cdot \left(\frac{{x - \text{{mean}}}}{{\sqrt{{\text{{variance}} + \text{{epsilon}}}}}}\right) + \text{{bias}} LayerNorm(x)=scale?(variance+epsilon?x?mean?)+bias其中,mean 和
variance 分別表示輸入向量 x x x 的均值和方差,epsilon 是一個小的正數防止除以零的情況,scale 和 bias
是可學習的參數。 通過將輸入向量 x x x 進行歸一化,Layer normalization 可以使得每個神經網絡層的輸入具有類似的分布。
深入了解可以參考論文:
Layer normalization. Ba et al. arXiv 2016.
我們主要關注 Multi-Head Attention 部分,下面我們對這部分詳細介紹一下。
3.1.1 Attention
我們先回顧一下前講的注意力機制:給定一個 query 向量和一組 value 向量,注意力機制基于 query 向量對 value 向量進行一個加權平均。
而 Transformer 給定的是一個 query 向量和一組 key-value 向量對。其中,query 向量和 key 向量的維度都是 d k d_k dk?,而 value 向量的維度是 d v d_v dv?。
不同于之前用 query 向量和 value 向量來計算注意力分數,我們這里采用 query 向量和 key 向量的點積來計算注意力分數。
這里的輸出同樣是對 value 向量進行一個加權平均。
A ( q , K , V ) = ∑ i e q ? K i ∑ j e q ? K j V i = softmax ( q K T ) V A(q,K,V)=\sum_i{\frac{e^{q\cdot K_i}}{\sum_j{e^{q\cdot K_j}}}V_i}=\text{softmax}(qK^T)V A(q,K,V)=i∑?∑j?eq?Kj?eq?Ki??Vi?=softmax(qKT)V
大家可以借助淘寶的例子來進行理解:
而多個 query 向量可以通過矩陣 Q Q Q 來表示:
A ( Q , K , V ) = softmax ( Q K T ) V A(Q,K,V)=\text{softmax}(QK^T)V A(Q,K,V)=softmax(QKT)V
為了控制注意力權重的大小和梯度的穩定性,這里進一步通過 query 向量的長度 d k d_k dk? 進行縮放(scale):
A ( Q , K , V ) = softmax ( Q K T d k ) V A(Q,K,V)=\text{softmax}(\frac{QK^T}{\sqrt{d_k}})V A(Q,K,V)=softmax(dk??QKT?)V
上圖完整地展示了 attention 的一個過程:
- 首先 Q Q Q 和 V V V 進行一個矩陣乘法,得到對應的一個注意力分數;
- 然后通過縮放系數 1 d k \frac{1}{\sqrt{d_k}} dk??1? 對注意力分數進行放縮
Mask 這個部分我們將在 decoder 部分使用- 接著再通過 SoftMax 函數將注意力分數轉換為一個概率分布
- 隨后通過與對應的 V V V 矩陣進行一個矩陣乘法就可以對 V V V 實現加權平均,得到我們最后的輸出
3.1.2 Self-attention
自注意力機制希望每個 token 能夠自主地選擇應該關注這句話中的哪些 token 并進行信息的整合,對應的 Q 、 K 、 V Q、K、V Q、K、V 三個矩陣其實都是通過文本的表示向量乘上一個變換矩陣得到的。
對于第一層的 Transformer Block 來說,文本的表示向量其實就是我們前面提到的詞表向量和對應位置編碼的一個求和。
而對于非第一層的 Transformer Block 來說,文本的表示向量其實就是前面一層的輸出。
自注意力機制的關鍵點在于, Q 、 K 、 V Q、K、V Q、K、V 是同一個東西,或者三者同源,不是輸入語句和輸出語句之間的注意力機制,而是輸入語句內部元素之間或者輸出語句內部元素之間發生的注意力機制。
注意力機制的 Q Q Q 和 K K K 是不同來源的。 例如,在 Encoder-Decoder 模型中, K K K是 Encoder 中的元素,而 Q Q Q 是 Decoder 中的元素。
自注意力機制的 Q Q Q 和 K K K 則都是來自于同一組元素。 例如,在 Encoder-Decoder 模型中, Q Q Q 和 K K K 都是 Encoder 中的元素,相互之間做注意力匯聚。
3.1.3 Multi-head Attention
在上述單個 attention 的基礎上,Transformer 為了進一步增強模型的一個表示能力,采用了多個結構相同但參數不同的注意力模塊,組成了一個多頭的注意力機制,其中每個注意力頭的計算方式都和前面介紹的完全一致,只不過每個頭都有一個自己的權重矩陣 W i Q W_i^Q WiQ?、 W i K W_i^K WiK? 和 W i V W_i^V WiV?(分別對應下圖下方的 Linear 位置)。
每個注意力頭通過前面介紹的方式得到自己的輸出:
h e a d i = A ( Q W i Q , K W i K , V W i V ) head_i=A(QW_i^Q,KW_i^K,VW_i^V) headi?=A(QWiQ?,KWiK?,VWiV?)
然后我們將這些輸出在維度層面進行一個拼接,然后通過一個線性層進行整合就得到了 Multi-head Attention 的一個輸出。
MultiHead ( Q , K , V ) = Concat ( h e a d 1 , . . . , h e a d h ) W O \text{MultiHead}(Q,K,V)=\text{Concat}(head_1,...,head_h)W^O MultiHead(Q,K,V)=Concat(head1?,...,headh?)WO
最后這個輸出就會通過殘差連接和正則化之后輸入到后面的前饋神經網絡(2-layer feed-forward network)。
3.2 Decoder
對于 Decoder 端,大體上和 Encoder 端是一致的,但是有兩個簡單的修改:
1、最開始并不是 Multi-head Attention,而是 Masked Multi-head Attention
掩碼操作可以避免模型在預測當前位置時使用未來位置的信息。具體而言,模型在預測第 i i i 個位置時,將第 i i i 個位置及其后續位置的注意力權重設置為一個很小的值,表示這些位置的信息被遮蓋。
2、Multi-head Attention 的輸入 Q Q Q 來自 Decoder,即 Masked Multi-head Attention 的輸出向量經過殘差連接和正則化之后的輸出,而 K K K 和 V V V 來自于 Encoder 最后一層的輸出
這個部分類似于我們最開始講的端到端模型中的注意力機制,它是為了幫助 Decoder 端每一步的生成都可以關注和整合每個 Encoder 端每個位置的信息。
和 Encoder block 一樣,這樣的 Decoder block 也可以進行堆疊,如上圖我右方標記了“Nx”。在原論文中,Decoder block 也是一共堆疊了 6 層。
3.2.1 Masked Multi-head Attention
在 Multi-head Attention 的基礎上, Masked Multi-head Attention 在注意力分數矩陣上進行了掩碼操作,即將這個矩陣的左對角線的上三角部分(不包括對角線)設置為 ? ∞ -∞ ?∞
這樣的操作能讓我們在計算 SoftMax 之后 ? ∞ -∞ ?∞ 對應的位置會變為 0,然后通過矩陣乘法我們會發現:第 i i i 個輸出(即 Output 的第 i i i 行)只考慮了前 i i i 個 value 向量(即 V 的前 i i i 行)
這樣的操作就保證了 Decoder 端在文本生成的時候是順序生成的,不會出現我們在生成第 i i i 個位置的時候參考了第 i + 1 i+1 i+1 個輸入位置的信息。
四、Transformer 的優缺點
優點:
- Transformer 是一個功能強大的模型,在許多自然語言處理 (NLP) 任務中已被證明是有效的。
- Transformer 模型適用于并行計算,可以在大規模數據上進行高效的訓練和推理。
- Transformer 的注意力機制被證明是一種有效的建模方法,在處理不同位置之間的關系時表現出色。
- Transformer 模型的出現為最近的 NLP 進展提供了啟示,如 BERT 和 GPT,這些模型基于 Transformer 的架構取得了顯著的突破。
缺點:
- 模型本身對于參數非常敏感,優化過程非常困難
- 處理復雜度為 O ( n 2 ) O(n^2) O(n2),導致對于也別長的文本束手無策,通過設置 512 為最大輸入長度。