第13堂課:自注意力機制 (Self-attention) (下) - 自注意力機制 Self-Attention

這堂課深入講解了自注意力機制 (Self-Attention) 的運作原理,從向量層面逐步過渡到矩陣運算,並探討了其多種變形、應用以及與其他主流模型的比較。

一、自注意力機制 (Self-Attention) 運作流程

Self-Attention 旨在將輸入的一系列向量 轉換為另一系列向量 。這裡強調一點,所有的輸出向量 一次同時被計算出來的,而非依序生成。

以計算 為例,其操作流程如下:

  1. 產生 Query (查詢) 向量 :

    • 將輸入向量 乘上一個轉換矩陣 得到查詢向量
  2. 計算注意力分數 (Attention Score):

    • 會與所有輸入向量 所對應的 Key (鍵) 向量 進行點積 (dot product) 運算,得到一系列注意力分數。
    • (其中 是另一個轉換矩陣)
    • 分數計算範例:
      • 點積得到
      • 點積得到
      • 點積得到
  3. 分數正規化 (Normalization):

    • 將這些原始注意力分數進行正規化,例如透過 Softmax 函數,得到最終的注意力權重
    • 例如,從 透過 Softmax 得到
  4. 加權求和 (Weighted Sum) 得到輸出 :

    • 將這些正規化後的注意力權重 分別乘上所有輸入向量 所對應的 Value (值) 向量 ,再將結果全部加總,即得到
    • (其中 是第三個轉換矩陣)

這個過程對每個 都一樣,只需將主角 換成 即可。

二、從矩陣角度看自注意力機制 (Self-Attention)

上述的步驟可以被簡化為一系列的矩陣乘法運算。

2.1 產生 Q, K, V 矩陣

  1. 輸入矩陣 : 將輸入向量 橫向堆疊成一個矩陣 。若每個 維向量,序列長度為 ,則 的形狀通常為 (每行代表一個向量)。

  2. 轉換矩陣 : 這是 Self-Attention 層中唯一需要學習的參數。它們將輸入向量轉換為 Query, Key, Value 向量。

    • : 形狀為
    • : 形狀為
    • : 形狀為 (其中 是 Key/Query 的維度, 是 Value 的維度,通常 )
  3. 計算 矩陣:

    • (Query 矩陣,形狀 )
    • (Key 矩陣,形狀 )
    • (Value 矩陣,形狀 )
    • 這些矩陣的每一行分別代表一個 向量。

2.2 計算注意力分數矩陣 A

  1. 計算原始注意力分數矩陣 : 每個 Query 向量與每個 Key 向量進行點積,形成一個 的注意力分數矩陣。

    • 這裡除以 是為了縮放,防止點積結果過大,導致 Softmax 梯度過小。
    • 矩陣 中的每個元素 代表 的關聯程度 ()。
  2. 正規化得到注意力權重矩陣 : 對 的每一行 (或每一列,取決於設計) 進行 Softmax 運算,確保權重和為

    • 通常被稱為 Attention Matrix

2.3 計算輸出矩陣 O

  1. 加權求和得到輸出矩陣 : 將注意力權重矩陣 乘上 Value 矩陣
    • 矩陣 的形狀為 ,其每一行 即為對應輸入 的輸出向量

2.4 矩陣運算總結

整個 Self-Attention 層的操作可以概括為:

其核心流程是: Input 矩陣 注意力分數矩陣 正規化注意力矩陣 輸出矩陣

值得注意的是,Self-Attention 層中唯一需要訓練的參數是 這三個轉換矩陣。

三、多頭自注意力機制 (Multi-head Self-Attention)

多頭 (Multi-head) Self-Attention 是 Self-Attention 的一種進階變形,在現代 Transformer 模型中被廣泛應用。

3.1 概念

  • 多種相關性: 相關性可能有多種定義。例如,在句子中,一個詞可能與另一個詞有語法上的關聯,也可能與第三個詞有語義上的關聯。
  • 多個「頭」: 為了捕捉這些不同種類的相關性,我們不只產生一個 向量,而是產生多個「頭」的 向量組,讓不同的頭負責學習不同類型的相關性。

3.2 運作流程

  1. 生成多個 Query, Key, Value 投影:

    • 對每個輸入 ,不再只產生一組
    • 例如,如果有 個頭,每個 會生成 (其中 是頭的編號)。
    • 這通常透過將 乘上 組不同的投影矩陣 (),或將 投影到更高維度後再分割成 個部分來實現。
  2. 平行執行多個 Self-Attention:

    • 每個頭 (e.g., 頭 1) 獨立執行 Self-Attention 流程: 只與 計算注意力分數,然後用這些分數對 進行加權求和,得到輸出
    • 所有 個頭同時進行 these 運算,互不干擾。
  3. 拼接與最終轉換:

    • 將所有頭的輸出向量 (e.g., ) 拼接 (concatenate) 起來。
    • 將拼接後的向量再通過一個最終的線性轉換矩陣 (Outpu t Projection),得到最終的輸出

