"自注意力 (Self-Attention)" 是一種特殊的注意力機制,與我們之前討論的注意力機制不同之處在於,它不是讓輸出序列的元素去關注輸入序列的元素,而是讓輸入序列的每個元素都去關注輸入序列中的所有其他元素(包括自身),從而捕捉序列內部不同位置之間的依賴關係。
你可以將自注意力想像成一個句子中的每個詞語都在審視句子中的所有其他詞語,以判斷哪些詞語與自己最相關。這樣,模型就能夠理解句子中不同詞語之間的相互作用,例如指代關係、修飾關係等等。自注意力的核心思想:Queries, Keys, 和 Values
自注意力機制的核心是將輸入序列中的每個元素都看作是三個不同的向量:
- 查詢 (Query): 代表當前正在關注的元素,它想知道序列中的哪些其他元素與它相關。
- 鍵 (Key): 代表序列中的其他元素,它們提供了可以用來與查詢進行比較的信息。
- 值 (Value): 代表序列中的其他元素所攜帶的實際信息,這些信息會根據與查詢的相關性被加權聚合。
對於輸入序列中的每個元素,我們都會通過三個不同的線性變換(由可學習的權重矩陣構成)將其轉換成對應的查詢向量、鍵向量和值向量。
自注意力的計算過程 (簡化版):
假設我們有一個輸入序列 (X = (x_1, x_2, ..., x_n))。對於每個輸入 (x_i),我們計算其對應的查詢 (q_i)、鍵 (k_i) 和值 (v_i)。
- 計算注意力分數 (Scores): 對於序列中的每個查詢 (q_i),我們將其與所有鍵 (k_j) (包括 (k_i) 本身)進行比較,計算一個注意力分數 (s_{ij})。常用的計算方法是點積:(s_{ij} = q_i \cdot k_j)。縮放點積注意力還會在點積之後除以鍵向量維度的平方根,以防止點積結果過大。
- 歸一化注意力分數 (Normalization): 我們對每個查詢 (q_i) 的所有注意力分數 (s_{ij}) 應用 Softmax 函數進行歸一化,得到注意力權重 (a_{ij})。這個權重表示序列中第 (j) 個元素對於第 (i) 個元素的關注程度。
- 計算加權和 (Weighted Sum): 我們將每個值向量 (v_j) 乘以其對應的注意力權重 (a_{ij}),然後將所有加權後的值向量相加,得到最終的自注意力輸出 (z_i) 對於第 (i) 個元素。
因此,對於輸入序列中的每個位置 (i),自注意力機制都會輸出一個新的表示 (z_i),這個表示融合了序列中所有其他位置的信息,並根據它們與位置 (i) 的相關性進行加權。
多頭注意力 (Multi-Head Attention):
在實際應用中,通常會使用「多頭注意力」。這意味著我們會使用多組獨立的線性變換來生成多個不同的查詢、鍵和值,並進行多次自注意力計算。最後,將每個頭的注意力輸出拼接起來,並通過另一個線性變換得到最終的輸出。多頭注意力允許模型捕捉序列中不同方面的依賴關係。
自注意力的優點:
- 捕捉長距離依賴: 相較於 RNN,自注意力可以直接計算序列中任意兩個位置之間的依賴關係,而不需要像 RNN 那樣逐個時間步傳播信息,因此更容易捕捉長距離依賴。
- 並行計算: 自注意力計算可以並行進行,因為每個位置的輸出只依賴於所有位置的輸入,這使得模型在 GPU 等並行計算設備上效率更高。
- 可解釋性: 注意力權重可以提供關於序列內部哪些部分相互關聯的信息,有助於理解模型的決策過程。
自注意力的應用:
自注意力機制是 Transformer 模型的核心組成部分,而 Transformer 模型在自然語言處理領域取得了巨大的成功,例如:
- 機器翻譯 (Transformer 模型)
- 文本摘要
- 文本生成
- 語言模型 (例如 BERT, GPT)
除了 NLP,自注意力機制也被應用於其他領域,例如:
- 電腦視覺 (例如用於目標檢測和圖像分割)
- 時間序列分析
總之,自注意力是一種強大的機制,它允許模型有效地建模序列內部元素之間的關係,尤其擅長捕捉長距離依賴,並且是現代深度學習模型中非常重要的組成部分。


















