機器學習2021 - 自注意力機制(Self-Attention)

機器學習2021 - 自注意力機制(Self-Attention)

機器學習2021 - 自注意力機制(Self-Attention)

自注意力機制(Self-Attention)是一種常見的網路架構,主要用於處理輸入為一組向量序列(Sequence of Vectors),且序列長度可能變化的問題。它在自然語言處理(NLP)如 BERT 和 Transformer 架構中扮演了核心角色。

一、 自注意力機制的目標與輸入/輸出

目標: 自注意力機制旨在讓模型在處理序列中的每一個輸入向量時,能夠考量到整個輸入序列的上下文資訊。

輸入與輸出結構: 自注意力機制接受一串向量序列 A (例如 a1​,a2​,a3​,a4​) 作為輸入,並輸出另一串向量序列 B (例如 b1​,b2​,b3​,b4​)。輸出的向量 bi​ 必須是考量了所有輸入向量 a1​ 到 a4​ 之後才產生的

這種輸入輸出長度相同的任務類型,稱為序列標註(Sequence Labeling),常見應用包括詞性標記(POS Tagging)或語音辨識的簡化版。

二、 運作細節:Q、K、V 的產生與注意力分數計算

自注意力機制的運作核心是為每個輸入向量 a_i 產生三個不同的向量:Query (Q)、Key (K) 和 Value (V)。

1. 產生 Q、K、V 向量

每個輸入向量 ai​ 都會乘上三個不同的矩陣 Wq、Wk、Wv(這些矩陣是網路中需要學習的參數),來生成對應的 qi​、ki​、和 vi​:

Query (q):用來詢問(查詢)序列中其他向量的相關性。

  • qi​=ai​×Wq
    Key (k):用來匹配 Query,以計算彼此之間的關聯程度。

  • ki​=ai​×Wk
    Value ($v$):包含實際的資訊內容,用於後續的加權求和。

  • vi​=ai​×Wv

2. 計算注意力分數 (α)

為了計算輸出 b_2,我們以 a_2 產生的 q_2 作為主角,去對序列中所有的 Key (k_1 到 k_4) 計算注意力分數(Attention Score, α)。

注意力分數通常透過 Dot Product(內積)來計算,以衡量 Query 與 Key 之間的關聯性。例如,Query q2​ 與 Key k1​ 之間的關聯性 α2,1​ 為 q2​⋅k1​

這個過程會產生一組分數:α2,1​,α2,2​,α2,3​,α2,4​。

3. 歸一化(Normalization)

接著,這些原始注意力分數會進行歸一化,通常是使用 Softmax 函數,得到最終的注意力分數 α′。雖然 Softmax 是最常見的,但也可以選擇其他的操作,例如 ReLU。

4. 產生輸出向量 (b_i)

得到歸一化後的注意力分數 α′ 之後,將這些分數分別乘上對應的 Value 向量,並全部加總,就得到了輸出向量 bi​

bi​=j∑​αi,j′​×vj​

例如,計算 $b_2$ 時: b2​=α2,1′​×v1​+α2,2′​×v2​+α2,3′​×v3​+α2,4′​×v4​

透過這個加權求和(Weighted Sum)的過程,關聯性越強(α′ 越高)的 Value 向量,對最終 bi​的貢獻就越大。

重要特性: 所有的輸出向量 b1​ 到 b4​可以在一次運算中同時被計算出來,這提供了 Self-Attention 相對於 Recurrent Neural Network (RNN) 巨大的平行化優勢。

三、 矩陣乘法的表示方式

整個自注意力機制的操作可以被視為一連串的矩陣乘法。

整個 Self-Attention 流程可以總結為: I→Q,K,V→QKT→A→A′→O

在這個過程中,唯一需要透過訓練資料找出的未知參數就是 W^q, W^k 和 W^v

四、 進階與變形

1. 多頭自注意力機制 (Multi-head Self-attention)

Multi-head attention 是一種廣泛使用的進階版本。它基於「相關性」具有多種不同形式的考量。

  • 多頭生成: 產生不只一組 Q、K、V 向量,而是多組(例如 qi,1​,qi,2​)
  • 獨立計算: 每個頭(Head)獨立運作,只使用它自己的 Q、K、V 集合來計算注意力分數和輸出向量(例如 bi,1​,bi,2​)
  • 結果整合: 最終將所有頭的輸出結果(如 bi,1​ 和 bi,2​)串接起來,再通過一個線性轉換(矩陣乘法),得到最終的輸出 bi​

2. 位置編碼 (Positional Encoding)

原始的 Self-Attention 機制缺乏位置資訊;它認為序列中 a1​ 和 a4​ 的距離與 a2​ 和 a3​ 的距離是相同的(天涯若比鄰)。

為了解決這個問題,需要引入位置資訊:

  • 為序列中的每一個位置 i 設定一個位置向量 e_i。
  • 將這個 ei​ 向量加到輸入向量 ai​ 上 (ai​+ei​)。
  • Positioning Encoding 可以是人工設計的(如使用神奇的 sin/cos 函數,最早用於 Transformer),也可以是根據資料學出來的。

3. 與其他架構的比較

與 CNN 比較:

  • Self-Attention 可以被視為比 CNN 更具彈性的架構。
  • 在 CNN 中,網路只能考慮固定的、人工劃定的感受野(receptive field)範圍內的資訊。
  • 在 Self-Attention 中,模型透過 Attention 機制自動找出相關的像素或位置,等同於讓機器自己學出感受野的形狀和範圍。
  • Self-Attention 由於彈性較大,當訓練資料量不足時,可能更容易發生 overfitting;而在資料量充足時,其表現通常優於 CNN。
    與 RNN 比較:

  • Self-Attention 很大程度上已經取代了 RNN 在許多應用中的角色。

  • ◦ 平行化 (Parallelization): RNN 必須依序處理序列(先算 b1​ 才能算 b2​),因此無法平行化;而 Self-Attention 可以一次同時計算所有輸出向量 b1​ 到 b4​,因此運算效率更高
  • 長距離依賴 (Long-distance dependency): 即使是雙向 RNN,遠端的資訊也必須一路存在記憶體中傳遞;但 Self-Attention 只需要 Query 與 Key 能夠匹配,就能輕易地從序列上極遠的向量中抽取資訊
  • 應用範圍: 自注意力機制不僅限於 NLP,它也可以應用在語音處理(如 Truncated Self-attention 以應對長序列)、影像處理,以及 Graph 結構上(通常會結合邊緣資訊限制 Attention 的計算範圍,形成 Graph Neural Network 的一種變形)。

Comments

Loading comments…

Leave a Comment