本文目錄:
- 一、核心思想:一句話概括
- 二、計算流程的直觀比喻
- 三、分步計算詳解(附數字例子)
- 第 1 步:創建 Query, Key, Value 向量
- 第 2 步:計算注意力分數
- 第 3 步:縮放并應用 Softmax
- 第 4 步:與 Value 向量加權求和,得到輸出
- 四、矩陣運算:實際是如何計算的
- 五、為什么 Self-Attention 如此強大?
- 總結

前言:之前講解了Transformer各部分作用、殘差等,本文分享self-attention。
一、核心思想:一句話概括
Self-Attention 的核心思想是:讓序列中的每一個詞(元素)都能夠“關注”到序列中的所有其他詞(包括它自己),并根據相關性動態地聚合所有詞的信息,從而得到一個新的、融入了全局上下文信息的表示。
簡單比喻:
讀一句話時,為了理解某個詞的含義,你的大腦會自動地回顧句子中的其他詞,并賦予它們不同的重要性。Self-Attention 就是讓機器模擬這個過程。
- 理解“它”這個詞時,你會更關注句子前面提到的某個名詞(比如“蘋果”)。
- 理解“好吃”這個詞時,你會更關注“蘋果”而不是“石頭”。
二、計算流程的直觀比喻
我們把 Self-Attention 想象成一個信息檢索系統:
- 準備階段(Input Processing):每個詞都把自己改造成三份身份:查詢(Query)、鍵(Key)、值(Value)。
- 檢索階段(Attention Scoring):
- 一個詞(通過它的 Query)去“詢問”序列中的所有詞(它們的 Key):“我和你們每個人的相關度是多少?”
- 通過計算
Q·K
得到一組相關度分數(Attention Scores)。
- 加權求和階段(Output):
- 將這些相關度分數作為權重,對所有詞的 Value(實際攜帶的信息)進行加權求和。
- 最終輸出:一個融合了全局信息的、新的詞表示。
最終效果:每個詞的新表示,不再是它孤立的嵌入向量,而是一個深知全局上下文的“社交達人”。
三、分步計算詳解(附數字例子)
假設我們有一個簡單的序列:“Thinking Machines”,兩個詞。它們的初始嵌入向量(假設維度為 4)為:
x? = [1, 0, 1, 0]
(代表 “Thinking”)
x? = [0, 2, 0, 2]
(代表 “Machines”)
第 1 步:創建 Query, Key, Value 向量
每個輸入向量 x_i
會分別乘以三個可訓練的權重矩陣 W^Q
, W^K
, W^V
,從而產生對應的 Q, K, V 向量。
假設我們的權重矩陣是:
W^Q = [[1, 0, 1, 0],[0, 1, 0, 1],[1, 0, 0, 1],[0, 1, 1, 0]]W^K = [[0, 1, 1, 0],[1, 0, 0, 1],[0, 0, 1, 1],[1, 1, 0, 0]]W^V = [[1, 1, 0, 0],[0, 1, 1, 0],[0, 0, 1, 1],[1, 0, 0, 1]]
計算第一個詞 “Thinking” 的 Q, K, V:
q? = x? · W^Q = [1,0,1,0] · W^Q = [2, 0, 2, 0]
k? = x? · W^K = [1,0,1,0] · W^K = [0, 2, 2, 0]
v? = x? · W^V = [1,0,1,0] · W^V = [1, 1, 1, 1]
同理,計算 “Machines” 的 Q, K, V:
q? = x? · W^Q = [0,2,0,2] · W^Q = [0, 4, 0, 4]
k? = x? · W^K = [0,2,0,2] · W^K = [4, 0, 4, 0]
v? = x? · W^V = [0,2,0,2] · W^V = [2, 2, 2, 2]
關鍵:
W^Q
,W^K
,W^V
是模型需要學習的參數,它們決定了如何從原始輸入中解讀出“要查詢什么”、“用什么來被查詢”、“實際信息是什么”。
第 2 步:計算注意力分數
我們現在計算 “Thinking” (Query)對序列中每個詞(Key)的注意力分數。分數通過 Query 和 Key 的點積計算。
score?? = q? · k? = [2,0,2,0] · [0,2,2,0] = 0*2 + 2*0 + 2*2 + 0*0 = 4
(Thinking 與自身的相關性)
score?? = q? · k? = [2,0,2,0] · [4,0,4,0] = 2*4 + 0*0 + 2*4 + 0*0 = 16
(Thinking 與 Machines 的相關性)
第 3 步:縮放并應用 Softmax
-
縮放(Scale):點積的結果可能很大,導致 Softmax 梯度變小。因此除以 Key 向量維度(
d_k
)的平方根進行縮放。這里d_k=4
,平方根是 2。
scale_score?? = 4 / 2 = 2
scale_score?? = 16 / 2 = 8
-
Softmax:將分數轉換為概率分布(總和為1),使得大的分數更大,小的分數更小。
softmax([2, 8]) ≈ [0.012, 0.988]
解讀:對于 “Thinking” 這個詞來說,它認為 “Machines” 的信息(0.988)遠比它自己的信息(0.012)重要得多!
第 4 步:與 Value 向量加權求和,得到輸出
將 Softmax 得到的權重作用在所有詞的 Value 向量上,并求和,得到 “Thinking” 位置的新表示 z?
。
z? = 0.012 * v? + 0.988 * v? ≈ 0.012*[1,1,1,1] + 0.988*[2,2,2,2] ≈ [1.97, 1.97, 1.97, 1.97]
這個新的 z?
向量就是 “Thinking” 經過自注意力機制處理后的輸出。它幾乎完全由 “Machines” 的信息構成,這非常合理,因為 “Thinking Machines” 是一個整體概念。
對 “Machines” 重復步驟 2-4,可以計算出 z?
。
四、矩陣運算:實際是如何計算的
上述過程是為了理解,實際代碼中是用矩陣一次算完的,極其高效。
- 將所有輸入詞向量堆疊成矩陣
X
。 - 計算 Q, K, V 矩陣:
Q = X · W^Q
K = X · W^K
V = X · W^V
- 計算注意力分數矩陣:
Scores = Q · K^T / sqrt(d_k)
- 對 Scores 矩陣的每一行應用 Softmax。
- 計算輸出矩陣
Z
:Z = Softmax(Scores) · V
整個過程可以封裝為一個漂亮的公式:
Attention(Q, K, V) = softmax(QK^T / √d?) V
五、為什么 Self-Attention 如此強大?
- 全局依賴性:一步直接捕獲序列中任意兩個位置之間的關系,不受距離限制。解決了 RNN 的長程依賴問題。
- 并行化:巨大的矩陣乘法可以完全并行計算,訓練速度遠快于必須順序計算的 RNN。
- 可解釋性:通過分析注意力權重(
softmax(QK^T)
),我們可以直觀地看到模型在做決策時關注了哪些詞,如圖:
總結
Self-Attention 是一個精巧的“信息檢索與聚合”系統。它通過 Query、Key、Value 的抽象,讓模型能夠動態地、有選擇地融合序列的全局信息,從而為每個位置生成一個上下文感知的強大表示。它是 Transformer 能夠統治 NLP 乃至整個深度學習領域的基石。
本文分享到此結束。