1.Multiheads-Self-Attentiona簡介
多頭自注意力機制(Multi-Head Self-Attention)是一種注意力機制的變體,用于增強模型在處理序列數(shù)據時的建模能力。它在自注意力機制的基礎上引入了多個頭(Attention Head),每個頭都可以學習到不同的注意力權重分布,從而能夠捕捉到不同的關系和特征。
多頭自注意力機制可以分為以下幾個主要步驟:
1.1查詢、鍵和值的線性變換
????????首先,將輸入的查詢向量Q、鍵向量K和值向量V進行線性變換,得到多組查詢、鍵和值。具體來說,將它們通過不同的線性變換矩陣分別投射到不同的低維空間中,得到多組變換后的查詢向量Q'、鍵向量K'和值向量V'。
1.2多頭注意力權重的計算
????????在這一步驟中,針對每個注意力頭,分別計算出對應的注意力權重。具體來說,對于每個頭,將變換后的查詢向量Q'與鍵向量K'進行點積操作,然后通過softmax函數(shù)將得分歸一化為概率分布。這樣就得到了多組注意力權重。
1.3多頭上下文向量的計算
????????針對每個注意力頭,將對應的注意力權重與變換后的值向量V'進行加權求和,得到多組上下文向量。這些上下文向量將包含各個頭所關注的不同信息。
1.4多頭上下文的融合
????????將多組上下文向量在特定維度上進行拼接或線性變換,將它們融合成最終的上下文向量。這樣得到的上下文向量將包含從多個頭中學到的不同特征和關系。
????????多頭自注意力機制的優(yōu)勢在于可以并行地學習多組不同的注意力權重,從而能夠提取不同層次、不同類型的相關信息。通過引入多頭機制,模型可以同時關注序列中的多個位置,并從不同的角度對序列進行編碼,提高了模型的表達能力和泛化能力。
圖中h就是代表頭的數(shù)量,這個是transformer結構的一部分
2.代碼實現(xiàn)Multi-heads-Self-Attentiona結構
import torch
import torch.nn.functional as F
# 一個形狀為 (batch_size, seq_len, feature_dim) 的張量 x
x = torch.randn(2, 3, 4) # 形狀 (batch_size, seq_len, feature_dim)
# 定義頭數(shù)和每個頭的維度
num_heads = 2
head_dim = 2
# feature_dim 必須是 num_heads * head_dim 的整數(shù)倍
assert x.size(-1) == num_heads * head_dim
# 定義線性層用于將 x 轉換為 Q, K, V 向量
linear_q = torch.nn.Linear(4, 4)
linear_k = torch.nn.Linear(4, 4)
linear_v = torch.nn.Linear(4, 4)
# 通過線性層計算 Q, K, V
Q = linear_q(x) # 形狀 (batch_size, seq_len, feature_dim)
K = linear_k(x) # 形狀 (batch_size, seq_len, feature_dim)
V = linear_v(x) # 形狀 (batch_size, seq_len, feature_dim)
# 將 Q, K, V 分割成 num_heads 個頭
def split_heads(tensor, num_heads):
batch_size, seq_len, feature_dim = tensor.size()
head_dim = feature_dim // num_heads
output = tensor.view(batch_size, seq_len, num_heads, head_dim).transpose(1, 2)
return output # 形狀 (batch_size, num_heads, seq_len, feature_dim)
Q = split_heads(Q, num_heads) # 形狀 (batch_size, num_heads, seq_len, head_dim)
K = split_heads(K, num_heads) # 形狀 (batch_size, num_heads, seq_len, head_dim)
V = split_heads(V, num_heads) # 形狀 (batch_size, num_heads, seq_len, head_dim)
# 計算 Q 和 K 的點積,作為相似度分數(shù) , 也就是自注意力原始權重
raw_weights = torch.matmul(Q, K.transpose(-2, -1)) # 形狀 (batch_size, num_heads, seq_len, seq_len)
# 對自注意力原始權重進行縮放
scale_factor = K.size(-1) ** 0.5
scaled_weights = raw_weights / scale_factor # 形狀 (batch_size, num_heads, seq_len, seq_len)
# 對縮放后的權重進行 softmax 歸一化,得到注意力權重
attn_weights = F.softmax(scaled_weights, dim=-1) # 形狀 (batch_size, num_heads, seq_len, seq_len)
# 將注意力權重應用于 V 向量,計算加權和,得到加權信息
attn_outputs = torch.matmul(attn_weights, V) # 形狀 (batch_size, num_heads, seq_len, head_dim)
# 將所有頭的結果拼接起來
def combine_heads(tensor, num_heads):
batch_size, num_heads, seq_len, head_dim = tensor.size()
feature_dim = num_heads * head_dim
output = tensor.transpose(1, 2).contiguous().view(batch_size, seq_len, feature_dim)
return output# 形狀 : (batch_size, seq_len, feature_dim)
attn_outputs = combine_heads(attn_outputs, num_heads) # 形狀 (batch_size, seq_len, feature_dim)
# 對拼接后的結果進行線性變換
linear_out = torch.nn.Linear(4, 4)
attn_outputs = linear_out(attn_outputs) # 形狀 (batch_size, seq_len, feature_dim)
print(" 加權信息 :", attn_outputs)
在我的其它文章中詳細介紹了transformer和gpt的結構,具體代碼見此專欄的其他文章?
3.總結
????????值得注意的是,多頭自注意力機制通常還會引入一些線性變換和歸一化操作,以增加模型的表達能力和穩(wěn)定性。比如,可以通過將多個頭輸出的上下文向量進行線性變換并拼接,然后再通過另一個線性變換將其映射到目標空間。同時,為了保持變換前后的數(shù)值范圍一致,常常會進行歸一化操作,如層歸一化(Layer Normalization)或批次歸一化(Batch Normalization)。文章來源:http://www.zghlxwxcb.cn/news/detail-858344.html
????????綜上所述,多頭自注意力機制通過引入多組注意力頭,可以并行學習多個不同的注意力權重,從而能夠提取不同層次、不同類型的相關信息,增強模型的表達能力和泛化能力。它是當前很多自然語言處理任務中常用的重要注意力機制之一。文章來源地址http://www.zghlxwxcb.cn/news/detail-858344.html
到了這里,關于Python 基于pytorch實現(xiàn)多頭自注意力機制代碼;Multiheads-Self-Attention代碼實現(xiàn)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!