3.3 超參數考量

  • 頭的數量 (Number of Heads): 這是需要調整的超參數。不同的任務可能需要不同數量的頭。例如,翻譯和語音辨識可能需要更多的頭,而某些簡單任務可能一個頭就足夠。

四、位置編碼 (Positional Encoding)

4.1 問題

  • 缺失位置資訊: 傳統的 Self-Attention 機制對輸入序列中的每個向量 都是獨立處理的,它無法區分一個向量是出現在序列的最前面還是最後面,或者與其他向量的相對距離。所有的位置對於 Self-Attention 而言都是「天涯若比鄰」。
  • 重要性: 位置資訊在許多序列任務中至關重要,例如詞性標記時,知道一個詞在句首或句尾有助於判斷其詞性。

4.2 解決方案:將位置資訊嵌入輸入

  1. 生成位置向量 (Positional Vector): 為序列中的每個位置 創建一個獨特的向量
  2. 疊加到輸入向量: 將這個位置向量 加到對應位置的輸入向量 上,形成新的輸入
  3. 這樣,Self-Attention 層在處理 時,就能感知其在序列中的位置。

4.3 Positional Encoding 的實現

  • Handcrafted (人工設計): 原始 Transformer 論文採用了正弦 () 和餘弦 () 函數來生成 。這種方法的好處是不受序列長度限制。
  • Learnable (可學習): 也可以將 Positional Encoding 向量設為模型的參數,讓模型透過訓練數據自動學習這些向量。
  • 研究熱點: Positional Encoding 仍然是一個活躍的研究領域,不斷有新的方法被提出,例如基於 RNN 生成、或稱為 FLOATER 的方法。目前沒有一個公認的最佳方法。

五、Self-Attention 的應用與變形

5.1 語音辨識 (Speech Recognition) - 截斷式 Self-attention (Truncated Self-attention)

  • 問題: 語音訊號轉換成的向量序列 (e.g., Mel-spectrogram) 長度非常可觀(1秒聲音約100個向量),導致標準 Self-Attention 的計算複雜度 過高,難以訓練。
  • 解決方案: 截斷式 Self-attention。在計算注意力時,只考慮輸入向量周圍一小段範圍內的向量,而非整個序列。
  • 依據: 辨識一個音素往往只需要其前後少量語音資訊,無需整個句子上下文。這有助於大幅降低計算量 and 記憶體消耗。

5.2 影像處理 (Image Processing)

  • 觀點轉換: Self-Attention 適用於輸入為「一排向量」的場景。雖然影像常被視為高維張量 (Tensor),但也可以將其重新概念化為「一個向量的集合」。
    • 例如,一張 的彩色圖片,可以看作是 個像素點,每個像素點本身就是一個 3 維向量 (RGB)。
  • 應用: Vision Transformer (ViT) 等模型已成功將 Self-Attention 應用於影像處理任務,顯示其泛化能力。

六、Self-Attention 與其他模型的比較

6.1 與卷積神經網路 (CNN) 的比較

  • 感受野 (Receptive Field):
    • CNN: 每個神經元只考慮其局部感受野內的資訊,感受野的大小是人工設計的。
    • Self-Attention: 透過注意力機制,可以考慮整張影像或整個序列的資訊 (全局感受野),就像感受野是「自動學習」出來的,網絡自己決定哪些像素是相關的。
  • 關係:
    • 數學上,CNN 可以被視為 Self-Attention 的一個特例 (subset)。Self-Attention 是更彈性 (flexible) 的 CNN,而 CNN 是受限制 (restricted) 的 Self-Attention。
    • 只要設定合適的參數,Self-Attention 就能模擬 CNN 的行為。
  • 數據量與過擬合:
    • Self-Attention: 彈性大,需要更多的訓練資料。數據量不足時容易過擬合。
    • CNN: 彈性小 (具有更強的歸納偏置,inductive bias),在訓練資料量較少時,通常表現會比 Self-Attention 更好,不易過擬合。
    • 實驗結果 (Google ViT 論文) 顯示,當訓練資料量極大時,Self-Attention 表現會超越 CNN。
  • 混合模型: 實際應用中,可以結合兩者優點,例如 Conformer 模型同時使用 Self-Attention 和 CNN。

