注意力機制的實現可以分解為幾個核心步驟,其本質是通過動態計算權重,決定不同位置信息的重要性,再對信息進行加權融合。以下從數學原理、代碼實現到直觀解釋逐步展開:
一、核心實現步驟
以最常見的**點積注意力(Dot-Product Attention)**為例:
1. 輸入向量化
- 假設輸入序列有 ( N ) 個詞,每個詞轉換為向量 ( \mathbf{x}i )(維度為 ( d{\text{model}} ))。
2. 生成Query、Key、Value
- 對每個詞向量分別進行線性變換,生成三組向量:
- Query(查詢向量):
Q = X W Q \mathbf{Q} = \mathbf{X} \mathbf{W}^Q \ Q=XWQ? - Key(鍵向量):
K = X W K \mathbf{K} = \mathbf{X} \mathbf{W}^K \ K=XWK? - Value(值向量):
V = X W V \mathbf{V} = \mathbf{X} \mathbf{W}^V \ V=XWV? - 其中
W Q , W K , W V \mathbf{W}^Q, \mathbf{W}^K, \mathbf{W}^V \ WQ,WK,WV?是可學習的權重矩陣。
- Query(查詢向量):
3. 計算注意力分數
- 通過 Query 和 Key 的點積 計算詞與詞之間的相關性分數:
Scores = Q K T \text{Scores} = \mathbf{Q} \mathbf{K}^T Scores=QKT- 分數越高,表示兩個詞的相關性越強。
4. 縮放與歸一化
- 縮放(Scale):為避免點積結果過大導致梯度消失,除以 ( \sqrt{d_k} )(( d_k ) 是 Key 的維度):
Scaled?Scores = Q K T d k \text{Scaled Scores} = \frac{\mathbf{Q} \mathbf{K}^T}{\sqrt{d_k}} Scaled?Scores=dk??QKT? - Softmax 歸一化:將分數轉換為概率分布(和為1):
Attention?Weights = softmax ( Scaled?Scores ) \text{Attention Weights} = \text{softmax}(\text{Scaled Scores}) Attention?Weights=softmax(Scaled?Scores)
5. 加權求和
- 用注意力權重對 Value 加權求和,得到最終輸出:
Output = Attention?Weights ? V \text{Output} = \text{Attention Weights} \cdot \mathbf{V} Output=Attention?Weights?V
二、數學公式整合
注意力機制的完整公式為:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{softmax}\left( \frac{\mathbf{Q} \mathbf{K}^T}{\sqrt{d_k}} \right) \mathbf{V} Attention(Q,K,V)=softmax(dk??QKT?)V
三、代碼實現(PyTorch示例)
import torch
import torch.nn as nn
import torch.nn.functional as Fclass DotProductAttention(nn.Module):def __init__(self, d_k):super().__init__()self.d_k = d_k # Key的維度def forward(self, Q, K, V):# 計算點積注意力分數scores = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(self.d_k))# Softmax歸一化attention_weights = F.softmax(scores, dim=-1)# 加權求和output = torch.matmul(attention_weights, V)return output# 示例輸入
batch_size = 2
seq_len = 5 # 序列長度
d_model = 64 # 輸入維度
d_k = d_v = 32 # Key和Value的維度# 隨機生成輸入向量
X = torch.randn(batch_size, seq_len, d_model)
# 定義權重矩陣(實際中應使用nn.Linear)
W_Q = nn.Linear(d_model, d_k)
W_K = nn.Linear(d_model, d_k)
W_V = nn.Linear(d_model, d_v)# 生成Q, K, V
Q = W_Q(X) # shape: [batch_size, seq_len, d_k]
K = W_K(X)
V = W_V(X)# 計算注意力
attention = DotProductAttention(d_k)
output = attention(Q, K, V) # shape: [batch_size, seq_len, d_v]
四、多頭注意力(Multi-Head Attention)
為了增強模型捕捉不同模式信息的能力,通常會將注意力機制擴展為多頭形式:
1. 實現步驟
- 分割向量:將 ( \mathbf{Q}, \mathbf{K}, \mathbf{V} ) 按頭數(( h ))分割為 ( h ) 組子向量。
- 獨立計算注意力:每組子向量并行計算注意力。
- 拼接結果:將各頭的輸出拼接,再通過線性層融合。
2. 數學公式
MultiHead ( Q , K , V ) = Concat ( head 1 , … , head h ) W O \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h) \mathbf{W}^O MultiHead(Q,K,V)=Concat(head1?,…,headh?)WO
其中
head i = Attention ( Q W i Q , K W i K , V W i V ) \text{head}_i = \text{Attention}(Q \mathbf{W}_i^Q, K \mathbf{W}_i^K, V \mathbf{W}_i^V) \ headi?=Attention(QWiQ?,KWiK?,VWiV?)?
五、直觀解釋
1. Query-Key-Value的比喻
- Query(問題):當前詞想知道什么?
- Key(標簽):其他詞能提供什么信息?
- Value(答案):實際傳遞的信息內容。
注意力機制相當于通過 問題 和 標簽 的匹配程度,決定從 答案 中提取多少信息。
2. 動態權重的作用
- 若兩個詞的 Key 和 Query 高度匹配(點積大),它們的權重會接近1,反之接近0。
- 例如:句子 “貓追老鼠,因為它餓了” 中,處理“它”時,模型會給“貓”高權重,給“老鼠”低權重。
六、注意力機制的變體
類型 | 特點 |
---|---|
加性注意力 | 使用神經網絡計算相關性分數(如Bahdanau注意力) |
局部注意力 | 僅計算局部窗口內的注意力權重,降低計算成本 |
稀疏注意力 | 通過規則或隨機采樣減少計算量(如Longformer、BigBird) |
軸向注意力 | 在多維數據(如圖像)中沿特定軸計算注意力 |
七、總結
注意力機制通過以下步驟實現:
- 向量變換:生成Query、Key、Value。
- 相關性計算:通過點積衡量詞與詞之間的關聯。
- 權重歸一化:Softmax轉換為概率分布。
- 信息融合:加權求和得到最終輸出。
其核心優勢在于動態聚焦關鍵信息,而多頭注意力進一步增強了模型的表達能力。這種機制不僅是Transformer的基礎,也被廣泛應用于計算機視覺、語音處理等領域。