Illustrated Transformer筆記

peterzh6發表於2024-06-16

Attention Is All You Need

編碼器端

image

Self-attention層

用處:將對其他相關單詞的“理解”融入我們當前正在處理的單詞的方法,類似於RNN透過保持隱藏狀態讓 RNN 將其已處理的先前單詞/向量的表示與當前正在處理的單詞/向量結合起來

將單詞輸入轉化為Embedding之後,將Embedding和Q K V三個矩陣相乘,便可以獲得一個查詢向量\(q_i\)、一個鍵向量\(k_i\)和一個值向量\(v_i\)
image

有了\(q_i\)\(k_i\),我們就可以根據這個詞對輸入句子的每個單詞進行評分。分數決定了我們在某個位置編碼單詞時對輸入句子其他部分的關注程度。透過計算\(q_i \cdot k_i\),獲得這個分數。
之後,我們將這些分數除以 8(論文中使用的關鍵向量維度64的平方根 - 8。這會導致更穩定的梯度。這裡可能還有其他可能的值,但這是預設值),然後將結果傳遞給 softmax 運算,最終再乘以\(v_i\)向量
image

使用矩陣表示上面的流程

\[Attention(Q, K, V) = Z = \text{softmax}\left(\frac {Q \cdot K^T}{\sqrt{d_k}}\right)V \]

Z矩陣就是self-attention的輸出
image

多頭注意力本質:多個獨立的Q K V矩陣

\[\mathrm{MultiHead}(Q, K, V) = \mathrm{Concat}(\mathrm{head_1}, ..., \mathrm{head_h})W^O \\ \text{where}~\mathrm{head_i} = \mathrm{Attention}(QW^Q_i, KW^K_i, VW^V_i) \]

但是前饋層並不期望八個(多頭的預設數目)矩陣——它期望一個矩陣(每個單詞一個向量)。所以我們需要一種方法將這八個矩陣壓縮成一個矩陣。我們該怎麼做呢?我們將矩陣連線起來,然後將它們乘以附加權重矩陣 \(W^O\)
image

使用位置編碼表示序列的順序

到目前為止,我們所描述的模型缺少一件事,那就是解釋輸入序列中單詞順序的方法。

為了解決這個問題,Transformer 為每個輸入嵌入新增了一個向量。這些向量遵循模型學習到的特定模式,這有助於確定每個單詞的位置,或序列中不同單詞之間的距離。這裡的直覺是,將這些值新增到嵌入中後,一旦嵌入向量被投影到 \(Q/K/V\) 向量中並在點積注意期間,它們之間就會提供有意義的距離。

解碼器端

image

Encoder-Decoder Attention層

在上述公式中,\(d_k\) 表示的是矩陣的維度,而不是向量的維度。

具體來說,\(d_k\) 是注意力機制中查詢(query)和鍵(key)的維度大小。在自注意力機制(self-attention)中,輸入向量會被分成多個注意力頭,每個頭都會有自己的查詢、鍵和值。\(d_k\) 用來表示每個注意力頭中查詢和鍵的維度大小,以便在計算注意力權重時進行歸一化。

在公式中,\(Q\), \(K\)\(V\) 都是矩陣形式的輸入,而 \(d_k\) 表示了查詢和鍵矩陣的維度大小。該維度大小通常與輸入矩陣的特徵維度相對應,以保持一致性和有效性。

為什麼採用self-attention

1、每層的計算量減少

2、在訓練時,可以平行計算

3、網路中長範圍的相關性,當兩個位置的輸入輸出之前的路徑更短時,更容易學習到兩者之間的相關性。感覺有點吸取了CNN和RNN中梯度消失和梯度爆炸的教訓

4、self-attention可以得到更具有解釋性的模型

來源:Illustrated Transformer