6.2 與遞迴神經網路 (RNN) 的比較

  • 處理方式:
    • RNN: 順序處理序列,前一個時間步的輸出會作為下一個時間步的輸入 (透過記憶體向量)。若要考慮遠端資訊,需要將資訊一路「帶」到最後,且容易有梯度消失/爆炸問題。
    • Self-Attention: 可以直接在序列中任意兩個位置之間建立聯繫,無論距離多遠,都能直接抽取資訊 (天涯若比鄰),沒有「遺忘」的問題。
  • 平行化 (Parallelization):
    • RNN: 無法平行化。每個時間步的計算都依賴於前一個時間步的結果,必須依序進行。
    • Self-Attention: 輸出序列中的每個向量都可以同時計算,高度平行化,因此運算效率更高。
  • 趨勢: 由於其平行處理能力和捕捉長距離依賴的優勢,Self-Attention 在許多序列任務中逐漸取代了 RNN 的地位。
  • 關係: Self-Attention 透過某些設計和限制,也可以模擬 RNN 的行為。

七、Self-Attention 在圖 (Graph) 上的應用

  • 圖即向量集合: 圖 (Graph) 也可以被視為一組節點向量,因此 Self-Attention 也能應用於圖結構數據。
  • 結合邊資訊: 在圖上應用 Self-Attention 時,除了節點本身的特徵向量外,我們還擁有邊 (Edge) 的資訊,這代表了節點之間的明確關聯。
  • 限制注意力範圍: 可以利用圖的邊資訊來限制 Self-Attention 的計算。例如,只計算有邊相連的節點之間的注意力分數,對於沒有直接相連的節點,其注意力分數可直接設為 0。
  • Graph Neural Network (GNN): 這種結合圖結構資訊的 Self-Attention,是某一種類型的圖神經網絡 (GNN)。它利用了圖中已知的關聯性,避免模型重新學習這些已知的關係。

八、Self-Attention 的變形與未來研究

8.1 挑戰:計算複雜度

  • Self-Attention 最大的問題在於其計算複雜度為 ,這對於長序列來說是巨大的負擔。
  • 因此,如何減少 Self-Attention 的計算量,是目前研究的重點方向。

8.2 高效變形 (Efficient Transformers)

  • xxformer 家族: 為了優化計算效率,產生了許多 Self-Attention 的變形,通常被冠以 “-former” 的名稱,如 Linformer, Performer, Reformer 等。
  • 速度與效能的權衡: 這些高效變形通常能在速度上超越原始 Transformer,但往往會犧牲一定的模型效能 (performance)。
  • 未來研究: 如何設計出既快又好 (兼顧速度與效能) 的 Self-Attention 變形,仍然是一個開放且活躍的研究問題。有許多論文 (如 “Long Range Arena” 和 “Efficient Transformers: A Survey”) 專門探討和比較這些變形。
