注意力機制分數(attention scores)
注意力機制的分數通常是透過計算查詢(Query)與鍵(Key)之間的相似度來決定的。這個分數反映了查詢與每個鍵的相關性,並用於計算注意力權重,進而決定每個值(Value)在最終輸出中的貢獻程度。以下是常見的幾種計算方式:
1. 點積注意力(Dot-Product Attention)
- 計算方式:( \text{score} = Q \cdot K )
- 說明:這是最簡單且常見的方式,通過計算查詢向量 ( Q ) 和鍵向量 ( K ) 的點積來衡量它們的相似度。點積越大,表示查詢與鍵越相關。
- 優點:計算簡單,特別適合高維數據。
- 應用:廣泛用於Transformer模型中。
2. 縮放點積注意力(Scaled Dot-Product Attention)
- 計算方式:( \text{score} = \frac{Q \cdot K}{\sqrt{d_k}} )
- 說明:這是點積注意力的改進版本,通過除以鍵向量維度 ( d_k ) 的平方根來縮放分數。這樣可以避免高維情況下點積值過大,導致softmax函數梯度過小的問題。
- 優點:在高維數據中更穩定。
- 應用:Transformer模型中的標準注意力機制。
3. 加性注意力(Additive Attention)
- 計算方式:( \text{score} = V^T \tanh(W_1 Q + W_2 K) )
- 說明:使用一個神經網絡層計算分數,其中 ( V )、( W_1 )、( W_2 ) 是可學習的參數。這種方式通過非線性變換捕捉查詢和鍵之間的複雜關係。
- 優點:更靈活,能捕捉複雜的相似性。
- 應用:常見於RNN-based模型,例如Bahdanau注意力機制。
4. 餘弦相似度(Cosine Similarity)
- 計算方式:( \text{score} = \frac{Q \cdot K}{|Q| |K|} )
- 說明:計算查詢和鍵的餘弦相似度,關注它們的方向相似性,分數範圍在 [-1, 1] 之間。
- 優點:對向量大小不敏感,適合需要方向一致性的場景。
- 應用:在某些文本相似度計算中較為常見。
5. 雙線性注意力(Bilinear Attention)
- 計算方式:( \text{score} = Q^T W K )
- 說明:引入一個可學習的權重矩陣 ( W ),允許查詢和鍵之間進行更複雜的交互。
- 優點:能學習更豐富的相似性模式。
- 應用:在某些注意力機制中作為替代方案。
6. 多頭注意力(Multi-Head Attention)
- 計算方式:在Transformer中,多頭注意力並行計算多組分數,每個頭使用不同的線性變換生成查詢、鍵和值,然後獨立計算分數,最後將結果拼接或加權求和。
- 說明:這種方式允許模型從不同角度捕捉查詢和鍵的關係,增強表達能力。
- 應用:Transformer模型的核心組成部分。
總結
注意力機制的分數是基於查詢與鍵的相似度計算得出的,常見方法包括點積注意力、縮放點積注意力、加性注意力、餘弦相似度和雙線性注意力等。這些分數通常會經過softmax歸一化,轉化為注意力權重,再用於加權求和值向量,生成最終的上下文表示。選擇哪種方式取決於具體應用場景,其中縮放點積注意力因其高效性和穩定性,在Transformer模型中應用最為廣泛。
解釋
「注意力分數」是如何影響到「下一個 token」的。
這裡的關鍵在於理解「注意力分數」(或者更精確地說,是由分數經過 Softmax 轉換後的「注意力權重」)是如何被用來更新查詢 token (Query token) 自身的表示 (representation) 的。
以下是詳細步驟,著重於分數帶來的影響:
- 回顧:得到分數 (Scores)
- 對於一個特定的 token 作為「查詢 (Query)」,我們會計算它與序列中所有其他 token(包括它自己)作為「鍵 (Key)」的相似度(原始分數)。
- 這些原始分數接著會通過一個 softmax 函數。這個步驟將原始分數轉換成注意力權重 (Attention Weights)(也就是我們在模擬中視覺化並標示為 “Score” 的那些值)。
- 最重要的是,這些注意力權重是機率分佈:它們都是正數,並且對於每一個 Query 來說,所有權重加總起來等於 1。
- 引入「值 (Value)」向量
- 在從初始的 token embedding(詞嵌入)產生查詢 (Q) 和鍵 (K) 向量的同時,Transformer 也會使用另一個學習到的權重矩陣 (Wv) 來產生第三組向量,稱為**「值 (V)」向量**。
- 你可以把一個 token 的 Value 向量想像成它所持有、並且準備好要分享(如果它被關注到的話)的實際「資訊」或「內容」。Key 是用來判斷相關性的,而 Value 則是實際被傳遞的內容。
- 加權總和 (Weighted Sum) – 分數發揮作用之處
- 核心的操作是:查詢 token 的新表示 是透過計算序列中所有 Value 向量的加權總和得到的。
- 而這個加權總和所使用的權重,正是該 Query 對每個 Key 計算出來的注意力權重 (Attention Weights,即我們的 “Scores”)。
- 公式概念: 查詢 token i 的輸出 = sum( 注意力權重_i_到_j * 值向量_j ) (對序列中所有的 j 進行加總)
- 分數如何影響輸出 (Output)
- 高分 (高注意力權重): 如果 Query 給予 Key j 很高的注意力分數/權重,那麼對應的 Value_j 向量在加權總和中就會乘以一個較大的權重。這意味著包含在 Value_j 中的資訊將對 Query token 的新表示產生強烈的貢獻。Query 從 token j「吸取」了大量資訊。
- 低分 (低注意力權重): 如果 Query 給予 Key k 很低的注意力分數/權重,那麼 Value_k 就會乘以一個非常小的權重。來自 token k 的資訊對 Query 更新後的狀態影響就微乎其微。
- 結果: Query token 的輸出表示變成了一種資訊的融合 (blend),這些資訊來自序列中的所有 token,但融合的比例是根據每個 token 被判斷的相關性(由 Q-K 相似度分數決定)來調配的。這是一個具備上下文感知能力 (context-aware) 的表示。
類比: 想像你在做一杯水果果昔(代表 Query 的新表示)。
- 每種可用的水果都是一個 token。
- 你根據當前的喜好程度(Query-Key 相似度)對每種水果打的分數,決定了注意力分數/權重。
- 水果本身(它的味道、營養成分)就是 Value 向量。
- 你最終製作果昔的方式,是根據你對每種水果的喜好程度(注意力權重),加入不同量的水果(Value)。你會加入很多你喜歡的水果(高分),而只加一點點或完全不加你不喜歡的水果(低分)。
關於「下一個 token」:
注意力分數並不直接決定序列中物理位置相鄰的下一個 token 的屬性。相反地,它們決定的是查詢 token 本身的、更新後的狀態。這個經過更新、理解了上下文的 Query token 表示,通常會接著:
- 在同一個 Transformer 區塊 (block) 中,被傳遞到一個前饋神經網路 (Feed-Forward Network)。
- 或者,被當作輸入傳遞到下一個 Transformer 層(如果模型有多層的話)。
所以,分數影響的是 Query token 對其上下文的理解,而這種更佳的理解會影響後續的處理步驟,可能影響到其他 token 在之後如何被處理,或者最終如何生成模型的輸出。它影響的是資訊流和表示的更新,而不是直接改變序列中的下一個元素。