graph TD
    A["自注意力機制 Self-Attention"] --> SA_Flow["運作流程"]
    A --> SA_Matrix["矩陣視角"]
    A --> MHSA["多頭自注意力機制"]
    A --> PE["位置編碼"]
    A --> App["應用與變形"]
    A --> Comp["與其他模型比較"]
    A --> Graph["在圖上的應用"]
    A --> Future["變形與未來研究"]

    SA_Flow --> Q_Vec["查詢 Q 向量"]
    SA_Flow --> K_Vec["鍵 K 向量"]
    SA_Flow --> V_Vec["值 V 向量"]
    Q_Vec -- Node1["點積計算分數"] --> Attn_Scores["注意力分數"]
    K_Vec -- Node2["提供上下文"] --> Attn_Scores
    Attn_Scores -- Node3["Softmax正規化"] --> Alpha_Prime["注意力權重 α'"]
    V_Vec -- Node4["加權求和"] --> Output_B["輸出向量 b"]
    Alpha_Prime -- Node4["加權求和"] --> Output_B

    SA_Matrix --> Input_I["輸入 I 矩陣"]
    Input_I -- Node5["乘以 Wq, Wk, Wv"] --> QKV_Matrix["Q, K, V 矩陣"]
    QKV_Matrix -- Node6["Q K轉置計算"] --> Raw_Attn_A["原始注意力矩陣 A"]
    Raw_Attn_A -- Node3["Softmax正規化"] --> Attn_Matrix_A_Prime["正規化注意力矩陣 A'"]
    Attn_Matrix_A_Prime -- Node7["乘以 V 矩陣"] --> Output_O["輸出 O 矩陣"]
    QKV_Matrix -- Node8["Wq, Wk, Wv 可學習參數"] --> SA_Matrix

    MHSA --> Diff_Heads["多個獨立的頭"]
    MHSA --> Concat_Output["拼接各頭輸出"]
    MHSA --> Linear_Transform["線性轉換 W^O"]
    Diff_Heads -- Node9["捕捉不同相關性"] --> Attn_Scores

    PE --> Pos_Info["解決位置資訊缺失"]
    PE --> Add_To_Input["將位置向量加到輸入"]
    PE --> Handcrafted_PE["人工設計: Sin/Cos"]
    PE --> Learnable_PE["可學習位置編碼"]

    App --> Speech_Attn["語音辨識"]
    App --> Image_Attn["影像處理"]
    Speech_Attn --> Truncated_Attn["截斷式自注意力"]
    Truncated_Attn -- Node10["降低 O("]L^2")" --> App
    Image_Attn --> Pixel_As_Vector["像素視為向量集合"]
    Image_Attn --> Vision_Transformer["應用於 Vision Transformer"]

    Comp --> VS_CNN["與 CNN 比較"]
    Comp --> VS_RNN["與 RNN 比較"]
    VS_CNN --> Local_vs_Global["局部 vs. 全局感受野"]
    VS_CNN --> Subset_Relationship["CNN 是 Self-Attention 的特例"]
    VS_CNN --> Data_Amount_Effect["數據量影響表現"]
    VS_RNN --> Parallelization["平行處理能力"]
    VS_RNN --> Long_Term_Dep["長距離依賴處理"]
    VS_RNN --> RNN_Replacement["逐漸取代 RNN"]

    Graph --> Edge_Info["利用圖的邊資訊"]
    Graph --> Limited_Attn["僅計算相鄰節點注意力"]
    Graph --> GNN_Type["一種類型的 Graph Neural Network"]

    Future --> Compute_Complexity["O(L^2) 計算量大"]
    Future --> Efficient_Transformers["高效 Transformer 變形"]
    Efficient_Transformers --> XXformer["如 Linformer, Performer"]
    Efficient_Transformers --> Speed_Performance_Tradeoff["速度與效能權衡"]

隨堂測驗

測驗一

在自注意力機制 (Self-Attention) 中,當我們要計算一組輸出向量 時,它們的計算順序為何?

A. 必須先計算 ,然後 ,依序進行。 B. 可以一次同時計算出來。 C. 順序無關緊要,但通常會先計算 。 D. 順序由模型自行決定,可能依序也可能同時。

點擊查看解答 **正確答案:B** 解釋:Self-Attention 的一個重要特性是,其所有輸出向量 $b^1$ 到 $b^L$ 可以透過平行運算一次性生成,這也是它相較於 RNN 的一個主要優勢。

測驗二

為何 Self-Attention 模型需要「位置編碼 (Positional Encoding)」?它是如何將位置資訊傳達給模型的?

A. 為了降低模型的計算複雜度,透過位置編碼來優化注意力分數的計算。 B. 因為 Self-Attention 機制本身不包含任何位置信息,所有輸入向量對它來說是沒有順序關係的。它透過將位置向量加到輸入向量上來提供位置信息。 C. 位置編碼有助於減少模型訓練時的過擬合問題,它透過對 矩陣進行額外的編碼來實現。 D. 為了在多頭自注意力機制中區分不同的頭,每個頭被賦予一個獨特的位置編碼。

點擊查看解答 **正確答案:B** 解釋:Self-Attention 模型的設計使得它對輸入序列中向量的相對或絕對位置是無感的。為了讓模型感知位置信息,通常會生成一個獨特的位置向量 (Positional Vector),並將其疊加到對應的輸入向量上,從而將位置信息嵌入到輸入中。

測驗三

比較 Self-Attention (SA) 和卷積神經網絡 (CNN) 在處理影像時的特性,尤其是在訓練資料量較少的情況下,哪一個模型的表現可能更好?簡述其原因。

點擊查看解答 **答案:** 在訓練資料量較少的情況下,**CNN** 的表現通常會比 Self-Attention 更好。

原因:

  1. 彈性與歸納偏置 (Inductive Bias)
    • Self-Attention 具有非常高的彈性,它可以「學習」任意兩個像素之間的關係,就像其感受野是自適應學習的,因此需要大量的數據來充分學習這些複雜的模式。
    • CNN 具有較強的「局部性」歸納偏置,它預設了影像中的相關資訊通常存在於局部區域(即感受野)。這種對局部性的內建偏置限制了模型的彈性,使其在數據量有限時,由於搜尋空間較小,更不容易過擬合。
  2. 數據需求
    • 由於 Self-Attention 更為靈活,它需要更多的訓練資料才能收斂並達到最佳性能。
    • CNN 的限制性使其在數據量較少時,依然能利用其局部性優勢,表現出較好的泛化能力。